From 1021e712193af048337c752f4e225728d20d61df Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Mon, 15 Sep 2025 11:35:11 +0200 Subject: [PATCH 01/34] commit wip adding hyperlane adapter and custom application with loads of todos --- controller/adapter/generic_parsers.go | 2 +- controller/adapter/hyperlane.go | 114 ++++++++++++++++++++++++++ depinject.go | 15 +++- keeper/hyperlane.go | 102 +++++++++++++++++++++++ keeper/keeper.go | 18 +++- testutil/mocks/hyperlane.go | 11 +++ testutil/mocks/mocks.go | 5 +- testutil/mocks/orbiter/orbiter.go | 1 + testutil/testdata/testdata.go | 2 + types/core/attributes.go | 3 +- types/expected_keepers.go | 8 ++ types/hyperlane/message_body.go | 110 +++++++++++++++++++++++++ 12 files changed, 385 insertions(+), 6 deletions(-) create mode 100644 controller/adapter/hyperlane.go create mode 100644 keeper/hyperlane.go create mode 100644 types/hyperlane/message_body.go diff --git a/controller/adapter/generic_parsers.go b/controller/adapter/generic_parsers.go index e001d6db..a41f5541 100644 --- a/controller/adapter/generic_parsers.go +++ b/controller/adapter/generic_parsers.go @@ -39,7 +39,7 @@ type JSONParser struct { // NewJSONParser returns a reference to a JSONParser instance. func NewJSONParser(cdc codec.Codec) (*JSONParser, error) { if cdc == nil { - return nil, core.ErrNilPointer.Wrap("codec cannot be nil for JSON parser") + return nil, core.ErrNilPointer.Wrap("cdc cannot be nil for JSON parser") } return &JSONParser{ diff --git a/controller/adapter/hyperlane.go b/controller/adapter/hyperlane.go new file mode 100644 index 00000000..d969fb93 --- /dev/null +++ b/controller/adapter/hyperlane.go @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 adapter + +import ( + errorsmod "cosmossdk.io/errors" + "cosmossdk.io/log" + "github.com/cosmos/cosmos-sdk/codec" + + "github.com/noble-assets/orbiter/controller" + "github.com/noble-assets/orbiter/types" + "github.com/noble-assets/orbiter/types/core" + "github.com/noble-assets/orbiter/types/hyperlane" +) + +var _ types.AdapterController = &HyperlaneAdapter{} + +// HyperlaneAdapter is the type component to convert +// an incoming Hyperlane message body to the common payload +// type handled by the module. +type HyperlaneAdapter struct { + *controller.BaseController[core.ProtocolID] + + logger log.Logger + parser *HyperlaneParser +} + +// NewHyperlaneAdapter returns a reference to a new HyperlaneAdapter instance. +func NewHyperlaneAdapter(cdc codec.Codec, logger log.Logger) (*HyperlaneAdapter, error) { + if logger == nil { + return nil, core.ErrNilPointer.Wrap("logger cannot be nil") + } + + baseController, err := controller.NewBase(core.PROTOCOL_HYPERLANE) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to create base controller") + } + + parser, err := NewHyperlaneParser(cdc) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to create hyperlane parser") + } + + return &HyperlaneAdapter{ + BaseController: baseController, + logger: logger.With(core.AdapterControllerName, baseController.Name()), + parser: parser, + }, nil +} + +// ParsePayload delegates the parsing of a Hyperlane message body to the underlying +// Parser implementation. +func (h *HyperlaneAdapter) ParsePayload( + protocolID core.ProtocolID, + payloadBz []byte, +) (bool, *core.Payload, error) { + return h.parser.ParsePayload(protocolID, payloadBz) +} + +// HyperlaneParser is used to parse Orbiter payloads from an incoming Hyperlane message body. +type HyperlaneParser struct { + cdc codec.Codec +} + +func NewHyperlaneParser(cdc codec.Codec) (*HyperlaneParser, error) { + if cdc == nil { + return nil, core.ErrNilPointer.Wrap("codec cannot be nil") + } + + return &HyperlaneParser{cdc: cdc}, nil +} + +// ParsePayload parses the payload from a Hyperlane message body to retrieve +// the Orbiter payload. +// +// NOTE: This parser is only ever called in the Handle method of the Hyperlane application, +// which means that all message bodies handled by this parser were intended for the +// Orbiter. Hence, the first return value is ALWAYS true. +// +// TODO: can protocol ID be removed here? Why is it included? +func (p *HyperlaneParser) ParsePayload( + _ core.ProtocolID, + payloadBz []byte, +) (bool, *core.Payload, error) { + parsedBody, err := hyperlane.ParseHyperlaneOrbiterBody(p.cdc, payloadBz) + if err != nil { + return true, nil, errorsmod.Wrap(err, "failed to parse hyperlane body") + } + + payload, err := parsedBody.ToOrbiterPayload() + if err != nil { + return true, nil, errorsmod.Wrap(err, "failed to convert hyperlane body to payload") + } + + return true, payload, nil +} diff --git a/depinject.go b/depinject.go index 347b4901..50ab8c9c 100644 --- a/depinject.go +++ b/depinject.go @@ -21,6 +21,7 @@ package orbiter import ( + hyperlanecorekeeper "github.com/bcp-innovations/hyperlane-cosmos/x/core/keeper" warpkeeper "github.com/bcp-innovations/hyperlane-cosmos/x/warp/keeper" cctpkeeper "github.com/circlefin/noble-cctp/x/cctp/keeper" @@ -63,6 +64,9 @@ type ModuleInputs struct { StoreService store.KVStoreService BankKeeper types.BankKeeper + + // TODO: use abstracted interfaces + CoreKeeper *hyperlanecorekeeper.Keeper } type ModuleOutputs struct { @@ -87,6 +91,7 @@ func ProvideModule(in ModuleInputs) ModuleOutputs { in.StoreService, authority.String(), in.BankKeeper, + in.CoreKeeper, ) m := NewAppModule(k) @@ -159,5 +164,13 @@ func InjectAdapterControllers(in ComponentsInputs) { panic(errorsmod.Wrap(err, "error creating IBC adapter")) } - in.Orbiters.SetAdapterControllers(ibc) + hyperlane, err := adapterctrl.NewHyperlaneAdapter( + in.Orbiters.Codec(), + in.Orbiters.Adapter().Logger(), + ) + if err != nil { + panic(errorsmod.Wrap(err, "error creating Hyperlane adapter")) + } + + in.Orbiters.SetAdapterControllers(ibc, hyperlane) } diff --git a/keeper/hyperlane.go b/keeper/hyperlane.go new file mode 100644 index 00000000..19b1ed10 --- /dev/null +++ b/keeper/hyperlane.go @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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" + "errors" + "strconv" + + hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" + + errorsmod "cosmossdk.io/errors" + + "github.com/noble-assets/orbiter/types/core" +) + +var _ hyperlaneutil.HyperlaneApp = &Keeper{} + +const OrbiterHyperlaneApp uint8 = iota + +func (k *Keeper) RegisterHyperlaneAppRoute() { + k.hyperlaneCoreKeeper.AppRouter().RegisterModule(uint8(0), k) +} + +// TODO: do we need this? The Warp implementation is using this to check if a token is registered.. +// but we don't need that? +func (k *Keeper) Exists( + ctx context.Context, + handledPayload hyperlaneutil.HexAddress, +) (bool, error) { + // return k.HandledHyperlaneTransfers.Has(ctx, handledPayload.GetInternalId()) + return true, nil +} + +// TODO: do we need this? The Warp implementation is using this to check for a certain ISM +// per-token, +// but we won't keep track of any specific assets that would need to be registered. +func (k *Keeper) ReceiverIsmId( + ctx context.Context, + recipient hyperlaneutil.HexAddress, +) (*hyperlaneutil.HexAddress, error) { + return nil, errors.New("not implemented") +} + +func (k *Keeper) Handle( + ctx context.Context, + mailboxId hyperlaneutil.HexAddress, + message hyperlaneutil.HyperlaneMessage, +) error { + _, payload, err := k.adapter.ParsePayload(core.PROTOCOL_HYPERLANE, message.Body) + if err != nil { + return errorsmod.Wrap(err, "failed to parse payload") + } + + ccID, err := core.NewCrossChainID(core.PROTOCOL_HYPERLANE, strconv.Itoa(int(message.Origin))) + if err != nil { + return errorsmod.Wrap(err, "failed to parse cross chain ID") + } + + // TODO: I guess here should be where the BeforeTransferHook is called? however the transfer + // should already have been processed at this point + if err = k.adapter.BeforeTransferHook( + ctx, ccID, payload, + ); err != nil { + return errorsmod.Wrap(err, "failed during before transfer hook") + } + + // TODO: what to do with mailbox ID? do we need to check this? + + // TODO: theoretically we'd need a different after-transfer hook here? + // The transfer attributes should be populated from the information from the Warp transfer + // and not based on the balance of the module account since the transfer is in a separate + // message. + transferAttr, err := k.adapter.AfterTransferHook(ctx, ccID, payload) + if err != nil { + return errorsmod.Wrap(err, "failed to run AfterTransferHook") + } + + if err = k.adapter.ProcessPayload(ctx, transferAttr, payload); err != nil { + return errorsmod.Wrap(err, "failed to process payload") + } + + return nil +} diff --git a/keeper/keeper.go b/keeper/keeper.go index d4d4a6f6..7a714419 100644 --- a/keeper/keeper.go +++ b/keeper/keeper.go @@ -56,6 +56,9 @@ type Keeper struct { forwarder *forwardercomp.Forwarder dispatcher *dispatchercomp.Dispatcher adapter *adaptercomp.Adapter + + // Hyperlane dependencies + hyperlaneCoreKeeper types.HyperlaneCoreKeeper } // NewKeeper returns a reference to a validated instance of the keeper. @@ -68,8 +71,9 @@ func NewKeeper( storeService store.KVStoreService, authority string, bankKeeper types.BankKeeper, + coreKeeper types.HyperlaneCoreKeeper, ) *Keeper { - if err := validateKeeperInputs(cdc, addressCdc, logger, eventService, storeService, bankKeeper, authority); err != nil { + if err := validateKeeperInputs(cdc, addressCdc, logger, eventService, storeService, bankKeeper, coreKeeper, authority); err != nil { panic(err) } @@ -80,6 +84,8 @@ func NewKeeper( eventService: eventService, logger: logger.With("module", fmt.Sprintf("x/%s", core.ModuleName)), authority: authority, + + hyperlaneCoreKeeper: coreKeeper, } if err := k.setComponents(k.cdc, k.logger, k.eventService, sb, bankKeeper); err != nil { @@ -94,6 +100,8 @@ func NewKeeper( panic(err) } + k.RegisterHyperlaneAppRoute() + return &k } @@ -106,6 +114,7 @@ func validateKeeperInputs( eventService event.Service, storeService store.KVStoreService, bankKeeper types.BankKeeper, + coreKeeper types.HyperlaneCoreKeeper, authority string, ) error { if cdc == nil { @@ -126,6 +135,11 @@ func validateKeeperInputs( if bankKeeper == nil { return core.ErrNilPointer.Wrap("bank keeper cannot be nil") } + + if coreKeeper == nil { + return core.ErrNilPointer.Wrap("hyperlane core keeper cannot be nil") + } + _, err := addressCdc.StringToBytes(authority) if err != nil { return errors.New("authority for x/orbiter module is not valid") @@ -213,7 +227,7 @@ func (k *Keeper) SetAdapterControllers(controllers ...types.AdapterController) { } } -// RequireAuthority returns an error is the signer is not the +// RequireAuthority returns an error if the signer is not the // keeper authority. func (k *Keeper) RequireAuthority(signer string) error { if k.Authority() != signer { diff --git a/testutil/mocks/hyperlane.go b/testutil/mocks/hyperlane.go index d744de51..47c69f7a 100644 --- a/testutil/mocks/hyperlane.go +++ b/testutil/mocks/hyperlane.go @@ -27,6 +27,7 @@ import ( hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" + "github.com/noble-assets/orbiter/types" "github.com/noble-assets/orbiter/types/controller/forwarding" ) @@ -64,3 +65,13 @@ func (h HyperlaneHandler) Token( Token: &t, }, nil } + +var _ types.HyperlaneCoreKeeper = HyperlaneCoreKeeper{} + +type HyperlaneCoreKeeper struct { + appRouter *hyperlaneutil.Router[hyperlaneutil.HyperlaneApp] +} + +func (hck HyperlaneCoreKeeper) AppRouter() *hyperlaneutil.Router[hyperlaneutil.HyperlaneApp] { + return hck.appRouter +} diff --git a/testutil/mocks/mocks.go b/testutil/mocks/mocks.go index 7bad801d..2373d737 100644 --- a/testutil/mocks/mocks.go +++ b/testutil/mocks/mocks.go @@ -42,6 +42,8 @@ type Mocks struct { BankKeeper *BankKeeper // Circle CCTPMsgServer *CCTPMsgServer + // Hyperlane + HyperlaneCoreKeeper *HyperlaneCoreKeeper } func NewMocks() Mocks { @@ -53,7 +55,8 @@ func NewMocks() Mocks { // Cosmos SDK BankKeeper: &bk, // Circle - CCTPMsgServer: &CCTPMsgServer{}, + CCTPMsgServer: &CCTPMsgServer{}, + HyperlaneCoreKeeper: &HyperlaneCoreKeeper{}, } return mocks diff --git a/testutil/mocks/orbiter/orbiter.go b/testutil/mocks/orbiter/orbiter.go index e5bbe00e..61c8fd96 100644 --- a/testutil/mocks/orbiter/orbiter.go +++ b/testutil/mocks/orbiter/orbiter.go @@ -58,6 +58,7 @@ func orbiterKeeperWithMocks( deps.StoreService, testutil.Authority, m.BankKeeper, + m.HyperlaneCoreKeeper, ) return k, deps.SdkCtx diff --git a/testutil/testdata/testdata.go b/testutil/testdata/testdata.go index 6d7dbb6a..b6303e26 100644 --- a/testutil/testdata/testdata.go +++ b/testutil/testdata/testdata.go @@ -30,3 +30,5 @@ var ( func (a *TestForwardingAttr) CounterpartyID() string { return a.Planet } + +func (a *TestForwardingAttr) Validate() error { return nil } diff --git a/types/core/attributes.go b/types/core/attributes.go index 033ba5ce..a020eb58 100644 --- a/types/core/attributes.go +++ b/types/core/attributes.go @@ -34,6 +34,7 @@ type ActionAttributes interface { // attribute type has to implement. type ForwardingAttributes interface { proto.Message - // Returns the destination chain identifier. + // CounterpartyID returns the destination chain identifier. CounterpartyID() string + Validate() error } diff --git a/types/expected_keepers.go b/types/expected_keepers.go index 331792a2..ac65d47b 100644 --- a/types/expected_keepers.go +++ b/types/expected_keepers.go @@ -23,6 +23,8 @@ package types import ( "context" + hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" + sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -52,3 +54,9 @@ type BankKeeperAdapter interface { amt sdk.Coins, ) error } + +// HyperlaneCoreKeeper specifies the expected interface of Hyperlane +// core functionality that is required for the Orbiter execution. +type HyperlaneCoreKeeper interface { + AppRouter() *hyperlaneutil.Router[hyperlaneutil.HyperlaneApp] +} diff --git a/types/hyperlane/message_body.go b/types/hyperlane/message_body.go new file mode 100644 index 00000000..7f1db5e5 --- /dev/null +++ b/types/hyperlane/message_body.go @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 hyperlane + +import ( + "encoding/binary" + "errors" + "math" + + errorsmod "cosmossdk.io/errors" + "github.com/cosmos/cosmos-sdk/codec" + + forwardingtypes "github.com/noble-assets/orbiter/types/controller/forwarding" + "github.com/noble-assets/orbiter/types/core" +) + +// OrbiterBody defines the structure of the payload to be passed +// in Hyperlane messages, that can be parsed by the Orbiter module. +// +// Bytes layout: +// - 0:4 : protocol ID +// - 4: : forwarding +type OrbiterBody struct { + // // TODO: how can these bytes be constructed in the EVM? + // // TODO: There is no way to do proper serializing of the data according to protobuf types in + // Solidity, + // // so we'll need custom bytes building. + // payload core.Payload + + protocolID core.ProtocolID + attributes core.ForwardingAttributes +} + +func NewHyperlaneOrbiterBody(p core.ProtocolID, a core.ForwardingAttributes) (*OrbiterBody, error) { + if err := p.Validate(); err != nil { + return nil, errorsmod.Wrap(err, "invalid protocol id") + } + + if err := a.Validate(); err != nil { + return nil, errorsmod.Wrap(err, "invalid forward attributes") + } + + return &OrbiterBody{ + protocolID: p, + attributes: a, + }, nil +} + +func (h OrbiterBody) ToOrbiterPayload() (*core.Payload, error) { + // TODO: currently not supporting passthrough payload + forwarding, err := core.NewForwarding(h.protocolID, h.attributes, nil) + if err != nil { + // sanity check, should not happen because the parsing should only yield valid bodies. + return nil, err + } + + return core.NewPayload(forwarding) +} + +// ParseHyperlaneOrbiterBody parses the bytes of a Hyperlane message body to retrieve +// the relevant information for handling with the Orbiter implementation. +// +// TODO: for now this is not containing any actions but can only contain forwarding information. +func ParseHyperlaneOrbiterBody(cdc codec.Codec, messageBody []byte) (*OrbiterBody, error) { + protocolIDu32 := binary.BigEndian.Uint32(messageBody[:4]) + if protocolIDu32 > math.MaxInt32 { + return nil, errors.New("protocol id out of range") + } + + protocolID, err := core.NewProtocolID(int32(protocolIDu32)) + if err != nil { + return nil, errorsmod.Wrap(err, "message body contains invalid protocol id") + } + + // TODO: This won't work as it is, because this would require marshalling protos inside + // of Solidity contracts. + // Instead, we will have to manually pack / unpack the contents from the bytes array. + forwardingAttributes := messageBody[4:] + var hypAttrs forwardingtypes.HypAttributes + if err = cdc.Unmarshal(forwardingAttributes, &hypAttrs); err == nil { + return NewHyperlaneOrbiterBody(protocolID, &hypAttrs) + } + + var cctpAttrs forwardingtypes.CCTPAttributes + if err = cdc.Unmarshal(forwardingAttributes, &cctpAttrs); err == nil { + return NewHyperlaneOrbiterBody(protocolID, &cctpAttrs) + } + + // TODO: currently not supporting IBC yet because the attributes are not defined yet + + return nil, errors.New("message body does not contain valid forwarding attributes") +} From 02d1999880b41ab2e8b9c452f14a79f0cc547211 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Tue, 16 Sep 2025 12:09:06 +0200 Subject: [PATCH 02/34] add wip unpacking forwarding attributes --- types/hyperlane/cctp_attributes.go | 10 ++++ types/hyperlane/hyperlane_attributes.go | 79 +++++++++++++++++++++++++ types/hyperlane/message_body.go | 69 ++++++++++++--------- 3 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 types/hyperlane/cctp_attributes.go create mode 100644 types/hyperlane/hyperlane_attributes.go diff --git a/types/hyperlane/cctp_attributes.go b/types/hyperlane/cctp_attributes.go new file mode 100644 index 00000000..481d509c --- /dev/null +++ b/types/hyperlane/cctp_attributes.go @@ -0,0 +1,10 @@ +package hyperlane + +import "github.com/noble-assets/orbiter/types/core" + +// unpackCCTPAttributes does the manual unpacking of CCTP attributes from a bytes payload. +// +// TODO: move into common utils? could also be used for the CCTP adapter +func unpackCCTPAttributes(bz []byte) (core.ForwardingAttributes, error) { + panic("not implemented") +} diff --git a/types/hyperlane/hyperlane_attributes.go b/types/hyperlane/hyperlane_attributes.go new file mode 100644 index 00000000..1879938b --- /dev/null +++ b/types/hyperlane/hyperlane_attributes.go @@ -0,0 +1,79 @@ +package hyperlane + +import ( + errorsmod "cosmossdk.io/errors" + sdkmath "cosmossdk.io/math" + "encoding/binary" + "fmt" + hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/noble-assets/orbiter/types/controller/forwarding" + "github.com/noble-assets/orbiter/types/core" + "math/big" +) + +// Hyperlane attributes constants +// +// TODO: cross-check assumptions here, correct length used for everything? +// TODO: can probably be removed in favor of ABI unpacking +const ( + tokenIDLength = hyperlaneutil.HEX_ADDRESS_LENGTH + destDomainLength = 4 + recipientLength = hyperlaneutil.HEX_ADDRESS_LENGTH + customHookIDLength = hyperlaneutil.HEX_ADDRESS_LENGTH + gasLimitLength = 32 // uint256 + feeAmountLength = 32 // uint256 + feeDenomLength = 32 // just a random assumption / requirement we can put in place? + + hypAttrMinLength = tokenIDLength + destDomainLength + recipientLength + customHookIDLength + gasLimitLength + feeAmountLength + feeDenomLength +) + +// unpackHypAttributes does the manual unpacking of Hyperlane orbiter attributes from a bytes payload. +// +// TODO: move into common utils? could also be used for the CCTP adapter +func unpackHypAttributes(bz []byte) (core.ForwardingAttributes, error) { + if len(bz) < hypAttrMinLength { + return nil, fmt.Errorf("minimum length for hyperlane attributes is %d; got %d", hypAttrMinLength, len(bz)) + } + + offset := 0 + + tokenID := bz[offset:tokenIDLength] + offset += tokenIDLength + + destDomain := binary.BigEndian.Uint32(bz[offset : offset+destDomainLength]) + offset += destDomainLength + + recipient := bz[offset : offset+recipientLength] + offset += recipientLength + + customHookID := bz[offset:customHookIDLength] + offset += customHookIDLength + + gasLimit := new(big.Int).SetBytes(bz[offset : offset+gasLimitLength]) + offset += gasLimitLength + + maxFeeAmount := new(big.Int).SetBytes(bz[offset : offset+feeAmountLength]) + offset += feeAmountLength + + maxFeeDenom := string(bz[offset : offset+feeDenomLength]) + offset += feeDenomLength + + // since this is of variable length, we unpack this last + customHookMetadata := string(bz[offset:]) + + maxFee := sdk.Coin{Denom: maxFeeDenom, Amount: sdkmath.NewIntFromBigInt(maxFeeAmount)} + if err := maxFee.Validate(); err != nil { + return nil, errorsmod.Wrap(err, "invalid max fee provided") + } + + return forwarding.NewHyperlaneAttributes( + tokenID, + destDomain, + recipient, + customHookID, + customHookMetadata, + sdkmath.NewIntFromBigInt(gasLimit), + maxFee, + ) +} diff --git a/types/hyperlane/message_body.go b/types/hyperlane/message_body.go index 7f1db5e5..12c3a16c 100644 --- a/types/hyperlane/message_body.go +++ b/types/hyperlane/message_body.go @@ -21,14 +21,13 @@ package hyperlane import ( + errorsmod "cosmossdk.io/errors" "encoding/binary" "errors" - "math" - - errorsmod "cosmossdk.io/errors" + "fmt" "github.com/cosmos/cosmos-sdk/codec" + "math" - forwardingtypes "github.com/noble-assets/orbiter/types/controller/forwarding" "github.com/noble-assets/orbiter/types/core" ) @@ -37,7 +36,7 @@ import ( // // Bytes layout: // - 0:4 : protocol ID -// - 4: : forwarding +// - 4: : forwarding attributes type OrbiterBody struct { // // TODO: how can these bytes be constructed in the EVM? // // TODO: There is no way to do proper serializing of the data according to protobuf types in @@ -49,24 +48,31 @@ type OrbiterBody struct { attributes core.ForwardingAttributes } +// TODO: remove if unused? func NewHyperlaneOrbiterBody(p core.ProtocolID, a core.ForwardingAttributes) (*OrbiterBody, error) { - if err := p.Validate(); err != nil { - return nil, errorsmod.Wrap(err, "invalid protocol id") + o := &OrbiterBody{ + protocolID: p, + attributes: a, + } + + return o, o.Validate() +} + +func (o OrbiterBody) Validate() error { + if err := o.protocolID.Validate(); err != nil { + return errorsmod.Wrap(err, "invalid protocol id") } - if err := a.Validate(); err != nil { - return nil, errorsmod.Wrap(err, "invalid forward attributes") + if err := o.attributes.Validate(); err != nil { + return errorsmod.Wrap(err, "invalid forwarding attributes") } - return &OrbiterBody{ - protocolID: p, - attributes: a, - }, nil + return nil } -func (h OrbiterBody) ToOrbiterPayload() (*core.Payload, error) { +func (o OrbiterBody) ToOrbiterPayload() (*core.Payload, error) { // TODO: currently not supporting passthrough payload - forwarding, err := core.NewForwarding(h.protocolID, h.attributes, nil) + forwarding, err := core.NewForwarding(o.protocolID, o.attributes, nil) if err != nil { // sanity check, should not happen because the parsing should only yield valid bodies. return nil, err @@ -79,6 +85,7 @@ func (h OrbiterBody) ToOrbiterPayload() (*core.Payload, error) { // the relevant information for handling with the Orbiter implementation. // // TODO: for now this is not containing any actions but can only contain forwarding information. +// TODO: cdc can be removed I think :eyes: func ParseHyperlaneOrbiterBody(cdc codec.Codec, messageBody []byte) (*OrbiterBody, error) { protocolIDu32 := binary.BigEndian.Uint32(messageBody[:4]) if protocolIDu32 > math.MaxInt32 { @@ -93,18 +100,26 @@ func ParseHyperlaneOrbiterBody(cdc codec.Codec, messageBody []byte) (*OrbiterBod // TODO: This won't work as it is, because this would require marshalling protos inside // of Solidity contracts. // Instead, we will have to manually pack / unpack the contents from the bytes array. - forwardingAttributes := messageBody[4:] - var hypAttrs forwardingtypes.HypAttributes - if err = cdc.Unmarshal(forwardingAttributes, &hypAttrs); err == nil { - return NewHyperlaneOrbiterBody(protocolID, &hypAttrs) + var attr core.ForwardingAttributes + switch protocolID { + case core.PROTOCOL_CCTP: + panic("TODO: implement") + attr, err = unpackCCTPAttributes(messageBody[4:]) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to unpack cctp attributes") + } + case core.PROTOCOL_HYPERLANE: + panic("TODO: implement") + attr, err = unpackHypAttributes(messageBody[4:]) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to unpack hyperlane attributes") + } + default: + panic(fmt.Sprintf("protocol %s not implemented", protocolID.String())) } - var cctpAttrs forwardingtypes.CCTPAttributes - if err = cdc.Unmarshal(forwardingAttributes, &cctpAttrs); err == nil { - return NewHyperlaneOrbiterBody(protocolID, &cctpAttrs) - } - - // TODO: currently not supporting IBC yet because the attributes are not defined yet - - return nil, errors.New("message body does not contain valid forwarding attributes") + return &OrbiterBody{ + protocolID: protocolID, + attributes: attr, + }, errors.New("message body does not contain valid forwarding attributes") } From ce5b7162f21ba36413bf60660847bf4d857188e2 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 17 Sep 2025 17:10:25 +0200 Subject: [PATCH 03/34] wip adding entrypoint contract; will be changed --- contracts/.gitignore | 1 + contracts/HyperlaneEntrypoint.sol | 85 ++ contracts/HyperlaneInterfaces.sol | 29 + contracts/Makefile | 25 + contracts/bun.lock | 1309 +++++++++++++++++++++++++++++ contracts/package.json | 6 + 6 files changed, 1455 insertions(+) create mode 100644 contracts/.gitignore create mode 100644 contracts/HyperlaneEntrypoint.sol create mode 100644 contracts/HyperlaneInterfaces.sol create mode 100644 contracts/Makefile create mode 100644 contracts/bun.lock create mode 100644 contracts/package.json diff --git a/contracts/.gitignore b/contracts/.gitignore new file mode 100644 index 00000000..40b878db --- /dev/null +++ b/contracts/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/contracts/HyperlaneEntrypoint.sol b/contracts/HyperlaneEntrypoint.sol new file mode 100644 index 00000000..cf08b73c --- /dev/null +++ b/contracts/HyperlaneEntrypoint.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma Solidity ^v0.8.13; + +import {ITokenRouter} from "./HyperlaneInterfaces.sol"; + +/* + * @dev The canonical entrypoint contract to use Noble's Orbiter implementation through Hyperlane. + * + * The Orbiter (https://github.com/noble-assets/orbiter) allows to send cross-chain transfers + * using various bridge mechanisms, execute actions on the Noble blockchain (e.g. fee payments), + * and eventually forward the resulting assets to another destination through one of the available + * bridging mechanisms (e.g. IBC, CCTP). + * + * TODO: make upgradeable + */ +contract HyperlaneEntrypoint { + // The canonical mailbox to dispatch orbiter messages. + // + // TODO: check if should be public and immutable? + IMailbox public immutable mailbox; + + // TODO: add constructor logic + constructor(address _mailbox) { + mailbox = IMailbox(_mailbox); + } + + // TODO: add initialize function so we can use an upgradeable proxy? + function initialize( + address mailbox + ) external initializer { + __Ownable_init(); + } + + /* + * @dev Send an asset transfer to the Orbiter, that should be forwarded to another Hyperlane domain. + */ + function sendWithForwardThroughHyperlane( + uint32 destinationDomain, + bytes32 recipient, + uint256 amount + ) external returns (bytes32 messageID) { + ITokenRouter token = new ITokenRouter(tokenAddress); + bytes32 warpMessageID = token.remoteTransfer( + + ); + + bytes32 orbiterMessageID = sendHyperlaneForwardInformation( + warpMessageID, + orbiterPayload + ); + + mailbox.dispatch( + + ) + } + + /* @dev Packs the given attributes into a bytes array. + * + * This metadata is used to be passed as payload bytes to the Orbiter implementation + * via the Hyperlane protocol. + * + * TODO: check if used types are correct. + */ + function packHyperlaneForwardingAttributes( + bytes32 tokenID, // checked + uint32 destDomain, // checked + bytes32 recipient, // checked + bytes32 customHookID, // TODO: maybe instead use the IPostDispatchHook thing here? + string memory customHookMetadata, + uint256 gasLimit, // checked + uint256 maxFeeAmount, // checked + string memory maxFeeDenom // TODO: even pass this? Shouldn't just the denom on Noble be used? + ) internal returns (bytes memory) { + return abi.encode( + tokenID, + destDomain, + recipient, + customHookID, + gasLimit, + maxFeeAmount, + maxFeeDenom, + customHookMetadata + ); + } +} \ No newline at end of file diff --git a/contracts/HyperlaneInterfaces.sol b/contracts/HyperlaneInterfaces.sol new file mode 100644 index 00000000..45b84084 --- /dev/null +++ b/contracts/HyperlaneInterfaces.sol @@ -0,0 +1,29 @@ +/* + * @dev Contains the required interface to send tokens through a Hyperlane Warp Route. + */ +interface ITokenRouter { + // https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/token/libs/TokenRouter.sol#L45-L61 + function transferRemote( + uint32 _destination, + bytes32 _recipient, + uint256 _amountOrId + ) external payable virtual returns ( + bytes32 messageId + ); + + // TODO: add option for transfer with hook metadata? +} + +/* + * @dev Contains the required interface to dispatch messages using the Hyperlane protocol. + */ +interface IMailbox { + // https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/Mailbox.sol#L102-L123 + function dispatch( + uint32 _destinationDomain, + bytes32 _recipientAddress, + bytes calldata _messageBody + ) external payable override returns (bytes32); + + // TODO: add option for dispatch with hook metadata? +} diff --git a/contracts/Makefile b/contracts/Makefile new file mode 100644 index 00000000..d05bf96e --- /dev/null +++ b/contracts/Makefile @@ -0,0 +1,25 @@ +all: deps compile + +compile: compile-go-bindings + +SOLIDITY_VERSION := "0.8.13" +SOLC_IMAGE := "ethereum/solc:$(SOLIDITY_VERSION)" +compile-go-bindings: + docker run --rm \ + -v $(PWD):/workspace \ + -w /workspace \ + $(SOLC_IMAGE) \ + --abi --bin --overwrite \ + -o /workspace/build \ + /workspace/HyperlaneEntrypoint.sol + docker run --rm \ + -v $(PWD):/workspace \ + -w /workspace \ + ethereum/client-go:alltools-v1.13.0 \ + abigen --abi=/workspace/build/HyperlaneEntrypoint.abi \ + --bin=/workspace/build/HyperlaneEntrypoint.bin \ + --pkg=contracts \ + --out=/workspace/HyperlaneEntrypoint.go + +deps: + bun install diff --git a/contracts/bun.lock b/contracts/bun.lock new file mode 100644 index 00000000..99c7a433 --- /dev/null +++ b/contracts/bun.lock @@ -0,0 +1,1309 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "dependencies": { + "@hyperlane-xyz/core": "9.0.9", + }, + }, + }, + "packages": { + "@arbitrum/nitro-contracts": ["@arbitrum/nitro-contracts@1.3.0", "", { "dependencies": { "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", "patch-package": "^6.4.7" } }, "sha512-nNNOgqqyiOxFiF1k53u0upC6tRWar1aj2arRZoE8C99/0eMnWk9az6rUO1yhxgMyMmk5fx9Pg42oSsZ9H7noOg=="], + + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], + + "@balena/dockerignore": ["@balena/dockerignore@1.0.2", "", {}, "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q=="], + + "@chainlink/contracts": ["@chainlink/contracts@1.4.0", "", { "dependencies": { "@arbitrum/nitro-contracts": "3.0.0", "@changesets/cli": "~2.28.1", "@changesets/get-github-info": "^0.6.0", "@eth-optimism/contracts": "0.6.0", "@openzeppelin/contracts": "4.9.6", "@openzeppelin/contracts-upgradeable": "4.9.6", "@scroll-tech/contracts": "0.1.0", "@zksync/contracts": "github:matter-labs/era-contracts#446d391d34bdb48255d5f8fef8a8248925fc98b9", "semver": "^7.7.1" } }, "sha512-SpNCJ0TPOI6pa2l702Wk4WIP8ccw5ARcRP1E/ZTqaFffXNoZeF03WhsVL8f3l3OTRFA9Z40O5KcZzmJmZQkoFA=="], + + "@chainlink/contracts-ccip": ["@chainlink/contracts-ccip@1.6.1", "", { "dependencies": { "@chainlink/contracts": "1.4.0", "@changesets/cli": "^2.29.5", "@changesets/get-github-info": "^0.6.0", "semver": "^7.7.2" } }, "sha512-2ainz7DhzSPyUTD01e0roRHQ4V895peJ6rlu+GgxOYCZVFVtuwXEbT27ByyaJSFsB9ZubAtu1zhAijuL0OwPzw=="], + + "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.0.13", "", { "dependencies": { "@changesets/config": "^3.1.1", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg=="], + + "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="], + + "@changesets/changelog-git": ["@changesets/changelog-git@0.2.1", "", { "dependencies": { "@changesets/types": "^6.1.0" } }, "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q=="], + + "@changesets/cli": ["@changesets/cli@2.29.7", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.13", "@changesets/assemble-release-plan": "^6.0.9", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.1", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.13", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.5", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@inquirer/external-editor": "^1.0.0", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ=="], + + "@changesets/config": ["@changesets/config@3.1.1", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/logger": "^0.1.1", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1", "micromatch": "^4.0.8" } }, "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA=="], + + "@changesets/errors": ["@changesets/errors@0.2.0", "", { "dependencies": { "extendable-error": "^0.1.5" } }, "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow=="], + + "@changesets/get-dependents-graph": ["@changesets/get-dependents-graph@2.1.3", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "picocolors": "^1.1.0", "semver": "^7.5.3" } }, "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ=="], + + "@changesets/get-github-info": ["@changesets/get-github-info@0.6.0", "", { "dependencies": { "dataloader": "^1.4.0", "node-fetch": "^2.5.0" } }, "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA=="], + + "@changesets/get-release-plan": ["@changesets/get-release-plan@4.0.13", "", { "dependencies": { "@changesets/assemble-release-plan": "^6.0.9", "@changesets/config": "^3.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.5", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg=="], + + "@changesets/get-version-range-type": ["@changesets/get-version-range-type@0.4.0", "", {}, "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ=="], + + "@changesets/git": ["@changesets/git@3.0.4", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@manypkg/get-packages": "^1.1.3", "is-subdir": "^1.1.1", "micromatch": "^4.0.8", "spawndamnit": "^3.0.1" } }, "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw=="], + + "@changesets/logger": ["@changesets/logger@0.1.1", "", { "dependencies": { "picocolors": "^1.1.0" } }, "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg=="], + + "@changesets/parse": ["@changesets/parse@0.4.1", "", { "dependencies": { "@changesets/types": "^6.1.0", "js-yaml": "^3.13.1" } }, "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q=="], + + "@changesets/pre": ["@changesets/pre@2.0.2", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "fs-extra": "^7.0.1" } }, "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug=="], + + "@changesets/read": ["@changesets/read@0.6.5", "", { "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/parse": "^0.4.1", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", "picocolors": "^1.1.0" } }, "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg=="], + + "@changesets/should-skip-package": ["@changesets/should-skip-package@0.1.2", "", { "dependencies": { "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } }, "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw=="], + + "@changesets/types": ["@changesets/types@6.1.0", "", {}, "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA=="], + + "@changesets/write": ["@changesets/write@0.4.0", "", { "dependencies": { "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "human-id": "^4.1.1", "prettier": "^2.7.1" } }, "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q=="], + + "@cosmjs/encoding": ["@cosmjs/encoding@0.32.4", "", { "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", "readonly-date": "^1.0.0" } }, "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw=="], + + "@eth-optimism/contracts": ["@eth-optimism/contracts@0.6.0", "", { "dependencies": { "@eth-optimism/core-utils": "0.12.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0" }, "peerDependencies": { "ethers": "^5" } }, "sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w=="], + + "@eth-optimism/core-utils": ["@eth-optimism/core-utils@0.12.0", "", { "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/contracts": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/providers": "^5.7.0", "@ethersproject/rlp": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/web": "^5.7.0", "bufio": "^1.0.7", "chai": "^4.3.4" } }, "sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw=="], + + "@ethereumjs/rlp": ["@ethereumjs/rlp@5.0.2", "", { "bin": { "rlp": "bin/rlp.cjs" } }, "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA=="], + + "@ethereumjs/util": ["@ethereumjs/util@9.1.0", "", { "dependencies": { "@ethereumjs/rlp": "^5.0.2", "ethereum-cryptography": "^2.2.1" } }, "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog=="], + + "@ethersproject/abi": ["@ethersproject/abi@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q=="], + + "@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "@ethersproject/basex": ["@ethersproject/basex@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q=="], + + "@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "@ethersproject/contracts": ["@ethersproject/contracts@5.8.0", "", { "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0" } }, "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ=="], + + "@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "@ethersproject/hdnode": ["@ethersproject/hdnode@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/pbkdf2": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/sha2": "^5.8.0", "@ethersproject/signing-key": "^5.8.0", "@ethersproject/strings": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/wordlists": "^5.8.0" } }, "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA=="], + + "@ethersproject/json-wallets": ["@ethersproject/json-wallets@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/hdnode": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/pbkdf2": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/random": "^5.8.0", "@ethersproject/strings": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w=="], + + "@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" } }, "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg=="], + + "@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "@ethersproject/providers": ["@ethersproject/providers@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/basex": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/random": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/sha2": "^5.8.0", "@ethersproject/strings": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0", "bech32": "1.1.4", "ws": "8.18.0" } }, "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw=="], + + "@ethersproject/random": ["@ethersproject/random@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A=="], + + "@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], + + "@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "@ethersproject/solidity": ["@ethersproject/solidity@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/sha2": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA=="], + + "@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "@ethersproject/units": ["@ethersproject/units@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ=="], + + "@ethersproject/wallet": ["@ethersproject/wallet@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/hdnode": "^5.8.0", "@ethersproject/json-wallets": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/random": "^5.8.0", "@ethersproject/signing-key": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/wordlists": "^5.8.0" } }, "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA=="], + + "@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "@ethersproject/wordlists": ["@ethersproject/wordlists@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg=="], + + "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], + + "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], + + "@hyperlane-xyz/core": ["@hyperlane-xyz/core@9.0.9", "", { "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@chainlink/contracts-ccip": "^1.5.0", "@eth-optimism/contracts": "^0.6.0", "@hyperlane-xyz/utils": "18.2.0", "@matterlabs/hardhat-zksync-solc": "1.2.5", "@matterlabs/hardhat-zksync-verify": "1.7.1", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^4.9.3" }, "peerDependencies": { "@ethersproject/abi": "*", "@ethersproject/providers": "*", "@types/sinon-chai": "*" } }, "sha512-FM6oeOGjN54NO0pIKDmbpgn/Cg/BwEOFHcGqKBA4Wldhy46KcV2e6aq5SRvlOAkmC6gNA5htzpTsM4dZ1fSwvA=="], + + "@hyperlane-xyz/utils": ["@hyperlane-xyz/utils@18.2.0", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", "bech32": "^2.0.0", "bignumber.js": "^9.1.1", "ethers": "^5.8.0", "lodash-es": "^4.17.21", "pino": "^8.19.0", "starknet": "^7.4.0", "yaml": "2.4.5" }, "peerDependencies": { "@google-cloud/pino-logging-gcp-config": "^1.0.6", "pino-pretty": ">=10.0.0" }, "optionalPeers": ["@google-cloud/pino-logging-gcp-config", "pino-pretty"] }, "sha512-Y0amJTjE9Sly0bOFUYL6yjOPnIov9yQvCkaOFlY/ZaQBm5uy3213IHaiOVvUmXP5ZNYL4UW6t5TR/kLpAdOAUA=="], + + "@inquirer/external-editor": ["@inquirer/external-editor@1.0.2", "", { "dependencies": { "chardet": "^2.1.0", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ=="], + + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + + "@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA=="], + + "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="], + + "@matterlabs/hardhat-zksync-solc": ["@matterlabs/hardhat-zksync-solc@1.2.5", "", { "dependencies": { "@nomiclabs/hardhat-docker": "^2.0.2", "chai": "^4.3.4", "chalk": "^4.1.2", "debug": "^4.3.5", "dockerode": "^4.0.2", "fs-extra": "^11.2.0", "proper-lockfile": "^4.1.2", "semver": "^7.6.2", "sinon": "^18.0.0", "sinon-chai": "^3.7.0", "undici": "^6.18.2" }, "peerDependencies": { "hardhat": "^2.22.5" } }, "sha512-iZyznWl1Hoe/Z46hnUe1s2drBZBjJOS/eN+Ql2lIBX9B6NevBl9DYzkKzH5HEIMCLGnX9sWpRAJqUQJWy9UB6w=="], + + "@matterlabs/hardhat-zksync-verify": ["@matterlabs/hardhat-zksync-verify@1.7.1", "", { "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/address": "5.7.0", "@matterlabs/hardhat-zksync-solc": "^1.2.5", "@nomicfoundation/hardhat-verify": "^2.0.8", "axios": "^1.7.2", "cbor": "^9.0.2", "chai": "^4.3.4", "chalk": "^4.1.2", "debug": "^4.3.5", "semver": "^7.6.2", "sinon": "^18.0.0", "sinon-chai": "^3.7.0" }, "peerDependencies": { "hardhat": "^2.22.5" } }, "sha512-FtibELgllkyAZORDW4/s/7XSC5DaqAXG0KXMqGipQyXuIXQ9l1kpaHMpoEtHvQL7xxmkgZqCcSZgATnKl91nDg=="], + + "@noble/curves": ["@noble/curves@1.7.0", "", { "dependencies": { "@noble/hashes": "1.6.0" } }, "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw=="], + + "@noble/hashes": ["@noble/hashes@1.6.0", "", {}, "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ=="], + + "@noble/secp256k1": ["@noble/secp256k1@1.7.1", "", {}, "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@nomicfoundation/edr": ["@nomicfoundation/edr@0.11.3", "", { "dependencies": { "@nomicfoundation/edr-darwin-arm64": "0.11.3", "@nomicfoundation/edr-darwin-x64": "0.11.3", "@nomicfoundation/edr-linux-arm64-gnu": "0.11.3", "@nomicfoundation/edr-linux-arm64-musl": "0.11.3", "@nomicfoundation/edr-linux-x64-gnu": "0.11.3", "@nomicfoundation/edr-linux-x64-musl": "0.11.3", "@nomicfoundation/edr-win32-x64-msvc": "0.11.3" } }, "sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g=="], + + "@nomicfoundation/edr-darwin-arm64": ["@nomicfoundation/edr-darwin-arm64@0.11.3", "", {}, "sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA=="], + + "@nomicfoundation/edr-darwin-x64": ["@nomicfoundation/edr-darwin-x64@0.11.3", "", {}, "sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA=="], + + "@nomicfoundation/edr-linux-arm64-gnu": ["@nomicfoundation/edr-linux-arm64-gnu@0.11.3", "", {}, "sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ=="], + + "@nomicfoundation/edr-linux-arm64-musl": ["@nomicfoundation/edr-linux-arm64-musl@0.11.3", "", {}, "sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA=="], + + "@nomicfoundation/edr-linux-x64-gnu": ["@nomicfoundation/edr-linux-x64-gnu@0.11.3", "", {}, "sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw=="], + + "@nomicfoundation/edr-linux-x64-musl": ["@nomicfoundation/edr-linux-x64-musl@0.11.3", "", {}, "sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg=="], + + "@nomicfoundation/edr-win32-x64-msvc": ["@nomicfoundation/edr-win32-x64-msvc@0.11.3", "", {}, "sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung=="], + + "@nomicfoundation/hardhat-verify": ["@nomicfoundation/hardhat-verify@2.1.1", "", { "dependencies": { "@ethersproject/abi": "^5.1.2", "@ethersproject/address": "^5.0.2", "cbor": "^8.1.0", "debug": "^4.1.1", "lodash.clonedeep": "^4.5.0", "picocolors": "^1.1.0", "semver": "^6.3.0", "table": "^6.8.0", "undici": "^5.14.0" }, "peerDependencies": { "hardhat": "^2.26.0" } }, "sha512-K1plXIS42xSHDJZRkrE2TZikqxp9T4y6jUMUNI/imLgN5uCcEQokmfU0DlyP9zzHncYK92HlT5IWP35UVCLrPw=="], + + "@nomicfoundation/solidity-analyzer": ["@nomicfoundation/solidity-analyzer@0.1.2", "", { "optionalDependencies": { "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2", "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2", "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2", "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2", "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2", "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2", "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2" } }, "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA=="], + + "@nomicfoundation/solidity-analyzer-darwin-arm64": ["@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2", "", {}, "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw=="], + + "@nomicfoundation/solidity-analyzer-darwin-x64": ["@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2", "", {}, "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw=="], + + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": ["@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2", "", {}, "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA=="], + + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": ["@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2", "", {}, "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA=="], + + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": ["@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2", "", {}, "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g=="], + + "@nomicfoundation/solidity-analyzer-linux-x64-musl": ["@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2", "", {}, "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg=="], + + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": ["@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2", "", {}, "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA=="], + + "@nomiclabs/hardhat-docker": ["@nomiclabs/hardhat-docker@2.0.2", "", { "dependencies": { "dockerode": "^2.5.8", "fs-extra": "^7.0.1", "node-fetch": "^2.6.0" } }, "sha512-XgGEpRT3wlA1VslyB57zyAHV+oll8KnV1TjwnxxC1tpAL04/lbdwpdO5KxInVN8irMSepqFpsiSkqlcnvbE7Ng=="], + + "@offchainlabs/upgrade-executor": ["@offchainlabs/upgrade-executor@1.1.0-beta.0", "", { "dependencies": { "@openzeppelin/contracts": "4.7.3", "@openzeppelin/contracts-upgradeable": "4.7.3" } }, "sha512-mpn6PHjH/KDDjNX0pXHEKdyv8m6DVGQiI2nGzQn0JbM1nOSHJpWx6fvfjtH7YxHJ6zBZTcsKkqGkFKDtCfoSLw=="], + + "@openzeppelin/contracts": ["@openzeppelin/contracts@4.9.6", "", {}, "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA=="], + + "@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.9.6", "", {}, "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@scroll-tech/contracts": ["@scroll-tech/contracts@0.1.0", "", {}, "sha512-aBbDOc3WB/WveZdpJYcrfvMYMz7ZTEiW8M9XMJLba8p9FAR5KGYB/cV+8+EUsq3MKt7C1BfR+WnXoTVdvwIY6w=="], + + "@scure/base": ["@scure/base@1.2.1", "", {}, "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ=="], + + "@scure/bip32": ["@scure/bip32@1.1.5", "", { "dependencies": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", "@scure/base": "~1.1.0" } }, "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw=="], + + "@scure/bip39": ["@scure/bip39@1.1.1", "", { "dependencies": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" } }, "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg=="], + + "@scure/starknet": ["@scure/starknet@1.1.0", "", { "dependencies": { "@noble/curves": "~1.7.0", "@noble/hashes": "~1.6.0" } }, "sha512-83g3M6Ix2qRsPN4wqLDqiRZ2GBNbjVWfboJE/9UjfG+MHr6oDSu/CWgy8hsBSJejr09DkkL+l0Ze4KVrlCIdtQ=="], + + "@sentry/core": ["@sentry/core@5.30.0", "", { "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", "tslib": "^1.9.3" } }, "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg=="], + + "@sentry/hub": ["@sentry/hub@5.30.0", "", { "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", "tslib": "^1.9.3" } }, "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ=="], + + "@sentry/minimal": ["@sentry/minimal@5.30.0", "", { "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", "tslib": "^1.9.3" } }, "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw=="], + + "@sentry/node": ["@sentry/node@5.30.0", "", { "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", "@sentry/tracing": "5.30.0", "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", "tslib": "^1.9.3" } }, "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg=="], + + "@sentry/tracing": ["@sentry/tracing@5.30.0", "", { "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", "tslib": "^1.9.3" } }, "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw=="], + + "@sentry/types": ["@sentry/types@5.30.0", "", {}, "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw=="], + + "@sentry/utils": ["@sentry/utils@5.30.0", "", { "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" } }, "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww=="], + + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@11.2.2", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw=="], + + "@sinonjs/samsam": ["@sinonjs/samsam@8.0.3", "", { "dependencies": { "@sinonjs/commons": "^3.0.1", "type-detect": "^4.1.0" } }, "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ=="], + + "@sinonjs/text-encoding": ["@sinonjs/text-encoding@0.7.3", "", {}, "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA=="], + + "@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="], + + "@solana/codecs-core": ["@solana/codecs-core@2.3.0", "", { "dependencies": { "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw=="], + + "@solana/codecs-numbers": ["@solana/codecs-numbers@2.3.0", "", { "dependencies": { "@solana/codecs-core": "2.3.0", "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg=="], + + "@solana/errors": ["@solana/errors@2.3.0", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^14.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ=="], + + "@solana/web3.js": ["@solana/web3.js@1.98.4", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw=="], + + "@starknet-io/starknet-types-07": ["@starknet-io/types-js@0.7.10", "", {}, "sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w=="], + + "@starknet-io/starknet-types-08": ["@starknet-io/types-js@0.8.4", "", {}, "sha512-0RZ3TZHcLsUTQaq1JhDSCM8chnzO4/XNsSCozwDET64JK5bjFDIf2ZUkta+tl5Nlbf4usoU7uZiDI/Q57kt2SQ=="], + + "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="], + + "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + + "@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@types/sinon": ["@types/sinon@17.0.4", "", { "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew=="], + + "@types/sinon-chai": ["@types/sinon-chai@4.0.0", "", { "dependencies": { "@types/chai": "*", "@types/sinon": "*" } }, "sha512-Uar+qk3TmeFsUWCwtqRNqNUE7vf34+MCJiQJR5M2rd4nCbhtE8RgTiHwN/mVwbfCjhmO6DiOel/MgzHkRMJJFg=="], + + "@types/sinonjs__fake-timers": ["@types/sinonjs__fake-timers@8.1.5", "", {}, "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ=="], + + "@types/uuid": ["@types/uuid@8.3.4", "", {}, "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw=="], + + "@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@yarnpkg/lockfile": ["@yarnpkg/lockfile@1.1.0", "", {}, "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ=="], + + "@zksync/contracts": ["era-contracts@github:matter-labs/era-contracts#446d391", {}, "matter-labs-era-contracts-446d391"], + + "JSONStream": ["JSONStream@1.3.2", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA=="], + + "abi-wan-kanabi": ["abi-wan-kanabi@2.2.4", "", { "dependencies": { "ansicolors": "^0.3.2", "cardinal": "^2.1.1", "fs-extra": "^10.0.0", "yargs": "^17.7.2" }, "bin": { "generate": "dist/generate.js" } }, "sha512-0aA81FScmJCPX+8UvkXLki3X1+yPQuWxEkqXBVKltgPAK79J+NB+Lp5DouMXa7L6f+zcRlIA/6XO7BN/q9fnvg=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "adm-zip": ["adm-zip@0.4.16", "", {}, "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg=="], + + "aes-js": ["aes-js@3.0.0", "", {}, "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw=="], + + "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], + + "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], + + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], + + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ansicolors": ["ansicolors@0.3.2", "", {}, "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], + + "assertion-error": ["assertion-error@1.1.0", "", {}, "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="], + + "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], + + "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axios": ["axios@1.12.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="], + + "bech32": ["bech32@1.1.4", "", {}, "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ=="], + + "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="], + + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "bn.js": ["bn.js@5.2.2", "", {}, "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw=="], + + "borsh": ["borsh@0.7.0", "", { "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", "text-encoding-utf-8": "^1.0.2" } }, "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA=="], + + "boxen": ["boxen@5.1.2", "", { "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" } }, "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ=="], + + "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], + + "browser-stdout": ["browser-stdout@1.3.1", "", {}, "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="], + + "bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-alloc": ["buffer-alloc@1.2.0", "", { "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" } }, "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow=="], + + "buffer-alloc-unsafe": ["buffer-alloc-unsafe@1.1.0", "", {}, "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="], + + "buffer-fill": ["buffer-fill@1.0.0", "", {}, "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bufferutil": ["bufferutil@4.0.9", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw=="], + + "bufio": ["bufio@1.2.3", "", {}, "sha512-5Tt66bRzYUSlVZatc0E92uDenreJ+DpTBmSAUwL4VSxJn3e6cUyYwx+PoqML0GRZatgA/VX8ybhxItF8InZgqA=="], + + "buildcheck": ["buildcheck@0.0.6", "", {}, "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A=="], + + "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "cardinal": ["cardinal@2.1.1", "", { "dependencies": { "ansicolors": "~0.3.2", "redeyed": "~2.1.0" }, "bin": { "cdl": "./bin/cdl.js" } }, "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw=="], + + "cbor": ["cbor@9.0.2", "", { "dependencies": { "nofilter": "^3.1.0" } }, "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ=="], + + "chai": ["chai@4.5.0", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.1.0" } }, "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chardet": ["chardet@2.1.0", "", {}, "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA=="], + + "check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="], + + "cli-boxes": ["cli-boxes@2.2.1", "", {}, "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "command-exists": ["command-exists@1.2.9", "", {}, "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w=="], + + "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "concat-stream": ["concat-stream@1.6.2", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="], + + "cookie": ["cookie@0.4.2", "", {}, "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cpu-features": ["cpu-features@0.0.10", "", { "dependencies": { "buildcheck": "~0.0.6", "nan": "^2.19.0" } }, "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA=="], + + "cross-spawn": ["cross-spawn@6.0.6", "", { "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw=="], + + "dataloader": ["dataloader@1.4.0", "", {}, "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decamelize": ["decamelize@4.0.0", "", {}, "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ=="], + + "deep-eql": ["deep-eql@4.1.4", "", { "dependencies": { "type-detect": "^4.0.0" } }, "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "delay": ["delay@5.0.0", "", {}, "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], + + "diff": ["diff@5.2.0", "", {}, "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "docker-modem": ["docker-modem@5.0.6", "", { "dependencies": { "debug": "^4.1.1", "readable-stream": "^3.5.0", "split-ca": "^1.0.1", "ssh2": "^1.15.0" } }, "sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ=="], + + "dockerode": ["dockerode@4.0.8", "", { "dependencies": { "@balena/dockerignore": "^1.0.2", "@grpc/grpc-js": "^1.11.1", "@grpc/proto-loader": "^0.7.13", "docker-modem": "^5.0.6", "protobufjs": "^7.3.2", "tar-fs": "~2.1.3", "uuid": "^10.0.0" } }, "sha512-HdPBprWmwfHMHi12AVIFDhXIqIS+EpiOVkZaAZxgML4xf5McqEZjJZtahTPkLDxWOt84ApfWPAH9EoQwOiaAIQ=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "elliptic": ["elliptic@6.6.1", "", { "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" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], + + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="], + + "es6-promisify": ["es6-promisify@5.0.0", "", { "dependencies": { "es6-promise": "^4.0.3" } }, "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "ethereum-cryptography": ["ethereum-cryptography@1.2.0", "", { "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", "@scure/bip32": "1.1.5", "@scure/bip39": "1.1.1" } }, "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw=="], + + "ethers": ["ethers@5.8.0", "", { "dependencies": { "@ethersproject/abi": "5.8.0", "@ethersproject/abstract-provider": "5.8.0", "@ethersproject/abstract-signer": "5.8.0", "@ethersproject/address": "5.8.0", "@ethersproject/base64": "5.8.0", "@ethersproject/basex": "5.8.0", "@ethersproject/bignumber": "5.8.0", "@ethersproject/bytes": "5.8.0", "@ethersproject/constants": "5.8.0", "@ethersproject/contracts": "5.8.0", "@ethersproject/hash": "5.8.0", "@ethersproject/hdnode": "5.8.0", "@ethersproject/json-wallets": "5.8.0", "@ethersproject/keccak256": "5.8.0", "@ethersproject/logger": "5.8.0", "@ethersproject/networks": "5.8.0", "@ethersproject/pbkdf2": "5.8.0", "@ethersproject/properties": "5.8.0", "@ethersproject/providers": "5.8.0", "@ethersproject/random": "5.8.0", "@ethersproject/rlp": "5.8.0", "@ethersproject/sha2": "5.8.0", "@ethersproject/signing-key": "5.8.0", "@ethersproject/solidity": "5.8.0", "@ethersproject/strings": "5.8.0", "@ethersproject/transactions": "5.8.0", "@ethersproject/units": "5.8.0", "@ethersproject/wallet": "5.8.0", "@ethersproject/web": "5.8.0", "@ethersproject/wordlists": "5.8.0" } }, "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="], + + "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], + + "eyes": ["eyes@0.1.8", "", {}, "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], + + "fast-stable-stringify": ["fast-stable-stringify@1.0.0", "", {}, "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag=="], + + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "find-yarn-workspace-root": ["find-yarn-workspace-root@2.0.0", "", { "dependencies": { "micromatch": "^4.0.2" } }, "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ=="], + + "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], + + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + + "fp-ts": ["fp-ts@1.19.3", "", {}, "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + + "fs-extra": ["fs-extra@11.3.2", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-func-name": ["get-func-name@2.0.2", "", {}, "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "hardhat": ["hardhat@2.26.3", "", { "dependencies": { "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", "@nomicfoundation/edr": "^0.11.3", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "adm-zip": "^0.4.16", "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", "boxen": "^5.1.2", "chokidar": "^4.0.0", "ci-info": "^2.0.0", "debug": "^4.1.1", "enquirer": "^2.3.0", "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "find-up": "^5.0.0", "fp-ts": "1.19.3", "fs-extra": "^7.0.1", "immutable": "^4.0.0-rc.12", "io-ts": "1.10.4", "json-stream-stringify": "^3.1.4", "keccak": "^3.0.2", "lodash": "^4.17.11", "micro-eth-signer": "^0.14.0", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", "picocolors": "^1.1.0", "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", "solc": "0.8.26", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", "tinyglobby": "^0.2.6", "tsort": "0.0.1", "undici": "^5.14.0", "uuid": "^8.3.2", "ws": "^7.4.6" }, "peerDependencies": { "ts-node": "*", "typescript": "*" }, "optionalPeers": ["ts-node", "typescript"], "bin": { "hardhat": "internal/cli/bootstrap.js" } }, "sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], + + "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + + "human-id": ["human-id@4.1.1", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg=="], + + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], + + "iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "immutable": ["immutable@4.3.7", "", {}, "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "io-ts": ["io-ts@1.10.4", "", { "dependencies": { "fp-ts": "^1.0.0" } }, "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-ci": ["is-ci@2.0.0", "", { "dependencies": { "ci-info": "^2.0.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="], + + "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], + + "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], + + "jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "js-sha3": ["js-sha3@0.8.0", "", {}, "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "json-stream-stringify": ["json-stream-stringify@3.1.6", "", {}, "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], + + "just-extend": ["just-extend@6.2.0", "", {}, "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw=="], + + "keccak": ["keccak@3.0.4", "", { "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", "readable-stream": "^3.6.0" } }, "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q=="], + + "klaw-sync": ["klaw-sync@6.0.0", "", { "dependencies": { "graceful-fs": "^4.1.11" } }, "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.clonedeep": ["lodash.clonedeep@4.5.0", "", {}, "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="], + + "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="], + + "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="], + + "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "lossless-json": ["lossless-json@4.2.0", "", {}, "sha512-bsHH3x+7acZfqokfn9Ks/ej96yF/z6oGGw1aBmXesq4r3fAjhdG4uYuqzDgZMk5g1CZUd5w3kwwIp9K1LOYUiA=="], + + "loupe": ["loupe@2.3.7", "", { "dependencies": { "get-func-name": "^2.0.1" } }, "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA=="], + + "lru_map": ["lru_map@0.3.3", "", {}, "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "memorystream": ["memorystream@0.3.1", "", {}, "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micro-eth-signer": ["micro-eth-signer@0.14.0", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "micro-packed": "~0.7.2" } }, "sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw=="], + + "micro-packed": ["micro-packed@0.7.3", "", { "dependencies": { "@scure/base": "~1.2.5" } }, "sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], + + "minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + + "mnemonist": ["mnemonist@0.38.5", "", { "dependencies": { "obliterator": "^2.0.0" } }, "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg=="], + + "mocha": ["mocha@10.8.2", "", { "dependencies": { "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", "chokidar": "^3.5.3", "debug": "^4.3.5", "diff": "^5.2.0", "escape-string-regexp": "^4.0.0", "find-up": "^5.0.0", "glob": "^8.1.0", "he": "^1.2.0", "js-yaml": "^4.1.0", "log-symbols": "^4.1.0", "minimatch": "^5.1.6", "ms": "^2.1.3", "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", "workerpool": "^6.5.1", "yargs": "^16.2.0", "yargs-parser": "^20.2.9", "yargs-unparser": "^2.0.0" }, "bin": { "mocha": "bin/mocha.js", "_mocha": "bin/_mocha" } }, "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nan": ["nan@2.23.0", "", {}, "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ=="], + + "nice-try": ["nice-try@1.0.5", "", {}, "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="], + + "nise": ["nise@6.1.1", "", { "dependencies": { "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "^13.0.1", "@sinonjs/text-encoding": "^0.7.3", "just-extend": "^6.2.0", "path-to-regexp": "^8.1.0" } }, "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g=="], + + "node-addon-api": ["node-addon-api@2.0.2", "", {}, "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + + "nofilter": ["nofilter@3.1.0", "", {}, "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "obliterator": ["obliterator@2.0.5", "", {}, "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw=="], + + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + + "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], + + "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="], + + "p-filter": ["p-filter@2.1.0", "", { "dependencies": { "p-map": "^2.0.0" } }, "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw=="], + + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], + + "pako": ["pako@2.1.0", "", {}, "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="], + + "patch-package": ["patch-package@6.5.1", "", { "dependencies": { "@yarnpkg/lockfile": "^1.1.0", "chalk": "^4.1.2", "cross-spawn": "^6.0.5", "find-yarn-workspace-root": "^2.0.0", "fs-extra": "^9.0.0", "is-ci": "^2.0.0", "klaw-sync": "^6.0.0", "minimist": "^1.2.6", "open": "^7.4.2", "rimraf": "^2.6.3", "semver": "^5.6.0", "slash": "^2.0.0", "tmp": "^0.0.33", "yaml": "^1.10.2" }, "bin": { "patch-package": "index.js" } }, "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathval": ["pathval@1.1.1", "", {}, "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], + + "pino": ["pino@8.21.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^1.2.0", "pino-std-serializers": "^6.0.0", "process-warning": "^3.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^3.7.0", "thread-stream": "^2.6.0" }, "bin": { "pino": "bin.js" } }, "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q=="], + + "pino-abstract-transport": ["pino-abstract-transport@1.2.0", "", { "dependencies": { "readable-stream": "^4.0.0", "split2": "^4.0.0" } }, "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q=="], + + "pino-std-serializers": ["pino-std-serializers@6.2.2", "", {}, "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "process-warning": ["process-warning@3.0.0", "", {}, "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ=="], + + "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], + + "protobufjs": ["protobufjs@7.5.4", "", { "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/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + + "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], + + "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="], + + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "readonly-date": ["readonly-date@1.0.0", "", {}, "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ=="], + + "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], + + "redeyed": ["redeyed@2.1.1", "", { "dependencies": { "esprima": "~4.0.0" } }, "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "resolve": ["resolve@1.17.0", "", { "dependencies": { "path-parse": "^1.0.6" } }, "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], + + "rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "scrypt-js": ["scrypt-js@3.0.1", "", {}, "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shebang-command": ["shebang-command@1.2.0", "", { "dependencies": { "shebang-regex": "^1.0.0" } }, "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="], + + "shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "sinon": ["sinon@18.0.1", "", { "dependencies": { "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "11.2.2", "@sinonjs/samsam": "^8.0.0", "diff": "^5.2.0", "nise": "^6.0.0", "supports-color": "^7" } }, "sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw=="], + + "sinon-chai": ["sinon-chai@3.7.0", "", { "peerDependencies": { "chai": "^4.0.0", "sinon": ">=4.0.0" } }, "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g=="], + + "slash": ["slash@2.0.0", "", {}, "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A=="], + + "slice-ansi": ["slice-ansi@4.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="], + + "solady": ["solady@0.0.182", "", {}, "sha512-FW6xo1akJoYpkXMzu58/56FcNU3HYYNamEbnFO3iSibXk0nSHo0DV2Gu/zI3FPg3So5CCX6IYli1TT1IWATnvg=="], + + "solc": ["solc@0.8.26", "", { "dependencies": { "command-exists": "^1.2.8", "commander": "^8.1.0", "follow-redirects": "^1.12.1", "js-sha3": "0.8.0", "memorystream": "^0.3.1", "semver": "^5.5.0", "tmp": "0.0.33" }, "bin": { "solcjs": "solc.js" } }, "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g=="], + + "sonic-boom": ["sonic-boom@3.8.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "spawndamnit": ["spawndamnit@3.0.1", "", { "dependencies": { "cross-spawn": "^7.0.5", "signal-exit": "^4.0.1" } }, "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg=="], + + "split-ca": ["split-ca@1.0.1", "", {}, "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "ssh2": ["ssh2@1.17.0", "", { "dependencies": { "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2" }, "optionalDependencies": { "cpu-features": "~0.0.10", "nan": "^2.23.0" } }, "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ=="], + + "stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="], + + "starknet": ["starknet@7.6.4", "", { "dependencies": { "@noble/curves": "1.7.0", "@noble/hashes": "1.6.0", "@scure/base": "1.2.1", "@scure/starknet": "1.1.0", "@starknet-io/starknet-types-07": "npm:@starknet-io/types-js@~0.7.10", "@starknet-io/starknet-types-08": "npm:@starknet-io/types-js@~0.8.4", "abi-wan-kanabi": "2.2.4", "lossless-json": "^4.0.1", "pako": "^2.0.4", "ts-mixer": "^6.0.3" } }, "sha512-FB20IaLCDbh/XomkB+19f5jmNxG+RzNdRO7QUhm7nfH81UPIt2C/MyWAlHCYkbv2wznSEb73wpxbp9tytokTgQ=="], + + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "stream-chain": ["stream-chain@2.2.5", "", {}, "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA=="], + + "stream-json": ["stream-json@1.9.1", "", { "dependencies": { "stream-chain": "^2.2.5" } }, "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "table": ["table@6.9.0", "", { "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" } }, "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A=="], + + "tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "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" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="], + + "text-encoding-utf-8": ["text-encoding-utf-8@1.0.2", "", {}, "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg=="], + + "thread-stream": ["thread-stream@2.7.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], + + "to-buffer": ["to-buffer@1.2.1", "", { "dependencies": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", "typed-array-buffer": "^1.0.3" } }, "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "ts-mixer": ["ts-mixer@6.0.4", "", {}, "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="], + + "tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "tsort": ["tsort@0.0.1", "", {}, "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw=="], + + "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], + + "type-detect": ["type-detect@4.1.0", "", {}, "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw=="], + + "type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], + + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], + + "undici": ["undici@6.21.3", "", {}, "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw=="], + + "undici-types": ["undici-types@7.12.0", "", {}, "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "widest-line": ["widest-line@3.1.0", "", { "dependencies": { "string-width": "^4.0.0" } }, "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg=="], + + "workerpool": ["workerpool@6.5.1", "", {}, "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yaml": ["yaml@2.4.5", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg=="], + + "yargs": ["yargs@17.7.2", "", { "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.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + + "yargs-unparser": ["yargs-unparser@2.0.0", "", { "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" } }, "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "@arbitrum/nitro-contracts/@openzeppelin/contracts": ["@openzeppelin/contracts@4.5.0", "", {}, "sha512-fdkzKPYMjrRiPK6K4y64e6GzULR7R7RwxSigHS8DDp7aWDeoReqsQI+cxHV1UuhAqX69L1lAaWDxenfP+xiqzA=="], + + "@arbitrum/nitro-contracts/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.5.2", "", {}, "sha512-xgWZYaPlrEOQo3cBj97Ufiuv79SPd8Brh4GcFYhPgb6WvAq4ppz8dWKL6h+jLAK01rUqMRp/TS9AdXgAeNvCLA=="], + + "@chainlink/contracts/@arbitrum/nitro-contracts": ["@arbitrum/nitro-contracts@3.0.0", "", { "dependencies": { "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "4.7.3", "@openzeppelin/contracts-upgradeable": "4.7.3", "patch-package": "^6.4.7", "solady": "0.0.182" } }, "sha512-7VzNW9TxvrX9iONDDsi7AZlEUPa6z+cjBkB4Mxlnog9VQZAapRC3CdRXyUzHnBYmUhRzyNJdyxkWPw59QGcLmA=="], + + "@chainlink/contracts/@changesets/cli": ["@changesets/cli@2.28.1", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.10", "@changesets/assemble-release-plan": "^6.0.6", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.1", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.8", "@changesets/git": "^3.0.2", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "external-editor": "^3.1.0", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA=="], + + "@changesets/apply-release-plan/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "@changesets/cli/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "@changesets/config/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "@changesets/parse/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "@changesets/pre/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "@changesets/read/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "@changesets/write/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "@ethereumjs/util/ethereum-cryptography": ["ethereum-cryptography@2.2.1", "", { "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", "@scure/bip32": "1.4.0", "@scure/bip39": "1.3.0" } }, "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg=="], + + "@hyperlane-xyz/utils/bech32": ["bech32@2.0.0", "", {}, "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="], + + "@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@manypkg/get-packages/@changesets/types": ["@changesets/types@4.1.0", "", {}, "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw=="], + + "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@matterlabs/hardhat-zksync-verify/@ethersproject/address": ["@ethersproject/address@5.7.0", "", { "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" } }, "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA=="], + + "@nomicfoundation/hardhat-verify/cbor": ["cbor@8.1.0", "", { "dependencies": { "nofilter": "^3.1.0" } }, "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg=="], + + "@nomicfoundation/hardhat-verify/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@nomicfoundation/hardhat-verify/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + + "@nomiclabs/hardhat-docker/dockerode": ["dockerode@2.5.8", "", { "dependencies": { "concat-stream": "~1.6.2", "docker-modem": "^1.0.8", "tar-fs": "~1.16.3" } }, "sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw=="], + + "@nomiclabs/hardhat-docker/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "@offchainlabs/upgrade-executor/@openzeppelin/contracts": ["@openzeppelin/contracts@4.7.3", "", {}, "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw=="], + + "@offchainlabs/upgrade-executor/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.7.3", "", {}, "sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A=="], + + "@scure/bip32/@noble/hashes": ["@noble/hashes@1.2.0", "", {}, "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ=="], + + "@scure/bip32/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], + + "@scure/bip39/@noble/hashes": ["@noble/hashes@1.2.0", "", {}, "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ=="], + + "@scure/bip39/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], + + "@sinonjs/commons/type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + + "@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "@solana/errors/commander": ["commander@14.0.1", "", {}, "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A=="], + + "@swc/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "abi-wan-kanabi/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "boxen/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + + "concat-stream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "cross-spawn/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "docker-modem/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "dockerode/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + + "elliptic/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], + + "ethereum-cryptography/@noble/hashes": ["@noble/hashes@1.2.0", "", {}, "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ=="], + + "external-editor/chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], + + "external-editor/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "hardhat/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], + + "hardhat/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "hardhat/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "hardhat/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], + + "hardhat/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "is-ci/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], + + "jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "keccak/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "micro-eth-signer/@noble/curves": ["@noble/curves@1.8.2", "", { "dependencies": { "@noble/hashes": "1.7.2" } }, "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g=="], + + "micro-eth-signer/@noble/hashes": ["@noble/hashes@1.7.2", "", {}, "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ=="], + + "micro-packed/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "mocha/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "mocha/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], + + "mocha/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "mocha/yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + + "nise/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "p-filter/p-map": ["p-map@2.1.0", "", {}, "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="], + + "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "patch-package/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "patch-package/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "patch-package/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "protobufjs/@types/node": ["@types/node@24.5.0", "", { "dependencies": { "undici-types": "~7.12.0" } }, "sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg=="], + + "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "read-yaml-file/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "rpc-websockets/@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "solc/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + + "solc/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "spawndamnit/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "spawndamnit/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "stacktrace-parser/type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], + + "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "@chainlink/contracts/@arbitrum/nitro-contracts/@openzeppelin/contracts": ["@openzeppelin/contracts@4.7.3", "", {}, "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw=="], + + "@chainlink/contracts/@arbitrum/nitro-contracts/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.7.3", "", {}, "sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A=="], + + "@chainlink/contracts/@changesets/cli/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "@changesets/apply-release-plan/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@changesets/apply-release-plan/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@changesets/cli/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@changesets/cli/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@changesets/config/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@changesets/config/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@changesets/parse/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "@changesets/pre/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@changesets/pre/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@changesets/read/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@changesets/read/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@changesets/write/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@changesets/write/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@ethereumjs/util/ethereum-cryptography/@noble/curves": ["@noble/curves@1.4.2", "", { "dependencies": { "@noble/hashes": "1.4.0" } }, "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw=="], + + "@ethereumjs/util/ethereum-cryptography/@noble/hashes": ["@noble/hashes@1.4.0", "", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="], + + "@ethereumjs/util/ethereum-cryptography/@scure/bip32": ["@scure/bip32@1.4.0", "", { "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" } }, "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg=="], + + "@ethereumjs/util/ethereum-cryptography/@scure/bip39": ["@scure/bip39@1.3.0", "", { "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" } }, "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ=="], + + "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "@manypkg/find-root/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@manypkg/find-root/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@manypkg/get-packages/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@manypkg/get-packages/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@nomiclabs/hardhat-docker/dockerode/docker-modem": ["docker-modem@1.0.9", "", { "dependencies": { "JSONStream": "1.3.2", "debug": "^3.2.6", "readable-stream": "~1.0.26-4", "split-ca": "^1.0.0" } }, "sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw=="], + + "@nomiclabs/hardhat-docker/dockerode/tar-fs": ["tar-fs@1.16.5", "", { "dependencies": { "chownr": "^1.0.1", "mkdirp": "^0.5.1", "pump": "^1.0.0", "tar-stream": "^1.1.2" } }, "sha512-1ergVCCysmwHQNrOS+Pjm4DQ4nrGp43+Xnu4MRGjCnQu/m3hEgLNS78d5z+B8OJ1hN5EejJdCSFZE1oM6AQXAQ=="], + + "@nomiclabs/hardhat-docker/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@nomiclabs/hardhat-docker/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "concat-stream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "concat-stream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "hardhat/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "hardhat/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "mocha/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "mocha/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + + "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "spawndamnit/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "spawndamnit/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "spawndamnit/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "@chainlink/contracts/@changesets/cli/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@chainlink/contracts/@changesets/cli/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@ethereumjs/util/ethereum-cryptography/@scure/bip32/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], + + "@ethereumjs/util/ethereum-cryptography/@scure/bip39/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], + + "@manypkg/find-root/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "@nomiclabs/hardhat-docker/dockerode/docker-modem/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "@nomiclabs/hardhat-docker/dockerode/docker-modem/readable-stream": ["readable-stream@1.0.34", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg=="], + + "@nomiclabs/hardhat-docker/dockerode/tar-fs/pump": ["pump@1.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw=="], + + "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream": ["tar-stream@1.6.2", "", { "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", "end-of-stream": "^1.0.0", "fs-constants": "^1.0.0", "readable-stream": "^2.3.0", "to-buffer": "^1.1.1", "xtend": "^4.0.0" } }, "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A=="], + + "mocha/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "spawndamnit/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "@nomiclabs/hardhat-docker/dockerode/docker-modem/readable-stream/isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], + + "@nomiclabs/hardhat-docker/dockerode/docker-modem/readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], + + "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/bl": ["bl@1.2.3", "", { "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" } }, "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww=="], + + "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + } +} diff --git a/contracts/package.json b/contracts/package.json new file mode 100644 index 00000000..f4a3dda4 --- /dev/null +++ b/contracts/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "@hyperlane-xyz/core": "9.0.9" + } +} + From c4d527ecbafb2baac079fadd0be6350deedeec6f Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Tue, 23 Sep 2025 13:50:10 +0200 Subject: [PATCH 04/34] commit WIP adding deployment scripts and USDN utils to deploy an adjusted version of NobleDollar --- contracts/.gitignore | 10 +- contracts/HyperlaneEntrypoint.sol | 85 -- contracts/HyperlaneInterfaces.sol | 29 - contracts/Makefile | 26 +- contracts/README.md | 36 + contracts/bun.lock | 792 +++++++++++++++++- contracts/foundry.toml | 8 + contracts/package.json | 15 +- ...rlane-xyz%2Fcore@8.0.0-stillmintable.patch | 42 + .../patches/@hyperlane-xyz%2Fcore@8.0.0.patch | 67 ++ .../script/DeployHyperlaneEntrypoint.s.sol | 30 + contracts/script/DeployNobleDollar.s.sol | 42 + contracts/script/SendForwardedTransfer.s.sol | 37 + contracts/src/HyperlaneEntrypoint.sol | 49 ++ contracts/src/usdn/OrbiterTransientStore.sol | 38 + contracts/src/usdn/USDNHyperlaneOrbiter.sol | 291 +++++++ contracts/src/usdn/utils/IndexingMath.sol | 103 +++ contracts/src/usdn/utils/UintMath.sol | 39 + 18 files changed, 1581 insertions(+), 158 deletions(-) delete mode 100644 contracts/HyperlaneEntrypoint.sol delete mode 100644 contracts/HyperlaneInterfaces.sol create mode 100644 contracts/README.md create mode 100644 contracts/foundry.toml create mode 100644 contracts/patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch create mode 100644 contracts/patches/@hyperlane-xyz%2Fcore@8.0.0.patch create mode 100644 contracts/script/DeployHyperlaneEntrypoint.s.sol create mode 100644 contracts/script/DeployNobleDollar.s.sol create mode 100644 contracts/script/SendForwardedTransfer.s.sol create mode 100644 contracts/src/HyperlaneEntrypoint.sol create mode 100644 contracts/src/usdn/OrbiterTransientStore.sol create mode 100644 contracts/src/usdn/USDNHyperlaneOrbiter.sol create mode 100644 contracts/src/usdn/utils/IndexingMath.sol create mode 100644 contracts/src/usdn/utils/UintMath.sol diff --git a/contracts/.gitignore b/contracts/.gitignore index 40b878db..5b97e985 100644 --- a/contracts/.gitignore +++ b/contracts/.gitignore @@ -1 +1,9 @@ -node_modules/ \ No newline at end of file +# dependencies +node_modules/ + +# compilation files +out/ +cache/ + +# foundry testing / script files +broadcast/ diff --git a/contracts/HyperlaneEntrypoint.sol b/contracts/HyperlaneEntrypoint.sol deleted file mode 100644 index cf08b73c..00000000 --- a/contracts/HyperlaneEntrypoint.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma Solidity ^v0.8.13; - -import {ITokenRouter} from "./HyperlaneInterfaces.sol"; - -/* - * @dev The canonical entrypoint contract to use Noble's Orbiter implementation through Hyperlane. - * - * The Orbiter (https://github.com/noble-assets/orbiter) allows to send cross-chain transfers - * using various bridge mechanisms, execute actions on the Noble blockchain (e.g. fee payments), - * and eventually forward the resulting assets to another destination through one of the available - * bridging mechanisms (e.g. IBC, CCTP). - * - * TODO: make upgradeable - */ -contract HyperlaneEntrypoint { - // The canonical mailbox to dispatch orbiter messages. - // - // TODO: check if should be public and immutable? - IMailbox public immutable mailbox; - - // TODO: add constructor logic - constructor(address _mailbox) { - mailbox = IMailbox(_mailbox); - } - - // TODO: add initialize function so we can use an upgradeable proxy? - function initialize( - address mailbox - ) external initializer { - __Ownable_init(); - } - - /* - * @dev Send an asset transfer to the Orbiter, that should be forwarded to another Hyperlane domain. - */ - function sendWithForwardThroughHyperlane( - uint32 destinationDomain, - bytes32 recipient, - uint256 amount - ) external returns (bytes32 messageID) { - ITokenRouter token = new ITokenRouter(tokenAddress); - bytes32 warpMessageID = token.remoteTransfer( - - ); - - bytes32 orbiterMessageID = sendHyperlaneForwardInformation( - warpMessageID, - orbiterPayload - ); - - mailbox.dispatch( - - ) - } - - /* @dev Packs the given attributes into a bytes array. - * - * This metadata is used to be passed as payload bytes to the Orbiter implementation - * via the Hyperlane protocol. - * - * TODO: check if used types are correct. - */ - function packHyperlaneForwardingAttributes( - bytes32 tokenID, // checked - uint32 destDomain, // checked - bytes32 recipient, // checked - bytes32 customHookID, // TODO: maybe instead use the IPostDispatchHook thing here? - string memory customHookMetadata, - uint256 gasLimit, // checked - uint256 maxFeeAmount, // checked - string memory maxFeeDenom // TODO: even pass this? Shouldn't just the denom on Noble be used? - ) internal returns (bytes memory) { - return abi.encode( - tokenID, - destDomain, - recipient, - customHookID, - gasLimit, - maxFeeAmount, - maxFeeDenom, - customHookMetadata - ); - } -} \ No newline at end of file diff --git a/contracts/HyperlaneInterfaces.sol b/contracts/HyperlaneInterfaces.sol deleted file mode 100644 index 45b84084..00000000 --- a/contracts/HyperlaneInterfaces.sol +++ /dev/null @@ -1,29 +0,0 @@ -/* - * @dev Contains the required interface to send tokens through a Hyperlane Warp Route. - */ -interface ITokenRouter { - // https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/token/libs/TokenRouter.sol#L45-L61 - function transferRemote( - uint32 _destination, - bytes32 _recipient, - uint256 _amountOrId - ) external payable virtual returns ( - bytes32 messageId - ); - - // TODO: add option for transfer with hook metadata? -} - -/* - * @dev Contains the required interface to dispatch messages using the Hyperlane protocol. - */ -interface IMailbox { - // https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/Mailbox.sol#L102-L123 - function dispatch( - uint32 _destinationDomain, - bytes32 _recipientAddress, - bytes calldata _messageBody - ) external payable override returns (bytes32); - - // TODO: add option for dispatch with hook metadata? -} diff --git a/contracts/Makefile b/contracts/Makefile index d05bf96e..c79b4b1e 100644 --- a/contracts/Makefile +++ b/contracts/Makefile @@ -1,25 +1,9 @@ -all: deps compile +.PHONY: all deps compile -compile: compile-go-bindings +all: deps compile -SOLIDITY_VERSION := "0.8.13" -SOLC_IMAGE := "ethereum/solc:$(SOLIDITY_VERSION)" -compile-go-bindings: - docker run --rm \ - -v $(PWD):/workspace \ - -w /workspace \ - $(SOLC_IMAGE) \ - --abi --bin --overwrite \ - -o /workspace/build \ - /workspace/HyperlaneEntrypoint.sol - docker run --rm \ - -v $(PWD):/workspace \ - -w /workspace \ - ethereum/client-go:alltools-v1.13.0 \ - abigen --abi=/workspace/build/HyperlaneEntrypoint.abi \ - --bin=/workspace/build/HyperlaneEntrypoint.bin \ - --pkg=contracts \ - --out=/workspace/HyperlaneEntrypoint.go +compile: + @forge compile deps: - bun install + @bun install diff --git a/contracts/README.md b/contracts/README.md new file mode 100644 index 00000000..ab28519b --- /dev/null +++ b/contracts/README.md @@ -0,0 +1,36 @@ +# Orbiter Entrypoint Contracts + +This directory contains the entrypoint contracts for interacting with the Orbiter system +through smart contracts on an EVM chain. + +## Requirements + +To use this repository, you need the following software installed: + +- `bun` +- `foundry` + +## Dependencies + +To download the required dependencies, run: + +```shell +make deps +``` + +## Compile contracts + +To compile the contracts, run: + +```shell +make compile +``` + +## Things To Note + +The `NobleDollar` contract was taken from this commit on the Dollar repository: +https://github.com/noble-assets/dollar/tree/b84f0bb4a0c8058e073c20b523513920b7870b0b + +To have some initial supply of tokens available for testing, +I have changed the `patched` dependencies to still allow +setting a `_totalSupply` that gets minted to the owner. diff --git a/contracts/bun.lock b/contracts/bun.lock index 99c7a433..40683e35 100644 --- a/contracts/bun.lock +++ b/contracts/bun.lock @@ -2,14 +2,22 @@ "lockfileVersion": 1, "workspaces": { "": { - "dependencies": { - "@hyperlane-xyz/core": "9.0.9", + "devDependencies": { + "@hyperlane-xyz/core": "8.0.0", + "@openzeppelin/contracts": "5.3.0", + "@openzeppelin/contracts-upgradeable": "5.3.0", + "forge-std": "github:foundry-rs/forge-std#v1.9.7", }, }, }, + "patchedDependencies": { + "@hyperlane-xyz/core@8.0.0": "patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch", + }, "packages": { "@arbitrum/nitro-contracts": ["@arbitrum/nitro-contracts@1.3.0", "", { "dependencies": { "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", "patch-package": "^6.4.7" } }, "sha512-nNNOgqqyiOxFiF1k53u0upC6tRWar1aj2arRZoE8C99/0eMnWk9az6rUO1yhxgMyMmk5fx9Pg42oSsZ9H7noOg=="], + "@axelar-network/axelar-gmp-sdk-solidity": ["@axelar-network/axelar-gmp-sdk-solidity@5.10.0", "", {}, "sha512-s8SImALvYB+5AeiT3tbfWNBI2Mhqw1x91i/zM3DNpVUCnAR2HKtsB9T84KnUn/OJjOVgb4h0lv7q9smeYniRPw=="], + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], "@balena/dockerignore": ["@balena/dockerignore@1.0.2", "", {}, "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q=="], @@ -126,18 +134,26 @@ "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], - "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], + "@grpc/grpc-js": ["@grpc/grpc-js@1.14.0", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg=="], "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], - "@hyperlane-xyz/core": ["@hyperlane-xyz/core@9.0.9", "", { "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@chainlink/contracts-ccip": "^1.5.0", "@eth-optimism/contracts": "^0.6.0", "@hyperlane-xyz/utils": "18.2.0", "@matterlabs/hardhat-zksync-solc": "1.2.5", "@matterlabs/hardhat-zksync-verify": "1.7.1", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^4.9.3" }, "peerDependencies": { "@ethersproject/abi": "*", "@ethersproject/providers": "*", "@types/sinon-chai": "*" } }, "sha512-FM6oeOGjN54NO0pIKDmbpgn/Cg/BwEOFHcGqKBA4Wldhy46KcV2e6aq5SRvlOAkmC6gNA5htzpTsM4dZ1fSwvA=="], + "@hyperlane-xyz/core": ["@hyperlane-xyz/core@8.0.0", "", { "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@chainlink/contracts-ccip": "^1.5.0", "@eth-optimism/contracts": "^0.6.0", "@hyperlane-xyz/utils": "13.3.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@matterlabs/hardhat-zksync-solc": "1.2.5", "@matterlabs/hardhat-zksync-verify": "1.7.1", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^4.9.3", "fx-portal": "^1.0.3" }, "peerDependencies": { "@ethersproject/abi": "*", "@ethersproject/providers": "*", "@types/sinon-chai": "*" } }, "sha512-ydZrmUEV9HnlPTiN3Gal1EdOoHN+2nCFhcYV+yBmw2cPgCFu9IN13foDmGk00a6p4NKDOPV2bItKZSOXfYkmXA=="], - "@hyperlane-xyz/utils": ["@hyperlane-xyz/utils@18.2.0", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", "bech32": "^2.0.0", "bignumber.js": "^9.1.1", "ethers": "^5.8.0", "lodash-es": "^4.17.21", "pino": "^8.19.0", "starknet": "^7.4.0", "yaml": "2.4.5" }, "peerDependencies": { "@google-cloud/pino-logging-gcp-config": "^1.0.6", "pino-pretty": ">=10.0.0" }, "optionalPeers": ["@google-cloud/pino-logging-gcp-config", "pino-pretty"] }, "sha512-Y0amJTjE9Sly0bOFUYL6yjOPnIov9yQvCkaOFlY/ZaQBm5uy3213IHaiOVvUmXP5ZNYL4UW6t5TR/kLpAdOAUA=="], + "@hyperlane-xyz/utils": ["@hyperlane-xyz/utils@13.3.0", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", "bignumber.js": "^9.1.1", "ethers": "^5.8.0", "lodash-es": "^4.17.21", "pino": "^8.19.0", "starknet": "^6.24.1", "yaml": "2.4.5" } }, "sha512-AzgmFHqocRZTa7+Z3WiUKyHmHv6iQ1AmbJu4Xw0yZ11S++p7Up4QNeeQ22eiC10TXI86D9B1sdTgqroAcN6vow=="], "@inquirer/external-editor": ["@inquirer/external-editor@1.0.2", "", { "dependencies": { "chardet": "^2.1.0", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ=="], "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + "@layerzerolabs/lz-evm-messagelib-v2": ["@layerzerolabs/lz-evm-messagelib-v2@2.3.44", "", { "peerDependencies": { "@arbitrum/nitro-contracts": "^1.1.0", "@axelar-network/axelar-gmp-sdk-solidity": "^5.6.4", "@chainlink/contracts-ccip": "^0.7.6", "@eth-optimism/contracts": "^0.6.0", "@layerzerolabs/lz-evm-protocol-v2": "^2.3.44", "@layerzerolabs/lz-evm-v1-0.7": "^2.3.44", "@openzeppelin/contracts": "^4.8.1 || ^5.0.0", "@openzeppelin/contracts-upgradeable": "^4.8.1 || ^5.0.0", "hardhat-deploy": "^0.12.4", "solidity-bytes-utils": "^0.8.0" }, "optionalPeers": ["@arbitrum/nitro-contracts"] }, "sha512-2HZMjV0KZH0e3W2KL/H8HvE3I7QMJw1no46IQ5LpGSvxIm5Ri45tnQAynbmEbRyKXrRSP3Brkvkc2U7VrfZ/Cg=="], + + "@layerzerolabs/lz-evm-oapp-v2": ["@layerzerolabs/lz-evm-oapp-v2@2.0.2", "", { "dependencies": { "@layerzerolabs/lz-evm-messagelib-v2": "^2.0.2", "@layerzerolabs/lz-evm-protocol-v2": "^2.0.2", "@layerzerolabs/lz-evm-v1-0.7": "^2.0.2" }, "peerDependencies": { "solidity-bytes-utils": "^0.8.0" } }, "sha512-50hG8BKa1ywobIt2UVjI3ePQO9XBy6uT9YCN9i5IBfX6WrSZevPyDtL8OayzKtRQgkKTvprC82bdGzAoqh2RUw=="], + + "@layerzerolabs/lz-evm-protocol-v2": ["@layerzerolabs/lz-evm-protocol-v2@2.3.44", "", { "peerDependencies": { "@openzeppelin/contracts": "^4.8.1 || ^5.0.0", "@openzeppelin/contracts-upgradeable": "^4.8.1 || ^5.0.0", "hardhat-deploy": "^0.12.4", "solidity-bytes-utils": "^0.8.0" } }, "sha512-oNtwl4HGCogFVOr45T3FfrkB0/CRW2eGAEScBw/FY/6mlncnS4dqlvrCJ3SFlK17cu1w9q0ztD3NzS9sUrb7vw=="], + + "@layerzerolabs/lz-evm-v1-0.7": ["@layerzerolabs/lz-evm-v1-0.7@2.3.44", "", { "peerDependencies": { "@openzeppelin/contracts": "3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0", "@openzeppelin/contracts-upgradeable": "3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0", "hardhat-deploy": "^0.12.4" } }, "sha512-gxPUv5yk5TLy4Rp4KwFqiPHGpVOPMtnwUi+LvRysnGgkqopOJRCzzvWqEv6M2YMUAsof+Vmr3UYWxKcilvv97g=="], + "@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA=="], "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="], @@ -146,9 +162,9 @@ "@matterlabs/hardhat-zksync-verify": ["@matterlabs/hardhat-zksync-verify@1.7.1", "", { "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/address": "5.7.0", "@matterlabs/hardhat-zksync-solc": "^1.2.5", "@nomicfoundation/hardhat-verify": "^2.0.8", "axios": "^1.7.2", "cbor": "^9.0.2", "chai": "^4.3.4", "chalk": "^4.1.2", "debug": "^4.3.5", "semver": "^7.6.2", "sinon": "^18.0.0", "sinon-chai": "^3.7.0" }, "peerDependencies": { "hardhat": "^2.22.5" } }, "sha512-FtibELgllkyAZORDW4/s/7XSC5DaqAXG0KXMqGipQyXuIXQ9l1kpaHMpoEtHvQL7xxmkgZqCcSZgATnKl91nDg=="], - "@noble/curves": ["@noble/curves@1.7.0", "", { "dependencies": { "@noble/hashes": "1.6.0" } }, "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw=="], + "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - "@noble/hashes": ["@noble/hashes@1.6.0", "", {}, "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ=="], + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], "@noble/secp256k1": ["@noble/secp256k1@1.7.1", "", {}, "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw=="], @@ -196,9 +212,9 @@ "@offchainlabs/upgrade-executor": ["@offchainlabs/upgrade-executor@1.1.0-beta.0", "", { "dependencies": { "@openzeppelin/contracts": "4.7.3", "@openzeppelin/contracts-upgradeable": "4.7.3" } }, "sha512-mpn6PHjH/KDDjNX0pXHEKdyv8m6DVGQiI2nGzQn0JbM1nOSHJpWx6fvfjtH7YxHJ6zBZTcsKkqGkFKDtCfoSLw=="], - "@openzeppelin/contracts": ["@openzeppelin/contracts@4.9.6", "", {}, "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA=="], + "@openzeppelin/contracts": ["@openzeppelin/contracts@5.3.0", "", {}, "sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA=="], - "@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.9.6", "", {}, "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA=="], + "@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@5.3.0", "", { "peerDependencies": { "@openzeppelin/contracts": "5.3.0" } }, "sha512-yVzSSyTMWO6rapGI5tuqkcLpcGGXA0UA1vScyV5EhE5yw8By3Ewex9rDUw8lfVw0iTkvR/egjfcW5vpk03lqZg=="], "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], @@ -262,10 +278,6 @@ "@solana/web3.js": ["@solana/web3.js@1.98.4", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw=="], - "@starknet-io/starknet-types-07": ["@starknet-io/types-js@0.7.10", "", {}, "sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w=="], - - "@starknet-io/starknet-types-08": ["@starknet-io/types-js@0.8.4", "", {}, "sha512-0RZ3TZHcLsUTQaq1JhDSCM8chnzO4/XNsSCozwDET64JK5bjFDIf2ZUkta+tl5Nlbf4usoU7uZiDI/Q57kt2SQ=="], - "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="], "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], @@ -276,6 +288,8 @@ "@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], + "@types/sinon": ["@types/sinon@17.0.4", "", { "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew=="], "@types/sinon-chai": ["@types/sinon-chai@4.0.0", "", { "dependencies": { "@types/chai": "*", "@types/sinon": "*" } }, "sha512-Uar+qk3TmeFsUWCwtqRNqNUE7vf34+MCJiQJR5M2rd4nCbhtE8RgTiHwN/mVwbfCjhmO6DiOel/MgzHkRMJJFg=="], @@ -480,6 +494,8 @@ "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "encode-utf8": ["encode-utf8@1.0.3", "", {}, "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="], + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], @@ -534,6 +550,8 @@ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + "fetch-cookie": ["fetch-cookie@3.0.1", "", { "dependencies": { "set-cookie-parser": "^2.4.8", "tough-cookie": "^4.0.0" } }, "sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q=="], + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], @@ -542,10 +560,14 @@ "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], + "fmix": ["fmix@0.1.0", "", { "dependencies": { "imul": "^1.0.0" } }, "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w=="], + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + "forge-std": ["forge-std@github:foundry-rs/forge-std#77041d2", {}, "foundry-rs-forge-std-77041d2"], + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], "fp-ts": ["fp-ts@1.19.3", "", {}, "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg=="], @@ -560,6 +582,8 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + "fx-portal": ["fx-portal@1.0.3", "", { "dependencies": { "@openzeppelin/contracts": "^4.2.0" } }, "sha512-wjjc/RQzHpjimeNVrOuLLwGBcjSzj0pTTaL26wAwTTrmaeeLrs2bcM4OldA0awZcaLqQXe3oQME8oC281jxzGw=="], + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], "get-func-name": ["get-func-name@2.0.2", "", {}, "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ=="], @@ -580,6 +604,8 @@ "hardhat": ["hardhat@2.26.3", "", { "dependencies": { "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", "@nomicfoundation/edr": "^0.11.3", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "adm-zip": "^0.4.16", "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", "boxen": "^5.1.2", "chokidar": "^4.0.0", "ci-info": "^2.0.0", "debug": "^4.1.1", "enquirer": "^2.3.0", "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "find-up": "^5.0.0", "fp-ts": "1.19.3", "fs-extra": "^7.0.1", "immutable": "^4.0.0-rc.12", "io-ts": "1.10.4", "json-stream-stringify": "^3.1.4", "keccak": "^3.0.2", "lodash": "^4.17.11", "micro-eth-signer": "^0.14.0", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", "picocolors": "^1.1.0", "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", "solc": "0.8.26", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", "tinyglobby": "^0.2.6", "tsort": "0.0.1", "undici": "^5.14.0", "uuid": "^8.3.2", "ws": "^7.4.6" }, "peerDependencies": { "ts-node": "*", "typescript": "*" }, "optionalPeers": ["ts-node", "typescript"], "bin": { "hardhat": "internal/cli/bootstrap.js" } }, "sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw=="], + "hardhat-deploy": ["hardhat-deploy@0.12.4", "", { "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/contracts": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@ethersproject/solidity": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/wallet": "^5.7.0", "@types/qs": "^6.9.7", "axios": "^0.21.1", "chalk": "^4.1.2", "chokidar": "^3.5.2", "debug": "^4.3.2", "enquirer": "^2.3.6", "ethers": "^5.7.0", "form-data": "^4.0.0", "fs-extra": "^10.0.0", "match-all": "^1.2.6", "murmur-128": "^0.2.1", "qs": "^6.9.4", "zksync-ethers": "^5.0.0" } }, "sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ=="], + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], @@ -612,6 +638,8 @@ "immutable": ["immutable@4.3.7", "", {}, "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw=="], + "imul": ["imul@1.0.1", "", {}, "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA=="], + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], @@ -652,6 +680,8 @@ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "isomorphic-fetch": ["isomorphic-fetch@3.0.0", "", { "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" } }, "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA=="], + "isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], "jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], @@ -700,6 +730,8 @@ "lru_map": ["lru_map@0.3.3", "", {}, "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ=="], + "match-all": ["match-all@1.2.7", "", {}, "sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], "memorystream": ["memorystream@0.3.1", "", {}, "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw=="], @@ -736,6 +768,8 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "murmur-128": ["murmur-128@0.2.1", "", { "dependencies": { "encode-utf8": "^1.0.2", "fmix": "^0.1.0", "imul": "^1.0.0" } }, "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg=="], + "nan": ["nan@2.23.0", "", {}, "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ=="], "nice-try": ["nice-try@1.0.5", "", {}, "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="], @@ -752,6 +786,8 @@ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + "obliterator": ["obliterator@2.0.5", "", {}, "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw=="], "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], @@ -822,10 +858,18 @@ "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], + "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], @@ -850,6 +894,8 @@ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], + "resolve": ["resolve@1.17.0", "", { "dependencies": { "path-parse": "^1.0.6" } }, "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w=="], "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], @@ -876,6 +922,8 @@ "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], @@ -884,6 +932,14 @@ "shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="], + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "sinon": ["sinon@18.0.1", "", { "dependencies": { "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "11.2.2", "@sinonjs/samsam": "^8.0.0", "diff": "^5.2.0", "nise": "^6.0.0", "supports-color": "^7" } }, "sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw=="], @@ -898,6 +954,8 @@ "solc": ["solc@0.8.26", "", { "dependencies": { "command-exists": "^1.2.8", "commander": "^8.1.0", "follow-redirects": "^1.12.1", "js-sha3": "0.8.0", "memorystream": "^0.3.1", "semver": "^5.5.0", "tmp": "0.0.33" }, "bin": { "solcjs": "solc.js" } }, "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g=="], + "solidity-bytes-utils": ["solidity-bytes-utils@0.8.4", "", {}, "sha512-/bjac5YR12i0plOKvGlhE51F5IWGP6rI8DJetCQlXcnwKWz/Hgf/vr+Qlk1BWz56xVcwVhmhCaDkTMnx5xvt0g=="], + "sonic-boom": ["sonic-boom@3.8.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg=="], "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -916,7 +974,9 @@ "stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="], - "starknet": ["starknet@7.6.4", "", { "dependencies": { "@noble/curves": "1.7.0", "@noble/hashes": "1.6.0", "@scure/base": "1.2.1", "@scure/starknet": "1.1.0", "@starknet-io/starknet-types-07": "npm:@starknet-io/types-js@~0.7.10", "@starknet-io/starknet-types-08": "npm:@starknet-io/types-js@~0.8.4", "abi-wan-kanabi": "2.2.4", "lossless-json": "^4.0.1", "pako": "^2.0.4", "ts-mixer": "^6.0.3" } }, "sha512-FB20IaLCDbh/XomkB+19f5jmNxG+RzNdRO7QUhm7nfH81UPIt2C/MyWAlHCYkbv2wznSEb73wpxbp9tytokTgQ=="], + "starknet": ["starknet@6.24.1", "", { "dependencies": { "@noble/curves": "1.7.0", "@noble/hashes": "1.6.0", "@scure/base": "1.2.1", "@scure/starknet": "1.1.0", "abi-wan-kanabi": "^2.2.3", "fetch-cookie": "~3.0.0", "isomorphic-fetch": "~3.0.0", "lossless-json": "^4.0.1", "pako": "^2.0.4", "starknet-types-07": "npm:@starknet-io/types-js@^0.7.10", "ts-mixer": "^6.0.3" } }, "sha512-g7tiCt73berhcNi41otlN3T3kxZnIvZhMi8WdC21Y6GC6zoQgbI2z1t7JAZF9c4xZiomlanwVnurcpyfEdyMpg=="], + + "starknet-types-07": ["@starknet-io/types-js@0.7.10", "", {}, "sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w=="], "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], @@ -940,7 +1000,7 @@ "table": ["table@6.9.0", "", { "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" } }, "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A=="], - "tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], + "tar-fs": ["tar-fs@2.1.4", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ=="], "tar-stream": ["tar-stream@2.2.0", "", { "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" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], @@ -962,6 +1022,8 @@ "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + "tough-cookie": ["tough-cookie@4.1.4", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="], + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], "ts-mixer": ["ts-mixer@6.0.4", "", {}, "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="], @@ -990,6 +1052,8 @@ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], + "utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="], "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], @@ -998,6 +1062,8 @@ "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], @@ -1028,6 +1094,8 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "zksync-ethers": ["zksync-ethers@5.10.0", "", { "dependencies": { "ethers": "~5.7.0" } }, "sha512-OAjTGAHF9wbdkRGkj7XZuF/a1Sk/FVbwH4pmLjAKlR7mJ7sQtQhBhrPU2dCc67xLaNvEESPfwil19ES5wooYFg=="], + "@arbitrum/nitro-contracts/@openzeppelin/contracts": ["@openzeppelin/contracts@4.5.0", "", {}, "sha512-fdkzKPYMjrRiPK6K4y64e6GzULR7R7RwxSigHS8DDp7aWDeoReqsQI+cxHV1UuhAqX69L1lAaWDxenfP+xiqzA=="], "@arbitrum/nitro-contracts/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.5.2", "", {}, "sha512-xgWZYaPlrEOQo3cBj97Ufiuv79SPd8Brh4GcFYhPgb6WvAq4ppz8dWKL6h+jLAK01rUqMRp/TS9AdXgAeNvCLA=="], @@ -1036,6 +1104,10 @@ "@chainlink/contracts/@changesets/cli": ["@changesets/cli@2.28.1", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.10", "@changesets/assemble-release-plan": "^6.0.6", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.1", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.8", "@changesets/git": "^3.0.2", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "external-editor": "^3.1.0", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA=="], + "@chainlink/contracts/@openzeppelin/contracts": ["@openzeppelin/contracts@4.9.6", "", {}, "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA=="], + + "@chainlink/contracts/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.9.6", "", {}, "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA=="], + "@changesets/apply-release-plan/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], "@changesets/cli/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], @@ -1052,7 +1124,11 @@ "@ethereumjs/util/ethereum-cryptography": ["ethereum-cryptography@2.2.1", "", { "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", "@scure/bip32": "1.4.0", "@scure/bip39": "1.3.0" } }, "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg=="], - "@hyperlane-xyz/utils/bech32": ["bech32@2.0.0", "", {}, "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="], + "@grpc/grpc-js/@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], + + "@hyperlane-xyz/core/@openzeppelin/contracts": ["@openzeppelin/contracts@4.9.6", "", {}, "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA=="], + + "@hyperlane-xyz/core/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.9.6", "", {}, "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA=="], "@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], @@ -1086,6 +1162,10 @@ "@scure/bip39/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], + "@scure/starknet/@noble/curves": ["@noble/curves@1.7.0", "", { "dependencies": { "@noble/hashes": "1.6.0" } }, "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw=="], + + "@scure/starknet/@noble/hashes": ["@noble/hashes@1.6.0", "", {}, "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ=="], + "@sinonjs/commons/type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], "@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], @@ -1094,6 +1174,10 @@ "@swc/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@types/connect/@types/node": ["@types/node@24.5.2", "", { "dependencies": { "undici-types": "~7.12.0" } }, "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ=="], + + "@types/ws/@types/node": ["@types/node@24.5.2", "", { "dependencies": { "undici-types": "~7.12.0" } }, "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ=="], + "abi-wan-kanabi/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -1120,6 +1204,8 @@ "external-editor/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + "fx-portal/@openzeppelin/contracts": ["@openzeppelin/contracts@4.9.6", "", {}, "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA=="], + "glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], @@ -1134,6 +1220,12 @@ "hardhat/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "hardhat-deploy/axios": ["axios@0.21.4", "", { "dependencies": { "follow-redirects": "^1.14.0" } }, "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg=="], + + "hardhat-deploy/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "hardhat-deploy/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + "is-ci/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], "jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], @@ -1168,7 +1260,7 @@ "patch-package/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], - "protobufjs/@types/node": ["@types/node@24.5.0", "", { "dependencies": { "undici-types": "~7.12.0" } }, "sha512-y1dMvuvJspJiPSDZUQ+WMBvF7dpnEqN4x9DDC9ie5Fs/HUZJA3wFp7EhHoVaKX/iI0cRoECV8X2jL8zi0xrHCg=="], + "protobufjs/@types/node": ["@types/node@24.5.2", "", { "dependencies": { "undici-types": "~7.12.0" } }, "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ=="], "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], @@ -1186,12 +1278,20 @@ "stacktrace-parser/type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], + "starknet/@noble/curves": ["@noble/curves@1.7.0", "", { "dependencies": { "@noble/hashes": "1.6.0" } }, "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw=="], + + "starknet/@noble/hashes": ["@noble/hashes@1.6.0", "", {}, "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ=="], + "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + "tough-cookie/universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], + "yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "zksync-ethers/ethers": ["ethers@5.7.2", "", { "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/address": "5.7.0", "@ethersproject/base64": "5.7.0", "@ethersproject/basex": "5.7.0", "@ethersproject/bignumber": "5.7.0", "@ethersproject/bytes": "5.7.0", "@ethersproject/constants": "5.7.0", "@ethersproject/contracts": "5.7.0", "@ethersproject/hash": "5.7.0", "@ethersproject/hdnode": "5.7.0", "@ethersproject/json-wallets": "5.7.0", "@ethersproject/keccak256": "5.7.0", "@ethersproject/logger": "5.7.0", "@ethersproject/networks": "5.7.1", "@ethersproject/pbkdf2": "5.7.0", "@ethersproject/properties": "5.7.0", "@ethersproject/providers": "5.7.2", "@ethersproject/random": "5.7.0", "@ethersproject/rlp": "5.7.0", "@ethersproject/sha2": "5.7.0", "@ethersproject/signing-key": "5.7.0", "@ethersproject/solidity": "5.7.0", "@ethersproject/strings": "5.7.0", "@ethersproject/transactions": "5.7.0", "@ethersproject/units": "5.7.0", "@ethersproject/wallet": "5.7.0", "@ethersproject/web": "5.7.1", "@ethersproject/wordlists": "5.7.0" } }, "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg=="], + "@chainlink/contracts/@arbitrum/nitro-contracts/@openzeppelin/contracts": ["@openzeppelin/contracts@4.7.3", "", {}, "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw=="], "@chainlink/contracts/@arbitrum/nitro-contracts/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.7.3", "", {}, "sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A=="], @@ -1244,7 +1344,7 @@ "@nomiclabs/hardhat-docker/dockerode/docker-modem": ["docker-modem@1.0.9", "", { "dependencies": { "JSONStream": "1.3.2", "debug": "^3.2.6", "readable-stream": "~1.0.26-4", "split-ca": "^1.0.0" } }, "sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw=="], - "@nomiclabs/hardhat-docker/dockerode/tar-fs": ["tar-fs@1.16.5", "", { "dependencies": { "chownr": "^1.0.1", "mkdirp": "^0.5.1", "pump": "^1.0.0", "tar-stream": "^1.1.2" } }, "sha512-1ergVCCysmwHQNrOS+Pjm4DQ4nrGp43+Xnu4MRGjCnQu/m3hEgLNS78d5z+B8OJ1hN5EejJdCSFZE1oM6AQXAQ=="], + "@nomiclabs/hardhat-docker/dockerode/tar-fs": ["tar-fs@1.16.6", "", { "dependencies": { "chownr": "^1.0.1", "mkdirp": "^0.5.1", "pump": "^1.0.0", "tar-stream": "^1.1.2" } }, "sha512-JkOgFt3FxM/2v2CNpAVHqMW2QASjc/Hxo7IGfNd3MHaDYSW/sBFiS7YVmmhmr8x6vwN1VFQDQGdT2MWpmIuVKA=="], "@nomiclabs/hardhat-docker/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], @@ -1256,6 +1356,8 @@ "glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "hardhat-deploy/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + "hardhat/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], "hardhat/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], @@ -1266,12 +1368,74 @@ "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "rpc-websockets/@types/ws/@types/node": ["@types/node@24.5.2", "", { "dependencies": { "undici-types": "~7.12.0" } }, "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ=="], + "spawndamnit/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "spawndamnit/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "spawndamnit/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "zksync-ethers/ethers/@ethersproject/abi": ["@ethersproject/abi@5.7.0", "", { "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/web": "^5.7.0" } }, "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.7.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0" } }, "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ=="], + + "zksync-ethers/ethers/@ethersproject/address": ["@ethersproject/address@5.7.0", "", { "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" } }, "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA=="], + + "zksync-ethers/ethers/@ethersproject/base64": ["@ethersproject/base64@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0" } }, "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ=="], + + "zksync-ethers/ethers/@ethersproject/basex": ["@ethersproject/basex@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" } }, "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw=="], + + "zksync-ethers/ethers/@ethersproject/bignumber": ["@ethersproject/bignumber@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "bn.js": "^5.2.1" } }, "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw=="], + + "zksync-ethers/ethers/@ethersproject/bytes": ["@ethersproject/bytes@5.7.0", "", { "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A=="], + + "zksync-ethers/ethers/@ethersproject/constants": ["@ethersproject/constants@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0" } }, "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA=="], + + "zksync-ethers/ethers/@ethersproject/contracts": ["@ethersproject/contracts@5.7.0", "", { "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/transactions": "^5.7.0" } }, "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg=="], + + "zksync-ethers/ethers/@ethersproject/hash": ["@ethersproject/hash@5.7.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g=="], + + "zksync-ethers/ethers/@ethersproject/hdnode": ["@ethersproject/hdnode@5.7.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/pbkdf2": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/sha2": "^5.7.0", "@ethersproject/signing-key": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/wordlists": "^5.7.0" } }, "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets": ["@ethersproject/json-wallets@5.7.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/hdnode": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/pbkdf2": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g=="], + + "zksync-ethers/ethers/@ethersproject/keccak256": ["@ethersproject/keccak256@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" } }, "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg=="], + + "zksync-ethers/ethers/@ethersproject/logger": ["@ethersproject/logger@5.7.0", "", {}, "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig=="], + + "zksync-ethers/ethers/@ethersproject/networks": ["@ethersproject/networks@5.7.1", "", { "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ=="], + + "zksync-ethers/ethers/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" } }, "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw=="], + + "zksync-ethers/ethers/@ethersproject/properties": ["@ethersproject/properties@5.7.0", "", { "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw=="], + + "zksync-ethers/ethers/@ethersproject/providers": ["@ethersproject/providers@5.7.2", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", "@ethersproject/rlp": "^5.7.0", "@ethersproject/sha2": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/web": "^5.7.0", "bech32": "1.1.4", "ws": "7.4.6" } }, "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg=="], + + "zksync-ethers/ethers/@ethersproject/random": ["@ethersproject/random@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ=="], + + "zksync-ethers/ethers/@ethersproject/rlp": ["@ethersproject/rlp@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w=="], + + "zksync-ethers/ethers/@ethersproject/sha2": ["@ethersproject/sha2@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "hash.js": "1.1.7" } }, "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw=="], + + "zksync-ethers/ethers/@ethersproject/signing-key": ["@ethersproject/signing-key@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "bn.js": "^5.2.1", "elliptic": "6.5.4", "hash.js": "1.1.7" } }, "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q=="], + + "zksync-ethers/ethers/@ethersproject/solidity": ["@ethersproject/solidity@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/sha2": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA=="], + + "zksync-ethers/ethers/@ethersproject/strings": ["@ethersproject/strings@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg=="], + + "zksync-ethers/ethers/@ethersproject/transactions": ["@ethersproject/transactions@5.7.0", "", { "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/rlp": "^5.7.0", "@ethersproject/signing-key": "^5.7.0" } }, "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ=="], + + "zksync-ethers/ethers/@ethersproject/units": ["@ethersproject/units@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg=="], + + "zksync-ethers/ethers/@ethersproject/wallet": ["@ethersproject/wallet@5.7.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/hdnode": "^5.7.0", "@ethersproject/json-wallets": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", "@ethersproject/signing-key": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/wordlists": "^5.7.0" } }, "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA=="], + + "zksync-ethers/ethers/@ethersproject/web": ["@ethersproject/web@5.7.1", "", { "dependencies": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w=="], + + "zksync-ethers/ethers/@ethersproject/wordlists": ["@ethersproject/wordlists@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA=="], + "@chainlink/contracts/@changesets/cli/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], "@chainlink/contracts/@changesets/cli/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], @@ -1290,10 +1454,322 @@ "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream": ["tar-stream@1.6.2", "", { "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", "end-of-stream": "^1.0.0", "fs-constants": "^1.0.0", "readable-stream": "^2.3.0", "to-buffer": "^1.1.1", "xtend": "^4.0.0" } }, "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A=="], + "hardhat-deploy/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "mocha/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "spawndamnit/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/address/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/address/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/address/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/address/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/base64/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/basex/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/basex/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/bignumber/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/bignumber/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi": ["@ethersproject/abi@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/basex": ["@ethersproject/basex@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" } }, "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists": ["@ethersproject/wordlists@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode": ["@ethersproject/hdnode@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/pbkdf2": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/sha2": "^5.8.0", "@ethersproject/signing-key": "^5.8.0", "@ethersproject/strings": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/wordlists": "^5.8.0" } }, "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" } }, "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/random": ["@ethersproject/random@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/keccak256/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/networks/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/pbkdf2/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/pbkdf2/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], + + "zksync-ethers/ethers/@ethersproject/properties/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/basex": ["@ethersproject/basex@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/random": ["@ethersproject/random@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/providers/ws": ["ws@7.4.6", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="], + + "zksync-ethers/ethers/@ethersproject/random/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/random/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/rlp/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/rlp/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/sha2/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/sha2/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/signing-key/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/signing-key/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/signing-key/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/signing-key/elliptic": ["elliptic@6.5.4", "", { "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" } }, "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ=="], + + "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], + + "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/strings/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/strings/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/units/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/units/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/units/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode": ["@ethersproject/hdnode@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/pbkdf2": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/sha2": "^5.8.0", "@ethersproject/signing-key": "^5.8.0", "@ethersproject/strings": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/wordlists": "^5.8.0" } }, "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets": ["@ethersproject/json-wallets@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/hdnode": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/pbkdf2": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/random": "^5.8.0", "@ethersproject/strings": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/random": ["@ethersproject/random@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/wordlists": ["@ethersproject/wordlists@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg=="], + + "zksync-ethers/ethers/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/web/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/web/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/web/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + "@nomiclabs/hardhat-docker/dockerode/docker-modem/readable-stream/isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], "@nomiclabs/hardhat-docker/dockerode/docker-modem/readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], @@ -1302,8 +1778,288 @@ "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/base64/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/basex/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/basex/@ethersproject/properties/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/constants/@ethersproject/bignumber/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/constants/@ethersproject/bignumber/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/address/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/address/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/basex": ["@ethersproject/basex@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/wordlists": ["@ethersproject/wordlists@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/pbkdf2/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/keccak256/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/pbkdf2/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/pbkdf2/@ethersproject/sha2/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/address/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/hash/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/signing-key/elliptic/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], + + "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/units/@ethersproject/bignumber/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hash/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/basex": ["@ethersproject/basex@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" } }, "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" } }, "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/wordlists/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hash/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets/@ethersproject/pbkdf2/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/wordlists/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/web/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], } } diff --git a/contracts/foundry.toml b/contracts/foundry.toml new file mode 100644 index 00000000..f0dd6c9e --- /dev/null +++ b/contracts/foundry.toml @@ -0,0 +1,8 @@ +[profile.default] +src = "src" +out = "out" +libs = ["node_modules"] +auto_detect_remappings = false +remappings = ["forge-std=node_modules/forge-std/src", "@hyperlane=node_modules/@hyperlane-xyz/core/contracts", "@openzeppelin=node_modules/@openzeppelin"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options \ No newline at end of file diff --git a/contracts/package.json b/contracts/package.json index f4a3dda4..96535b0c 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,6 +1,13 @@ { - "dependencies": { - "@hyperlane-xyz/core": "9.0.9" + "name": "@noble-assets/orbiter-contracts", + "private": true, + "devDependencies": { + "@hyperlane-xyz/core": "8.0.0", + "@openzeppelin/contracts": "5.3.0", + "@openzeppelin/contracts-upgradeable": "5.3.0", + "forge-std": "github:foundry-rs/forge-std#v1.9.7" + }, + "patchedDependencies": { + "@hyperlane-xyz/core@8.0.0": "patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch" } -} - +} \ No newline at end of file diff --git a/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch b/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch new file mode 100644 index 00000000..bc7c3c67 --- /dev/null +++ b/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch @@ -0,0 +1,42 @@ +diff --git a/contracts/client/MailboxClient.sol b/contracts/client/MailboxClient.sol +index 0b0d3642db1f2f8a2434f0a1e96438c8caf07011..12e8421805e7ff7e1f0214894a2eae02653691a9 100644 +--- a/contracts/client/MailboxClient.sol ++++ b/contracts/client/MailboxClient.sol +@@ -21,7 +21,6 @@ import {Message} from "../libs/Message.sol"; + import {PackageVersioned} from "../PackageVersioned.sol"; + + // ============ External Imports ============ +-import {Address} from "@openzeppelin/contracts/utils/Address.sol"; + import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + + abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { +@@ -43,7 +42,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { + // ============ Modifiers ============ + modifier onlyContract(address _contract) { + require( +- Address.isContract(_contract), ++ _contract.code.length > 0, + "MailboxClient: invalid mailbox" + ); + _; +@@ -51,7 +50,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { + + modifier onlyContractOrNull(address _contract) { + require( +- Address.isContract(_contract) || _contract == address(0), ++ _contract.code.length > 0 || _contract == address(0), + "MailboxClient: invalid contract setting" + ); + _; +@@ -111,10 +110,9 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { + address __interchainSecurityModule, + address _owner + ) internal onlyInitializing { +- __Ownable_init(); ++ __Ownable_init(_owner); + setHook(_hook); + setInterchainSecurityModule(__interchainSecurityModule); +- _transferOwnership(_owner); + } + + function _isLatestDispatched(bytes32 id) internal view returns (bool) { diff --git a/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0.patch b/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0.patch new file mode 100644 index 00000000..8cf1c1b8 --- /dev/null +++ b/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0.patch @@ -0,0 +1,67 @@ +diff --git a/contracts/client/MailboxClient.sol b/contracts/client/MailboxClient.sol +index 0b0d3642db1f2f8a2434f0a1e96438c8caf07011..12e8421805e7ff7e1f0214894a2eae02653691a9 100644 +--- a/contracts/client/MailboxClient.sol ++++ b/contracts/client/MailboxClient.sol +@@ -21,7 +21,6 @@ import {Message} from "../libs/Message.sol"; + import {PackageVersioned} from "../PackageVersioned.sol"; + + // ============ External Imports ============ +-import {Address} from "@openzeppelin/contracts/utils/Address.sol"; + import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + + abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { +@@ -43,7 +42,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { + // ============ Modifiers ============ + modifier onlyContract(address _contract) { + require( +- Address.isContract(_contract), ++ _contract.code.length > 0, + "MailboxClient: invalid mailbox" + ); + _; +@@ -51,7 +50,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { + + modifier onlyContractOrNull(address _contract) { + require( +- Address.isContract(_contract) || _contract == address(0), ++ _contract.code.length > 0 || _contract == address(0), + "MailboxClient: invalid contract setting" + ); + _; +@@ -111,10 +110,9 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { + address __interchainSecurityModule, + address _owner + ) internal onlyInitializing { +- __Ownable_init(); ++ __Ownable_init(_owner); + setHook(_hook); + setInterchainSecurityModule(__interchainSecurityModule); +- _transferOwnership(_owner); + } + + function _isLatestDispatched(bytes32 id) internal view returns (bool) { +diff --git a/contracts/token/HypERC20.sol b/contracts/token/HypERC20.sol +index 6463193893c8c2d195cf24052ee71b12e76a61a0..8af0c875fedfe160de9c4dcaaccc30897750536e 100644 +--- a/contracts/token/HypERC20.sol ++++ b/contracts/token/HypERC20.sol +@@ -25,12 +25,10 @@ contract HypERC20 is ERC20Upgradeable, FungibleTokenRouter { + + /** + * @notice Initializes the Hyperlane router, ERC20 metadata, and mints initial supply to deployer. +- * @param _totalSupply The initial supply of the token. + * @param _name The name of the token. + * @param _symbol The symbol of the token. + */ + function initialize( +- uint256 _totalSupply, + string memory _name, + string memory _symbol, + address _hook, +@@ -39,7 +37,6 @@ contract HypERC20 is ERC20Upgradeable, FungibleTokenRouter { + ) public virtual initializer { + // Initialize ERC20 metadata + __ERC20_init(_name, _symbol); +- _mint(msg.sender, _totalSupply); + _MailboxClient_initialize(_hook, _interchainSecurityModule, _owner); + } + diff --git a/contracts/script/DeployHyperlaneEntrypoint.s.sol b/contracts/script/DeployHyperlaneEntrypoint.s.sol new file mode 100644 index 00000000..e38276a7 --- /dev/null +++ b/contracts/script/DeployHyperlaneEntrypoint.s.sol @@ -0,0 +1,30 @@ +//SPDX-License-Identifer: BUSL-1.1 +pragma solidity ^0.8.24; + +import { console } from "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; +import { OrbiterTransientStore } from "../src/usdn/OrbiterTransientStore.sol"; +import { NobleDollar } from "../src/usdn/USDNHyperlaneOrbiter.sol"; + +contract DeployHyperlaneEntrypoint is Script { + function run() external { + address nobleDollar = vm.envAddress("NOBLEDOLLAR"); + require(nobleDollar != address(0), "noble dollar address not set"); + + vm.startBroadcast(); + + OrbiterTransientStore ots = new OrbiterTransientStore(); + NobleDollar nd = NobleDollar(nobleDollar); + nd.setOTS(address(ots)); + + HyperlaneEntrypoint he = new HyperlaneEntrypoint(address(ots)); + + ots.transferOwnership(address(he)); + require(ots.owner() == address(he), "expected ownership to be transferred"); + + console.log("deployed hyperlane entrypoint at: ", address(he)); + + vm.stopBroadcast(); + } +} \ No newline at end of file diff --git a/contracts/script/DeployNobleDollar.s.sol b/contracts/script/DeployNobleDollar.s.sol new file mode 100644 index 00000000..240f32bc --- /dev/null +++ b/contracts/script/DeployNobleDollar.s.sol @@ -0,0 +1,42 @@ +//SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.24; + +import { console } from "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import { NobleDollar } from "../src/usdn/USDNHyperlaneOrbiter.sol"; +import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +contract DeployNobleDollar is Script { + function run() external { + address mailbox = vm.envAddress("MAILBOX"); + require(mailbox != address(0), "hyperlane mailbox address not set"); + + address proxyAdmin = vm.envAddress("PROXYADMIN"); + require(proxyAdmin != address(0), "proxy admin address not set"); + + vm.startBroadcast(); + + // Deploy the implementation behind a proxy. + NobleDollar implementation = new NobleDollar(mailbox); + TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy( + address(implementation), + proxyAdmin, + abi.encodeWithSelector( + NobleDollar.initialize.selector, + address(0), + address(0) + ) + ); + + // Get the proxy implementation using the NobleDollar interface. + NobleDollar nd = NobleDollar(address(proxy)); + + // Sanity check that the minting during initialization was successful. + uint256 minted = nd.balanceOf(msg.sender); + require(minted != 0, "expected balance to have been minted for msg sender"); + + console.log("deployed NobleDollar as proxy at ", address(nd)); + + vm.stopBroadcast(); + } +} \ No newline at end of file diff --git a/contracts/script/SendForwardedTransfer.s.sol b/contracts/script/SendForwardedTransfer.s.sol new file mode 100644 index 00000000..0b25ec4b --- /dev/null +++ b/contracts/script/SendForwardedTransfer.s.sol @@ -0,0 +1,37 @@ +//SPDX-License-Identifer: BUSL-1.1 +pragma solidity ^0.8.24; + +import { console } from "forge-std/console.sol"; +import { Script } from "forge-std/Script.sol"; +import {HyperlaneEntrypoint} from "../src/HyperlaneEntrypoint.sol"; + +contract SendForwardedTransfer is Script { + function run() external { + address entrypoint = vm.envAddress("ENTRYPOINT"); + require(entrypoint != address(0), "entrypoint not set"); + + address nobleDollar = vm.envAddress("NOBLEDOLLAR"); + require(entrypoint != address(0), "noble dollar address not set"); + + uint32 destinationDomain = 1; + bytes32 recipient = bytes32(0); // TODO: adjust to use identifier + uint256 amount = 123; + bytes32 payloadHash = bytes32(uint256(10203040)); // TODO: generate valid payload hash + + vm.startBroadcast(); + + HyperlaneEntrypoint he = HyperlaneEntrypoint(entrypoint); + bytes32 messageID = he.sendUSDNWithForwardThroughHyperlane( + nobleDollar, + destinationDomain, + recipient, + amount, + payloadHash + ); + + console.log("sent message ID: "); + console.logBytes32(messageID); + + vm.stopBroadcast(); + } +} \ No newline at end of file diff --git a/contracts/src/HyperlaneEntrypoint.sol b/contracts/src/HyperlaneEntrypoint.sol new file mode 100644 index 00000000..700975e4 --- /dev/null +++ b/contracts/src/HyperlaneEntrypoint.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.24; + +import {NobleDollar} from "./usdn/USDNHyperlaneOrbiter.sol"; +import {OrbiterTransientStore} from "./usdn/OrbiterTransientStore.sol"; + +/* + * @dev The canonical entrypoint contract to use Noble's Orbiter implementation through Hyperlane. + * + * The Orbiter (https://github.com/noble-assets/orbiter) allows to send cross-chain transfers + * using various bridge mechanisms, execute actions on the Noble blockchain (e.g. fee payments), + * and eventually forward the resulting assets to another destination through one of the available + * bridging mechanisms (e.g. IBC, CCTP). + * + * TODO: make upgradeable + */ +contract HyperlaneEntrypoint { + address private otsAddress; + + constructor(address _otsAddress) { + otsAddress = _otsAddress; + } + + /* + * @dev Send an asset transfer to the Orbiter, that should be forwarded to another Hyperlane domain. + */ + function sendUSDNWithForwardThroughHyperlane( + address tokenAddress, + uint32 destinationDomain, + bytes32 recipient, + uint256 amount, + bytes32 payloadHash + ) external returns (bytes32 messageID) { + OrbiterTransientStore ots = OrbiterTransientStore(otsAddress); + + // 1. set the pending payload into the transient storage + ots.setPendingPayloadHash(payloadHash); + + // 2. send the warp transfer with the NobleDollar contract, + // which will get the payload hash to build the metadata + // in the overriden _transferRemote internal method. + NobleDollar token = NobleDollar(tokenAddress); + return token.transferRemote( + destinationDomain, + recipient, + amount + ); + } +} \ No newline at end of file diff --git a/contracts/src/usdn/OrbiterTransientStore.sol b/contracts/src/usdn/OrbiterTransientStore.sol new file mode 100644 index 00000000..ac63929d --- /dev/null +++ b/contracts/src/usdn/OrbiterTransientStore.sol @@ -0,0 +1,38 @@ +/* + * Copyright 2025 NASD Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ +pragma solidity ^0.8.28; + +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; + +/* + * @notice Holds pending payload hashes of transfers that should be executed + * through the Orbiter. + */ +contract OrbiterTransientStore is Ownable { + bytes32 transient pendingPayloadHash; + + constructor() Ownable(msg.sender) {} + + function getPendingPayloadHash() external view returns (bytes32) { + return pendingPayloadHash; + } + + function setPendingPayloadHash(bytes32 payloadHash) external onlyOwner { + pendingPayloadHash = payloadHash; + } +} diff --git a/contracts/src/usdn/USDNHyperlaneOrbiter.sol b/contracts/src/usdn/USDNHyperlaneOrbiter.sol new file mode 100644 index 00000000..f7408ec7 --- /dev/null +++ b/contracts/src/usdn/USDNHyperlaneOrbiter.sol @@ -0,0 +1,291 @@ +/* + * Copyright 2025 NASD Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ +pragma solidity ^0.8.24; + +import {HypERC20} from "@hyperlane/token/HypERC20.sol"; +import {TokenMessage} from "@hyperlane/token/libs/TokenMessage.sol"; + +import {OrbiterTransientStore} from "./OrbiterTransientStore.sol"; + +import {IndexingMath} from "./utils/IndexingMath.sol"; + +import {UIntMath} from "./utils/UIntMath.sol"; + +/* + +███╗ ██╗ ██████╗ ██████╗ ██╗ ███████╗ +████╗ ██║██╔═══██╗██╔══██╗██║ ██╔════╝ +██╔██╗ ██║██║ ██║██████╔╝██║ █████╗ +██║╚██╗██║██║ ██║██╔══██╗██║ ██╔══╝ +██║ ╚████║╚██████╔╝██████╔╝███████╗███████╗ +╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝ + +██████╗ ██████╗ ██╗ ██╗ █████╗ ██████╗ +██╔══██╗██╔═══██╗██║ ██║ ██╔══██╗██╔══██╗ +██║ ██║██║ ██║██║ ██║ ███████║██████╔╝ +██║ ██║██║ ██║██║ ██║ ██╔══██║██╔══██╗ +██████╔╝╚██████╔╝███████╗███████╗██║ ██║██║ ██║ +╚═════╝ ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ + +*/ + +/** + * @title NobleDollar + * @author John Letey + * @notice ERC20 Noble Dollar. + */ +contract NobleDollar is HypERC20 { + /// @notice Thrown when a user attempts to claim yield but has no claimable yield available. + error NoClaimableYield(); + + /// @notice Thrown when an invalid transfer to the contract is attempted. + error InvalidTransfer(); + + /// @notice The transient store contract to retrieve a pending Orbiter payload hash within the same + /// smart contract call. + OrbiterTransientStore orbiterTransientStore; + + /** + * @notice Emitted when the index is updated due to yield accrual. + * @param oldIndex The previous index value. + * @param newIndex The new index value. + * @param totalPrincipal The total principal amount at the time of update. + * @param yieldAccrued The amount of yield that was accrued. + */ + event IndexUpdated(uint128 oldIndex, uint128 newIndex, uint112 totalPrincipal, uint256 yieldAccrued); + + /** + * @notice Emitted when yield is claimed by an account. + * @param account The account that claimed the yield. + * @param amount The amount of yield claimed. + */ + event YieldClaimed(address indexed account, uint256 amount); + + /// @custom:storage-location erc7201:noble.storage.USDN + struct USDNStorage { + uint128 index; + uint112 totalPrincipal; + mapping(address account => uint112) principal; + } + + // keccak256(abi.encode(uint256(keccak256("noble.storage.USDN")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant USDNStorageLocation = 0xccec1a0a356b34ea3899fbc248aeaeba5687659563a3acddccc6f1e8a5d84200; + + function _getUSDNStorage() private pure returns (USDNStorage storage $) { + assembly { + $.slot := USDNStorageLocation + } + } + + constructor(address mailbox_) HypERC20(6, 1, mailbox_) { +// _disableInitializers(); + } + + function initialize(address hook_, address ism_) public virtual initializer { +// super.initialize("Noble Dollar", "USDN", hook_, ism_, msg.sender); + // TODO: added this for testing purposes to have tokens available + super.initialize(uint256(2e18), "Noble Dollar", "USDN", hook_, ism_, msg.sender); + + _getUSDNStorage().index = IndexingMath.EXP_SCALED_ONE; + } + + /// @dev Returns the current index used for yield calculations. + function index() public view returns (uint128) { + return _getUSDNStorage().index; + } + + /// @dev Returns the amount of principal in existence. + function totalPrincipal() public view returns (uint112) { + return _getUSDNStorage().totalPrincipal; + } + + /// @dev Returns the amount of principal owned for a given account. + function principalOf(address account) public view returns (uint112) { + return _getUSDNStorage().principal[account]; + } + + /** + * @notice Returns the amount of yield claimable for a given account. + * @dev Calculates claimable yield by comparing the expected balance (principal * current index) + * with the actual token balance. The yield represents the difference between what the + * account should have based on yield accrual and what they currently hold. + * + * Formula: max(0, (principal * index / 1e12) - currentBalance) + * + * Returns 0 if the current balance is greater than or equal to the expected balance, + * which can happen if the account has already claimed their yield or if no yield + * has accrued since their last interaction. + * + * @param account The address to check yield for. + * @return The amount of yield claimable by the account. + */ + function yield(address account) public view returns (uint256) { + USDNStorage storage $ = _getUSDNStorage(); + + uint256 expectedBalance = IndexingMath.getPresentAmountRoundedDown($.principal[account], $.index); + + uint256 currentBalance = balanceOf(account); + + return expectedBalance > currentBalance ? expectedBalance - currentBalance : 0; + } + + /** + * @notice Claims all available yield for the caller. + * @dev Calculates the claimable yield based on the difference between the expected balance + * (principal * current index) and the actual token balance. Transfers the yield amount + * from the contract to the caller and emits a YieldClaimed event. + * @custom:throws NoClaimableYield if the caller has no yield available to claim. + * @custom:emits YieldClaimed when yield is successfully claimed. + */ + function claim() public { + uint256 amount = yield(msg.sender); + + if (amount == 0) revert NoClaimableYield(); + + _update(address(this), msg.sender, amount); + + emit YieldClaimed(msg.sender, amount); + } + + /* + * @notice Sets the Orbiter transient store. + */ + function setOTS(address _otsAddress) external { + orbiterTransientStore = OrbiterTransientStore(_otsAddress); + } + + /** + * @notice Internal function that handles token transfers while managing principal accounting. + * @dev Overrides the base ERC20 _update function to implement yield-bearing token mechanics. + * This function manages principal balances and index updates for different transfer scenarios: + * + * 1. Yield payout (from contract): No principal updates needed + * 2. Yield accrual (to contract from zero address): Updates index based on new yield + * 3. Regular transfers: Updates principal balances for both sender and recipient + * 4. Minting (from zero address): Increases recipient's principal and total principal + * 5. Burning (to zero address): Decreases sender's principal and total principal + * + * @param from The address tokens are transferred from (zero address for minting) + * @param to The address tokens are transferred to (zero address for burning) + * @param value The amount of tokens being transferred + * + * @custom:throws InvalidTransfer if attempting to transfer to the contract from a non-zero address + * @custom:emits IndexUpdated when yield is accrued and the index is updated + * @custom:security Principal is calculated using ceiling / floor division in favor of protocol. + */ + function _update(address from, address to, uint256 value) internal virtual override { + super._update(from, to, value); + + // Special case, no-op operation. + if (from == address(0) && to == address(0)) return; + + // We don't want to perform any principal updates in the case of yield payout. + if (from == address(this)) return; + + // We don't want to allow any other transfers to the yield account. + if (from != address(0) && to == address(this)) revert InvalidTransfer(); + + USDNStorage storage $ = _getUSDNStorage(); + + // Distribute yield, derive new index from the adjusted total supply. + // NOTE: We don't want to perform any principal updates in the case of yield accrual. + if (to == address(this)) { + + if ($.totalPrincipal == 0) return; + + uint128 oldIndex = $.index; + + $.index = IndexingMath.getIndexRoundedDown(totalSupply(), $.totalPrincipal); + + emit IndexUpdated(oldIndex, $.index, $.totalPrincipal, value); + + return; + } + + // Minting + if (from == address(0)) { + uint112 principalDown = IndexingMath.getPrincipalAmountRoundedDown(value, $.index); + $.principal[to] += principalDown; + $.totalPrincipal += principalDown; + + return; + } + + // Safely round up principal in case of transfers or burning. + uint112 fromPrincipal = $.principal[from]; + uint112 principalUp = IndexingMath.getSafePrincipalAmountRoundedUp(value, $.index, fromPrincipal); + $.principal[from] = fromPrincipal - principalUp; + + if (to == address(0)) { + // Burning + $.totalPrincipal -= principalUp; + } else { + // Transfer + $.principal[to] += principalUp; + } + } + + function _transferRemote( + uint32 _destination, + bytes32 _recipient, + uint256 _amount, + uint256 _value, + bytes memory _hookMetadata, + address _hook + ) internal virtual override returns (bytes32 messageId) { + // Run default logic for HypERC20 token. + HypERC20._transferFromSender(_amount); + + // This is where the custom logic is added + // to bind the metadata comes into play. + // + // It is designed with inspiration from the CCTP token bridge contract: + // https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/token/TokenBridgeCctp.sol#L196-L231 + // + // TODO: this is currently requiring the OTS to be set, check if we always want this? + require( + address(orbiterTransientStore) != address(0), + "orbiterTransientStore must be set" + ); + bytes32 payloadHash = orbiterTransientStore.getPendingPayloadHash(); + + bytes memory _tokenMessage; + if (payloadHash != bytes32(0)) { + _tokenMessage = TokenMessage.format( + _recipient, + _amount, + abi.encodePacked(payloadHash) + ); + } else { + _tokenMessage = TokenMessage.format( + _recipient, + _amount + ); + } + + messageId = _Router_dispatch( + _destination, + _value, + _tokenMessage, + _hookMetadata, + _hook + ); + + emit SentTransferRemote(_destination, _recipient, _amount); + } +} \ No newline at end of file diff --git a/contracts/src/usdn/utils/IndexingMath.sol b/contracts/src/usdn/utils/IndexingMath.sol new file mode 100644 index 00000000..833b36f3 --- /dev/null +++ b/contracts/src/usdn/utils/IndexingMath.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.20 <0.9.0; + +import {UIntMath} from "./UIntMath.sol"; + +/** + * @title Helper library for indexing math functions. + * @author M0 Labs + */ +library IndexingMath { + /* ============ Variables ============ */ + + /// @notice The scaling of indexes for exponent math. + uint56 internal constant EXP_SCALED_ONE = 1e12; + + /* ============ Custom Errors ============ */ + + /// @notice Emitted when a division by zero occurs. + error DivisionByZero(); + + /* ============ Exposed Functions ============ */ + + /** + * @dev Returns the present amount (rounded down) given the principal amount and an index. + * @param principal The principal amount. + * @param index An index. + * @return The present amount rounded down. + */ + function getPresentAmountRoundedDown(uint112 principal, uint128 index) internal pure returns (uint256) { + unchecked { + return (uint256(principal) * index) / EXP_SCALED_ONE; + } + } + + /** + * @dev Returns the principal amount given the present amount, using the current index. + * @param presentAmount The present amount. + * @param index An index. + * @return The principal amount rounded down. + */ + function getPrincipalAmountRoundedDown(uint256 presentAmount, uint128 index) internal pure returns (uint112) { + if (index == 0) revert DivisionByZero(); + + unchecked { + // NOTE: While `uint256(presentAmount) * EXP_SCALED_ONE` can technically overflow, these divide/multiply functions are + // only used for the purpose of principal/present amount calculations for continuous indexing, and + // so for an `presentAmount` to be large enough to overflow this, it would have to be a possible result of + // `multiply112By128Down` or `multiply112By128Up`, which would already satisfy + // `uint256(presentAmount) * EXP_SCALED_ONE < type(uint240).max`. + return UIntMath.safe112((presentAmount * EXP_SCALED_ONE) / index); + } + } + + /** + * @dev Returns the principal amount given the present amount, using the current index. + * @param presentAmount The present amount. + * @param index An index. + * @return The principal amount rounded up. + */ + function getPrincipalAmountRoundedUp(uint256 presentAmount, uint128 index) internal pure returns (uint112) { + if (index == 0) revert DivisionByZero(); + + unchecked { + // NOTE: While `uint256(presentAmount) * EXP_SCALED_ONE` can technically overflow, these divide/multiply functions are + // only used for the purpose of principal/present amount calculations for continuous indexing, and + // so for an `presentAmount` to be large enough to overflow this, it would have to be a possible result of + // `multiply112By128Down` or `multiply112By128Up`, which would already satisfy + // `uint256(presentAmount) * EXP_SCALED_ONE < type(uint240).max`. + return UIntMath.safe112(((presentAmount * EXP_SCALED_ONE) + index - 1) / index); + } + } + + /** + * @dev Returns the safely capped principal amount given the present amount, using the current index. + * @param presentAmount The present amount. + * @param index An index. + * @param maxPrincipalAmount The maximum principal amount. + * @return The principal amount rounded up, capped at maxPrincipalAmount. + */ + function getSafePrincipalAmountRoundedUp(uint256 presentAmount, uint128 index, uint112 maxPrincipalAmount) + internal + pure + returns (uint112) + { + uint112 principalAmount = getPrincipalAmountRoundedUp(presentAmount, index); + return principalAmount > maxPrincipalAmount ? maxPrincipalAmount : principalAmount; + } + + /** + * @notice Returns the index (rounded down) given the present amount and principal. + * @param presentAmount The present amount. + * @param principal The principal amount. + * @return The index rounded down. + */ + function getIndexRoundedDown(uint256 presentAmount, uint112 principal) internal pure returns (uint128) { + if (principal == 0) revert DivisionByZero(); + + unchecked { + return UIntMath.safe128((presentAmount * IndexingMath.EXP_SCALED_ONE) / principal); + } + } +} \ No newline at end of file diff --git a/contracts/src/usdn/utils/UintMath.sol b/contracts/src/usdn/utils/UintMath.sol new file mode 100644 index 00000000..3994d015 --- /dev/null +++ b/contracts/src/usdn/utils/UintMath.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.8.20 <0.9.0; + +/** + * @title Library to perform safe math operations on uint types + * @author M0 Labs + */ +library UIntMath { + /* ============ Custom Errors ============ */ + + /// @notice Emitted when a passed value is greater than the maximum value of uint112. + error InvalidUInt112(); + + /// @notice Emitted when a passed value is greater than the maximum value of uint128. + error InvalidUInt128(); + + /* ============ Internal View/Pure Functions ============ */ + + /** + * @notice Casts a uint256 value to a uint112, ensuring that it is less than or equal to the maximum uint112 value. + * @param n The value to cast. + * @return The value casted to uint112. + */ + function safe112(uint256 n) internal pure returns (uint112) { + if (n > type(uint112).max) revert InvalidUInt112(); + return uint112(n); + } + + /** + * @notice Casts a uint256 value to a uint128, ensuring that it is less than or equal to the maximum uint128 value. + * @param n The value to cast. + * @return The value casted to uint128. + */ + function safe128(uint256 n) internal pure returns (uint128) { + if (n > type(uint128).max) revert InvalidUInt128(); + return uint128(n); + } +} From 0358fe63cf9f770ffd1ab5857c73f790ee64e645 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 24 Sep 2025 16:00:15 +0200 Subject: [PATCH 05/34] avoid using NobleDollar and instead use own OrbiterHypERC20 implementation instead --- contracts/bun.lock | 761 +----------------- contracts/package.json | 9 +- ...rlane-xyz%2Fcore@8.0.0-stillmintable.patch | 42 - .../patches/@hyperlane-xyz%2Fcore@8.0.0.patch | 67 -- .../script/DeployHyperlaneEntrypoint.s.sol | 16 +- ...llar.s.sol => DeployOrbiterHypERC20.s.sol} | 42 +- contracts/script/SendForwardedTransfer.s.sol | 8 +- contracts/src/HyperlaneEntrypoint.sol | 46 +- contracts/src/OrbiterHypERC20.sol | 113 +++ .../src/{usdn => }/OrbiterTransientStore.sol | 11 +- contracts/src/usdn/USDNHyperlaneOrbiter.sol | 291 ------- contracts/src/usdn/utils/IndexingMath.sol | 103 --- contracts/src/usdn/utils/UintMath.sol | 39 - 13 files changed, 201 insertions(+), 1347 deletions(-) delete mode 100644 contracts/patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch delete mode 100644 contracts/patches/@hyperlane-xyz%2Fcore@8.0.0.patch rename contracts/script/{DeployNobleDollar.s.sol => DeployOrbiterHypERC20.s.sol} (50%) create mode 100644 contracts/src/OrbiterHypERC20.sol rename contracts/src/{usdn => }/OrbiterTransientStore.sol (76%) delete mode 100644 contracts/src/usdn/USDNHyperlaneOrbiter.sol delete mode 100644 contracts/src/usdn/utils/IndexingMath.sol delete mode 100644 contracts/src/usdn/utils/UintMath.sol diff --git a/contracts/bun.lock b/contracts/bun.lock index 40683e35..8c2c9ba7 100644 --- a/contracts/bun.lock +++ b/contracts/bun.lock @@ -3,21 +3,16 @@ "workspaces": { "": { "devDependencies": { - "@hyperlane-xyz/core": "8.0.0", - "@openzeppelin/contracts": "5.3.0", - "@openzeppelin/contracts-upgradeable": "5.3.0", + "@hyperlane-xyz/core": "9.0.9", + "@openzeppelin/contracts": "^4.9.3", + "@openzeppelin/contracts-upgradeable": "^4.9.3", "forge-std": "github:foundry-rs/forge-std#v1.9.7", }, }, }, - "patchedDependencies": { - "@hyperlane-xyz/core@8.0.0": "patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch", - }, "packages": { "@arbitrum/nitro-contracts": ["@arbitrum/nitro-contracts@1.3.0", "", { "dependencies": { "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", "patch-package": "^6.4.7" } }, "sha512-nNNOgqqyiOxFiF1k53u0upC6tRWar1aj2arRZoE8C99/0eMnWk9az6rUO1yhxgMyMmk5fx9Pg42oSsZ9H7noOg=="], - "@axelar-network/axelar-gmp-sdk-solidity": ["@axelar-network/axelar-gmp-sdk-solidity@5.10.0", "", {}, "sha512-s8SImALvYB+5AeiT3tbfWNBI2Mhqw1x91i/zM3DNpVUCnAR2HKtsB9T84KnUn/OJjOVgb4h0lv7q9smeYniRPw=="], - "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], "@balena/dockerignore": ["@balena/dockerignore@1.0.2", "", {}, "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q=="], @@ -138,22 +133,14 @@ "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], - "@hyperlane-xyz/core": ["@hyperlane-xyz/core@8.0.0", "", { "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@chainlink/contracts-ccip": "^1.5.0", "@eth-optimism/contracts": "^0.6.0", "@hyperlane-xyz/utils": "13.3.0", "@layerzerolabs/lz-evm-oapp-v2": "2.0.2", "@matterlabs/hardhat-zksync-solc": "1.2.5", "@matterlabs/hardhat-zksync-verify": "1.7.1", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^4.9.3", "fx-portal": "^1.0.3" }, "peerDependencies": { "@ethersproject/abi": "*", "@ethersproject/providers": "*", "@types/sinon-chai": "*" } }, "sha512-ydZrmUEV9HnlPTiN3Gal1EdOoHN+2nCFhcYV+yBmw2cPgCFu9IN13foDmGk00a6p4NKDOPV2bItKZSOXfYkmXA=="], + "@hyperlane-xyz/core": ["@hyperlane-xyz/core@9.0.9", "", { "dependencies": { "@arbitrum/nitro-contracts": "^1.2.1", "@chainlink/contracts-ccip": "^1.5.0", "@eth-optimism/contracts": "^0.6.0", "@hyperlane-xyz/utils": "18.2.0", "@matterlabs/hardhat-zksync-solc": "1.2.5", "@matterlabs/hardhat-zksync-verify": "1.7.1", "@openzeppelin/contracts": "^4.9.3", "@openzeppelin/contracts-upgradeable": "^4.9.3" }, "peerDependencies": { "@ethersproject/abi": "*", "@ethersproject/providers": "*", "@types/sinon-chai": "*" } }, "sha512-FM6oeOGjN54NO0pIKDmbpgn/Cg/BwEOFHcGqKBA4Wldhy46KcV2e6aq5SRvlOAkmC6gNA5htzpTsM4dZ1fSwvA=="], - "@hyperlane-xyz/utils": ["@hyperlane-xyz/utils@13.3.0", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", "bignumber.js": "^9.1.1", "ethers": "^5.8.0", "lodash-es": "^4.17.21", "pino": "^8.19.0", "starknet": "^6.24.1", "yaml": "2.4.5" } }, "sha512-AzgmFHqocRZTa7+Z3WiUKyHmHv6iQ1AmbJu4Xw0yZ11S++p7Up4QNeeQ22eiC10TXI86D9B1sdTgqroAcN6vow=="], + "@hyperlane-xyz/utils": ["@hyperlane-xyz/utils@18.2.0", "", { "dependencies": { "@cosmjs/encoding": "^0.32.4", "@solana/web3.js": "^1.95.4", "bech32": "^2.0.0", "bignumber.js": "^9.1.1", "ethers": "^5.8.0", "lodash-es": "^4.17.21", "pino": "^8.19.0", "starknet": "^7.4.0", "yaml": "2.4.5" }, "peerDependencies": { "@google-cloud/pino-logging-gcp-config": "^1.0.6", "pino-pretty": ">=10.0.0" }, "optionalPeers": ["@google-cloud/pino-logging-gcp-config", "pino-pretty"] }, "sha512-Y0amJTjE9Sly0bOFUYL6yjOPnIov9yQvCkaOFlY/ZaQBm5uy3213IHaiOVvUmXP5ZNYL4UW6t5TR/kLpAdOAUA=="], "@inquirer/external-editor": ["@inquirer/external-editor@1.0.2", "", { "dependencies": { "chardet": "^2.1.0", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ=="], "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], - "@layerzerolabs/lz-evm-messagelib-v2": ["@layerzerolabs/lz-evm-messagelib-v2@2.3.44", "", { "peerDependencies": { "@arbitrum/nitro-contracts": "^1.1.0", "@axelar-network/axelar-gmp-sdk-solidity": "^5.6.4", "@chainlink/contracts-ccip": "^0.7.6", "@eth-optimism/contracts": "^0.6.0", "@layerzerolabs/lz-evm-protocol-v2": "^2.3.44", "@layerzerolabs/lz-evm-v1-0.7": "^2.3.44", "@openzeppelin/contracts": "^4.8.1 || ^5.0.0", "@openzeppelin/contracts-upgradeable": "^4.8.1 || ^5.0.0", "hardhat-deploy": "^0.12.4", "solidity-bytes-utils": "^0.8.0" }, "optionalPeers": ["@arbitrum/nitro-contracts"] }, "sha512-2HZMjV0KZH0e3W2KL/H8HvE3I7QMJw1no46IQ5LpGSvxIm5Ri45tnQAynbmEbRyKXrRSP3Brkvkc2U7VrfZ/Cg=="], - - "@layerzerolabs/lz-evm-oapp-v2": ["@layerzerolabs/lz-evm-oapp-v2@2.0.2", "", { "dependencies": { "@layerzerolabs/lz-evm-messagelib-v2": "^2.0.2", "@layerzerolabs/lz-evm-protocol-v2": "^2.0.2", "@layerzerolabs/lz-evm-v1-0.7": "^2.0.2" }, "peerDependencies": { "solidity-bytes-utils": "^0.8.0" } }, "sha512-50hG8BKa1ywobIt2UVjI3ePQO9XBy6uT9YCN9i5IBfX6WrSZevPyDtL8OayzKtRQgkKTvprC82bdGzAoqh2RUw=="], - - "@layerzerolabs/lz-evm-protocol-v2": ["@layerzerolabs/lz-evm-protocol-v2@2.3.44", "", { "peerDependencies": { "@openzeppelin/contracts": "^4.8.1 || ^5.0.0", "@openzeppelin/contracts-upgradeable": "^4.8.1 || ^5.0.0", "hardhat-deploy": "^0.12.4", "solidity-bytes-utils": "^0.8.0" } }, "sha512-oNtwl4HGCogFVOr45T3FfrkB0/CRW2eGAEScBw/FY/6mlncnS4dqlvrCJ3SFlK17cu1w9q0ztD3NzS9sUrb7vw=="], - - "@layerzerolabs/lz-evm-v1-0.7": ["@layerzerolabs/lz-evm-v1-0.7@2.3.44", "", { "peerDependencies": { "@openzeppelin/contracts": "3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0", "@openzeppelin/contracts-upgradeable": "3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0", "hardhat-deploy": "^0.12.4" } }, "sha512-gxPUv5yk5TLy4Rp4KwFqiPHGpVOPMtnwUi+LvRysnGgkqopOJRCzzvWqEv6M2YMUAsof+Vmr3UYWxKcilvv97g=="], - "@manypkg/find-root": ["@manypkg/find-root@1.1.0", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@types/node": "^12.7.1", "find-up": "^4.1.0", "fs-extra": "^8.1.0" } }, "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA=="], "@manypkg/get-packages": ["@manypkg/get-packages@1.1.3", "", { "dependencies": { "@babel/runtime": "^7.5.5", "@changesets/types": "^4.0.1", "@manypkg/find-root": "^1.1.0", "fs-extra": "^8.1.0", "globby": "^11.0.0", "read-yaml-file": "^1.1.0" } }, "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A=="], @@ -212,9 +199,9 @@ "@offchainlabs/upgrade-executor": ["@offchainlabs/upgrade-executor@1.1.0-beta.0", "", { "dependencies": { "@openzeppelin/contracts": "4.7.3", "@openzeppelin/contracts-upgradeable": "4.7.3" } }, "sha512-mpn6PHjH/KDDjNX0pXHEKdyv8m6DVGQiI2nGzQn0JbM1nOSHJpWx6fvfjtH7YxHJ6zBZTcsKkqGkFKDtCfoSLw=="], - "@openzeppelin/contracts": ["@openzeppelin/contracts@5.3.0", "", {}, "sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA=="], + "@openzeppelin/contracts": ["@openzeppelin/contracts@4.9.6", "", {}, "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA=="], - "@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@5.3.0", "", { "peerDependencies": { "@openzeppelin/contracts": "5.3.0" } }, "sha512-yVzSSyTMWO6rapGI5tuqkcLpcGGXA0UA1vScyV5EhE5yw8By3Ewex9rDUw8lfVw0iTkvR/egjfcW5vpk03lqZg=="], + "@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.9.6", "", {}, "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA=="], "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], @@ -278,6 +265,10 @@ "@solana/web3.js": ["@solana/web3.js@1.98.4", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw=="], + "@starknet-io/starknet-types-07": ["@starknet-io/types-js@0.7.10", "", {}, "sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w=="], + + "@starknet-io/starknet-types-08": ["@starknet-io/types-js@0.8.4", "", {}, "sha512-0RZ3TZHcLsUTQaq1JhDSCM8chnzO4/XNsSCozwDET64JK5bjFDIf2ZUkta+tl5Nlbf4usoU7uZiDI/Q57kt2SQ=="], + "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="], "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], @@ -288,8 +279,6 @@ "@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], - "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], - "@types/sinon": ["@types/sinon@17.0.4", "", { "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew=="], "@types/sinon-chai": ["@types/sinon-chai@4.0.0", "", { "dependencies": { "@types/chai": "*", "@types/sinon": "*" } }, "sha512-Uar+qk3TmeFsUWCwtqRNqNUE7vf34+MCJiQJR5M2rd4nCbhtE8RgTiHwN/mVwbfCjhmO6DiOel/MgzHkRMJJFg=="], @@ -494,8 +483,6 @@ "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "encode-utf8": ["encode-utf8@1.0.3", "", {}, "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="], - "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], @@ -550,8 +537,6 @@ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "fetch-cookie": ["fetch-cookie@3.0.1", "", { "dependencies": { "set-cookie-parser": "^2.4.8", "tough-cookie": "^4.0.0" } }, "sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q=="], - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], @@ -560,8 +545,6 @@ "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="], - "fmix": ["fmix@0.1.0", "", { "dependencies": { "imul": "^1.0.0" } }, "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w=="], - "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], @@ -582,8 +565,6 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "fx-portal": ["fx-portal@1.0.3", "", { "dependencies": { "@openzeppelin/contracts": "^4.2.0" } }, "sha512-wjjc/RQzHpjimeNVrOuLLwGBcjSzj0pTTaL26wAwTTrmaeeLrs2bcM4OldA0awZcaLqQXe3oQME8oC281jxzGw=="], - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], "get-func-name": ["get-func-name@2.0.2", "", {}, "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ=="], @@ -604,8 +585,6 @@ "hardhat": ["hardhat@2.26.3", "", { "dependencies": { "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", "@nomicfoundation/edr": "^0.11.3", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "adm-zip": "^0.4.16", "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", "boxen": "^5.1.2", "chokidar": "^4.0.0", "ci-info": "^2.0.0", "debug": "^4.1.1", "enquirer": "^2.3.0", "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "find-up": "^5.0.0", "fp-ts": "1.19.3", "fs-extra": "^7.0.1", "immutable": "^4.0.0-rc.12", "io-ts": "1.10.4", "json-stream-stringify": "^3.1.4", "keccak": "^3.0.2", "lodash": "^4.17.11", "micro-eth-signer": "^0.14.0", "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", "picocolors": "^1.1.0", "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", "solc": "0.8.26", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", "tinyglobby": "^0.2.6", "tsort": "0.0.1", "undici": "^5.14.0", "uuid": "^8.3.2", "ws": "^7.4.6" }, "peerDependencies": { "ts-node": "*", "typescript": "*" }, "optionalPeers": ["ts-node", "typescript"], "bin": { "hardhat": "internal/cli/bootstrap.js" } }, "sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw=="], - "hardhat-deploy": ["hardhat-deploy@0.12.4", "", { "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/contracts": "^5.7.0", "@ethersproject/providers": "^5.7.2", "@ethersproject/solidity": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/wallet": "^5.7.0", "@types/qs": "^6.9.7", "axios": "^0.21.1", "chalk": "^4.1.2", "chokidar": "^3.5.2", "debug": "^4.3.2", "enquirer": "^2.3.6", "ethers": "^5.7.0", "form-data": "^4.0.0", "fs-extra": "^10.0.0", "match-all": "^1.2.6", "murmur-128": "^0.2.1", "qs": "^6.9.4", "zksync-ethers": "^5.0.0" } }, "sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], @@ -638,8 +617,6 @@ "immutable": ["immutable@4.3.7", "", {}, "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw=="], - "imul": ["imul@1.0.1", "", {}, "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA=="], - "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], @@ -680,8 +657,6 @@ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "isomorphic-fetch": ["isomorphic-fetch@3.0.0", "", { "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" } }, "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA=="], - "isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], "jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], @@ -730,8 +705,6 @@ "lru_map": ["lru_map@0.3.3", "", {}, "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ=="], - "match-all": ["match-all@1.2.7", "", {}, "sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw=="], - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], "memorystream": ["memorystream@0.3.1", "", {}, "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw=="], @@ -768,8 +741,6 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "murmur-128": ["murmur-128@0.2.1", "", { "dependencies": { "encode-utf8": "^1.0.2", "fmix": "^0.1.0", "imul": "^1.0.0" } }, "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg=="], - "nan": ["nan@2.23.0", "", {}, "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ=="], "nice-try": ["nice-try@1.0.5", "", {}, "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="], @@ -786,8 +757,6 @@ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - "obliterator": ["obliterator@2.0.5", "", {}, "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw=="], "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], @@ -858,18 +827,10 @@ "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], - "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="], - "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - - "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], - "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], - "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], @@ -894,8 +855,6 @@ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], - "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="], - "resolve": ["resolve@1.17.0", "", { "dependencies": { "path-parse": "^1.0.6" } }, "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w=="], "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], @@ -922,8 +881,6 @@ "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], - "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], - "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], @@ -932,14 +889,6 @@ "shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="], - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], - - "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], - - "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], - - "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "sinon": ["sinon@18.0.1", "", { "dependencies": { "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "11.2.2", "@sinonjs/samsam": "^8.0.0", "diff": "^5.2.0", "nise": "^6.0.0", "supports-color": "^7" } }, "sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw=="], @@ -954,8 +903,6 @@ "solc": ["solc@0.8.26", "", { "dependencies": { "command-exists": "^1.2.8", "commander": "^8.1.0", "follow-redirects": "^1.12.1", "js-sha3": "0.8.0", "memorystream": "^0.3.1", "semver": "^5.5.0", "tmp": "0.0.33" }, "bin": { "solcjs": "solc.js" } }, "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g=="], - "solidity-bytes-utils": ["solidity-bytes-utils@0.8.4", "", {}, "sha512-/bjac5YR12i0plOKvGlhE51F5IWGP6rI8DJetCQlXcnwKWz/Hgf/vr+Qlk1BWz56xVcwVhmhCaDkTMnx5xvt0g=="], - "sonic-boom": ["sonic-boom@3.8.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg=="], "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -974,9 +921,7 @@ "stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="], - "starknet": ["starknet@6.24.1", "", { "dependencies": { "@noble/curves": "1.7.0", "@noble/hashes": "1.6.0", "@scure/base": "1.2.1", "@scure/starknet": "1.1.0", "abi-wan-kanabi": "^2.2.3", "fetch-cookie": "~3.0.0", "isomorphic-fetch": "~3.0.0", "lossless-json": "^4.0.1", "pako": "^2.0.4", "starknet-types-07": "npm:@starknet-io/types-js@^0.7.10", "ts-mixer": "^6.0.3" } }, "sha512-g7tiCt73berhcNi41otlN3T3kxZnIvZhMi8WdC21Y6GC6zoQgbI2z1t7JAZF9c4xZiomlanwVnurcpyfEdyMpg=="], - - "starknet-types-07": ["@starknet-io/types-js@0.7.10", "", {}, "sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w=="], + "starknet": ["starknet@7.6.4", "", { "dependencies": { "@noble/curves": "1.7.0", "@noble/hashes": "1.6.0", "@scure/base": "1.2.1", "@scure/starknet": "1.1.0", "@starknet-io/starknet-types-07": "npm:@starknet-io/types-js@~0.7.10", "@starknet-io/starknet-types-08": "npm:@starknet-io/types-js@~0.8.4", "abi-wan-kanabi": "2.2.4", "lossless-json": "^4.0.1", "pako": "^2.0.4", "ts-mixer": "^6.0.3" } }, "sha512-FB20IaLCDbh/XomkB+19f5jmNxG+RzNdRO7QUhm7nfH81UPIt2C/MyWAlHCYkbv2wznSEb73wpxbp9tytokTgQ=="], "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], @@ -1022,8 +967,6 @@ "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], - "tough-cookie": ["tough-cookie@4.1.4", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="], - "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], "ts-mixer": ["ts-mixer@6.0.4", "", {}, "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="], @@ -1052,8 +995,6 @@ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - "url-parse": ["url-parse@1.5.10", "", { "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="], - "utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="], "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], @@ -1062,8 +1003,6 @@ "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], - "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], - "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], @@ -1094,8 +1033,6 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zksync-ethers": ["zksync-ethers@5.10.0", "", { "dependencies": { "ethers": "~5.7.0" } }, "sha512-OAjTGAHF9wbdkRGkj7XZuF/a1Sk/FVbwH4pmLjAKlR7mJ7sQtQhBhrPU2dCc67xLaNvEESPfwil19ES5wooYFg=="], - "@arbitrum/nitro-contracts/@openzeppelin/contracts": ["@openzeppelin/contracts@4.5.0", "", {}, "sha512-fdkzKPYMjrRiPK6K4y64e6GzULR7R7RwxSigHS8DDp7aWDeoReqsQI+cxHV1UuhAqX69L1lAaWDxenfP+xiqzA=="], "@arbitrum/nitro-contracts/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.5.2", "", {}, "sha512-xgWZYaPlrEOQo3cBj97Ufiuv79SPd8Brh4GcFYhPgb6WvAq4ppz8dWKL6h+jLAK01rUqMRp/TS9AdXgAeNvCLA=="], @@ -1104,10 +1041,6 @@ "@chainlink/contracts/@changesets/cli": ["@changesets/cli@2.28.1", "", { "dependencies": { "@changesets/apply-release-plan": "^7.0.10", "@changesets/assemble-release-plan": "^6.0.6", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.1", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/get-release-plan": "^4.0.8", "@changesets/git": "^3.0.2", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", "@changesets/read": "^0.6.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", "external-editor": "^3.1.0", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", "package-manager-detector": "^0.2.0", "picocolors": "^1.1.0", "resolve-from": "^5.0.0", "semver": "^7.5.3", "spawndamnit": "^3.0.1", "term-size": "^2.1.0" }, "bin": { "changeset": "bin.js" } }, "sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA=="], - "@chainlink/contracts/@openzeppelin/contracts": ["@openzeppelin/contracts@4.9.6", "", {}, "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA=="], - - "@chainlink/contracts/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.9.6", "", {}, "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA=="], - "@changesets/apply-release-plan/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], "@changesets/cli/fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], @@ -1126,9 +1059,7 @@ "@grpc/grpc-js/@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], - "@hyperlane-xyz/core/@openzeppelin/contracts": ["@openzeppelin/contracts@4.9.6", "", {}, "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA=="], - - "@hyperlane-xyz/core/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.9.6", "", {}, "sha512-m4iHazOsOCv1DgM7eD7GupTJ+NFVujRZt1wzddDPSVGpWdKq1SKkla5htKG7+IS4d2XOCtzkUNwRZ7Vq5aEUMA=="], + "@hyperlane-xyz/utils/bech32": ["bech32@2.0.0", "", {}, "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg=="], "@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], @@ -1204,8 +1135,6 @@ "external-editor/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - "fx-portal/@openzeppelin/contracts": ["@openzeppelin/contracts@4.9.6", "", {}, "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA=="], - "glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "globby/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], @@ -1220,12 +1149,6 @@ "hardhat/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], - "hardhat-deploy/axios": ["axios@0.21.4", "", { "dependencies": { "follow-redirects": "^1.14.0" } }, "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg=="], - - "hardhat-deploy/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - - "hardhat-deploy/fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], - "is-ci/ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], "jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], @@ -1286,12 +1209,8 @@ "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - "tough-cookie/universalify": ["universalify@0.2.0", "", {}, "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="], - "yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "zksync-ethers/ethers": ["ethers@5.7.2", "", { "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", "@ethersproject/abstract-signer": "5.7.0", "@ethersproject/address": "5.7.0", "@ethersproject/base64": "5.7.0", "@ethersproject/basex": "5.7.0", "@ethersproject/bignumber": "5.7.0", "@ethersproject/bytes": "5.7.0", "@ethersproject/constants": "5.7.0", "@ethersproject/contracts": "5.7.0", "@ethersproject/hash": "5.7.0", "@ethersproject/hdnode": "5.7.0", "@ethersproject/json-wallets": "5.7.0", "@ethersproject/keccak256": "5.7.0", "@ethersproject/logger": "5.7.0", "@ethersproject/networks": "5.7.1", "@ethersproject/pbkdf2": "5.7.0", "@ethersproject/properties": "5.7.0", "@ethersproject/providers": "5.7.2", "@ethersproject/random": "5.7.0", "@ethersproject/rlp": "5.7.0", "@ethersproject/sha2": "5.7.0", "@ethersproject/signing-key": "5.7.0", "@ethersproject/solidity": "5.7.0", "@ethersproject/strings": "5.7.0", "@ethersproject/transactions": "5.7.0", "@ethersproject/units": "5.7.0", "@ethersproject/wallet": "5.7.0", "@ethersproject/web": "5.7.1", "@ethersproject/wordlists": "5.7.0" } }, "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg=="], - "@chainlink/contracts/@arbitrum/nitro-contracts/@openzeppelin/contracts": ["@openzeppelin/contracts@4.7.3", "", {}, "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw=="], "@chainlink/contracts/@arbitrum/nitro-contracts/@openzeppelin/contracts-upgradeable": ["@openzeppelin/contracts-upgradeable@4.7.3", "", {}, "sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A=="], @@ -1356,8 +1275,6 @@ "glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "hardhat-deploy/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "hardhat/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], "hardhat/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], @@ -1376,66 +1293,6 @@ "spawndamnit/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "zksync-ethers/ethers/@ethersproject/abi": ["@ethersproject/abi@5.7.0", "", { "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/web": "^5.7.0" } }, "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.7.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0" } }, "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ=="], - - "zksync-ethers/ethers/@ethersproject/address": ["@ethersproject/address@5.7.0", "", { "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" } }, "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA=="], - - "zksync-ethers/ethers/@ethersproject/base64": ["@ethersproject/base64@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0" } }, "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ=="], - - "zksync-ethers/ethers/@ethersproject/basex": ["@ethersproject/basex@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" } }, "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw=="], - - "zksync-ethers/ethers/@ethersproject/bignumber": ["@ethersproject/bignumber@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "bn.js": "^5.2.1" } }, "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw=="], - - "zksync-ethers/ethers/@ethersproject/bytes": ["@ethersproject/bytes@5.7.0", "", { "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A=="], - - "zksync-ethers/ethers/@ethersproject/constants": ["@ethersproject/constants@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0" } }, "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA=="], - - "zksync-ethers/ethers/@ethersproject/contracts": ["@ethersproject/contracts@5.7.0", "", { "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/transactions": "^5.7.0" } }, "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg=="], - - "zksync-ethers/ethers/@ethersproject/hash": ["@ethersproject/hash@5.7.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g=="], - - "zksync-ethers/ethers/@ethersproject/hdnode": ["@ethersproject/hdnode@5.7.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/pbkdf2": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/sha2": "^5.7.0", "@ethersproject/signing-key": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/wordlists": "^5.7.0" } }, "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets": ["@ethersproject/json-wallets@5.7.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/hdnode": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/pbkdf2": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g=="], - - "zksync-ethers/ethers/@ethersproject/keccak256": ["@ethersproject/keccak256@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" } }, "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg=="], - - "zksync-ethers/ethers/@ethersproject/logger": ["@ethersproject/logger@5.7.0", "", {}, "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig=="], - - "zksync-ethers/ethers/@ethersproject/networks": ["@ethersproject/networks@5.7.1", "", { "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ=="], - - "zksync-ethers/ethers/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" } }, "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw=="], - - "zksync-ethers/ethers/@ethersproject/properties": ["@ethersproject/properties@5.7.0", "", { "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw=="], - - "zksync-ethers/ethers/@ethersproject/providers": ["@ethersproject/providers@5.7.2", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", "@ethersproject/rlp": "^5.7.0", "@ethersproject/sha2": "^5.7.0", "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/web": "^5.7.0", "bech32": "1.1.4", "ws": "7.4.6" } }, "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg=="], - - "zksync-ethers/ethers/@ethersproject/random": ["@ethersproject/random@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ=="], - - "zksync-ethers/ethers/@ethersproject/rlp": ["@ethersproject/rlp@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w=="], - - "zksync-ethers/ethers/@ethersproject/sha2": ["@ethersproject/sha2@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "hash.js": "1.1.7" } }, "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw=="], - - "zksync-ethers/ethers/@ethersproject/signing-key": ["@ethersproject/signing-key@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "bn.js": "^5.2.1", "elliptic": "6.5.4", "hash.js": "1.1.7" } }, "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q=="], - - "zksync-ethers/ethers/@ethersproject/solidity": ["@ethersproject/solidity@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/sha2": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA=="], - - "zksync-ethers/ethers/@ethersproject/strings": ["@ethersproject/strings@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg=="], - - "zksync-ethers/ethers/@ethersproject/transactions": ["@ethersproject/transactions@5.7.0", "", { "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/rlp": "^5.7.0", "@ethersproject/signing-key": "^5.7.0" } }, "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ=="], - - "zksync-ethers/ethers/@ethersproject/units": ["@ethersproject/units@5.7.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg=="], - - "zksync-ethers/ethers/@ethersproject/wallet": ["@ethersproject/wallet@5.7.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/hdnode": "^5.7.0", "@ethersproject/json-wallets": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", "@ethersproject/signing-key": "^5.7.0", "@ethersproject/transactions": "^5.7.0", "@ethersproject/wordlists": "^5.7.0" } }, "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA=="], - - "zksync-ethers/ethers/@ethersproject/web": ["@ethersproject/web@5.7.1", "", { "dependencies": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w=="], - - "zksync-ethers/ethers/@ethersproject/wordlists": ["@ethersproject/wordlists@5.7.0", "", { "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA=="], - "@chainlink/contracts/@changesets/cli/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], "@chainlink/contracts/@changesets/cli/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], @@ -1454,322 +1311,10 @@ "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream": ["tar-stream@1.6.2", "", { "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", "end-of-stream": "^1.0.0", "fs-constants": "^1.0.0", "readable-stream": "^2.3.0", "to-buffer": "^1.1.1", "xtend": "^4.0.0" } }, "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A=="], - "hardhat-deploy/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "mocha/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "spawndamnit/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/address/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/address/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/address/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/address/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/base64/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/basex/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/basex/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/bignumber/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/bignumber/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi": ["@ethersproject/abi@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/basex": ["@ethersproject/basex@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" } }, "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists": ["@ethersproject/wordlists@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode": ["@ethersproject/hdnode@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/pbkdf2": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/sha2": "^5.8.0", "@ethersproject/signing-key": "^5.8.0", "@ethersproject/strings": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/wordlists": "^5.8.0" } }, "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" } }, "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/random": ["@ethersproject/random@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/keccak256/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/networks/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/pbkdf2/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/pbkdf2/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], - - "zksync-ethers/ethers/@ethersproject/properties/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/basex": ["@ethersproject/basex@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/random": ["@ethersproject/random@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/providers/ws": ["ws@7.4.6", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="], - - "zksync-ethers/ethers/@ethersproject/random/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/random/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/rlp/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/rlp/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/sha2/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/sha2/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/signing-key/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/signing-key/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/signing-key/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/signing-key/elliptic": ["elliptic@6.5.4", "", { "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" } }, "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ=="], - - "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], - - "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/strings/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/strings/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/units/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/units/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/units/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode": ["@ethersproject/hdnode@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/pbkdf2": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/sha2": "^5.8.0", "@ethersproject/signing-key": "^5.8.0", "@ethersproject/strings": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/wordlists": "^5.8.0" } }, "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets": ["@ethersproject/json-wallets@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/hdnode": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/pbkdf2": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/random": "^5.8.0", "@ethersproject/strings": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/random": ["@ethersproject/random@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/wordlists": ["@ethersproject/wordlists@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg=="], - - "zksync-ethers/ethers/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/web/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/web/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/web/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - "@nomiclabs/hardhat-docker/dockerode/docker-modem/readable-stream/isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], "@nomiclabs/hardhat-docker/dockerode/docker-modem/readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], @@ -1778,288 +1323,8 @@ "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/base64/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/basex/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/basex/@ethersproject/properties/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/constants/@ethersproject/bignumber/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/constants/@ethersproject/bignumber/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/address/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/address/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/basex": ["@ethersproject/basex@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/wordlists": ["@ethersproject/wordlists@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/pbkdf2/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/keccak256/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/pbkdf2/@ethersproject/bytes/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/pbkdf2/@ethersproject/sha2/@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/address/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/hash/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/providers/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/signing-key/elliptic/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], - - "zksync-ethers/ethers/@ethersproject/solidity/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/units/@ethersproject/bignumber/@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hash/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/basex": ["@ethersproject/basex@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" } }, "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets/@ethersproject/pbkdf2": ["@ethersproject/pbkdf2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" } }, "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/wordlists/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "@nomiclabs/hardhat-docker/dockerode/tar-fs/tar-stream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abi/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/contracts/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hash/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/hdnode/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets/@ethersproject/pbkdf2/@ethersproject/sha2": ["@ethersproject/sha2@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/json-wallets/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/wordlists/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/web/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/strings/@ethersproject/constants/@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/address/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/json-wallets/@ethersproject/hdnode/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], - - "zksync-ethers/ethers/@ethersproject/wallet/@ethersproject/abstract-provider/@ethersproject/web/@ethersproject/strings/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/abi/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], - - "zksync-ethers/ethers/@ethersproject/wordlists/@ethersproject/hash/@ethersproject/abstract-signer/@ethersproject/abstract-provider/@ethersproject/transactions/@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], } } diff --git a/contracts/package.json b/contracts/package.json index 96535b0c..dda96c66 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -2,12 +2,9 @@ "name": "@noble-assets/orbiter-contracts", "private": true, "devDependencies": { - "@hyperlane-xyz/core": "8.0.0", - "@openzeppelin/contracts": "5.3.0", - "@openzeppelin/contracts-upgradeable": "5.3.0", + "@hyperlane-xyz/core": "9.0.9", + "@openzeppelin/contracts": "^4.9.3", + "@openzeppelin/contracts-upgradeable": "^4.9.3", "forge-std": "github:foundry-rs/forge-std#v1.9.7" - }, - "patchedDependencies": { - "@hyperlane-xyz/core@8.0.0": "patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch" } } \ No newline at end of file diff --git a/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch b/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch deleted file mode 100644 index bc7c3c67..00000000 --- a/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0-stillmintable.patch +++ /dev/null @@ -1,42 +0,0 @@ -diff --git a/contracts/client/MailboxClient.sol b/contracts/client/MailboxClient.sol -index 0b0d3642db1f2f8a2434f0a1e96438c8caf07011..12e8421805e7ff7e1f0214894a2eae02653691a9 100644 ---- a/contracts/client/MailboxClient.sol -+++ b/contracts/client/MailboxClient.sol -@@ -21,7 +21,6 @@ import {Message} from "../libs/Message.sol"; - import {PackageVersioned} from "../PackageVersioned.sol"; - - // ============ External Imports ============ --import {Address} from "@openzeppelin/contracts/utils/Address.sol"; - import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - - abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { -@@ -43,7 +42,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { - // ============ Modifiers ============ - modifier onlyContract(address _contract) { - require( -- Address.isContract(_contract), -+ _contract.code.length > 0, - "MailboxClient: invalid mailbox" - ); - _; -@@ -51,7 +50,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { - - modifier onlyContractOrNull(address _contract) { - require( -- Address.isContract(_contract) || _contract == address(0), -+ _contract.code.length > 0 || _contract == address(0), - "MailboxClient: invalid contract setting" - ); - _; -@@ -111,10 +110,9 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { - address __interchainSecurityModule, - address _owner - ) internal onlyInitializing { -- __Ownable_init(); -+ __Ownable_init(_owner); - setHook(_hook); - setInterchainSecurityModule(__interchainSecurityModule); -- _transferOwnership(_owner); - } - - function _isLatestDispatched(bytes32 id) internal view returns (bool) { diff --git a/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0.patch b/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0.patch deleted file mode 100644 index 8cf1c1b8..00000000 --- a/contracts/patches/@hyperlane-xyz%2Fcore@8.0.0.patch +++ /dev/null @@ -1,67 +0,0 @@ -diff --git a/contracts/client/MailboxClient.sol b/contracts/client/MailboxClient.sol -index 0b0d3642db1f2f8a2434f0a1e96438c8caf07011..12e8421805e7ff7e1f0214894a2eae02653691a9 100644 ---- a/contracts/client/MailboxClient.sol -+++ b/contracts/client/MailboxClient.sol -@@ -21,7 +21,6 @@ import {Message} from "../libs/Message.sol"; - import {PackageVersioned} from "../PackageVersioned.sol"; - - // ============ External Imports ============ --import {Address} from "@openzeppelin/contracts/utils/Address.sol"; - import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - - abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { -@@ -43,7 +42,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { - // ============ Modifiers ============ - modifier onlyContract(address _contract) { - require( -- Address.isContract(_contract), -+ _contract.code.length > 0, - "MailboxClient: invalid mailbox" - ); - _; -@@ -51,7 +50,7 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { - - modifier onlyContractOrNull(address _contract) { - require( -- Address.isContract(_contract) || _contract == address(0), -+ _contract.code.length > 0 || _contract == address(0), - "MailboxClient: invalid contract setting" - ); - _; -@@ -111,10 +110,9 @@ abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { - address __interchainSecurityModule, - address _owner - ) internal onlyInitializing { -- __Ownable_init(); -+ __Ownable_init(_owner); - setHook(_hook); - setInterchainSecurityModule(__interchainSecurityModule); -- _transferOwnership(_owner); - } - - function _isLatestDispatched(bytes32 id) internal view returns (bool) { -diff --git a/contracts/token/HypERC20.sol b/contracts/token/HypERC20.sol -index 6463193893c8c2d195cf24052ee71b12e76a61a0..8af0c875fedfe160de9c4dcaaccc30897750536e 100644 ---- a/contracts/token/HypERC20.sol -+++ b/contracts/token/HypERC20.sol -@@ -25,12 +25,10 @@ contract HypERC20 is ERC20Upgradeable, FungibleTokenRouter { - - /** - * @notice Initializes the Hyperlane router, ERC20 metadata, and mints initial supply to deployer. -- * @param _totalSupply The initial supply of the token. - * @param _name The name of the token. - * @param _symbol The symbol of the token. - */ - function initialize( -- uint256 _totalSupply, - string memory _name, - string memory _symbol, - address _hook, -@@ -39,7 +37,6 @@ contract HypERC20 is ERC20Upgradeable, FungibleTokenRouter { - ) public virtual initializer { - // Initialize ERC20 metadata - __ERC20_init(_name, _symbol); -- _mint(msg.sender, _totalSupply); - _MailboxClient_initialize(_hook, _interchainSecurityModule, _owner); - } - diff --git a/contracts/script/DeployHyperlaneEntrypoint.s.sol b/contracts/script/DeployHyperlaneEntrypoint.s.sol index e38276a7..0c628dc2 100644 --- a/contracts/script/DeployHyperlaneEntrypoint.s.sol +++ b/contracts/script/DeployHyperlaneEntrypoint.s.sol @@ -3,26 +3,14 @@ pragma solidity ^0.8.24; import { console } from "forge-std/console.sol"; import { Script } from "forge-std/Script.sol"; + import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; -import { OrbiterTransientStore } from "../src/usdn/OrbiterTransientStore.sol"; -import { NobleDollar } from "../src/usdn/USDNHyperlaneOrbiter.sol"; contract DeployHyperlaneEntrypoint is Script { function run() external { - address nobleDollar = vm.envAddress("NOBLEDOLLAR"); - require(nobleDollar != address(0), "noble dollar address not set"); - vm.startBroadcast(); - OrbiterTransientStore ots = new OrbiterTransientStore(); - NobleDollar nd = NobleDollar(nobleDollar); - nd.setOTS(address(ots)); - - HyperlaneEntrypoint he = new HyperlaneEntrypoint(address(ots)); - - ots.transferOwnership(address(he)); - require(ots.owner() == address(he), "expected ownership to be transferred"); - + HyperlaneEntrypoint he = new HyperlaneEntrypoint(); console.log("deployed hyperlane entrypoint at: ", address(he)); vm.stopBroadcast(); diff --git a/contracts/script/DeployNobleDollar.s.sol b/contracts/script/DeployOrbiterHypERC20.s.sol similarity index 50% rename from contracts/script/DeployNobleDollar.s.sol rename to contracts/script/DeployOrbiterHypERC20.s.sol index 240f32bc..0269d283 100644 --- a/contracts/script/DeployNobleDollar.s.sol +++ b/contracts/script/DeployOrbiterHypERC20.s.sol @@ -3,10 +3,13 @@ pragma solidity ^0.8.24; import { console } from "forge-std/console.sol"; import { Script } from "forge-std/Script.sol"; -import { NobleDollar } from "../src/usdn/USDNHyperlaneOrbiter.sol"; + +import { OrbiterHypERC20 } from "../src/OrbiterHypERC20.sol"; +import { OrbiterTransientStore } from "../src/OrbiterTransientStore.sol"; + import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -contract DeployNobleDollar is Script { +contract DeployOrbiterHypERC20 is Script { function run() external { address mailbox = vm.envAddress("MAILBOX"); require(mailbox != address(0), "hyperlane mailbox address not set"); @@ -14,28 +17,49 @@ contract DeployNobleDollar is Script { address proxyAdmin = vm.envAddress("PROXYADMIN"); require(proxyAdmin != address(0), "proxy admin address not set"); + uint8 decimals = 6; + uint256 scale = 1; + uint256 initialSupply = 2e6; + string memory name = "Example"; + string memory symbol = "XMPL"; + address hook = address(0); + address ism = address(0); + vm.startBroadcast(); + // Deploy the Orbiter transient store for the HypERC20 token. + OrbiterTransientStore ots = new OrbiterTransientStore(); + // Deploy the implementation behind a proxy. - NobleDollar implementation = new NobleDollar(mailbox); + OrbiterHypERC20 implementation = new OrbiterHypERC20( + decimals, + scale, + mailbox + ); + TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy( address(implementation), proxyAdmin, abi.encodeWithSelector( - NobleDollar.initialize.selector, - address(0), - address(0) + OrbiterHypERC20.initialize.selector, + initialSupply, + name, + symbol, + hook, + ism, + msg.sender, + address(ots) ) ); // Get the proxy implementation using the NobleDollar interface. - NobleDollar nd = NobleDollar(address(proxy)); + OrbiterHypERC20 token = OrbiterHypERC20(address(proxy)); // Sanity check that the minting during initialization was successful. - uint256 minted = nd.balanceOf(msg.sender); + uint256 minted = token.balanceOf(msg.sender); require(minted != 0, "expected balance to have been minted for msg sender"); - console.log("deployed NobleDollar as proxy at ", address(nd)); + console.log("deployed proxy for OrbiterHypERC20 at ", address(token)); vm.stopBroadcast(); } diff --git a/contracts/script/SendForwardedTransfer.s.sol b/contracts/script/SendForwardedTransfer.s.sol index 0b25ec4b..3e879d11 100644 --- a/contracts/script/SendForwardedTransfer.s.sol +++ b/contracts/script/SendForwardedTransfer.s.sol @@ -3,14 +3,14 @@ pragma solidity ^0.8.24; import { console } from "forge-std/console.sol"; import { Script } from "forge-std/Script.sol"; -import {HyperlaneEntrypoint} from "../src/HyperlaneEntrypoint.sol"; +import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; contract SendForwardedTransfer is Script { function run() external { address entrypoint = vm.envAddress("ENTRYPOINT"); require(entrypoint != address(0), "entrypoint not set"); - address nobleDollar = vm.envAddress("NOBLEDOLLAR"); + address tokenAddress = vm.envAddress("NOBLEDOLLAR"); require(entrypoint != address(0), "noble dollar address not set"); uint32 destinationDomain = 1; @@ -21,8 +21,8 @@ contract SendForwardedTransfer is Script { vm.startBroadcast(); HyperlaneEntrypoint he = HyperlaneEntrypoint(entrypoint); - bytes32 messageID = he.sendUSDNWithForwardThroughHyperlane( - nobleDollar, + bytes32 messageID = he.sendForwardedTransfer( + tokenAddress, destinationDomain, recipient, amount, diff --git a/contracts/src/HyperlaneEntrypoint.sol b/contracts/src/HyperlaneEntrypoint.sol index 700975e4..883aae9a 100644 --- a/contracts/src/HyperlaneEntrypoint.sol +++ b/contracts/src/HyperlaneEntrypoint.sol @@ -1,8 +1,10 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.24; -import {NobleDollar} from "./usdn/USDNHyperlaneOrbiter.sol"; -import {OrbiterTransientStore} from "./usdn/OrbiterTransientStore.sol"; +import {OrbiterTransientStore} from "./OrbiterTransientStore.sol"; +import {OrbiterHypERC20} from "./OrbiterHypERC20.sol"; + +import { TokenRouter } from "@hyperlane/token/libs/TokenRouter.sol"; /* * @dev The canonical entrypoint contract to use Noble's Orbiter implementation through Hyperlane. @@ -15,35 +17,39 @@ import {OrbiterTransientStore} from "./usdn/OrbiterTransientStore.sol"; * TODO: make upgradeable */ contract HyperlaneEntrypoint { - address private otsAddress; - - constructor(address _otsAddress) { - otsAddress = _otsAddress; - } - /* - * @dev Send an asset transfer to the Orbiter, that should be forwarded to another Hyperlane domain. + * @notice Send an asset transfer to the Orbiter, that should be forwarded to another Hyperlane domain. */ - function sendUSDNWithForwardThroughHyperlane( + function sendForwardedTransfer( address tokenAddress, uint32 destinationDomain, bytes32 recipient, uint256 amount, bytes32 payloadHash ) external returns (bytes32 messageID) { - OrbiterTransientStore ots = OrbiterTransientStore(otsAddress); + OrbiterHypERC20 token = OrbiterHypERC20(tokenAddress); + + // TODO: this returns the address and then we instantiate the contract again -- can this simply return the OTS implementation? + address otsAddress = token.getOrbiterTransientStoreAddress(); + require(otsAddress != address(0), "orbiter transient store not set on token"); - // 1. set the pending payload into the transient storage + // set the pending payload into the transient storage + OrbiterTransientStore ots = OrbiterTransientStore(otsAddress); ots.setPendingPayloadHash(payloadHash); - // 2. send the warp transfer with the NobleDollar contract, - // which will get the payload hash to build the metadata - // in the overriden _transferRemote internal method. - NobleDollar token = NobleDollar(tokenAddress); - return token.transferRemote( - destinationDomain, - recipient, - amount + /* + * Transfer tokens from the user to this contract first. + * This ensures that when transferRemote burns tokens, this contract has them. + */ + require( + token.transferFrom(msg.sender, address(this), amount), + "failed to transfer tokens to entrypoint" ); + + /* + * Call transferRemote directly on the token contract. + * The token contract will handle the transfer and return the message ID. + */ + return token.transferRemote(destinationDomain, recipient, amount); } } \ No newline at end of file diff --git a/contracts/src/OrbiterHypERC20.sol b/contracts/src/OrbiterHypERC20.sol new file mode 100644 index 00000000..f384dda2 --- /dev/null +++ b/contracts/src/OrbiterHypERC20.sol @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.24; + +import { OrbiterTransientStore } from "./OrbiterTransientStore.sol"; + +import { HypERC20 } from "@hyperlane/token/HypERC20.sol"; +import { TokenMessage } from "@hyperlane/token/libs/TokenMessage.sol"; + +contract OrbiterHypERC20 is HypERC20 { + OrbiterTransientStore private ots; + + constructor( + uint8 _decimals, + uint256 _scale, + address _mailbox + ) HypERC20(_decimals, _scale, _mailbox) {} + + /** + * @notice Initializes the contract by calling the initialization logic + * of the HypERC20 contract and setting the Orbiter transient store. + */ + function initialize( + uint256 _totalSupply, + string memory _name, + string memory _symbol, + address _hook, + address _interchainSecurityModule, + address _owner, + address _orbiterTransientStore + ) public virtual initializer { + super.initialize( + _totalSupply, + _name, + _symbol, + _hook, + _interchainSecurityModule, + _owner + ); + + ots = OrbiterTransientStore(_orbiterTransientStore); + } + + /* + * @notice Returns the address of the Orbiter transient store that's + * associated with this contract. + */ + function getOrbiterTransientStoreAddress() external view returns (address) { + return address(ots); + } + + /* + * @notice Overrides the standard implementation of HypERC20 to support + * passing payloads within the same transaction using the Orbiter + * transient store. + */ + function _transferRemote( + uint32 _destination, + bytes32 _recipient, + uint256 _amount, + uint256 _value, + bytes memory _hookMetadata, + address _hook + ) internal virtual override returns (bytes32) { + // Run default logic for HypERC20 token. + HypERC20._transferFromSender(_amount); + + // This is where the custom logic is added + // to bind the metadata into the Hyperlane message. + // + // It is designed with inspiration from the CCTP token bridge contract: + // https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/token/TokenBridgeCctp.sol#L196-L231 + // + // TODO: this is currently requiring the OTS to be set, check if we always want this? + require( + address(ots) != address(0), + "orbiter transient store must be set" + ); + bytes32 payloadHash = ots.getPendingPayloadHash(); + + // Depending if the payload hash is populated or not, + // we are building the corresponding token messages to be sent + // via the Warp route. + bytes memory _tokenMessage; + if (payloadHash != bytes32(0)) { + _tokenMessage = TokenMessage.format( + _recipient, + _amount, + abi.encodePacked(payloadHash) + ); + } else { + _tokenMessage = TokenMessage.format( + _recipient, + _amount + ); + } + + bytes32 messageID = _Router_dispatch( + _destination, + _value, + _tokenMessage, + _hookMetadata, + _hook + ); + + emit SentTransferRemote( + _destination, + _recipient, + _amount + ); + + return messageID; + } +} diff --git a/contracts/src/usdn/OrbiterTransientStore.sol b/contracts/src/OrbiterTransientStore.sol similarity index 76% rename from contracts/src/usdn/OrbiterTransientStore.sol rename to contracts/src/OrbiterTransientStore.sol index ac63929d..8946edae 100644 --- a/contracts/src/usdn/OrbiterTransientStore.sol +++ b/contracts/src/OrbiterTransientStore.sol @@ -23,16 +23,19 @@ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; * @notice Holds pending payload hashes of transfers that should be executed * through the Orbiter. */ -contract OrbiterTransientStore is Ownable { - bytes32 transient pendingPayloadHash; +contract OrbiterTransientStore { + bytes32 transient private pendingPayloadHash; - constructor() Ownable(msg.sender) {} +// constructor() Ownable(msg.sender) {} + constructor() {} function getPendingPayloadHash() external view returns (bytes32) { return pendingPayloadHash; } - function setPendingPayloadHash(bytes32 payloadHash) external onlyOwner { + // TODO: this should be possible to be set by everyone? since it can only be set in the same transaction +// function setPendingPayloadHash(bytes32 payloadHash) external onlyOwner { + function setPendingPayloadHash(bytes32 payloadHash) external { pendingPayloadHash = payloadHash; } } diff --git a/contracts/src/usdn/USDNHyperlaneOrbiter.sol b/contracts/src/usdn/USDNHyperlaneOrbiter.sol deleted file mode 100644 index f7408ec7..00000000 --- a/contracts/src/usdn/USDNHyperlaneOrbiter.sol +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright 2025 NASD Inc. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * 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. - */ -pragma solidity ^0.8.24; - -import {HypERC20} from "@hyperlane/token/HypERC20.sol"; -import {TokenMessage} from "@hyperlane/token/libs/TokenMessage.sol"; - -import {OrbiterTransientStore} from "./OrbiterTransientStore.sol"; - -import {IndexingMath} from "./utils/IndexingMath.sol"; - -import {UIntMath} from "./utils/UIntMath.sol"; - -/* - -███╗ ██╗ ██████╗ ██████╗ ██╗ ███████╗ -████╗ ██║██╔═══██╗██╔══██╗██║ ██╔════╝ -██╔██╗ ██║██║ ██║██████╔╝██║ █████╗ -██║╚██╗██║██║ ██║██╔══██╗██║ ██╔══╝ -██║ ╚████║╚██████╔╝██████╔╝███████╗███████╗ -╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚══════╝╚══════╝ - -██████╗ ██████╗ ██╗ ██╗ █████╗ ██████╗ -██╔══██╗██╔═══██╗██║ ██║ ██╔══██╗██╔══██╗ -██║ ██║██║ ██║██║ ██║ ███████║██████╔╝ -██║ ██║██║ ██║██║ ██║ ██╔══██║██╔══██╗ -██████╔╝╚██████╔╝███████╗███████╗██║ ██║██║ ██║ -╚═════╝ ╚═════╝ ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ - -*/ - -/** - * @title NobleDollar - * @author John Letey - * @notice ERC20 Noble Dollar. - */ -contract NobleDollar is HypERC20 { - /// @notice Thrown when a user attempts to claim yield but has no claimable yield available. - error NoClaimableYield(); - - /// @notice Thrown when an invalid transfer to the contract is attempted. - error InvalidTransfer(); - - /// @notice The transient store contract to retrieve a pending Orbiter payload hash within the same - /// smart contract call. - OrbiterTransientStore orbiterTransientStore; - - /** - * @notice Emitted when the index is updated due to yield accrual. - * @param oldIndex The previous index value. - * @param newIndex The new index value. - * @param totalPrincipal The total principal amount at the time of update. - * @param yieldAccrued The amount of yield that was accrued. - */ - event IndexUpdated(uint128 oldIndex, uint128 newIndex, uint112 totalPrincipal, uint256 yieldAccrued); - - /** - * @notice Emitted when yield is claimed by an account. - * @param account The account that claimed the yield. - * @param amount The amount of yield claimed. - */ - event YieldClaimed(address indexed account, uint256 amount); - - /// @custom:storage-location erc7201:noble.storage.USDN - struct USDNStorage { - uint128 index; - uint112 totalPrincipal; - mapping(address account => uint112) principal; - } - - // keccak256(abi.encode(uint256(keccak256("noble.storage.USDN")) - 1)) & ~bytes32(uint256(0xff)) - bytes32 private constant USDNStorageLocation = 0xccec1a0a356b34ea3899fbc248aeaeba5687659563a3acddccc6f1e8a5d84200; - - function _getUSDNStorage() private pure returns (USDNStorage storage $) { - assembly { - $.slot := USDNStorageLocation - } - } - - constructor(address mailbox_) HypERC20(6, 1, mailbox_) { -// _disableInitializers(); - } - - function initialize(address hook_, address ism_) public virtual initializer { -// super.initialize("Noble Dollar", "USDN", hook_, ism_, msg.sender); - // TODO: added this for testing purposes to have tokens available - super.initialize(uint256(2e18), "Noble Dollar", "USDN", hook_, ism_, msg.sender); - - _getUSDNStorage().index = IndexingMath.EXP_SCALED_ONE; - } - - /// @dev Returns the current index used for yield calculations. - function index() public view returns (uint128) { - return _getUSDNStorage().index; - } - - /// @dev Returns the amount of principal in existence. - function totalPrincipal() public view returns (uint112) { - return _getUSDNStorage().totalPrincipal; - } - - /// @dev Returns the amount of principal owned for a given account. - function principalOf(address account) public view returns (uint112) { - return _getUSDNStorage().principal[account]; - } - - /** - * @notice Returns the amount of yield claimable for a given account. - * @dev Calculates claimable yield by comparing the expected balance (principal * current index) - * with the actual token balance. The yield represents the difference between what the - * account should have based on yield accrual and what they currently hold. - * - * Formula: max(0, (principal * index / 1e12) - currentBalance) - * - * Returns 0 if the current balance is greater than or equal to the expected balance, - * which can happen if the account has already claimed their yield or if no yield - * has accrued since their last interaction. - * - * @param account The address to check yield for. - * @return The amount of yield claimable by the account. - */ - function yield(address account) public view returns (uint256) { - USDNStorage storage $ = _getUSDNStorage(); - - uint256 expectedBalance = IndexingMath.getPresentAmountRoundedDown($.principal[account], $.index); - - uint256 currentBalance = balanceOf(account); - - return expectedBalance > currentBalance ? expectedBalance - currentBalance : 0; - } - - /** - * @notice Claims all available yield for the caller. - * @dev Calculates the claimable yield based on the difference between the expected balance - * (principal * current index) and the actual token balance. Transfers the yield amount - * from the contract to the caller and emits a YieldClaimed event. - * @custom:throws NoClaimableYield if the caller has no yield available to claim. - * @custom:emits YieldClaimed when yield is successfully claimed. - */ - function claim() public { - uint256 amount = yield(msg.sender); - - if (amount == 0) revert NoClaimableYield(); - - _update(address(this), msg.sender, amount); - - emit YieldClaimed(msg.sender, amount); - } - - /* - * @notice Sets the Orbiter transient store. - */ - function setOTS(address _otsAddress) external { - orbiterTransientStore = OrbiterTransientStore(_otsAddress); - } - - /** - * @notice Internal function that handles token transfers while managing principal accounting. - * @dev Overrides the base ERC20 _update function to implement yield-bearing token mechanics. - * This function manages principal balances and index updates for different transfer scenarios: - * - * 1. Yield payout (from contract): No principal updates needed - * 2. Yield accrual (to contract from zero address): Updates index based on new yield - * 3. Regular transfers: Updates principal balances for both sender and recipient - * 4. Minting (from zero address): Increases recipient's principal and total principal - * 5. Burning (to zero address): Decreases sender's principal and total principal - * - * @param from The address tokens are transferred from (zero address for minting) - * @param to The address tokens are transferred to (zero address for burning) - * @param value The amount of tokens being transferred - * - * @custom:throws InvalidTransfer if attempting to transfer to the contract from a non-zero address - * @custom:emits IndexUpdated when yield is accrued and the index is updated - * @custom:security Principal is calculated using ceiling / floor division in favor of protocol. - */ - function _update(address from, address to, uint256 value) internal virtual override { - super._update(from, to, value); - - // Special case, no-op operation. - if (from == address(0) && to == address(0)) return; - - // We don't want to perform any principal updates in the case of yield payout. - if (from == address(this)) return; - - // We don't want to allow any other transfers to the yield account. - if (from != address(0) && to == address(this)) revert InvalidTransfer(); - - USDNStorage storage $ = _getUSDNStorage(); - - // Distribute yield, derive new index from the adjusted total supply. - // NOTE: We don't want to perform any principal updates in the case of yield accrual. - if (to == address(this)) { - - if ($.totalPrincipal == 0) return; - - uint128 oldIndex = $.index; - - $.index = IndexingMath.getIndexRoundedDown(totalSupply(), $.totalPrincipal); - - emit IndexUpdated(oldIndex, $.index, $.totalPrincipal, value); - - return; - } - - // Minting - if (from == address(0)) { - uint112 principalDown = IndexingMath.getPrincipalAmountRoundedDown(value, $.index); - $.principal[to] += principalDown; - $.totalPrincipal += principalDown; - - return; - } - - // Safely round up principal in case of transfers or burning. - uint112 fromPrincipal = $.principal[from]; - uint112 principalUp = IndexingMath.getSafePrincipalAmountRoundedUp(value, $.index, fromPrincipal); - $.principal[from] = fromPrincipal - principalUp; - - if (to == address(0)) { - // Burning - $.totalPrincipal -= principalUp; - } else { - // Transfer - $.principal[to] += principalUp; - } - } - - function _transferRemote( - uint32 _destination, - bytes32 _recipient, - uint256 _amount, - uint256 _value, - bytes memory _hookMetadata, - address _hook - ) internal virtual override returns (bytes32 messageId) { - // Run default logic for HypERC20 token. - HypERC20._transferFromSender(_amount); - - // This is where the custom logic is added - // to bind the metadata comes into play. - // - // It is designed with inspiration from the CCTP token bridge contract: - // https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/token/TokenBridgeCctp.sol#L196-L231 - // - // TODO: this is currently requiring the OTS to be set, check if we always want this? - require( - address(orbiterTransientStore) != address(0), - "orbiterTransientStore must be set" - ); - bytes32 payloadHash = orbiterTransientStore.getPendingPayloadHash(); - - bytes memory _tokenMessage; - if (payloadHash != bytes32(0)) { - _tokenMessage = TokenMessage.format( - _recipient, - _amount, - abi.encodePacked(payloadHash) - ); - } else { - _tokenMessage = TokenMessage.format( - _recipient, - _amount - ); - } - - messageId = _Router_dispatch( - _destination, - _value, - _tokenMessage, - _hookMetadata, - _hook - ); - - emit SentTransferRemote(_destination, _recipient, _amount); - } -} \ No newline at end of file diff --git a/contracts/src/usdn/utils/IndexingMath.sol b/contracts/src/usdn/utils/IndexingMath.sol deleted file mode 100644 index 833b36f3..00000000 --- a/contracts/src/usdn/utils/IndexingMath.sol +++ /dev/null @@ -1,103 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 - -pragma solidity >=0.8.20 <0.9.0; - -import {UIntMath} from "./UIntMath.sol"; - -/** - * @title Helper library for indexing math functions. - * @author M0 Labs - */ -library IndexingMath { - /* ============ Variables ============ */ - - /// @notice The scaling of indexes for exponent math. - uint56 internal constant EXP_SCALED_ONE = 1e12; - - /* ============ Custom Errors ============ */ - - /// @notice Emitted when a division by zero occurs. - error DivisionByZero(); - - /* ============ Exposed Functions ============ */ - - /** - * @dev Returns the present amount (rounded down) given the principal amount and an index. - * @param principal The principal amount. - * @param index An index. - * @return The present amount rounded down. - */ - function getPresentAmountRoundedDown(uint112 principal, uint128 index) internal pure returns (uint256) { - unchecked { - return (uint256(principal) * index) / EXP_SCALED_ONE; - } - } - - /** - * @dev Returns the principal amount given the present amount, using the current index. - * @param presentAmount The present amount. - * @param index An index. - * @return The principal amount rounded down. - */ - function getPrincipalAmountRoundedDown(uint256 presentAmount, uint128 index) internal pure returns (uint112) { - if (index == 0) revert DivisionByZero(); - - unchecked { - // NOTE: While `uint256(presentAmount) * EXP_SCALED_ONE` can technically overflow, these divide/multiply functions are - // only used for the purpose of principal/present amount calculations for continuous indexing, and - // so for an `presentAmount` to be large enough to overflow this, it would have to be a possible result of - // `multiply112By128Down` or `multiply112By128Up`, which would already satisfy - // `uint256(presentAmount) * EXP_SCALED_ONE < type(uint240).max`. - return UIntMath.safe112((presentAmount * EXP_SCALED_ONE) / index); - } - } - - /** - * @dev Returns the principal amount given the present amount, using the current index. - * @param presentAmount The present amount. - * @param index An index. - * @return The principal amount rounded up. - */ - function getPrincipalAmountRoundedUp(uint256 presentAmount, uint128 index) internal pure returns (uint112) { - if (index == 0) revert DivisionByZero(); - - unchecked { - // NOTE: While `uint256(presentAmount) * EXP_SCALED_ONE` can technically overflow, these divide/multiply functions are - // only used for the purpose of principal/present amount calculations for continuous indexing, and - // so for an `presentAmount` to be large enough to overflow this, it would have to be a possible result of - // `multiply112By128Down` or `multiply112By128Up`, which would already satisfy - // `uint256(presentAmount) * EXP_SCALED_ONE < type(uint240).max`. - return UIntMath.safe112(((presentAmount * EXP_SCALED_ONE) + index - 1) / index); - } - } - - /** - * @dev Returns the safely capped principal amount given the present amount, using the current index. - * @param presentAmount The present amount. - * @param index An index. - * @param maxPrincipalAmount The maximum principal amount. - * @return The principal amount rounded up, capped at maxPrincipalAmount. - */ - function getSafePrincipalAmountRoundedUp(uint256 presentAmount, uint128 index, uint112 maxPrincipalAmount) - internal - pure - returns (uint112) - { - uint112 principalAmount = getPrincipalAmountRoundedUp(presentAmount, index); - return principalAmount > maxPrincipalAmount ? maxPrincipalAmount : principalAmount; - } - - /** - * @notice Returns the index (rounded down) given the present amount and principal. - * @param presentAmount The present amount. - * @param principal The principal amount. - * @return The index rounded down. - */ - function getIndexRoundedDown(uint256 presentAmount, uint112 principal) internal pure returns (uint128) { - if (principal == 0) revert DivisionByZero(); - - unchecked { - return UIntMath.safe128((presentAmount * IndexingMath.EXP_SCALED_ONE) / principal); - } - } -} \ No newline at end of file diff --git a/contracts/src/usdn/utils/UintMath.sol b/contracts/src/usdn/utils/UintMath.sol deleted file mode 100644 index 3994d015..00000000 --- a/contracts/src/usdn/utils/UintMath.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 - -pragma solidity >=0.8.20 <0.9.0; - -/** - * @title Library to perform safe math operations on uint types - * @author M0 Labs - */ -library UIntMath { - /* ============ Custom Errors ============ */ - - /// @notice Emitted when a passed value is greater than the maximum value of uint112. - error InvalidUInt112(); - - /// @notice Emitted when a passed value is greater than the maximum value of uint128. - error InvalidUInt128(); - - /* ============ Internal View/Pure Functions ============ */ - - /** - * @notice Casts a uint256 value to a uint112, ensuring that it is less than or equal to the maximum uint112 value. - * @param n The value to cast. - * @return The value casted to uint112. - */ - function safe112(uint256 n) internal pure returns (uint112) { - if (n > type(uint112).max) revert InvalidUInt112(); - return uint112(n); - } - - /** - * @notice Casts a uint256 value to a uint128, ensuring that it is less than or equal to the maximum uint128 value. - * @param n The value to cast. - * @return The value casted to uint128. - */ - function safe128(uint256 n) internal pure returns (uint128) { - if (n > type(uint128).max) revert InvalidUInt128(); - return uint128(n); - } -} From b321aa31c60c4bd0481bb6c2650fad8a240ffd3f Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 24 Sep 2025 16:00:23 +0200 Subject: [PATCH 06/34] add forge test wip --- contracts/test/TestOrbiterHypERC20.t.sol | 144 +++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 contracts/test/TestOrbiterHypERC20.t.sol diff --git a/contracts/test/TestOrbiterHypERC20.t.sol b/contracts/test/TestOrbiterHypERC20.t.sol new file mode 100644 index 00000000..24c5ab62 --- /dev/null +++ b/contracts/test/TestOrbiterHypERC20.t.sol @@ -0,0 +1,144 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.24; + +import "forge-std/Test.sol"; + +import { OrbiterHypERC20 } from "../src/OrbiterHypERC20.sol"; +import { OrbiterTransientStore } from "../src/OrbiterTransientStore.sol"; +import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; + +import { Mailbox } from "@hyperlane/Mailbox.sol"; +import { MockMailbox } from "@hyperlane/mock/MockMailbox.sol"; +import { TestPostDispatchHook } from "@hyperlane/test/TestPostDispatchHook.sol"; + +import { TransparentUpgradeableProxy, ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +contract TestOrbiterHypERC20 is Test { + // TODO: check noble destination domain for Hyperlane + uint32 internal constant ORIGIN = 1; + uint32 internal constant DESTINATION = 6; + uint8 internal DECIMALS = 6; + uint256 internal SCALE = 1; + uint256 internal TOTAL_SUPPLY = 2e7; // 20 $ORB + + string internal constant NAME = "Orbiter"; + string internal constant SYMBOL = "ORB"; + + MockMailbox internal originMailbox; + MockMailbox internal remoteMailbox; + TestPostDispatchHook internal noopHook; + + OrbiterHypERC20 internal token; + HyperlaneEntrypoint internal entrypoint; + + address internal constant ALICE = address(0x1); + address internal constant BOB = address(0x2); + address internal constant ADMIN = address(0x3); + address internal constant HYP_OWNER = address(0x4); + + function setUp() public virtual { + // Run setup from ADMIN to make it the owner of contracts. + // + // NOTE: This MUST be a different account than the caller contract, + // because the TransparentUpgradeableProxy does not forward calls to the contracts + // if sending a transaction from its admin. + // This is an additional security mechanism to only have external accounts interact with the proxy's methods + // and the proxy admin to only be able to call configuration / settings methods. + vm.startPrank(ADMIN); + + // Set up testing instances of Hyperlane dependencies. + remoteMailbox = new MockMailbox(DESTINATION); + + noopHook = new TestPostDispatchHook(); + + address owner = remoteMailbox.owner(); + require(owner == ADMIN, "expected admin to be owner of mailbox"); + + remoteMailbox.setDefaultHook(address(noopHook)); + remoteMailbox.setRequiredHook(address(noopHook)); + + // Set up Orbiter transient store. + OrbiterTransientStore ots = new OrbiterTransientStore(); + + // Deploy Orbiter compatible token with a proxy. + OrbiterHypERC20 implementation = new OrbiterHypERC20( + DECIMALS, + SCALE, + address(remoteMailbox) + ); + + TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy( + address(implementation), + msg.sender, + abi.encodeWithSelector( + OrbiterHypERC20.initialize.selector, + // default HypERC20 initialization arguments + TOTAL_SUPPLY, + NAME, + SYMBOL, + address(noopHook), + address(0), // TODO: check if InterchainGasPaymaster has to be created? + HYP_OWNER, + // custom OrbiterHypERC20 initialization arguments + address(ots) + ) + ); + + token = OrbiterHypERC20(address(proxy)); + + entrypoint = new HyperlaneEntrypoint(); + + // After setting up the state we need to fund the test accounts + // with the ERC-20s. + // + // NOTE: the msg.sender of the `initialize` call has the supply of tokens + // minted to the corresponding address. + require(token.balanceOf(ADMIN) == TOTAL_SUPPLY, "expected tokens to be minted"); + require(token.balanceOf(ALICE) == 0, "expected alice to have no tokens before transfer"); + + uint256 sentAmount = 1e7; + require(token.transfer(ALICE, sentAmount), "failed to send tokens to alice"); + require(token.balanceOf(ALICE) == sentAmount, "expected tokens to have been sent to alice"); + + vm.stopPrank(); + } + + /* + * @notice This test checks that the setup was successful by asserting + * expected token balances and correct wiring of the interdependent contracts. + */ + function testSetupWorked() public { + assertNotEq( + token.balanceOf(ALICE), + 0, + "expected alice to have non-zero token balance after setup" + ); + } + + /* + * @notice This tests that sending a Hyperlane forwarded transfer + * using the entrypoint contract is going to work. + */ + function testForwardedTransfer() public { + vm.startPrank(ALICE); + + uint256 sentAmount = 1230; + assertGe(token.balanceOf(ALICE), sentAmount, "sent amount exceeds available token balance"); + + // Approve the entrypoint contract to spend ALICE's tokens + require(token.approve(address(entrypoint), sentAmount), "failed to approve entrypoint"); + + bytes32 sentPayloadHash = bytes32(uint256(1234)); + + bytes32 messageID = entrypoint.sendForwardedTransfer( + address(token), + DESTINATION, + bytes32(uint256(uint160(BOB))), // This converts the 20-byte address to a bytes32 value. + sentAmount, + sentPayloadHash + ); + assertNotEq32(messageID, 0, "expected non-zero message ID"); + + vm.stopPrank(); + } +} From c02a1c86fbd2447c2ee8b22a7c66f047e39abb41 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 24 Sep 2025 17:42:46 +0200 Subject: [PATCH 07/34] extract utility function and fix "no enrolled routers" error --- contracts/test/TestOrbiterHypERC20.t.sol | 117 +++++++++++++++++------ 1 file changed, 86 insertions(+), 31 deletions(-) diff --git a/contracts/test/TestOrbiterHypERC20.t.sol b/contracts/test/TestOrbiterHypERC20.t.sol index 24c5ab62..c764251a 100644 --- a/contracts/test/TestOrbiterHypERC20.t.sol +++ b/contracts/test/TestOrbiterHypERC20.t.sol @@ -10,12 +10,19 @@ import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; import { Mailbox } from "@hyperlane/Mailbox.sol"; import { MockMailbox } from "@hyperlane/mock/MockMailbox.sol"; import { TestPostDispatchHook } from "@hyperlane/test/TestPostDispatchHook.sol"; +import { TypeCasts } from "@hyperlane/libs/TypeCasts.sol"; import { TransparentUpgradeableProxy, ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; contract TestOrbiterHypERC20 is Test { - // TODO: check noble destination domain for Hyperlane + // NOTE: this is adding the utilities for converting address to Hyperlane expected bytes32. + using TypeCasts for address; + + /* + * CONSTANTS + */ uint32 internal constant ORIGIN = 1; + // TODO: check noble destination domain for Hyperlane uint32 internal constant DESTINATION = 6; uint8 internal DECIMALS = 6; uint256 internal SCALE = 1; @@ -24,13 +31,20 @@ contract TestOrbiterHypERC20 is Test { string internal constant NAME = "Orbiter"; string internal constant SYMBOL = "ORB"; + /* + * HYPERLANE CONTRACTS + */ MockMailbox internal originMailbox; MockMailbox internal remoteMailbox; TestPostDispatchHook internal noopHook; - OrbiterHypERC20 internal token; + OrbiterHypERC20 internal localToken; + OrbiterHypERC20 internal remoteToken; HyperlaneEntrypoint internal entrypoint; + /* + * TESTING ACCOUNTS + */ address internal constant ALICE = address(0x1); address internal constant BOB = address(0x2); address internal constant ADMIN = address(0x3); @@ -47,7 +61,10 @@ contract TestOrbiterHypERC20 is Test { vm.startPrank(ADMIN); // Set up testing instances of Hyperlane dependencies. + originMailbox = new MockMailbox(ORIGIN); remoteMailbox = new MockMailbox(DESTINATION); + originMailbox.addRemoteMailbox(DESTINATION, remoteMailbox); + remoteMailbox.addRemoteMailbox(ORIGIN, originMailbox); noopHook = new TestPostDispatchHook(); @@ -61,31 +78,20 @@ contract TestOrbiterHypERC20 is Test { OrbiterTransientStore ots = new OrbiterTransientStore(); // Deploy Orbiter compatible token with a proxy. - OrbiterHypERC20 implementation = new OrbiterHypERC20( - DECIMALS, - SCALE, - address(remoteMailbox) + localToken = deployOrbiterHypERC20( + address(originMailbox), + address(noopHook), + HYP_OWNER, + address(ots) ); - TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy( - address(implementation), - msg.sender, - abi.encodeWithSelector( - OrbiterHypERC20.initialize.selector, - // default HypERC20 initialization arguments - TOTAL_SUPPLY, - NAME, - SYMBOL, - address(noopHook), - address(0), // TODO: check if InterchainGasPaymaster has to be created? - HYP_OWNER, - // custom OrbiterHypERC20 initialization arguments - address(ots) - ) + remoteToken = deployOrbiterHypERC20( + address(remoteMailbox), + address(noopHook), + HYP_OWNER, + address(ots) ); - token = OrbiterHypERC20(address(proxy)); - entrypoint = new HyperlaneEntrypoint(); // After setting up the state we need to fund the test accounts @@ -93,12 +99,27 @@ contract TestOrbiterHypERC20 is Test { // // NOTE: the msg.sender of the `initialize` call has the supply of tokens // minted to the corresponding address. - require(token.balanceOf(ADMIN) == TOTAL_SUPPLY, "expected tokens to be minted"); - require(token.balanceOf(ALICE) == 0, "expected alice to have no tokens before transfer"); + require(localToken.balanceOf(ADMIN) == TOTAL_SUPPLY, "expected tokens to be minted"); + require(localToken.balanceOf(ALICE) == 0, "expected alice to have no tokens before transfer"); uint256 sentAmount = 1e7; - require(token.transfer(ALICE, sentAmount), "failed to send tokens to alice"); - require(token.balanceOf(ALICE) == sentAmount, "expected tokens to have been sent to alice"); + require(localToken.transfer(ALICE, sentAmount), "failed to send tokens to alice"); + require(localToken.balanceOf(ALICE) == sentAmount, "expected tokens to have been sent to alice"); + + vm.stopPrank(); + + vm.startPrank(HYP_OWNER); + + // Enroll the routers + localToken.enrollRemoteRouter( + DESTINATION, + address(remoteToken).addressToBytes32() + ); + + remoteToken.enrollRemoteRouter( + ORIGIN, + address(localToken).addressToBytes32() + ); vm.stopPrank(); } @@ -109,7 +130,7 @@ contract TestOrbiterHypERC20 is Test { */ function testSetupWorked() public { assertNotEq( - token.balanceOf(ALICE), + localToken.balanceOf(ALICE), 0, "expected alice to have non-zero token balance after setup" ); @@ -123,15 +144,15 @@ contract TestOrbiterHypERC20 is Test { vm.startPrank(ALICE); uint256 sentAmount = 1230; - assertGe(token.balanceOf(ALICE), sentAmount, "sent amount exceeds available token balance"); + assertGe(localToken.balanceOf(ALICE), sentAmount, "sent amount exceeds available token balance"); // Approve the entrypoint contract to spend ALICE's tokens - require(token.approve(address(entrypoint), sentAmount), "failed to approve entrypoint"); + require(localToken.approve(address(entrypoint), sentAmount), "failed to approve entrypoint"); bytes32 sentPayloadHash = bytes32(uint256(1234)); bytes32 messageID = entrypoint.sendForwardedTransfer( - address(token), + address(localToken), DESTINATION, bytes32(uint256(uint160(BOB))), // This converts the 20-byte address to a bytes32 value. sentAmount, @@ -141,4 +162,38 @@ contract TestOrbiterHypERC20 is Test { vm.stopPrank(); } + + function deployOrbiterHypERC20( + address _mailboxAddress, + address _hook, + address _owner, + address _otsAddress + ) internal returns (OrbiterHypERC20) { + OrbiterHypERC20 implementation = new OrbiterHypERC20( + DECIMALS, + SCALE, + _mailboxAddress + ); + + TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy( + address(implementation), + msg.sender, + abi.encodeWithSelector( + OrbiterHypERC20.initialize.selector, + // default HypERC20 initialization arguments + TOTAL_SUPPLY, + NAME, + SYMBOL, + _hook, + address(0), // TODO: check if InterchainGasPaymaster has to be created? + _owner, + // custom OrbiterHypERC20 initialization arguments + _otsAddress + ) + ); + + remoteToken = OrbiterHypERC20(address(proxy)); + + return remoteToken; + } } From ebb00ab2c4725042ec5c1c673657481fb87a6d2d Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 24 Sep 2025 18:54:04 +0200 Subject: [PATCH 08/34] add test for standard transfer remote on orbiter hyp contract --- contracts/src/OrbiterHypERC20.sol | 2 -- contracts/test/TestOrbiterHypERC20.t.sol | 40 +++++++++++++++++++++--- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/contracts/src/OrbiterHypERC20.sol b/contracts/src/OrbiterHypERC20.sol index f384dda2..fd1007e6 100644 --- a/contracts/src/OrbiterHypERC20.sol +++ b/contracts/src/OrbiterHypERC20.sol @@ -69,8 +69,6 @@ contract OrbiterHypERC20 is HypERC20 { // // It is designed with inspiration from the CCTP token bridge contract: // https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/token/TokenBridgeCctp.sol#L196-L231 - // - // TODO: this is currently requiring the OTS to be set, check if we always want this? require( address(ots) != address(0), "orbiter transient store must be set" diff --git a/contracts/test/TestOrbiterHypERC20.t.sol b/contracts/test/TestOrbiterHypERC20.t.sol index c764251a..7258bdc4 100644 --- a/contracts/test/TestOrbiterHypERC20.t.sol +++ b/contracts/test/TestOrbiterHypERC20.t.sol @@ -7,10 +7,11 @@ import { OrbiterHypERC20 } from "../src/OrbiterHypERC20.sol"; import { OrbiterTransientStore } from "../src/OrbiterTransientStore.sol"; import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; +import { TypeCasts } from "@hyperlane/libs/TypeCasts.sol"; import { Mailbox } from "@hyperlane/Mailbox.sol"; import { MockMailbox } from "@hyperlane/mock/MockMailbox.sol"; import { TestPostDispatchHook } from "@hyperlane/test/TestPostDispatchHook.sol"; -import { TypeCasts } from "@hyperlane/libs/TypeCasts.sol"; +import { TokenRouter } from "@hyperlane/token/libs/TokenRouter.sol"; import { TransparentUpgradeableProxy, ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; @@ -22,7 +23,6 @@ contract TestOrbiterHypERC20 is Test { * CONSTANTS */ uint32 internal constant ORIGIN = 1; - // TODO: check noble destination domain for Hyperlane uint32 internal constant DESTINATION = 6; uint8 internal DECIMALS = 6; uint256 internal SCALE = 1; @@ -108,9 +108,11 @@ contract TestOrbiterHypERC20 is Test { vm.stopPrank(); + /* + * Enrolling routers has to be done by the HYP token owner. + */ vm.startPrank(HYP_OWNER); - // Enroll the routers localToken.enrollRemoteRouter( DESTINATION, address(remoteToken).addressToBytes32() @@ -151,6 +153,7 @@ contract TestOrbiterHypERC20 is Test { bytes32 sentPayloadHash = bytes32(uint256(1234)); + // TODO: check event bytes32 messageID = entrypoint.sendForwardedTransfer( address(localToken), DESTINATION, @@ -163,6 +166,35 @@ contract TestOrbiterHypERC20 is Test { vm.stopPrank(); } + /* + * @notice This test shows that the token contract can still be used + * for direct `remoteTransfer` calls that do not go through the Hyperlane entrypoint, + * and therefore don't insert the payload hash into the emitted token message. + */ + function testStandardRemoteTransfer() public { + uint256 sentAmount = 123; + uint256 initialBalance = localToken.balanceOf(ALICE); + require(initialBalance >= sentAmount); + + // NOTE: this tracks the next emitted event and checks if it was emitted in the following + // function call. + vm.expectEmit(); + emit TokenRouter.SentTransferRemote( + DESTINATION, + address(BOB).addressToBytes32(), + sentAmount + ); + + vm.prank(ALICE); + localToken.transferRemote( + DESTINATION, + address(BOB).addressToBytes32(), + sentAmount + ); + + require(localToken.balanceOf(ALICE) == initialBalance - sentAmount, "expected tokens to be sent"); + } + function deployOrbiterHypERC20( address _mailboxAddress, address _hook, @@ -185,7 +217,7 @@ contract TestOrbiterHypERC20 is Test { NAME, SYMBOL, _hook, - address(0), // TODO: check if InterchainGasPaymaster has to be created? + address(0), // using no IGP here _owner, // custom OrbiterHypERC20 initialization arguments _otsAddress From aa1a2d17df0aad282c74ab9357e7a21b132a624c Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 25 Sep 2025 14:22:24 +0200 Subject: [PATCH 09/34] add expected event to test for dispatch event that includes payload hash --- contracts/test/TestOrbiterHypERC20.t.sol | 69 ++++++++++++++++++++---- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/contracts/test/TestOrbiterHypERC20.t.sol b/contracts/test/TestOrbiterHypERC20.t.sol index 7258bdc4..64b0724f 100644 --- a/contracts/test/TestOrbiterHypERC20.t.sol +++ b/contracts/test/TestOrbiterHypERC20.t.sol @@ -7,10 +7,13 @@ import { OrbiterHypERC20 } from "../src/OrbiterHypERC20.sol"; import { OrbiterTransientStore } from "../src/OrbiterTransientStore.sol"; import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; -import { TypeCasts } from "@hyperlane/libs/TypeCasts.sol"; import { Mailbox } from "@hyperlane/Mailbox.sol"; +import { IMailbox } from "@hyperlane/interfaces/IMailbox.sol"; +import { TypeCasts } from "@hyperlane/libs/TypeCasts.sol"; +import { Message } from "@hyperlane/libs/Message.sol"; import { MockMailbox } from "@hyperlane/mock/MockMailbox.sol"; import { TestPostDispatchHook } from "@hyperlane/test/TestPostDispatchHook.sol"; +import { TokenMessage } from "@hyperlane/token/libs/TokenMessage.sol"; import { TokenRouter } from "@hyperlane/token/libs/TokenRouter.sol"; import { TransparentUpgradeableProxy, ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; @@ -128,9 +131,9 @@ contract TestOrbiterHypERC20 is Test { /* * @notice This test checks that the setup was successful by asserting - * expected token balances and correct wiring of the interdependent contracts. + * expected token balances. */ - function testSetupWorked() public { + function testSetupWorked() public view { assertNotEq( localToken.balanceOf(ALICE), 0, @@ -140,7 +143,8 @@ contract TestOrbiterHypERC20 is Test { /* * @notice This tests that sending a Hyperlane forwarded transfer - * using the entrypoint contract is going to work. + * using the entrypoint contract is going to work and emits + * the expected dispatch event, which contains the payload hash. */ function testForwardedTransfer() public { vm.startPrank(ALICE); @@ -153,11 +157,33 @@ contract TestOrbiterHypERC20 is Test { bytes32 sentPayloadHash = bytes32(uint256(1234)); - // TODO: check event + // NOTE: the expected message is the wrapped token message with the contained payload. + bytes memory expectedMessage = _formatMessageWithMemoryBody( + 3, + 0, + ORIGIN, + address(localToken).addressToBytes32(), + DESTINATION, + address(remoteToken).addressToBytes32(), + TokenMessage.format( + BOB.addressToBytes32(), + sentAmount, + abi.encodePacked(sentPayloadHash) + ) + ); + + vm.expectEmit(); + emit IMailbox.Dispatch( + address(localToken), + DESTINATION, + address(remoteToken).addressToBytes32(), + expectedMessage + ); + bytes32 messageID = entrypoint.sendForwardedTransfer( address(localToken), DESTINATION, - bytes32(uint256(uint160(BOB))), // This converts the 20-byte address to a bytes32 value. + BOB.addressToBytes32(), sentAmount, sentPayloadHash ); @@ -195,6 +221,33 @@ contract TestOrbiterHypERC20 is Test { require(localToken.balanceOf(ALICE) == initialBalance - sentAmount, "expected tokens to be sent"); } + /* + * @notice Helper function to format a message with bytes memory body + * @dev This is needed because Message.formatMessage expects bytes calldata. + * + * It's based on the implementation on Message.sol: + * https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/libs/Message.sol#L21-L52 + */ + function _formatMessageWithMemoryBody( + uint8 _version, + uint32 _nonce, + uint32 _originDomain, + bytes32 _sender, + uint32 _destinationDomain, + bytes32 _recipient, + bytes memory _messageBody + ) internal pure returns (bytes memory) { + return abi.encodePacked( + _version, + _nonce, + _originDomain, + _sender, + _destinationDomain, + _recipient, + _messageBody + ); + } + function deployOrbiterHypERC20( address _mailboxAddress, address _hook, @@ -224,8 +277,6 @@ contract TestOrbiterHypERC20 is Test { ) ); - remoteToken = OrbiterHypERC20(address(proxy)); - - return remoteToken; + return OrbiterHypERC20(address(proxy)); } } From 82368ff296af8736f3eda657b883beb1e0f7d1da Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 25 Sep 2025 14:22:43 +0200 Subject: [PATCH 10/34] add linter config and makefile target --- contracts/.solhint.json | 3 +++ contracts/Makefile | 29 +++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 contracts/.solhint.json diff --git a/contracts/.solhint.json b/contracts/.solhint.json new file mode 100644 index 00000000..ce2220e0 --- /dev/null +++ b/contracts/.solhint.json @@ -0,0 +1,3 @@ +{ + "extends": "solhint:recommended" +} diff --git a/contracts/Makefile b/contracts/Makefile index c79b4b1e..f7a84008 100644 --- a/contracts/Makefile +++ b/contracts/Makefile @@ -1,9 +1,34 @@ -.PHONY: all deps compile -all: deps compile +# ------------------------------ +# Build & Deps +# ------------------------------ +.PHONY: all deps compile +all: deps compile lint compile: @forge compile deps: @bun install + +# ------------------------------ +# Testing +# ------------------------------ +.PHONY: lint lint-solidity +lint: lint-solidity + +SOLHINT_VERSION := "latest" +SOLHINT_IMAGE := "protodb/protofire-solhint:$(SOLHINT_VERSION)" +lint-solidity: + @docker run -v $(PWD):/workdir -w /workdir \ + -it $(SOLHINT_IMAGE) \ + solhint 'src/*.sol' + +# ------------------------------ +# Testing +# ------------------------------ +.PHONY: test test-forge +test: test-forge + +test-forge: + @forge test -vv From b04ffd97094a869e69576b04d3927f47797e117b Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 25 Sep 2025 18:55:41 +0200 Subject: [PATCH 11/34] address linters, rename entrypoint to gateway, implement ownable for transient storage --- contracts/.solhint.json | 5 +- contracts/Makefile | 4 + ...point.s.sol => DeployOrbiterGateway.s.sol} | 8 +- contracts/script/DeployOrbiterHypERC20.s.sol | 7 +- contracts/script/SendForwardedTransfer.s.sol | 16 +-- contracts/src/HyperlaneEntrypoint.sol | 55 ----------- contracts/src/OrbiterGateway.sol | 66 +++++++++++++ contracts/src/OrbiterHypERC20.sol | 78 ++++++++++----- ...tStore.sol => OrbiterTransientStorage.sol} | 27 ++--- contracts/test/TestOrbiterHypERC20.t.sol | 98 ++++++++++++------- 10 files changed, 226 insertions(+), 138 deletions(-) rename contracts/script/{DeployHyperlaneEntrypoint.s.sol => DeployOrbiterGateway.s.sol} (50%) delete mode 100644 contracts/src/HyperlaneEntrypoint.sol create mode 100644 contracts/src/OrbiterGateway.sol rename contracts/src/{OrbiterTransientStore.sol => OrbiterTransientStorage.sol} (52%) diff --git a/contracts/.solhint.json b/contracts/.solhint.json index ce2220e0..a7a7221b 100644 --- a/contracts/.solhint.json +++ b/contracts/.solhint.json @@ -1,3 +1,6 @@ { - "extends": "solhint:recommended" + "extends": "solhint:recommended", + "rules": { + "func-visibility": ["warn", {"ignoreConstructors": true}] + } } diff --git a/contracts/Makefile b/contracts/Makefile index f7a84008..17a00443 100644 --- a/contracts/Makefile +++ b/contracts/Makefile @@ -8,6 +8,10 @@ all: deps compile lint compile: @forge compile +clean: + @forge clean && \ + rm -rf node_modules/ + deps: @bun install diff --git a/contracts/script/DeployHyperlaneEntrypoint.s.sol b/contracts/script/DeployOrbiterGateway.s.sol similarity index 50% rename from contracts/script/DeployHyperlaneEntrypoint.s.sol rename to contracts/script/DeployOrbiterGateway.s.sol index 0c628dc2..64679a87 100644 --- a/contracts/script/DeployHyperlaneEntrypoint.s.sol +++ b/contracts/script/DeployOrbiterGateway.s.sol @@ -4,14 +4,14 @@ pragma solidity ^0.8.24; import { console } from "forge-std/console.sol"; import { Script } from "forge-std/Script.sol"; -import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; +import { OrbiterGateway } from "../src/OrbiterGateway.sol"; -contract DeployHyperlaneEntrypoint is Script { +contract DeployOrbiterGateway is Script { function run() external { vm.startBroadcast(); - HyperlaneEntrypoint he = new HyperlaneEntrypoint(); - console.log("deployed hyperlane entrypoint at: ", address(he)); + OrbiterGateway gw = new OrbiterGateway(); + console.log("deployed hyperlane gateway at: ", address(gw)); vm.stopBroadcast(); } diff --git a/contracts/script/DeployOrbiterHypERC20.s.sol b/contracts/script/DeployOrbiterHypERC20.s.sol index 0269d283..9ccd11b6 100644 --- a/contracts/script/DeployOrbiterHypERC20.s.sol +++ b/contracts/script/DeployOrbiterHypERC20.s.sol @@ -5,7 +5,7 @@ import { console } from "forge-std/console.sol"; import { Script } from "forge-std/Script.sol"; import { OrbiterHypERC20 } from "../src/OrbiterHypERC20.sol"; -import { OrbiterTransientStore } from "../src/OrbiterTransientStore.sol"; +import { OrbiterTransientStorage } from "../src/OrbiterTransientStorage.sol"; import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; @@ -17,6 +17,9 @@ contract DeployOrbiterHypERC20 is Script { address proxyAdmin = vm.envAddress("PROXYADMIN"); require(proxyAdmin != address(0), "proxy admin address not set"); + address gateway = vm.envAddress("GATEWAY"); + require(gateway != address(0), "gateway address not set"); + uint8 decimals = 6; uint256 scale = 1; uint256 initialSupply = 2e6; @@ -28,7 +31,7 @@ contract DeployOrbiterHypERC20 is Script { vm.startBroadcast(); // Deploy the Orbiter transient store for the HypERC20 token. - OrbiterTransientStore ots = new OrbiterTransientStore(); + OrbiterTransientStorage ots = new OrbiterTransientStorage(gateway); // Deploy the implementation behind a proxy. OrbiterHypERC20 implementation = new OrbiterHypERC20( diff --git a/contracts/script/SendForwardedTransfer.s.sol b/contracts/script/SendForwardedTransfer.s.sol index 3e879d11..9cb6fd3c 100644 --- a/contracts/script/SendForwardedTransfer.s.sol +++ b/contracts/script/SendForwardedTransfer.s.sol @@ -3,25 +3,25 @@ pragma solidity ^0.8.24; import { console } from "forge-std/console.sol"; import { Script } from "forge-std/Script.sol"; -import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; +import { OrbiterGateway } from "../src/OrbiterGateway.sol"; contract SendForwardedTransfer is Script { function run() external { - address entrypoint = vm.envAddress("ENTRYPOINT"); - require(entrypoint != address(0), "entrypoint not set"); + address gateway = vm.envAddress("GATEWAY"); + require(gateway != address(0), "orbiter gateway not set"); address tokenAddress = vm.envAddress("NOBLEDOLLAR"); - require(entrypoint != address(0), "noble dollar address not set"); + require(tokenAddress != address(0), "noble dollar address not set"); uint32 destinationDomain = 1; - bytes32 recipient = bytes32(0); // TODO: adjust to use identifier + bytes32 recipient = bytes32(0); uint256 amount = 123; - bytes32 payloadHash = bytes32(uint256(10203040)); // TODO: generate valid payload hash + bytes32 payloadHash = bytes32(uint256(10203040)); vm.startBroadcast(); - HyperlaneEntrypoint he = HyperlaneEntrypoint(entrypoint); - bytes32 messageID = he.sendForwardedTransfer( + OrbiterGateway gw = OrbiterGateway(gateway); + bytes32 messageID = gw.sendForwardedTransfer( tokenAddress, destinationDomain, recipient, diff --git a/contracts/src/HyperlaneEntrypoint.sol b/contracts/src/HyperlaneEntrypoint.sol deleted file mode 100644 index 883aae9a..00000000 --- a/contracts/src/HyperlaneEntrypoint.sol +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.24; - -import {OrbiterTransientStore} from "./OrbiterTransientStore.sol"; -import {OrbiterHypERC20} from "./OrbiterHypERC20.sol"; - -import { TokenRouter } from "@hyperlane/token/libs/TokenRouter.sol"; - -/* - * @dev The canonical entrypoint contract to use Noble's Orbiter implementation through Hyperlane. - * - * The Orbiter (https://github.com/noble-assets/orbiter) allows to send cross-chain transfers - * using various bridge mechanisms, execute actions on the Noble blockchain (e.g. fee payments), - * and eventually forward the resulting assets to another destination through one of the available - * bridging mechanisms (e.g. IBC, CCTP). - * - * TODO: make upgradeable - */ -contract HyperlaneEntrypoint { - /* - * @notice Send an asset transfer to the Orbiter, that should be forwarded to another Hyperlane domain. - */ - function sendForwardedTransfer( - address tokenAddress, - uint32 destinationDomain, - bytes32 recipient, - uint256 amount, - bytes32 payloadHash - ) external returns (bytes32 messageID) { - OrbiterHypERC20 token = OrbiterHypERC20(tokenAddress); - - // TODO: this returns the address and then we instantiate the contract again -- can this simply return the OTS implementation? - address otsAddress = token.getOrbiterTransientStoreAddress(); - require(otsAddress != address(0), "orbiter transient store not set on token"); - - // set the pending payload into the transient storage - OrbiterTransientStore ots = OrbiterTransientStore(otsAddress); - ots.setPendingPayloadHash(payloadHash); - - /* - * Transfer tokens from the user to this contract first. - * This ensures that when transferRemote burns tokens, this contract has them. - */ - require( - token.transferFrom(msg.sender, address(this), amount), - "failed to transfer tokens to entrypoint" - ); - - /* - * Call transferRemote directly on the token contract. - * The token contract will handle the transfer and return the message ID. - */ - return token.transferRemote(destinationDomain, recipient, amount); - } -} \ No newline at end of file diff --git a/contracts/src/OrbiterGateway.sol b/contracts/src/OrbiterGateway.sol new file mode 100644 index 00000000..e132ebe7 --- /dev/null +++ b/contracts/src/OrbiterGateway.sol @@ -0,0 +1,66 @@ +/* + * Copyright 2025 NASD Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ +pragma solidity ^0.8.24; + +import { OrbiterTransientStorage } from "./OrbiterTransientStorage.sol"; +import { OrbiterHypERC20 } from "./OrbiterHypERC20.sol"; + + +/// @title Orbiter Gateway Contract +/// @author Noble Core Team +/// @notice The canonical portal contract to use Noble's Orbiter implementation through Hyperlane. +/// @dev The Orbiter (https://github.com/noble-assets/orbiter) allows to send cross-chain transfers +/// using various bridge mechanisms, execute actions on the Noble blockchain (e.g. fee payments), +/// and eventually forward the resulting assets to another destination through one of the available +/// bridging mechanisms (e.g. IBC, CCTP). +/// +/// TODO: make upgradeable +contract OrbiterGateway { + /// @notice Send an asset transfer to the Orbiter, that should be forwarded to another Hyperlane domain. + /// @param tokenAddress Address of the token to forward using Orbiter. + /// @param destinationDomain The destination domain of the Noble chain (where the Orbiter lives). + /// @param recipient A bytes32 representation of the token recipient on the receiving chain. + /// @param amount The amount of tokens to transfer. + /// @param payloadHash The payload hash to associate with the cross-chain transfer. + /// @return messageID The ID of the dispatched Hyperlane message. + function sendForwardedTransfer( + address tokenAddress, + uint32 destinationDomain, + bytes32 recipient, + uint256 amount, + bytes32 payloadHash + ) external returns (bytes32 messageID) { + OrbiterHypERC20 token = OrbiterHypERC20(tokenAddress); + + OrbiterTransientStorage ots = token.getOrbiterTransientStore(); + ots.setPendingPayloadHash(payloadHash); + + /* + * Transfer tokens from the user to this contract first. + * This is required since transferRemote is burning from msg.sender, + * which is this contract. + */ + token.transferFrom(msg.sender, address(this), amount); + + /* + * Call transferRemote directly on the token contract. + * The token contract will handle the transfer and return the message ID. + */ + return token.transferRemote(destinationDomain, recipient, amount); + } +} \ No newline at end of file diff --git a/contracts/src/OrbiterHypERC20.sol b/contracts/src/OrbiterHypERC20.sol index fd1007e6..9d18e85f 100644 --- a/contracts/src/OrbiterHypERC20.sol +++ b/contracts/src/OrbiterHypERC20.sol @@ -1,24 +1,54 @@ -// SPDX-License-Identifier: BUSL-1.1 +/* + * Copyright 2025 NASD Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ pragma solidity ^0.8.24; -import { OrbiterTransientStore } from "./OrbiterTransientStore.sol"; +import {OrbiterTransientStorage} from "./OrbiterTransientStorage.sol"; import { HypERC20 } from "@hyperlane/token/HypERC20.sol"; import { TokenMessage } from "@hyperlane/token/libs/TokenMessage.sol"; +/// @title Orbiter HypERC-20 Extension +/// @author Noble Core Team +/// @notice Extends the HypERC20 contracts to include custom payload handling +/// for cross-chain transfers using Noble's Orbiter. contract OrbiterHypERC20 is HypERC20 { - OrbiterTransientStore private ots; + OrbiterTransientStorage private ots; + /// @notice Calls the constructor method of the underlying HypERC20 contract. + /// @param _decimals The decimals of the ERC-20 token. + /// @param _scale The scaling factor to apply for cross-chain transfers. + /// @param _mailbox The address of the associated mailbox. constructor( uint8 _decimals, uint256 _scale, address _mailbox ) HypERC20(_decimals, _scale, _mailbox) {} - /** - * @notice Initializes the contract by calling the initialization logic - * of the HypERC20 contract and setting the Orbiter transient store. - */ + /// @notice Initializes the contract by calling the initialization logic + /// of the HypERC20 contract and setting the Orbiter transient store. + /// + /// @param _totalSupply The initially minted total supply of the Orbiter HypERC20 token. + /// @param _name The token name. + /// @param _symbol The token symbol. + /// @param _hook Address of the used post-dispatch hook. + /// @param _interchainSecurityModule Address of the used ISM. + /// @param _owner Address of the contract owner. + /// @param _orbiterTransientStorage Address of the Orbiter transient storage contract. function initialize( uint256 _totalSupply, string memory _name, @@ -26,7 +56,7 @@ contract OrbiterHypERC20 is HypERC20 { address _hook, address _interchainSecurityModule, address _owner, - address _orbiterTransientStore + address _orbiterTransientStorage ) public virtual initializer { super.initialize( _totalSupply, @@ -37,22 +67,26 @@ contract OrbiterHypERC20 is HypERC20 { _owner ); - ots = OrbiterTransientStore(_orbiterTransientStore); + ots = OrbiterTransientStorage(_orbiterTransientStorage); } - /* - * @notice Returns the address of the Orbiter transient store that's - * associated with this contract. - */ - function getOrbiterTransientStoreAddress() external view returns (address) { - return address(ots); + /// @notice Returns the address of the Orbiter transient store that's + /// associated with this contract. + /// @return The instance of the Orbiter transient storage associated with this token. + function getOrbiterTransientStore() external view returns (OrbiterTransientStorage) { + return ots; } - /* - * @notice Overrides the standard implementation of HypERC20 to support - * passing payloads within the same transaction using the Orbiter - * transient store. - */ + /// @notice Overrides the standard implementation of HypERC20 to support + /// passing payloads within the same transaction using the Orbiter + /// transient store. + /// @param _destination The destination domain for the cross-chain transfer. + /// @param _recipient The bytes32 representation of the recipient address. + /// @param _amount The sent token amount. + /// @param _value The native denomination sent along with the transaction. + /// @param _hookMetadata The metadata to pass along to the post-dispatch hook. + /// @param _hook Address of the post-dispatch hook. + /// @return The message ID of the dispatched Hyperlane message. function _transferRemote( uint32 _destination, bytes32 _recipient, @@ -69,10 +103,6 @@ contract OrbiterHypERC20 is HypERC20 { // // It is designed with inspiration from the CCTP token bridge contract: // https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/token/TokenBridgeCctp.sol#L196-L231 - require( - address(ots) != address(0), - "orbiter transient store must be set" - ); bytes32 payloadHash = ots.getPendingPayloadHash(); // Depending if the payload hash is populated or not, diff --git a/contracts/src/OrbiterTransientStore.sol b/contracts/src/OrbiterTransientStorage.sol similarity index 52% rename from contracts/src/OrbiterTransientStore.sol rename to contracts/src/OrbiterTransientStorage.sol index 8946edae..58bdf0b7 100644 --- a/contracts/src/OrbiterTransientStore.sol +++ b/contracts/src/OrbiterTransientStorage.sol @@ -17,25 +17,30 @@ */ pragma solidity ^0.8.28; -import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; -/* - * @notice Holds pending payload hashes of transfers that should be executed - * through the Orbiter. - */ -contract OrbiterTransientStore { +/// @title Orbiter Transient Storage +/// @author Noble Core Team +/// @notice Holds pending payload hashes of transfers that should be executed +/// through the Orbiter. +contract OrbiterTransientStorage is Ownable { bytes32 transient private pendingPayloadHash; -// constructor() Ownable(msg.sender) {} - constructor() {} + /// @notice Initializes the contract by setting the owner to be the Orbiter gateway contract. + /// @param _gateway The address of the associated Orbiter gateway contract, which is set as the owner. + constructor(address _gateway) Ownable() { + transferOwnership(_gateway); + } + /// @notice Retrieves the currently pending payload hash. + /// @return pendingPayloadHash The currently pending payload hash. function getPendingPayloadHash() external view returns (bytes32) { return pendingPayloadHash; } - // TODO: this should be possible to be set by everyone? since it can only be set in the same transaction -// function setPendingPayloadHash(bytes32 payloadHash) external onlyOwner { - function setPendingPayloadHash(bytes32 payloadHash) external { + /// @notice Sets a new pending payload hash to the transient storage. + /// @param payloadHash The new payload hash to store. + function setPendingPayloadHash(bytes32 payloadHash) external onlyOwner { pendingPayloadHash = payloadHash; } } diff --git a/contracts/test/TestOrbiterHypERC20.t.sol b/contracts/test/TestOrbiterHypERC20.t.sol index 64b0724f..e677b41a 100644 --- a/contracts/test/TestOrbiterHypERC20.t.sol +++ b/contracts/test/TestOrbiterHypERC20.t.sol @@ -1,11 +1,27 @@ -// SPDX-License-Identifier: BUSL-1.1 +/* + * Copyright 2025 NASD Inc. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * 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. + */ pragma solidity ^0.8.24; import "forge-std/Test.sol"; import { OrbiterHypERC20 } from "../src/OrbiterHypERC20.sol"; -import { OrbiterTransientStore } from "../src/OrbiterTransientStore.sol"; -import { HyperlaneEntrypoint } from "../src/HyperlaneEntrypoint.sol"; +import { OrbiterTransientStorage } from "../src/OrbiterTransientStorage.sol"; +import { OrbiterGateway } from "../src/OrbiterGateway.sol"; import { Mailbox } from "@hyperlane/Mailbox.sol"; import { IMailbox } from "@hyperlane/interfaces/IMailbox.sol"; @@ -18,6 +34,8 @@ import { TokenRouter } from "@hyperlane/token/libs/TokenRouter.sol"; import { TransparentUpgradeableProxy, ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +/// @notice Tests for the Orbiter extension of the Hyperlane ERC-20 contracts. +/// @author Noble Core Team contract TestOrbiterHypERC20 is Test { // NOTE: this is adding the utilities for converting address to Hyperlane expected bytes32. using TypeCasts for address; @@ -43,7 +61,7 @@ contract TestOrbiterHypERC20 is Test { OrbiterHypERC20 internal localToken; OrbiterHypERC20 internal remoteToken; - HyperlaneEntrypoint internal entrypoint; + OrbiterGateway internal gateway; /* * TESTING ACCOUNTS @@ -53,6 +71,8 @@ contract TestOrbiterHypERC20 is Test { address internal constant ADMIN = address(0x3); address internal constant HYP_OWNER = address(0x4); + /// @notice Shared setup for all test scenarios. + /// @dev Deploys mocked mailboxes, Orbiter tokens and sets up the required routing. function setUp() public virtual { // Run setup from ADMIN to make it the owner of contracts. // @@ -77,8 +97,11 @@ contract TestOrbiterHypERC20 is Test { remoteMailbox.setDefaultHook(address(noopHook)); remoteMailbox.setRequiredHook(address(noopHook)); + // Deploy the Orbiter gateway contract. + gateway = new OrbiterGateway(); + // Set up Orbiter transient store. - OrbiterTransientStore ots = new OrbiterTransientStore(); + OrbiterTransientStorage ots = new OrbiterTransientStorage(address(gateway)); // Deploy Orbiter compatible token with a proxy. localToken = deployOrbiterHypERC20( @@ -95,8 +118,6 @@ contract TestOrbiterHypERC20 is Test { address(ots) ); - entrypoint = new HyperlaneEntrypoint(); - // After setting up the state we need to fund the test accounts // with the ERC-20s. // @@ -129,10 +150,8 @@ contract TestOrbiterHypERC20 is Test { vm.stopPrank(); } - /* - * @notice This test checks that the setup was successful by asserting - * expected token balances. - */ + /// @notice This test checks that the setup was successful by asserting + /// expected token balances. function testSetupWorked() public view { assertNotEq( localToken.balanceOf(ALICE), @@ -141,25 +160,22 @@ contract TestOrbiterHypERC20 is Test { ); } - /* - * @notice This tests that sending a Hyperlane forwarded transfer - * using the entrypoint contract is going to work and emits - * the expected dispatch event, which contains the payload hash. - */ + /// @notice This tests that sending a Hyperlane forwarded transfer + /// using the gateway contract is going to work and emits + /// the expected dispatch event, which contains the payload hash. function testForwardedTransfer() public { vm.startPrank(ALICE); uint256 sentAmount = 1230; assertGe(localToken.balanceOf(ALICE), sentAmount, "sent amount exceeds available token balance"); - // Approve the entrypoint contract to spend ALICE's tokens - require(localToken.approve(address(entrypoint), sentAmount), "failed to approve entrypoint"); + // Approve the gateway contract to spend ALICE's tokens + require(localToken.approve(address(gateway), sentAmount), "failed to approve gateway"); bytes32 sentPayloadHash = bytes32(uint256(1234)); // NOTE: the expected message is the wrapped token message with the contained payload. bytes memory expectedMessage = _formatMessageWithMemoryBody( - 3, 0, ORIGIN, address(localToken).addressToBytes32(), @@ -180,7 +196,7 @@ contract TestOrbiterHypERC20 is Test { expectedMessage ); - bytes32 messageID = entrypoint.sendForwardedTransfer( + bytes32 messageID = gateway.sendForwardedTransfer( address(localToken), DESTINATION, BOB.addressToBytes32(), @@ -192,11 +208,9 @@ contract TestOrbiterHypERC20 is Test { vm.stopPrank(); } - /* - * @notice This test shows that the token contract can still be used - * for direct `remoteTransfer` calls that do not go through the Hyperlane entrypoint, - * and therefore don't insert the payload hash into the emitted token message. - */ + /// @notice This test shows that the token contract can still be used + /// for direct `remoteTransfer` calls that do not go through the Hyperlane gateway, + /// and therefore don't insert the payload hash into the emitted token message. function testStandardRemoteTransfer() public { uint256 sentAmount = 123; uint256 initialBalance = localToken.balanceOf(ALICE); @@ -221,15 +235,26 @@ contract TestOrbiterHypERC20 is Test { require(localToken.balanceOf(ALICE) == initialBalance - sentAmount, "expected tokens to be sent"); } - /* - * @notice Helper function to format a message with bytes memory body - * @dev This is needed because Message.formatMessage expects bytes calldata. - * - * It's based on the implementation on Message.sol: - * https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/libs/Message.sol#L21-L52 - */ + /// @notice This test shows that the Orbiter transient storage cannot be + /// called from external addresses but only from the Gateway contract + /// that is its owner. + function testSetPendingPayload() public { + OrbiterTransientStorage ots = localToken.getOrbiterTransientStore(); + + vm.prank(address(gateway)); + ots.setPendingPayloadHash(bytes32(uint256(123))); + + vm.prank(ALICE); + vm.expectRevert("Ownable: caller is not the owner"); + ots.setPendingPayloadHash(bytes32(uint256(123))); + } + + /// @notice Helper function to format a message with bytes memory body + /// @dev This is needed because Message.formatMessage expects bytes calldata. + /// + /// It's based on the implementation on Message.sol: + /// https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/%40hyperlane-xyz/core%409.0.9/solidity/contracts/libs/Message.sol#L21-L52 function _formatMessageWithMemoryBody( - uint8 _version, uint32 _nonce, uint32 _originDomain, bytes32 _sender, @@ -237,6 +262,7 @@ contract TestOrbiterHypERC20 is Test { bytes32 _recipient, bytes memory _messageBody ) internal pure returns (bytes memory) { + uint8 _version = 3; // used version of the Hyperlane message implementation return abi.encodePacked( _version, _nonce, @@ -248,6 +274,12 @@ contract TestOrbiterHypERC20 is Test { ); } + /// @notice Deploy an instance of the OrbiterHypERC20 contract for testing purposes. + /// + /// @param _mailboxAddress Address of the used mailbox for this Hyperlane token. + /// @param _hook Address of the used post-dispatch hook. + /// @param _owner Address of the contract owner. + /// @param _otsAddress Address of the Orbiter transient storage associated with this contract. function deployOrbiterHypERC20( address _mailboxAddress, address _hook, From 6ba23710e2a212541d2357c006415647569dddbf Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Tue, 30 Sep 2025 11:01:30 +0200 Subject: [PATCH 12/34] commit wip adding warp handling and pending payload book keeping --- Makefile | 2 +- controller/adapter/hyperlane.go | 61 +++++--------- controller/adapter/ibc.go | 11 ++- controller/adapter/ibc_test.go | 6 +- depinject.go | 4 +- entrypoint/ibc_middleware.go | 1 + keeper/component/adapter/adapter.go | 3 +- keeper/hyperlane.go | 76 ++++++++++------- keeper/keeper.go | 32 ++++++- keeper/state_handler.go | 93 +++++++++++++++++++++ testutil/mocks/controllers.go | 1 + types/core/keys.go | 14 ++++ types/expected_keepers.go | 20 +++++ types/hyperlane/collections.go | 63 ++++++++++++++ types/hyperlane/constants.go | 29 +++++++ types/hyperlane/message_body.go | 125 ---------------------------- types/hyperlane/payload.go | 87 +++++++++++++++++++ types/hyperlane/payload_test.go | 72 ++++++++++++++++ types/parser.go | 6 +- 19 files changed, 501 insertions(+), 205 deletions(-) create mode 100644 keeper/state_handler.go create mode 100644 types/hyperlane/collections.go create mode 100644 types/hyperlane/constants.go delete mode 100644 types/hyperlane/message_body.go create mode 100644 types/hyperlane/payload.go create mode 100644 types/hyperlane/payload_test.go diff --git a/Makefile b/Makefile index 0059224f..8dc9b016 100644 --- a/Makefile +++ b/Makefile @@ -103,7 +103,7 @@ nancy: #=============================================================================# # Test # #=============================================================================# -.PHONY: test-unit test-unit-viz local-image +.PHONY: test-unit test-unit-viz local-image test-e2e test-unit: @echo "===================================================================" diff --git a/controller/adapter/hyperlane.go b/controller/adapter/hyperlane.go index d969fb93..1742b736 100644 --- a/controller/adapter/hyperlane.go +++ b/controller/adapter/hyperlane.go @@ -21,17 +21,18 @@ package adapter import ( + "context" + errorsmod "cosmossdk.io/errors" "cosmossdk.io/log" - "github.com/cosmos/cosmos-sdk/codec" "github.com/noble-assets/orbiter/controller" - "github.com/noble-assets/orbiter/types" + orbitertypes "github.com/noble-assets/orbiter/types" "github.com/noble-assets/orbiter/types/core" "github.com/noble-assets/orbiter/types/hyperlane" ) -var _ types.AdapterController = &HyperlaneAdapter{} +var _ orbitertypes.AdapterController = &HyperlaneAdapter{} // HyperlaneAdapter is the type component to convert // an incoming Hyperlane message body to the common payload @@ -40,11 +41,15 @@ type HyperlaneAdapter struct { *controller.BaseController[core.ProtocolID] logger log.Logger - parser *HyperlaneParser + + stateHandler orbitertypes.HyperlaneStateHandler } // NewHyperlaneAdapter returns a reference to a new HyperlaneAdapter instance. -func NewHyperlaneAdapter(cdc codec.Codec, logger log.Logger) (*HyperlaneAdapter, error) { +func NewHyperlaneAdapter( + logger log.Logger, + orbiterStateHandler orbitertypes.HyperlaneStateHandler, +) (*HyperlaneAdapter, error) { if logger == nil { return nil, core.ErrNilPointer.Wrap("logger cannot be nil") } @@ -54,61 +59,33 @@ func NewHyperlaneAdapter(cdc codec.Codec, logger log.Logger) (*HyperlaneAdapter, return nil, errorsmod.Wrap(err, "failed to create base controller") } - parser, err := NewHyperlaneParser(cdc) - if err != nil { - return nil, errorsmod.Wrap(err, "failed to create hyperlane parser") + if orbiterStateHandler == nil { + return nil, core.ErrNilPointer.Wrap("orbiter state handler cannot be nil") } return &HyperlaneAdapter{ BaseController: baseController, logger: logger.With(core.AdapterControllerName, baseController.Name()), - parser: parser, + stateHandler: orbiterStateHandler, }, nil } // ParsePayload delegates the parsing of a Hyperlane message body to the underlying // Parser implementation. func (h *HyperlaneAdapter) ParsePayload( - protocolID core.ProtocolID, - payloadBz []byte, -) (bool, *core.Payload, error) { - return h.parser.ParsePayload(protocolID, payloadBz) -} - -// HyperlaneParser is used to parse Orbiter payloads from an incoming Hyperlane message body. -type HyperlaneParser struct { - cdc codec.Codec -} - -func NewHyperlaneParser(cdc codec.Codec) (*HyperlaneParser, error) { - if cdc == nil { - return nil, core.ErrNilPointer.Wrap("codec cannot be nil") - } - - return &HyperlaneParser{cdc: cdc}, nil -} - -// ParsePayload parses the payload from a Hyperlane message body to retrieve -// the Orbiter payload. -// -// NOTE: This parser is only ever called in the Handle method of the Hyperlane application, -// which means that all message bodies handled by this parser were intended for the -// Orbiter. Hence, the first return value is ALWAYS true. -// -// TODO: can protocol ID be removed here? Why is it included? -func (p *HyperlaneParser) ParsePayload( + ctx context.Context, _ core.ProtocolID, payloadBz []byte, ) (bool, *core.Payload, error) { - parsedBody, err := hyperlane.ParseHyperlaneOrbiterBody(p.cdc, payloadBz) + payloadHash, err := hyperlane.GetPayloadHashFromWarpMessageBody(payloadBz) if err != nil { - return true, nil, errorsmod.Wrap(err, "failed to parse hyperlane body") + return false, nil, errorsmod.Wrap(err, "failed to parse payload") } - payload, err := parsedBody.ToOrbiterPayload() + pendingPayload, err := h.stateHandler.GetPendingPayloadWithHash(ctx, payloadHash) if err != nil { - return true, nil, errorsmod.Wrap(err, "failed to convert hyperlane body to payload") + return false, nil, errorsmod.Wrap(err, "failed to get pending payload") } - return true, payload, nil + return true, pendingPayload.CorePayload(), nil } diff --git a/controller/adapter/ibc.go b/controller/adapter/ibc.go index cc6b6ff8..21df6b68 100644 --- a/controller/adapter/ibc.go +++ b/controller/adapter/ibc.go @@ -21,6 +21,8 @@ package adapter import ( + "context" + errorsmod "cosmossdk.io/errors" "cosmossdk.io/log" "github.com/cosmos/cosmos-sdk/codec" @@ -69,10 +71,11 @@ func NewIBCAdapter(cdc codec.Codec, logger log.Logger) (*IBCAdapter, error) { // ParsePayload dispatches the payload parsing to the underlying IBC parser. func (a *IBCAdapter) ParsePayload( + ctx context.Context, id core.ProtocolID, payloadBz []byte, ) (bool, *core.Payload, error) { - return a.parser.ParsePayload(id, payloadBz) + return a.parser.ParsePayload(ctx, id, payloadBz) } var _ types.PayloadParser = &IBCParser{} @@ -102,7 +105,11 @@ func NewIBCParser(cdc codec.Codec) (*IBCParser, error) { // - bool: whether the payload is intended for the Orbiter module. // - Payload: the parsed payload. // - error: an error, if one occurred during parsing. -func (p *IBCParser) ParsePayload(_ core.ProtocolID, payloadBz []byte) (bool, *core.Payload, error) { +func (p *IBCParser) ParsePayload( + _ context.Context, + _ core.ProtocolID, + payloadBz []byte, +) (bool, *core.Payload, error) { data, err := p.GetICS20PacketData(payloadBz) if err != nil { // Despite the error is not nil, we don't return it. We diff --git a/controller/adapter/ibc_test.go b/controller/adapter/ibc_test.go index 3eced0d7..72e1f161 100644 --- a/controller/adapter/ibc_test.go +++ b/controller/adapter/ibc_test.go @@ -163,7 +163,11 @@ func TestParsePayload(t *testing.T) { require.NoError(t, err) fmt.Println("len of payload:", len(tc.payloadBz)) - isOrbiterPayload, payload, err := parser.ParsePayload(core.PROTOCOL_IBC, tc.payloadBz) + isOrbiterPayload, payload, err := parser.ParsePayload( + t.Context(), + core.PROTOCOL_IBC, + tc.payloadBz, + ) require.Equal(t, tc.expectIsOrbiter, isOrbiterPayload) if tc.expectError { diff --git a/depinject.go b/depinject.go index 50ab8c9c..730789bf 100644 --- a/depinject.go +++ b/depinject.go @@ -165,8 +165,8 @@ func InjectAdapterControllers(in ComponentsInputs) { } hyperlane, err := adapterctrl.NewHyperlaneAdapter( - in.Orbiters.Codec(), - in.Orbiters.Adapter().Logger(), + in.Orbiters.Logger(), + in.Orbiters, ) if err != nil { panic(errorsmod.Wrap(err, "error creating Hyperlane adapter")) diff --git a/entrypoint/ibc_middleware.go b/entrypoint/ibc_middleware.go index 4a1d91b9..ff3d7820 100644 --- a/entrypoint/ibc_middleware.go +++ b/entrypoint/ibc_middleware.go @@ -76,6 +76,7 @@ func (i IBCMiddleware) OnRecvPacket( relayer sdk.AccAddress, ) ibcexported.Acknowledgement { isOrbiterPayload, orbiterPayload, err := i.payloadAdapter.ParsePayload( + ctx, core.PROTOCOL_IBC, packet.GetData(), ) diff --git a/keeper/component/adapter/adapter.go b/keeper/component/adapter/adapter.go index 5e109a71..538c58cb 100644 --- a/keeper/component/adapter/adapter.go +++ b/keeper/component/adapter/adapter.go @@ -134,6 +134,7 @@ func (a *Adapter) SetRouter(r AdapterRouter) error { // ParsePayload implements types.PayloadAdapter. func (a *Adapter) ParsePayload( + ctx context.Context, id core.ProtocolID, payloadBz []byte, ) (bool, *core.Payload, error) { @@ -145,7 +146,7 @@ func (a *Adapter) ParsePayload( return false, nil, fmt.Errorf("adapter not found for protocol ID: %s", id) } - return adapter.ParsePayload(id, payloadBz) + return adapter.ParsePayload(ctx, id, payloadBz) } // BeforeTransferHook implements types.PayloadAdapter. diff --git a/keeper/hyperlane.go b/keeper/hyperlane.go index 19b1ed10..eb92ff76 100644 --- a/keeper/hyperlane.go +++ b/keeper/hyperlane.go @@ -30,34 +30,16 @@ import ( errorsmod "cosmossdk.io/errors" "github.com/noble-assets/orbiter/types/core" + hyperlaneorbitertypes "github.com/noble-assets/orbiter/types/hyperlane" ) -var _ hyperlaneutil.HyperlaneApp = &Keeper{} - -const OrbiterHyperlaneApp uint8 = iota +// OrbiterHyperlaneAppID defines the module identifier of the Orbiter Hyperlane application. +const OrbiterHyperlaneAppID uint8 = 255 +// RegisterHyperlaneAppRoute registers the Orbiter Hyperlane application in the main application +// router. func (k *Keeper) RegisterHyperlaneAppRoute() { - k.hyperlaneCoreKeeper.AppRouter().RegisterModule(uint8(0), k) -} - -// TODO: do we need this? The Warp implementation is using this to check if a token is registered.. -// but we don't need that? -func (k *Keeper) Exists( - ctx context.Context, - handledPayload hyperlaneutil.HexAddress, -) (bool, error) { - // return k.HandledHyperlaneTransfers.Has(ctx, handledPayload.GetInternalId()) - return true, nil -} - -// TODO: do we need this? The Warp implementation is using this to check for a certain ISM -// per-token, -// but we won't keep track of any specific assets that would need to be registered. -func (k *Keeper) ReceiverIsmId( - ctx context.Context, - recipient hyperlaneutil.HexAddress, -) (*hyperlaneutil.HexAddress, error) { - return nil, errors.New("not implemented") + k.hyperlaneCoreKeeper.AppRouter().RegisterModule(OrbiterHyperlaneAppID, k) } func (k *Keeper) Handle( @@ -65,7 +47,7 @@ func (k *Keeper) Handle( mailboxId hyperlaneutil.HexAddress, message hyperlaneutil.HyperlaneMessage, ) error { - _, payload, err := k.adapter.ParsePayload(core.PROTOCOL_HYPERLANE, message.Body) + _, payload, err := k.adapter.ParsePayload(ctx, core.PROTOCOL_HYPERLANE, message.Body) if err != nil { return errorsmod.Wrap(err, "failed to parse payload") } @@ -85,10 +67,22 @@ func (k *Keeper) Handle( // TODO: what to do with mailbox ID? do we need to check this? - // TODO: theoretically we'd need a different after-transfer hook here? - // The transfer attributes should be populated from the information from the Warp transfer - // and not based on the balance of the module account since the transfer is in a separate - // message. + // TODO: this should be where the underlying warp logic is called. + reducedWarpMessage, err := hyperlaneorbitertypes.GetReducedWarpMessageFromOrbiterMessage( + message, + ) + if err != nil { + return errorsmod.Wrap(err, "failed to create reduced warp message") + } + + if err = k.hyperlaneWarpKeeper.Handle( + ctx, + mailboxId, + reducedWarpMessage, + ); err != nil { + return errorsmod.Wrap(err, "internal warp handling failed") + } + transferAttr, err := k.adapter.AfterTransferHook(ctx, ccID, payload) if err != nil { return errorsmod.Wrap(err, "failed to run AfterTransferHook") @@ -100,3 +94,27 @@ func (k *Keeper) Handle( return nil } + +// TODO: do we need this? The Warp implementation is using this to check if a token is registered.. +// but we don't need that? +// +// TODO: should we delegate to the Warp method here? +func (k *Keeper) Exists( + ctx context.Context, + handledPayload hyperlaneutil.HexAddress, +) (bool, error) { + // return k.HandledHyperlaneTransfers.Has(ctx, handledPayload.GetInternalId()) + return true, nil +} + +// TODO: do we need this? The Warp implementation is using this to check for a certain ISM +// per-token, +// but we won't keep track of any specific assets that would need to be registered. +// +// TODO: should we delegate to the Warp method here? +func (k *Keeper) ReceiverIsmId( + ctx context.Context, + recipient hyperlaneutil.HexAddress, +) (*hyperlaneutil.HexAddress, error) { + return nil, errors.New("not implemented") +} diff --git a/keeper/keeper.go b/keeper/keeper.go index 7a714419..6e6f01f2 100644 --- a/keeper/keeper.go +++ b/keeper/keeper.go @@ -24,6 +24,8 @@ import ( "errors" "fmt" + hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" + "cosmossdk.io/collections" "cosmossdk.io/core/address" "cosmossdk.io/core/event" @@ -38,9 +40,17 @@ import ( forwardercomp "github.com/noble-assets/orbiter/keeper/component/forwarder" "github.com/noble-assets/orbiter/types" "github.com/noble-assets/orbiter/types/core" + "github.com/noble-assets/orbiter/types/hyperlane" ) -var _ types.Authorizer = &Keeper{} +var ( + // General interface compliance + _ types.Authorizer = &Keeper{} + + // Hyperlane interface compliance + _ hyperlaneutil.HyperlaneApp = &Keeper{} + _ types.HyperlaneStateHandler = &Keeper{} +) // Keeper is the main module keeper. type Keeper struct { @@ -57,8 +67,15 @@ type Keeper struct { dispatcher *dispatchercomp.Dispatcher adapter *adaptercomp.Adapter + // pendingPayloads stores the pending payloads addressed by their keccak256 hash. + pendingPayloads collections.Map[[]byte, hyperlane.PendingPayload] + // pendingPayloadsSequence is the unique identifier of a given pending payload handled by the + // orbiter. + pendingPayloadsSequence collections.Sequence + // Hyperlane dependencies hyperlaneCoreKeeper types.HyperlaneCoreKeeper + hyperlaneWarpKeeper types.HyperlaneWarpKeeper } // NewKeeper returns a reference to a validated instance of the keeper. @@ -85,6 +102,19 @@ func NewKeeper( logger: logger.With("module", fmt.Sprintf("x/%s", core.ModuleName)), authority: authority, + pendingPayloadsSequence: collections.NewSequence( + sb, + core.PendingPayloadsSequencePrefix, + core.PendingPayloadsSequenceName, + ), + pendingPayloads: collections.NewMap[[]byte, hyperlane.PendingPayload]( + sb, + core.PendingPayloadsPrefix, + core.PendingPayloadsName, + collections.BytesKey, + &hyperlane.PendingPayloadCollValue{}, + ), + hyperlaneCoreKeeper: coreKeeper, } diff --git a/keeper/state_handler.go b/keeper/state_handler.go new file mode 100644 index 00000000..8cca619d --- /dev/null +++ b/keeper/state_handler.go @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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" + "errors" + + errorsmod "cosmossdk.io/errors" + + orbitertypes "github.com/noble-assets/orbiter/types" + hyperlaneorbitertypes "github.com/noble-assets/orbiter/types/hyperlane" +) + +var _ orbitertypes.HyperlaneStateHandler = &Keeper{} + +// AcceptPendingPayload adds a new pending payload into the module storage. +// If the payload's hash is already set, an error is returned. +func (k *Keeper) AcceptPendingPayload( + ctx context.Context, + payload *hyperlaneorbitertypes.PendingPayload, +) error { + hash, err := payload.Hash() + if err != nil { + return err + } + + found, err := k.pendingPayloads.Has(ctx, hash.Bytes()) + if err != nil { + return errorsmod.Wrap(err, "failed to check pending payloads") + } + + if found { + return errors.New("payload hash already exists") + } + + return k.pendingPayloads.Set(ctx, hash.Bytes(), *payload) +} + +// GetPendingPayloadWithHash returns the pending payload with the given hash +// if it is found in the module storage. +// +// TODO: move into own abstraction type (Hyperlane state handler or smth.?) +func (k *Keeper) GetPendingPayloadWithHash( + ctx context.Context, + hash []byte, +) (*hyperlaneorbitertypes.PendingPayload, error) { + payload, err := k.pendingPayloads.Get(ctx, hash) + if err != nil { + return nil, errorsmod.Wrap(err, "pending payload not found") + } + + return &payload, nil +} + +// CompletePayloadWithHash removes the pending payload from the module state. +// If a payload is not found, it is a no-op but does not return an error. +// +// TODO: probably this needs to have more fields other than just the payload like the sender and +// origin account +func (k *Keeper) CompletePayloadWithHash( + ctx context.Context, + payload *hyperlaneorbitertypes.PendingPayload, +) error { + if payload == nil { + return errors.New("payload must not be nil") + } + + hash, err := payload.Hash() + if err != nil { + return err + } + + return k.pendingPayloads.Remove(ctx, hash.Bytes()) +} diff --git a/testutil/mocks/controllers.go b/testutil/mocks/controllers.go index a53b5d48..dec159da 100644 --- a/testutil/mocks/controllers.go +++ b/testutil/mocks/controllers.go @@ -87,6 +87,7 @@ func (a *NoOpAdapterController) Name() string { } func (a *NoOpAdapterController) ParsePayload( + _ context.Context, _ core.ProtocolID, bz []byte, ) (bool, *core.Payload, error) { diff --git a/types/core/keys.go b/types/core/keys.go index 54a1d366..a3c6a697 100644 --- a/types/core/keys.go +++ b/types/core/keys.go @@ -114,3 +114,17 @@ const ( var OrbiterPrefix = ModuleName var AdapterParamsPrefix = collections.NewPrefix(40) + +// ==================================================================================================== +// Pending Orbiter Payloads +// ====================================================================================================. + +const ( + PendingPayloadsName = "pending_payloads" + PendingPayloadsSequenceName = "pending_payloads_sequence" +) + +var ( + PendingPayloadsPrefix = collections.NewPrefix(50) + PendingPayloadsSequencePrefix = collections.NewPrefix(51) +) diff --git a/types/expected_keepers.go b/types/expected_keepers.go index ac65d47b..b214df22 100644 --- a/types/expected_keepers.go +++ b/types/expected_keepers.go @@ -26,6 +26,8 @@ import ( hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/noble-assets/orbiter/types/hyperlane" ) // BankKeeper wraps the bank behaviors expected by the orbiter @@ -60,3 +62,21 @@ type BankKeeperAdapter interface { type HyperlaneCoreKeeper interface { AppRouter() *hyperlaneutil.Router[hyperlaneutil.HyperlaneApp] } + +// HyperlaneWarpKeeper specifies the expected interface of Hyperlane +// warp functionality that is required for the Orbiter execution. +type HyperlaneWarpKeeper interface { + Handle( + ctx context.Context, + mailboxId hyperlaneutil.HexAddress, + message hyperlaneutil.HyperlaneMessage, + ) error +} + +// HyperlaneStateHandler defines the interface to adjust and query the Orbiter module +// state as it relates to Hyperlane bookkeeping. +type HyperlaneStateHandler interface { + AcceptPendingPayload(ctx context.Context, payload *hyperlane.PendingPayload) error + CompletePayloadWithHash(ctx context.Context, payload *hyperlane.PendingPayload) error + GetPendingPayloadWithHash(ctx context.Context, hash []byte) (*hyperlane.PendingPayload, error) +} diff --git a/types/hyperlane/collections.go b/types/hyperlane/collections.go new file mode 100644 index 00000000..32bd07fd --- /dev/null +++ b/types/hyperlane/collections.go @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 hyperlane + +import ( + "encoding/json" + + "cosmossdk.io/collections/codec" +) + +var _ codec.ValueCodec[PendingPayload] = &PendingPayloadCollValue{} + +// PendingPayloadCollValue implements the ValueCodec interface so that PendingPayload +// can be used with collections maps. +type PendingPayloadCollValue struct{} + +// TODO: this could use e.g. `abi` encoding to be aligned with Ethereum? +func (v *PendingPayloadCollValue) Encode(p PendingPayload) ([]byte, error) { + panic("implement me") +} + +func (v *PendingPayloadCollValue) Decode(data []byte) (PendingPayload, error) { + panic("implement me") +} + +func (v *PendingPayloadCollValue) EncodeJSON(payload PendingPayload) ([]byte, error) { + return json.Marshal(payload) +} + +func (v *PendingPayloadCollValue) DecodeJSON(data []byte) (PendingPayload, error) { + var payload PendingPayload + if err := json.Unmarshal(data, &payload); err != nil { + return PendingPayload{}, err + } + + return payload, nil +} + +func (v *PendingPayloadCollValue) Stringify(_ PendingPayload) string { + panic("implement me") +} + +func (v *PendingPayloadCollValue) ValueType() string { + panic("implement me") +} diff --git a/types/hyperlane/constants.go b/types/hyperlane/constants.go new file mode 100644 index 00000000..d8f089e5 --- /dev/null +++ b/types/hyperlane/constants.go @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 hyperlane + +import "github.com/bcp-innovations/hyperlane-cosmos/util" + +const ( + // ORBITER_PAYLOAD_SIZE is the warp payload plus 32 bytes of the forwarding payload hash. + ORBITER_PAYLOAD_SIZE = util.HEX_ADDRESS_LENGTH*2 + PAYLOAD_HASH_LENGTH + PAYLOAD_HASH_LENGTH = 32 +) diff --git a/types/hyperlane/message_body.go b/types/hyperlane/message_body.go deleted file mode 100644 index 12c3a16c..00000000 --- a/types/hyperlane/message_body.go +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -// -// Copyright (C) 2025, NASD Inc. All rights reserved. -// Use of this software is governed 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 hyperlane - -import ( - errorsmod "cosmossdk.io/errors" - "encoding/binary" - "errors" - "fmt" - "github.com/cosmos/cosmos-sdk/codec" - "math" - - "github.com/noble-assets/orbiter/types/core" -) - -// OrbiterBody defines the structure of the payload to be passed -// in Hyperlane messages, that can be parsed by the Orbiter module. -// -// Bytes layout: -// - 0:4 : protocol ID -// - 4: : forwarding attributes -type OrbiterBody struct { - // // TODO: how can these bytes be constructed in the EVM? - // // TODO: There is no way to do proper serializing of the data according to protobuf types in - // Solidity, - // // so we'll need custom bytes building. - // payload core.Payload - - protocolID core.ProtocolID - attributes core.ForwardingAttributes -} - -// TODO: remove if unused? -func NewHyperlaneOrbiterBody(p core.ProtocolID, a core.ForwardingAttributes) (*OrbiterBody, error) { - o := &OrbiterBody{ - protocolID: p, - attributes: a, - } - - return o, o.Validate() -} - -func (o OrbiterBody) Validate() error { - if err := o.protocolID.Validate(); err != nil { - return errorsmod.Wrap(err, "invalid protocol id") - } - - if err := o.attributes.Validate(); err != nil { - return errorsmod.Wrap(err, "invalid forwarding attributes") - } - - return nil -} - -func (o OrbiterBody) ToOrbiterPayload() (*core.Payload, error) { - // TODO: currently not supporting passthrough payload - forwarding, err := core.NewForwarding(o.protocolID, o.attributes, nil) - if err != nil { - // sanity check, should not happen because the parsing should only yield valid bodies. - return nil, err - } - - return core.NewPayload(forwarding) -} - -// ParseHyperlaneOrbiterBody parses the bytes of a Hyperlane message body to retrieve -// the relevant information for handling with the Orbiter implementation. -// -// TODO: for now this is not containing any actions but can only contain forwarding information. -// TODO: cdc can be removed I think :eyes: -func ParseHyperlaneOrbiterBody(cdc codec.Codec, messageBody []byte) (*OrbiterBody, error) { - protocolIDu32 := binary.BigEndian.Uint32(messageBody[:4]) - if protocolIDu32 > math.MaxInt32 { - return nil, errors.New("protocol id out of range") - } - - protocolID, err := core.NewProtocolID(int32(protocolIDu32)) - if err != nil { - return nil, errorsmod.Wrap(err, "message body contains invalid protocol id") - } - - // TODO: This won't work as it is, because this would require marshalling protos inside - // of Solidity contracts. - // Instead, we will have to manually pack / unpack the contents from the bytes array. - var attr core.ForwardingAttributes - switch protocolID { - case core.PROTOCOL_CCTP: - panic("TODO: implement") - attr, err = unpackCCTPAttributes(messageBody[4:]) - if err != nil { - return nil, errorsmod.Wrap(err, "failed to unpack cctp attributes") - } - case core.PROTOCOL_HYPERLANE: - panic("TODO: implement") - attr, err = unpackHypAttributes(messageBody[4:]) - if err != nil { - return nil, errorsmod.Wrap(err, "failed to unpack hyperlane attributes") - } - default: - panic(fmt.Sprintf("protocol %s not implemented", protocolID.String())) - } - - return &OrbiterBody{ - protocolID: protocolID, - attributes: attr, - }, errors.New("message body does not contain valid forwarding attributes") -} diff --git a/types/hyperlane/payload.go b/types/hyperlane/payload.go new file mode 100644 index 00000000..956b494e --- /dev/null +++ b/types/hyperlane/payload.go @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 hyperlane + +import ( + "encoding/json" + "fmt" + + hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + + "github.com/noble-assets/orbiter/types/core" +) + +// PendingPayload is the storage type for information on incoming Orbiter payloads. +// In order for them to be unique in the hashes they produce, the sequence number +// is included in the hash. +type PendingPayload struct { + Contents *core.Payload `json:"contents"` + Sequence uint64 `json:"sequence"` +} + +func (p *PendingPayload) CorePayload() *core.Payload { return p.Contents } + +func (p *PendingPayload) Hash() (common.Hash, error) { + bz, err := json.Marshal(p) + if err != nil { + return common.Hash{}, err + } + + return crypto.Keccak256Hash(bz), nil +} + +// GetPayloadHashFromWarpMessageBody grabs the orbiter payload hash from a Hyperlane message body. +// This hash is stored in the last 32 bytes of the passed byte slice. +func GetPayloadHashFromWarpMessageBody(body []byte) ([]byte, error) { + if len(body) != ORBITER_PAYLOAD_SIZE { + return nil, fmt.Errorf( + "malformed orbiter payload; expected %d bytes, got %d", + ORBITER_PAYLOAD_SIZE, + len(body), + ) + } + + return body[len(body)-hyperlaneutil.HEX_ADDRESS_LENGTH:], nil +} + +// GetReducedWarpMessageFromOrbiterMessage removes the extra payload bytes from the formatted +// message body +// which turns the custom Orbiter Hyperlane message format into a Warp compatible one. +func GetReducedWarpMessageFromOrbiterMessage( + message hyperlaneutil.HyperlaneMessage, +) (hyperlaneutil.HyperlaneMessage, error) { + payload := message.Body + if len(payload) != ORBITER_PAYLOAD_SIZE { + return hyperlaneutil.HyperlaneMessage{}, fmt.Errorf( + "malformed orbiter payload; expected %d bytes, got %d", + ORBITER_PAYLOAD_SIZE, + len(payload), + ) + } + + // NOTE: this operation just leaves the first two body entries in (recipient & amount) + // and cuts the orbiter payload hash. + message.Body = payload[:2*hyperlaneutil.HEX_ADDRESS_LENGTH] + + return message, nil +} diff --git a/types/hyperlane/payload_test.go b/types/hyperlane/payload_test.go new file mode 100644 index 00000000..8247ecd4 --- /dev/null +++ b/types/hyperlane/payload_test.go @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 hyperlane_test + +import ( + hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" + "math/big" + "testing" + + warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" + + "github.com/noble-assets/orbiter/testutil" + "github.com/noble-assets/orbiter/types/hyperlane" +) + +func TestPayloadConversion(t *testing.T) { + testAddr := ethcommon.BytesToAddress(testutil.AddressBytes()) + testAmount := big.NewInt(1000) + + expWarpPayload, err := warptypes.NewWarpPayload(testAddr.Bytes(), *testAmount) + require.NoError(t, err, "failed to build warp payload") + + bz := expWarpPayload.Bytes() + + testPayloadHash := ethcommon.LeftPadBytes( + []byte{1, 0, 0, 1, 1, 0, 0, 0}, + hyperlane.PAYLOAD_HASH_LENGTH, + ) + + fullPayload := make([]byte, hyperlane.ORBITER_PAYLOAD_SIZE) + copy(fullPayload[:len(bz)], bz) + copy(fullPayload[len(bz):], testPayloadHash) + + gotHash, err := hyperlane.GetPayloadHashFromWarpMessageBody(fullPayload) + require.NoError(t, err, "failed to get orbiter hash") + require.Equal(t, testPayloadHash, gotHash, "expected different payload hash") + + message := hyperlaneutil.HyperlaneMessage{Body: fullPayload} + + warpMessage, err := hyperlane.GetReducedWarpMessageFromOrbiterMessage(message) + require.NoError(t, err, "failed to get reduced warp message") + require.Len(t, warpMessage.Body, 64, "expected different message body length") + + warpPayload, err := warptypes.ParseWarpPayload(warpMessage.Body) + require.NoError(t, err, "failed to parse warp payload") + require.Equal(t, testAmount, warpPayload.Amount(), "expected different warp amount") + require.Equal(t, + ethcommon.LeftPadBytes(testAddr.Bytes(), hyperlaneutil.HEX_ADDRESS_LENGTH), + warpPayload.Recipient(), + "expected different warp recipient", + ) +} diff --git a/types/parser.go b/types/parser.go index 782ed905..85995390 100644 --- a/types/parser.go +++ b/types/parser.go @@ -21,6 +21,8 @@ package types import ( + "context" + "github.com/noble-assets/orbiter/types/core" ) @@ -31,5 +33,7 @@ type PayloadParser interface { // orbiter payload. It returns a boolean to inform if // the bytes represent an orbiter payload or not. The // parsing is executed only if the boolean is true. - ParsePayload(core.ProtocolID, []byte) (bool, *core.Payload, error) + // + // TODO: had to pass context here; remove again?? + ParsePayload(context.Context, core.ProtocolID, []byte) (bool, *core.Payload, error) } From 70894f53723e34ba34abfcd2d85b0ea5e436f422 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Tue, 30 Sep 2025 11:02:09 +0200 Subject: [PATCH 13/34] remove unused files --- types/hyperlane/cctp_attributes.go | 10 ---- types/hyperlane/hyperlane_attributes.go | 79 ------------------------- 2 files changed, 89 deletions(-) delete mode 100644 types/hyperlane/cctp_attributes.go delete mode 100644 types/hyperlane/hyperlane_attributes.go diff --git a/types/hyperlane/cctp_attributes.go b/types/hyperlane/cctp_attributes.go deleted file mode 100644 index 481d509c..00000000 --- a/types/hyperlane/cctp_attributes.go +++ /dev/null @@ -1,10 +0,0 @@ -package hyperlane - -import "github.com/noble-assets/orbiter/types/core" - -// unpackCCTPAttributes does the manual unpacking of CCTP attributes from a bytes payload. -// -// TODO: move into common utils? could also be used for the CCTP adapter -func unpackCCTPAttributes(bz []byte) (core.ForwardingAttributes, error) { - panic("not implemented") -} diff --git a/types/hyperlane/hyperlane_attributes.go b/types/hyperlane/hyperlane_attributes.go deleted file mode 100644 index 1879938b..00000000 --- a/types/hyperlane/hyperlane_attributes.go +++ /dev/null @@ -1,79 +0,0 @@ -package hyperlane - -import ( - errorsmod "cosmossdk.io/errors" - sdkmath "cosmossdk.io/math" - "encoding/binary" - "fmt" - hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/noble-assets/orbiter/types/controller/forwarding" - "github.com/noble-assets/orbiter/types/core" - "math/big" -) - -// Hyperlane attributes constants -// -// TODO: cross-check assumptions here, correct length used for everything? -// TODO: can probably be removed in favor of ABI unpacking -const ( - tokenIDLength = hyperlaneutil.HEX_ADDRESS_LENGTH - destDomainLength = 4 - recipientLength = hyperlaneutil.HEX_ADDRESS_LENGTH - customHookIDLength = hyperlaneutil.HEX_ADDRESS_LENGTH - gasLimitLength = 32 // uint256 - feeAmountLength = 32 // uint256 - feeDenomLength = 32 // just a random assumption / requirement we can put in place? - - hypAttrMinLength = tokenIDLength + destDomainLength + recipientLength + customHookIDLength + gasLimitLength + feeAmountLength + feeDenomLength -) - -// unpackHypAttributes does the manual unpacking of Hyperlane orbiter attributes from a bytes payload. -// -// TODO: move into common utils? could also be used for the CCTP adapter -func unpackHypAttributes(bz []byte) (core.ForwardingAttributes, error) { - if len(bz) < hypAttrMinLength { - return nil, fmt.Errorf("minimum length for hyperlane attributes is %d; got %d", hypAttrMinLength, len(bz)) - } - - offset := 0 - - tokenID := bz[offset:tokenIDLength] - offset += tokenIDLength - - destDomain := binary.BigEndian.Uint32(bz[offset : offset+destDomainLength]) - offset += destDomainLength - - recipient := bz[offset : offset+recipientLength] - offset += recipientLength - - customHookID := bz[offset:customHookIDLength] - offset += customHookIDLength - - gasLimit := new(big.Int).SetBytes(bz[offset : offset+gasLimitLength]) - offset += gasLimitLength - - maxFeeAmount := new(big.Int).SetBytes(bz[offset : offset+feeAmountLength]) - offset += feeAmountLength - - maxFeeDenom := string(bz[offset : offset+feeDenomLength]) - offset += feeDenomLength - - // since this is of variable length, we unpack this last - customHookMetadata := string(bz[offset:]) - - maxFee := sdk.Coin{Denom: maxFeeDenom, Amount: sdkmath.NewIntFromBigInt(maxFeeAmount)} - if err := maxFee.Validate(); err != nil { - return nil, errorsmod.Wrap(err, "invalid max fee provided") - } - - return forwarding.NewHyperlaneAttributes( - tokenID, - destDomain, - recipient, - customHookID, - customHookMetadata, - sdkmath.NewIntFromBigInt(gasLimit), - maxFee, - ) -} From 4d98eabfac2680a2d0a86a83fb8d1dbc8334598a Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 1 Oct 2025 15:21:09 +0200 Subject: [PATCH 14/34] add proto for submit payload message --- api/v1/tx.pulsar.go | 1750 ++++++++++++++++++++++++++++++- api/v1/tx_grpc.pb.go | 55 +- proto/noble/orbiter/v1/tx.proto | 42 + types/tx.pb.go | 855 ++++++++++++++- 4 files changed, 2660 insertions(+), 42 deletions(-) diff --git a/api/v1/tx.pulsar.go b/api/v1/tx.pulsar.go index 7fc881cc..3aa96efd 100644 --- a/api/v1/tx.pulsar.go +++ b/api/v1/tx.pulsar.go @@ -2,12 +2,1473 @@ package orbiterv1 import ( + _ "cosmossdk.io/api/amino" _ "cosmossdk.io/api/cosmos/msg/v1" + fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + runtime "github.com/cosmos/cosmos-proto/runtime" + _ "github.com/cosmos/gogoproto/gogoproto" + v1 "github.com/noble-assets/orbiter/api/core/v1" 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_MsgSubmitPayload protoreflect.MessageDescriptor + fd_MsgSubmitPayload_signer protoreflect.FieldDescriptor + fd_MsgSubmitPayload_payload protoreflect.FieldDescriptor +) + +func init() { + file_noble_orbiter_v1_tx_proto_init() + md_MsgSubmitPayload = File_noble_orbiter_v1_tx_proto.Messages().ByName("MsgSubmitPayload") + fd_MsgSubmitPayload_signer = md_MsgSubmitPayload.Fields().ByName("signer") + fd_MsgSubmitPayload_payload = md_MsgSubmitPayload.Fields().ByName("payload") +} + +var _ protoreflect.Message = (*fastReflection_MsgSubmitPayload)(nil) + +type fastReflection_MsgSubmitPayload MsgSubmitPayload + +func (x *MsgSubmitPayload) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgSubmitPayload)(x) +} + +func (x *MsgSubmitPayload) slowProtoReflect() protoreflect.Message { + mi := &file_noble_orbiter_v1_tx_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_MsgSubmitPayload_messageType fastReflection_MsgSubmitPayload_messageType +var _ protoreflect.MessageType = fastReflection_MsgSubmitPayload_messageType{} + +type fastReflection_MsgSubmitPayload_messageType struct{} + +func (x fastReflection_MsgSubmitPayload_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgSubmitPayload)(nil) +} +func (x fastReflection_MsgSubmitPayload_messageType) New() protoreflect.Message { + return new(fastReflection_MsgSubmitPayload) +} +func (x fastReflection_MsgSubmitPayload_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgSubmitPayload +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgSubmitPayload) Descriptor() protoreflect.MessageDescriptor { + return md_MsgSubmitPayload +} + +// 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_MsgSubmitPayload) Type() protoreflect.MessageType { + return _fastReflection_MsgSubmitPayload_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgSubmitPayload) New() protoreflect.Message { + return new(fastReflection_MsgSubmitPayload) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgSubmitPayload) Interface() protoreflect.ProtoMessage { + return (*MsgSubmitPayload)(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_MsgSubmitPayload) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Signer != "" { + value := protoreflect.ValueOfString(x.Signer) + if !f(fd_MsgSubmitPayload_signer, value) { + return + } + } + if x.Payload != nil { + value := protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) + if !f(fd_MsgSubmitPayload_payload, 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_MsgSubmitPayload) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayload.signer": + return x.Signer != "" + case "noble.orbiter.v1.MsgSubmitPayload.payload": + return x.Payload != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayload 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_MsgSubmitPayload) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayload.signer": + x.Signer = "" + case "noble.orbiter.v1.MsgSubmitPayload.payload": + x.Payload = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayload 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_MsgSubmitPayload) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "noble.orbiter.v1.MsgSubmitPayload.signer": + value := x.Signer + return protoreflect.ValueOfString(value) + case "noble.orbiter.v1.MsgSubmitPayload.payload": + value := x.Payload + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayload 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_MsgSubmitPayload) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayload.signer": + x.Signer = value.Interface().(string) + case "noble.orbiter.v1.MsgSubmitPayload.payload": + x.Payload = value.Message().Interface().(*v1.Payload) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayload 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_MsgSubmitPayload) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayload.payload": + if x.Payload == nil { + x.Payload = new(v1.Payload) + } + return protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) + case "noble.orbiter.v1.MsgSubmitPayload.signer": + panic(fmt.Errorf("field signer of message noble.orbiter.v1.MsgSubmitPayload is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayload 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_MsgSubmitPayload) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayload.signer": + return protoreflect.ValueOfString("") + case "noble.orbiter.v1.MsgSubmitPayload.payload": + m := new(v1.Payload) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayload 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_MsgSubmitPayload) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in noble.orbiter.v1.MsgSubmitPayload", 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_MsgSubmitPayload) 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_MsgSubmitPayload) 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_MsgSubmitPayload) 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_MsgSubmitPayload) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgSubmitPayload) + 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.Signer) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.Payload != nil { + l = options.Size(x.Payload) + 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().(*MsgSubmitPayload) + 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 x.Payload != nil { + encoded, err := options.Marshal(x.Payload) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x12 + } + if len(x.Signer) > 0 { + i -= len(x.Signer) + copy(dAtA[i:], x.Signer) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Signer))) + 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().(*MsgSubmitPayload) + 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: MsgSubmitPayload: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgSubmitPayload: 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 Signer", wireType) + } + var stringLen 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++ + stringLen |= uint64(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.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var msglen 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++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + 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 + } + if x.Payload == nil { + x.Payload = &v1.Payload{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Payload); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + 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_MsgSubmitPayloadResponse protoreflect.MessageDescriptor + fd_MsgSubmitPayloadResponse_sequence protoreflect.FieldDescriptor + fd_MsgSubmitPayloadResponse_hash protoreflect.FieldDescriptor +) + +func init() { + file_noble_orbiter_v1_tx_proto_init() + md_MsgSubmitPayloadResponse = File_noble_orbiter_v1_tx_proto.Messages().ByName("MsgSubmitPayloadResponse") + fd_MsgSubmitPayloadResponse_sequence = md_MsgSubmitPayloadResponse.Fields().ByName("sequence") + fd_MsgSubmitPayloadResponse_hash = md_MsgSubmitPayloadResponse.Fields().ByName("hash") +} + +var _ protoreflect.Message = (*fastReflection_MsgSubmitPayloadResponse)(nil) + +type fastReflection_MsgSubmitPayloadResponse MsgSubmitPayloadResponse + +func (x *MsgSubmitPayloadResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgSubmitPayloadResponse)(x) +} + +func (x *MsgSubmitPayloadResponse) slowProtoReflect() protoreflect.Message { + mi := &file_noble_orbiter_v1_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_MsgSubmitPayloadResponse_messageType fastReflection_MsgSubmitPayloadResponse_messageType +var _ protoreflect.MessageType = fastReflection_MsgSubmitPayloadResponse_messageType{} + +type fastReflection_MsgSubmitPayloadResponse_messageType struct{} + +func (x fastReflection_MsgSubmitPayloadResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgSubmitPayloadResponse)(nil) +} +func (x fastReflection_MsgSubmitPayloadResponse_messageType) New() protoreflect.Message { + return new(fastReflection_MsgSubmitPayloadResponse) +} +func (x fastReflection_MsgSubmitPayloadResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgSubmitPayloadResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgSubmitPayloadResponse) Descriptor() protoreflect.MessageDescriptor { + return md_MsgSubmitPayloadResponse +} + +// 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_MsgSubmitPayloadResponse) Type() protoreflect.MessageType { + return _fastReflection_MsgSubmitPayloadResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgSubmitPayloadResponse) New() protoreflect.Message { + return new(fastReflection_MsgSubmitPayloadResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgSubmitPayloadResponse) Interface() protoreflect.ProtoMessage { + return (*MsgSubmitPayloadResponse)(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_MsgSubmitPayloadResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Sequence != uint64(0) { + value := protoreflect.ValueOfUint64(x.Sequence) + if !f(fd_MsgSubmitPayloadResponse_sequence, value) { + return + } + } + if len(x.Hash) != 0 { + value := protoreflect.ValueOfBytes(x.Hash) + if !f(fd_MsgSubmitPayloadResponse_hash, 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_MsgSubmitPayloadResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": + return x.Sequence != uint64(0) + case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": + return len(x.Hash) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayloadResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayloadResponse 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_MsgSubmitPayloadResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": + x.Sequence = uint64(0) + case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": + x.Hash = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayloadResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayloadResponse 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_MsgSubmitPayloadResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": + value := x.Sequence + return protoreflect.ValueOfUint64(value) + case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": + value := x.Hash + return protoreflect.ValueOfBytes(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayloadResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayloadResponse 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_MsgSubmitPayloadResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": + x.Sequence = value.Uint() + case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": + x.Hash = value.Bytes() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayloadResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayloadResponse 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_MsgSubmitPayloadResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": + panic(fmt.Errorf("field sequence of message noble.orbiter.v1.MsgSubmitPayloadResponse is not mutable")) + case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": + panic(fmt.Errorf("field hash of message noble.orbiter.v1.MsgSubmitPayloadResponse is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayloadResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayloadResponse 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_MsgSubmitPayloadResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": + return protoreflect.ValueOfUint64(uint64(0)) + case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": + return protoreflect.ValueOfBytes(nil) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayloadResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.MsgSubmitPayloadResponse 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_MsgSubmitPayloadResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in noble.orbiter.v1.MsgSubmitPayloadResponse", 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_MsgSubmitPayloadResponse) 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_MsgSubmitPayloadResponse) 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_MsgSubmitPayloadResponse) 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_MsgSubmitPayloadResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgSubmitPayloadResponse) + 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.Sequence != 0 { + n += 1 + runtime.Sov(uint64(x.Sequence)) + } + l = len(x.Hash) + 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().(*MsgSubmitPayloadResponse) + 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.Hash) > 0 { + i -= len(x.Hash) + copy(dAtA[i:], x.Hash) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Hash))) + i-- + dAtA[i] = 0x12 + } + if x.Sequence != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.Sequence)) + i-- + dAtA[i] = 0x8 + } + 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().(*MsgSubmitPayloadResponse) + 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: MsgSubmitPayloadResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgSubmitPayloadResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) + } + x.Sequence = 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.Sequence |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Hash", 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.Hash = append(x.Hash[:0], dAtA[iNdEx:postIndex]...) + if x.Hash == nil { + x.Hash = []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_PendingPayload protoreflect.MessageDescriptor + fd_PendingPayload_sequence protoreflect.FieldDescriptor + fd_PendingPayload_payload protoreflect.FieldDescriptor +) + +func init() { + file_noble_orbiter_v1_tx_proto_init() + md_PendingPayload = File_noble_orbiter_v1_tx_proto.Messages().ByName("PendingPayload") + fd_PendingPayload_sequence = md_PendingPayload.Fields().ByName("sequence") + fd_PendingPayload_payload = md_PendingPayload.Fields().ByName("payload") +} + +var _ protoreflect.Message = (*fastReflection_PendingPayload)(nil) + +type fastReflection_PendingPayload PendingPayload + +func (x *PendingPayload) ProtoReflect() protoreflect.Message { + return (*fastReflection_PendingPayload)(x) +} + +func (x *PendingPayload) slowProtoReflect() protoreflect.Message { + mi := &file_noble_orbiter_v1_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_PendingPayload_messageType fastReflection_PendingPayload_messageType +var _ protoreflect.MessageType = fastReflection_PendingPayload_messageType{} + +type fastReflection_PendingPayload_messageType struct{} + +func (x fastReflection_PendingPayload_messageType) Zero() protoreflect.Message { + return (*fastReflection_PendingPayload)(nil) +} +func (x fastReflection_PendingPayload_messageType) New() protoreflect.Message { + return new(fastReflection_PendingPayload) +} +func (x fastReflection_PendingPayload_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_PendingPayload +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_PendingPayload) Descriptor() protoreflect.MessageDescriptor { + return md_PendingPayload +} + +// 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_PendingPayload) Type() protoreflect.MessageType { + return _fastReflection_PendingPayload_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_PendingPayload) New() protoreflect.Message { + return new(fastReflection_PendingPayload) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_PendingPayload) Interface() protoreflect.ProtoMessage { + return (*PendingPayload)(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_PendingPayload) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Sequence != uint64(0) { + value := protoreflect.ValueOfUint64(x.Sequence) + if !f(fd_PendingPayload_sequence, value) { + return + } + } + if x.Payload != nil { + value := protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) + if !f(fd_PendingPayload_payload, 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_PendingPayload) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "noble.orbiter.v1.PendingPayload.sequence": + return x.Sequence != uint64(0) + case "noble.orbiter.v1.PendingPayload.payload": + return x.Payload != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "noble.orbiter.v1.PendingPayload.sequence": + x.Sequence = uint64(0) + case "noble.orbiter.v1.PendingPayload.payload": + x.Payload = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "noble.orbiter.v1.PendingPayload.sequence": + value := x.Sequence + return protoreflect.ValueOfUint64(value) + case "noble.orbiter.v1.PendingPayload.payload": + value := x.Payload + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "noble.orbiter.v1.PendingPayload.sequence": + x.Sequence = value.Uint() + case "noble.orbiter.v1.PendingPayload.payload": + x.Payload = value.Message().Interface().(*v1.Payload) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.PendingPayload.payload": + if x.Payload == nil { + x.Payload = new(v1.Payload) + } + return protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) + case "noble.orbiter.v1.PendingPayload.sequence": + panic(fmt.Errorf("field sequence of message noble.orbiter.v1.PendingPayload is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.PendingPayload.sequence": + return protoreflect.ValueOfUint64(uint64(0)) + case "noble.orbiter.v1.PendingPayload.payload": + m := new(v1.Payload) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in noble.orbiter.v1.PendingPayload", 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_PendingPayload) 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_PendingPayload) 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_PendingPayload) 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_PendingPayload) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*PendingPayload) + 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.Sequence != 0 { + n += 1 + runtime.Sov(uint64(x.Sequence)) + } + if x.Payload != nil { + l = options.Size(x.Payload) + 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().(*PendingPayload) + 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 x.Payload != nil { + encoded, err := options.Marshal(x.Payload) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x12 + } + if x.Sequence != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.Sequence)) + i-- + dAtA[i] = 0x8 + } + 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().(*PendingPayload) + 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: PendingPayload: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PendingPayload: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) + } + x.Sequence = 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.Sequence |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var msglen 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++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + 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 + } + if x.Payload == nil { + x.Payload = &v1.Payload{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Payload); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + 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, + } +} + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.0 @@ -21,36 +1482,236 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// MsgSubmitPayload enters a new Orbiter payload into the queue of pending +// forwarding operations. +type MsgSubmitPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The signer of the transaction. + Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` + // The payload submitted to the Orbiter module. + Payload *v1.Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *MsgSubmitPayload) Reset() { + *x = MsgSubmitPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_noble_orbiter_v1_tx_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgSubmitPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgSubmitPayload) ProtoMessage() {} + +// Deprecated: Use MsgSubmitPayload.ProtoReflect.Descriptor instead. +func (*MsgSubmitPayload) Descriptor() ([]byte, []int) { + return file_noble_orbiter_v1_tx_proto_rawDescGZIP(), []int{0} +} + +func (x *MsgSubmitPayload) GetSigner() string { + if x != nil { + return x.Signer + } + return "" +} + +func (x *MsgSubmitPayload) GetPayload() *v1.Payload { + if x != nil { + return x.Payload + } + return nil +} + +// MsgSubmitPayloadResponse returns the sequence number of the registered +type MsgSubmitPayloadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The sequence number of the submitted payload. + Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` + // The keccak256 hash by which to reference the submitted payload. + Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` +} + +func (x *MsgSubmitPayloadResponse) Reset() { + *x = MsgSubmitPayloadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_noble_orbiter_v1_tx_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgSubmitPayloadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgSubmitPayloadResponse) ProtoMessage() {} + +// Deprecated: Use MsgSubmitPayloadResponse.ProtoReflect.Descriptor instead. +func (*MsgSubmitPayloadResponse) Descriptor() ([]byte, []int) { + return file_noble_orbiter_v1_tx_proto_rawDescGZIP(), []int{1} +} + +func (x *MsgSubmitPayloadResponse) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *MsgSubmitPayloadResponse) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +// PendingPayload holds the information that goes into the stored payload hash. +// +// TODO: move to different file? hyperlane.proto or something? +type PendingPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The sequence number of the pending payload. + Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` + // The submitted payload that will is registered as pending. + Payload *v1.Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *PendingPayload) Reset() { + *x = PendingPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_noble_orbiter_v1_tx_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PendingPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PendingPayload) ProtoMessage() {} + +// Deprecated: Use PendingPayload.ProtoReflect.Descriptor instead. +func (*PendingPayload) Descriptor() ([]byte, []int) { + return file_noble_orbiter_v1_tx_proto_rawDescGZIP(), []int{2} +} + +func (x *PendingPayload) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *PendingPayload) GetPayload() *v1.Payload { + if x != nil { + return x.Payload + } + return nil +} + var File_noble_orbiter_v1_tx_proto protoreflect.FileDescriptor var file_noble_orbiter_v1_tx_proto_rawDesc = []byte{ 0x0a, 0x19, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x6e, 0x6f, 0x62, - 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x6d, 0x73, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x73, 0x67, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x0c, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x1a, 0x05, 0x80, - 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, 0x62, - 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, - 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, - 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x6f, - 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x58, 0xaa, 0x02, - 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x56, - 0x31, 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, - 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, - 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, - 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var file_noble_orbiter_v1_tx_proto_goTypes = []interface{}{} + 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x11, 0x61, + 0x6d, 0x69, 0x6e, 0x6f, 0x2f, 0x61, 0x6d, 0x69, 0x6e, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x17, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x6d, 0x73, 0x67, 0x2f, 0x76, 0x31, 0x2f, + 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6e, 0x6f, 0x62, 0x6c, + 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0xc3, 0x01, 0x0a, 0x10, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, + 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, + 0x2a, 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x38, 0x82, 0xe7, 0xb0, + 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x28, 0x6e, 0x6f, 0x62, + 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x4d, 0x73, + 0x67, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x4a, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x22, 0x66, 0x0a, 0x0e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x38, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x32, 0x6d, 0x0a, 0x03, 0x4d, 0x73, 0x67, + 0x12, 0x5f, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x22, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x2a, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, + 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, + 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2d, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, + 0x76, 0x31, 0x3b, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4e, + 0x4f, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x62, 0x69, 0x74, + 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, + 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, 0x6f, 0x62, 0x6c, 0x65, + 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x3a, + 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_noble_orbiter_v1_tx_proto_rawDescOnce sync.Once + file_noble_orbiter_v1_tx_proto_rawDescData = file_noble_orbiter_v1_tx_proto_rawDesc +) + +func file_noble_orbiter_v1_tx_proto_rawDescGZIP() []byte { + file_noble_orbiter_v1_tx_proto_rawDescOnce.Do(func() { + file_noble_orbiter_v1_tx_proto_rawDescData = protoimpl.X.CompressGZIP(file_noble_orbiter_v1_tx_proto_rawDescData) + }) + return file_noble_orbiter_v1_tx_proto_rawDescData +} + +var file_noble_orbiter_v1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_noble_orbiter_v1_tx_proto_goTypes = []interface{}{ + (*MsgSubmitPayload)(nil), // 0: noble.orbiter.v1.MsgSubmitPayload + (*MsgSubmitPayloadResponse)(nil), // 1: noble.orbiter.v1.MsgSubmitPayloadResponse + (*PendingPayload)(nil), // 2: noble.orbiter.v1.PendingPayload + (*v1.Payload)(nil), // 3: noble.orbiter.core.v1.Payload +} var file_noble_orbiter_v1_tx_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 + 3, // 0: noble.orbiter.v1.MsgSubmitPayload.payload:type_name -> noble.orbiter.core.v1.Payload + 3, // 1: noble.orbiter.v1.PendingPayload.payload:type_name -> noble.orbiter.core.v1.Payload + 0, // 2: noble.orbiter.v1.Msg.SubmitPayload:input_type -> noble.orbiter.v1.MsgSubmitPayload + 1, // 3: noble.orbiter.v1.Msg.SubmitPayload:output_type -> noble.orbiter.v1.MsgSubmitPayloadResponse + 3, // [3:4] is the sub-list for method output_type + 2, // [2:3] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } func init() { file_noble_orbiter_v1_tx_proto_init() } @@ -58,18 +1719,57 @@ func file_noble_orbiter_v1_tx_proto_init() { if File_noble_orbiter_v1_tx_proto != nil { return } + if !protoimpl.UnsafeEnabled { + file_noble_orbiter_v1_tx_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgSubmitPayload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_noble_orbiter_v1_tx_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgSubmitPayloadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_noble_orbiter_v1_tx_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PendingPayload); 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_noble_orbiter_v1_tx_proto_rawDesc, NumEnums: 0, - NumMessages: 0, + NumMessages: 3, NumExtensions: 0, NumServices: 1, }, GoTypes: file_noble_orbiter_v1_tx_proto_goTypes, DependencyIndexes: file_noble_orbiter_v1_tx_proto_depIdxs, + MessageInfos: file_noble_orbiter_v1_tx_proto_msgTypes, }.Build() File_noble_orbiter_v1_tx_proto = out.File file_noble_orbiter_v1_tx_proto_rawDesc = nil diff --git a/api/v1/tx_grpc.pb.go b/api/v1/tx_grpc.pb.go index c1a1c193..031103c5 100644 --- a/api/v1/tx_grpc.pb.go +++ b/api/v1/tx_grpc.pb.go @@ -7,7 +7,10 @@ package orbiterv1 import ( + context "context" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" ) // This is a compile-time assertion to ensure that this generated file @@ -15,12 +18,19 @@ import ( // Requires gRPC-Go v1.64.0 or later. const _ = grpc.SupportPackageIsVersion9 +const ( + Msg_SubmitPayload_FullMethodName = "/noble.orbiter.v1.Msg/SubmitPayload" +) + // MsgClient is the client API for Msg service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. // // Msg defines the RPC methods for the Orbiter module. type MsgClient interface { + // SubmitPayload is the entrypoint to insert a new pending payload + // into the dispatching queue. + SubmitPayload(ctx context.Context, in *MsgSubmitPayload, opts ...grpc.CallOption) (*MsgSubmitPayloadResponse, error) } type msgClient struct { @@ -31,12 +41,25 @@ func NewMsgClient(cc grpc.ClientConnInterface) MsgClient { return &msgClient{cc} } +func (c *msgClient) SubmitPayload(ctx context.Context, in *MsgSubmitPayload, opts ...grpc.CallOption) (*MsgSubmitPayloadResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(MsgSubmitPayloadResponse) + err := c.cc.Invoke(ctx, Msg_SubmitPayload_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. // All implementations must embed UnimplementedMsgServer // for forward compatibility. // // Msg defines the RPC methods for the Orbiter module. type MsgServer interface { + // SubmitPayload is the entrypoint to insert a new pending payload + // into the dispatching queue. + SubmitPayload(context.Context, *MsgSubmitPayload) (*MsgSubmitPayloadResponse, error) mustEmbedUnimplementedMsgServer() } @@ -47,6 +70,9 @@ type MsgServer interface { // pointer dereference when methods are called. type UnimplementedMsgServer struct{} +func (UnimplementedMsgServer) SubmitPayload(context.Context, *MsgSubmitPayload) (*MsgSubmitPayloadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubmitPayload not implemented") +} func (UnimplementedMsgServer) mustEmbedUnimplementedMsgServer() {} func (UnimplementedMsgServer) testEmbeddedByValue() {} @@ -68,13 +94,36 @@ func RegisterMsgServer(s grpc.ServiceRegistrar, srv MsgServer) { s.RegisterService(&Msg_ServiceDesc, srv) } +func _Msg_SubmitPayload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSubmitPayload) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).SubmitPayload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Msg_SubmitPayload_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).SubmitPayload(ctx, req.(*MsgSubmitPayload)) + } + return interceptor(ctx, in, info, handler) +} + // Msg_ServiceDesc is the grpc.ServiceDesc for Msg service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var Msg_ServiceDesc = grpc.ServiceDesc{ ServiceName: "noble.orbiter.v1.Msg", HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{}, - Metadata: "noble/orbiter/v1/tx.proto", + Methods: []grpc.MethodDesc{ + { + MethodName: "SubmitPayload", + Handler: _Msg_SubmitPayload_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "noble/orbiter/v1/tx.proto", } diff --git a/proto/noble/orbiter/v1/tx.proto b/proto/noble/orbiter/v1/tx.proto index f0ec6938..0cfd25ff 100644 --- a/proto/noble/orbiter/v1/tx.proto +++ b/proto/noble/orbiter/v1/tx.proto @@ -2,11 +2,53 @@ syntax = "proto3"; package noble.orbiter.v1; +import "amino/amino.proto"; import "cosmos/msg/v1/msg.proto"; +import "cosmos_proto/cosmos.proto"; +import "gogoproto/gogo.proto"; +import "noble/orbiter/core/v1/orbiter.proto"; option go_package = "github.com/noble-assets/orbiter/types"; // Msg defines the RPC methods for the Orbiter module. service Msg { option (cosmos.msg.v1.service) = true; + + // SubmitPayload is the entrypoint to insert a new pending payload + // into the dispatching queue. + rpc SubmitPayload(MsgSubmitPayload) returns (MsgSubmitPayloadResponse); +} + +// MsgSubmitPayload enters a new Orbiter payload into the queue of pending +// forwarding operations. +message MsgSubmitPayload { + option (cosmos.msg.v1.signer) = "signer"; + option (amino.name) = "noble/orbiter/v1/MsgAcceptPendingPayload"; + + // The signer of the transaction. + string signer = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // The payload submitted to the Orbiter module. + noble.orbiter.core.v1.Payload payload = 2 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; +} + +// MsgSubmitPayloadResponse returns the sequence number of the registered +message MsgSubmitPayloadResponse { + // The sequence number of the submitted payload. + uint64 sequence = 1; + // The keccak256 hash by which to reference the submitted payload. + bytes hash = 2; +} + +// PendingPayload holds the information that goes into the stored payload hash. +// +// TODO: move to different file? hyperlane.proto or something? +message PendingPayload { + // The sequence number of the pending payload. + uint64 sequence = 1; + // The submitted payload that will is registered as pending. + noble.orbiter.core.v1.Payload payload = 2; } diff --git a/types/tx.pb.go b/types/tx.pb.go index 09cb964a..9f364104 100644 --- a/types/tx.pb.go +++ b/types/tx.pb.go @@ -6,11 +6,19 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-proto" _ "github.com/cosmos/cosmos-sdk/types/msgservice" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" + core "github.com/noble-assets/orbiter/types/core" 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. @@ -24,20 +32,210 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// MsgSubmitPayload enters a new Orbiter payload into the queue of pending +// forwarding operations. +type MsgSubmitPayload struct { + // The signer of the transaction. + Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` + // The payload submitted to the Orbiter module. + Payload core.Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload"` +} + +func (m *MsgSubmitPayload) Reset() { *m = MsgSubmitPayload{} } +func (m *MsgSubmitPayload) String() string { return proto.CompactTextString(m) } +func (*MsgSubmitPayload) ProtoMessage() {} +func (*MsgSubmitPayload) Descriptor() ([]byte, []int) { + return fileDescriptor_4f89c0e5a76b9120, []int{0} +} +func (m *MsgSubmitPayload) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSubmitPayload) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSubmitPayload.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 *MsgSubmitPayload) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSubmitPayload.Merge(m, src) +} +func (m *MsgSubmitPayload) XXX_Size() int { + return m.Size() +} +func (m *MsgSubmitPayload) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSubmitPayload.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSubmitPayload proto.InternalMessageInfo + +func (m *MsgSubmitPayload) GetSigner() string { + if m != nil { + return m.Signer + } + return "" +} + +func (m *MsgSubmitPayload) GetPayload() core.Payload { + if m != nil { + return m.Payload + } + return core.Payload{} +} + +// MsgSubmitPayloadResponse returns the sequence number of the registered +type MsgSubmitPayloadResponse struct { + // The sequence number of the submitted payload. + Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` + // The keccak256 hash by which to reference the submitted payload. + Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` +} + +func (m *MsgSubmitPayloadResponse) Reset() { *m = MsgSubmitPayloadResponse{} } +func (m *MsgSubmitPayloadResponse) String() string { return proto.CompactTextString(m) } +func (*MsgSubmitPayloadResponse) ProtoMessage() {} +func (*MsgSubmitPayloadResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4f89c0e5a76b9120, []int{1} +} +func (m *MsgSubmitPayloadResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSubmitPayloadResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSubmitPayloadResponse.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 *MsgSubmitPayloadResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSubmitPayloadResponse.Merge(m, src) +} +func (m *MsgSubmitPayloadResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgSubmitPayloadResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSubmitPayloadResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSubmitPayloadResponse proto.InternalMessageInfo + +func (m *MsgSubmitPayloadResponse) GetSequence() uint64 { + if m != nil { + return m.Sequence + } + return 0 +} + +func (m *MsgSubmitPayloadResponse) GetHash() []byte { + if m != nil { + return m.Hash + } + return nil +} + +// PendingPayload holds the information that goes into the stored payload hash. +// +// TODO: move to different file? hyperlane.proto or something? +type PendingPayload struct { + // The sequence number of the pending payload. + Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` + // The submitted payload that will is registered as pending. + Payload *core.Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (m *PendingPayload) Reset() { *m = PendingPayload{} } +func (m *PendingPayload) String() string { return proto.CompactTextString(m) } +func (*PendingPayload) ProtoMessage() {} +func (*PendingPayload) Descriptor() ([]byte, []int) { + return fileDescriptor_4f89c0e5a76b9120, []int{2} +} +func (m *PendingPayload) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PendingPayload) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PendingPayload.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 *PendingPayload) XXX_Merge(src proto.Message) { + xxx_messageInfo_PendingPayload.Merge(m, src) +} +func (m *PendingPayload) XXX_Size() int { + return m.Size() +} +func (m *PendingPayload) XXX_DiscardUnknown() { + xxx_messageInfo_PendingPayload.DiscardUnknown(m) +} + +var xxx_messageInfo_PendingPayload proto.InternalMessageInfo + +func (m *PendingPayload) GetSequence() uint64 { + if m != nil { + return m.Sequence + } + return 0 +} + +func (m *PendingPayload) GetPayload() *core.Payload { + if m != nil { + return m.Payload + } + return nil +} + +func init() { + proto.RegisterType((*MsgSubmitPayload)(nil), "noble.orbiter.v1.MsgSubmitPayload") + proto.RegisterType((*MsgSubmitPayloadResponse)(nil), "noble.orbiter.v1.MsgSubmitPayloadResponse") + proto.RegisterType((*PendingPayload)(nil), "noble.orbiter.v1.PendingPayload") +} + func init() { proto.RegisterFile("noble/orbiter/v1/tx.proto", fileDescriptor_4f89c0e5a76b9120) } var fileDescriptor_4f89c0e5a76b9120 = []byte{ - // 156 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcb, 0x4f, 0xca, - 0x49, 0xd5, 0xcf, 0x2f, 0x4a, 0xca, 0x2c, 0x49, 0x2d, 0xd2, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, - 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x00, 0x4b, 0xe9, 0x41, 0xa5, 0xf4, 0xca, 0x0c, 0xa5, - 0xc4, 0x93, 0xf3, 0x8b, 0x73, 0xf3, 0x8b, 0xf5, 0x73, 0x8b, 0xd3, 0x41, 0x2a, 0x73, 0x8b, 0xd3, - 0x21, 0x4a, 0x8d, 0x78, 0xb8, 0x98, 0x7d, 0x8b, 0xd3, 0xa5, 0x58, 0x1b, 0x9e, 0x6f, 0xd0, 0x62, - 0x74, 0xb2, 0x3f, 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, 0xd5, 0xf4, 0xcc, - 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0xb0, 0xe9, 0xba, 0x89, 0xc5, 0xc5, 0xa9, - 0x25, 0xc5, 0x70, 0xfb, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0xa6, 0x1a, 0x03, 0x02, - 0x00, 0x00, 0xff, 0xff, 0x4d, 0xa8, 0x52, 0x16, 0x9d, 0x00, 0x00, 0x00, + // 416 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x3d, 0xab, 0x13, 0x41, + 0x14, 0xdd, 0xd1, 0xe7, 0xd3, 0x37, 0x7e, 0xf0, 0x5c, 0x02, 0x6e, 0xb6, 0x58, 0xc3, 0x8a, 0x10, + 0x16, 0x32, 0x6b, 0x62, 0x13, 0x6c, 0x24, 0xb1, 0x13, 0x02, 0x61, 0xd3, 0xd9, 0x84, 0xfd, 0x18, + 0x27, 0x0b, 0xd9, 0x99, 0x75, 0xef, 0x24, 0x98, 0x4e, 0x2c, 0xad, 0xfc, 0x19, 0x96, 0x29, 0xfc, + 0x07, 0x36, 0x29, 0x83, 0x95, 0x95, 0x48, 0x52, 0xe4, 0x6f, 0xc8, 0xce, 0x4e, 0x02, 0x1b, 0x41, + 0xb1, 0x19, 0xe6, 0xce, 0xb9, 0xf7, 0x9c, 0x39, 0x87, 0x8b, 0x9b, 0x5c, 0x44, 0x73, 0xea, 0x8b, + 0x22, 0x4a, 0x25, 0x2d, 0xfc, 0x65, 0xd7, 0x97, 0xef, 0x49, 0x5e, 0x08, 0x29, 0xcc, 0x6b, 0x05, + 0x11, 0x0d, 0x91, 0x65, 0xd7, 0x7e, 0x18, 0x66, 0x29, 0x17, 0xbe, 0x3a, 0xab, 0x26, 0xfb, 0x51, + 0x2c, 0x20, 0x13, 0xe0, 0x67, 0xc0, 0xca, 0xe1, 0x0c, 0x98, 0x06, 0x9a, 0x15, 0x30, 0x55, 0x95, + 0x5f, 0x15, 0x1a, 0x6a, 0x30, 0xc1, 0x44, 0xf5, 0x5e, 0xde, 0xf4, 0xeb, 0x93, 0xfa, 0x4f, 0x62, + 0x51, 0xd0, 0x92, 0xf1, 0x28, 0xaf, 0x9a, 0xdc, 0x6f, 0x08, 0x5f, 0x8f, 0x80, 0x4d, 0x16, 0x51, + 0x96, 0xca, 0x71, 0xb8, 0x9a, 0x8b, 0x30, 0x31, 0x9f, 0xe1, 0x4b, 0x48, 0x19, 0xa7, 0x85, 0x85, + 0x5a, 0xa8, 0x7d, 0x35, 0xb4, 0xbe, 0x7f, 0xed, 0x34, 0xb4, 0xe2, 0x20, 0x49, 0x0a, 0x0a, 0x30, + 0x91, 0x45, 0xca, 0x59, 0xa0, 0xfb, 0xcc, 0x57, 0xf8, 0x76, 0x5e, 0x0d, 0x5b, 0x37, 0x5a, 0xa8, + 0x7d, 0xb7, 0xe7, 0x90, 0xba, 0xd9, 0x52, 0x9d, 0x2c, 0xbb, 0x44, 0x4b, 0x0c, 0xaf, 0x36, 0x3f, + 0x1f, 0x1b, 0x5f, 0x0e, 0x6b, 0x0f, 0x05, 0xc7, 0xc9, 0x17, 0xfd, 0x8f, 0x87, 0xb5, 0xa7, 0x19, + 0x3f, 0x1d, 0xd6, 0x5e, 0xfb, 0x8f, 0x28, 0x47, 0xc0, 0x06, 0x71, 0x4c, 0x73, 0x39, 0xa6, 0x3c, + 0x49, 0x39, 0xd3, 0x6c, 0xee, 0x6b, 0x6c, 0x9d, 0x9b, 0x08, 0x28, 0xe4, 0x82, 0x03, 0x35, 0x6d, + 0x7c, 0x07, 0xe8, 0xbb, 0x05, 0xe5, 0x31, 0x55, 0x76, 0x2e, 0x82, 0x53, 0x6d, 0x9a, 0xf8, 0x62, + 0x16, 0xc2, 0x4c, 0xfd, 0xf9, 0x5e, 0xa0, 0xee, 0xee, 0x5b, 0xfc, 0xa0, 0xce, 0xfe, 0x57, 0x86, + 0xfe, 0x7f, 0x1a, 0x3f, 0xb9, 0xed, 0x65, 0xf8, 0xe6, 0x08, 0x98, 0x39, 0xc5, 0xf7, 0xeb, 0xe1, + 0xbb, 0xe4, 0x7c, 0x4d, 0xc8, 0xb9, 0x37, 0xdb, 0xfb, 0x77, 0xcf, 0xd1, 0xbf, 0x7d, 0xeb, 0x43, + 0x99, 0xf2, 0xf0, 0xe5, 0x66, 0xe7, 0xa0, 0xed, 0xce, 0x41, 0xbf, 0x76, 0x0e, 0xfa, 0xbc, 0x77, + 0x8c, 0xed, 0xde, 0x31, 0x7e, 0xec, 0x1d, 0xe3, 0xcd, 0x53, 0x96, 0xca, 0xd9, 0x22, 0x22, 0xb1, + 0xc8, 0x7c, 0x45, 0xdb, 0x09, 0x01, 0xa8, 0x84, 0x53, 0xf0, 0x72, 0x95, 0x53, 0x88, 0x2e, 0xd5, + 0xc2, 0x3c, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xe9, 0xb1, 0x70, 0x7b, 0xe1, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -52,6 +250,9 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type MsgClient interface { + // SubmitPayload is the entrypoint to insert a new pending payload + // into the dispatching queue. + SubmitPayload(ctx context.Context, in *MsgSubmitPayload, opts ...grpc.CallOption) (*MsgSubmitPayloadResponse, error) } type msgClient struct { @@ -62,23 +263,649 @@ func NewMsgClient(cc grpc1.ClientConn) MsgClient { return &msgClient{cc} } +func (c *msgClient) SubmitPayload(ctx context.Context, in *MsgSubmitPayload, opts ...grpc.CallOption) (*MsgSubmitPayloadResponse, error) { + out := new(MsgSubmitPayloadResponse) + err := c.cc.Invoke(ctx, "/noble.orbiter.v1.Msg/SubmitPayload", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { + // SubmitPayload is the entrypoint to insert a new pending payload + // into the dispatching queue. + SubmitPayload(context.Context, *MsgSubmitPayload) (*MsgSubmitPayloadResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. type UnimplementedMsgServer struct { } +func (*UnimplementedMsgServer) SubmitPayload(ctx context.Context, req *MsgSubmitPayload) (*MsgSubmitPayloadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SubmitPayload not implemented") +} + func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) } +func _Msg_SubmitPayload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSubmitPayload) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).SubmitPayload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/noble.orbiter.v1.Msg/SubmitPayload", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).SubmitPayload(ctx, req.(*MsgSubmitPayload)) + } + return interceptor(ctx, in, info, handler) +} + var Msg_serviceDesc = _Msg_serviceDesc var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "noble.orbiter.v1.Msg", HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{}, - Metadata: "noble/orbiter/v1/tx.proto", + Methods: []grpc.MethodDesc{ + { + MethodName: "SubmitPayload", + Handler: _Msg_SubmitPayload_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "noble/orbiter/v1/tx.proto", +} + +func (m *MsgSubmitPayload) 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 *MsgSubmitPayload) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSubmitPayload) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Payload.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintTx(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSubmitPayloadResponse) 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 *MsgSubmitPayloadResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSubmitPayloadResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTx(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0x12 + } + if m.Sequence != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.Sequence)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *PendingPayload) 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 *PendingPayload) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PendingPayload) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Payload != nil { + { + size, err := m.Payload.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Sequence != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.Sequence)) + 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 *MsgSubmitPayload) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Payload.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgSubmitPayloadResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Sequence != 0 { + n += 1 + sovTx(uint64(m.Sequence)) + } + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *PendingPayload) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Sequence != 0 { + n += 1 + sovTx(uint64(m.Sequence)) + } + if m.Payload != nil { + l = m.Payload.Size() + n += 1 + l + sovTx(uint64(l)) + } + 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 *MsgSubmitPayload) 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: MsgSubmitPayload: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSubmitPayload: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", 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.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Payload.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + 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 *MsgSubmitPayloadResponse) 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: MsgSubmitPayloadResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSubmitPayloadResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) + } + m.Sequence = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Sequence |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", 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.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []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 *PendingPayload) 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: PendingPayload: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PendingPayload: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) + } + m.Sequence = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Sequence |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Payload == nil { + m.Payload = &core.Payload{} + } + if err := m.Payload.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + 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 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 5d41c2d7820333ddb0e89a97ba7a1a48554de346 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 1 Oct 2025 17:42:00 +0200 Subject: [PATCH 15/34] move definition of pending payload to use the proto generated one; fix hyperlane mocks to set up app router --- api/v1/tx.pulsar.go | 123 +++++------------- controller/action/fee_test.go | 8 +- controller/adapter/hyperlane.go | 2 +- go.mod | 2 +- keeper/keeper.go | 42 +++--- keeper/msg_server.go | 64 +++++++++ keeper/state_handler.go | 41 +++--- proto/noble/orbiter/v1/tx.proto | 4 +- testutil/mocks/hyperlane.go | 15 +++ testutil/mocks/mocks.go | 4 +- testutil/mocks/orbiter/orbiter.go | 2 +- types/expected_keepers.go | 8 +- types/hyperlane/payload.go | 24 ---- types/hyperlane/payload_test.go | 2 +- .../{hyperlane/collections.go => payload.go} | 17 ++- types/tx.pb.go | 94 +++++-------- 16 files changed, 211 insertions(+), 241 deletions(-) create mode 100644 keeper/msg_server.go rename types/{hyperlane/collections.go => payload.go} (82%) diff --git a/api/v1/tx.pulsar.go b/api/v1/tx.pulsar.go index 3aa96efd..5126343c 100644 --- a/api/v1/tx.pulsar.go +++ b/api/v1/tx.pulsar.go @@ -517,15 +517,13 @@ func (x *fastReflection_MsgSubmitPayload) ProtoMethods() *protoiface.Methods { } var ( - md_MsgSubmitPayloadResponse protoreflect.MessageDescriptor - fd_MsgSubmitPayloadResponse_sequence protoreflect.FieldDescriptor - fd_MsgSubmitPayloadResponse_hash protoreflect.FieldDescriptor + md_MsgSubmitPayloadResponse protoreflect.MessageDescriptor + fd_MsgSubmitPayloadResponse_hash protoreflect.FieldDescriptor ) func init() { file_noble_orbiter_v1_tx_proto_init() md_MsgSubmitPayloadResponse = File_noble_orbiter_v1_tx_proto.Messages().ByName("MsgSubmitPayloadResponse") - fd_MsgSubmitPayloadResponse_sequence = md_MsgSubmitPayloadResponse.Fields().ByName("sequence") fd_MsgSubmitPayloadResponse_hash = md_MsgSubmitPayloadResponse.Fields().ByName("hash") } @@ -594,12 +592,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) Interface() protoreflect.Proto // While iterating, mutating operations may only be performed // on the current field descriptor. func (x *fastReflection_MsgSubmitPayloadResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - if x.Sequence != uint64(0) { - value := protoreflect.ValueOfUint64(x.Sequence) - if !f(fd_MsgSubmitPayloadResponse_sequence, value) { - return - } - } if len(x.Hash) != 0 { value := protoreflect.ValueOfBytes(x.Hash) if !f(fd_MsgSubmitPayloadResponse_hash, value) { @@ -621,8 +613,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) Range(f func(protoreflect.Fiel // a repeated field is populated if it is non-empty. func (x *fastReflection_MsgSubmitPayloadResponse) Has(fd protoreflect.FieldDescriptor) bool { switch fd.FullName() { - case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": - return x.Sequence != uint64(0) case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": return len(x.Hash) != 0 default: @@ -641,8 +631,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) Has(fd protoreflect.FieldDescr // Clear is a mutating operation and unsafe for concurrent use. func (x *fastReflection_MsgSubmitPayloadResponse) Clear(fd protoreflect.FieldDescriptor) { switch fd.FullName() { - case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": - x.Sequence = uint64(0) case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": x.Hash = nil default: @@ -661,9 +649,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) Clear(fd protoreflect.FieldDes // of the value; to obtain a mutable reference, use Mutable. func (x *fastReflection_MsgSubmitPayloadResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { switch descriptor.FullName() { - case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": - value := x.Sequence - return protoreflect.ValueOfUint64(value) case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": value := x.Hash return protoreflect.ValueOfBytes(value) @@ -687,8 +672,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) Get(descriptor protoreflect.Fi // Set is a mutating operation and unsafe for concurrent use. func (x *fastReflection_MsgSubmitPayloadResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { switch fd.FullName() { - case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": - x.Sequence = value.Uint() case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": x.Hash = value.Bytes() default: @@ -711,8 +694,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) Set(fd protoreflect.FieldDescr // Mutable is a mutating operation and unsafe for concurrent use. func (x *fastReflection_MsgSubmitPayloadResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { - case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": - panic(fmt.Errorf("field sequence of message noble.orbiter.v1.MsgSubmitPayloadResponse is not mutable")) case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": panic(fmt.Errorf("field hash of message noble.orbiter.v1.MsgSubmitPayloadResponse is not mutable")) default: @@ -728,8 +709,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) Mutable(fd protoreflect.FieldD // For lists, maps, and messages, this returns a new, empty, mutable value. func (x *fastReflection_MsgSubmitPayloadResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { - case "noble.orbiter.v1.MsgSubmitPayloadResponse.sequence": - return protoreflect.ValueOfUint64(uint64(0)) case "noble.orbiter.v1.MsgSubmitPayloadResponse.hash": return protoreflect.ValueOfBytes(nil) default: @@ -801,9 +780,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) ProtoMethods() *protoiface.Met var n int var l int _ = l - if x.Sequence != 0 { - n += 1 + runtime.Sov(uint64(x.Sequence)) - } l = len(x.Hash) if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) @@ -842,12 +818,7 @@ func (x *fastReflection_MsgSubmitPayloadResponse) ProtoMethods() *protoiface.Met copy(dAtA[i:], x.Hash) i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Hash))) i-- - dAtA[i] = 0x12 - } - if x.Sequence != 0 { - i = runtime.EncodeVarint(dAtA, i, uint64(x.Sequence)) - i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } if input.Buf != nil { input.Buf = append(input.Buf, dAtA...) @@ -899,25 +870,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) ProtoMethods() *protoiface.Met } switch fieldNum { case 1: - if wireType != 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) - } - x.Sequence = 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.Sequence |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) } @@ -1535,10 +1487,8 @@ type MsgSubmitPayloadResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The sequence number of the submitted payload. - Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` // The keccak256 hash by which to reference the submitted payload. - Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` } func (x *MsgSubmitPayloadResponse) Reset() { @@ -1561,13 +1511,6 @@ func (*MsgSubmitPayloadResponse) Descriptor() ([]byte, []int) { return file_noble_orbiter_v1_tx_proto_rawDescGZIP(), []int{1} } -func (x *MsgSubmitPayloadResponse) GetSequence() uint64 { - if x != nil { - return x.Sequence - } - return 0 -} - func (x *MsgSubmitPayloadResponse) GetHash() []byte { if x != nil { return x.Hash @@ -1649,38 +1592,36 @@ var file_noble_orbiter_v1_tx_proto_rawDesc = []byte{ 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x28, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x4d, 0x73, 0x67, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x4a, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2e, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x22, 0x66, 0x0a, 0x0e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x38, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x32, 0x6d, 0x0a, 0x03, 0x4d, 0x73, 0x67, - 0x12, 0x5f, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x22, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x2a, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x66, 0x0a, 0x0e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, + 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x32, 0x6d, 0x0a, + 0x03, 0x4d, 0x73, 0x67, 0x12, 0x5f, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, - 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, - 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2d, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, - 0x76, 0x31, 0x3b, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4e, - 0x4f, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x62, 0x69, 0x74, - 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, - 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, 0x6f, 0x62, 0x6c, 0x65, - 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x3a, - 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x2a, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, + 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, 0x0a, + 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, + 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, + 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, + 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, 0x31, + 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, + 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, + 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, + 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x6f, + 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/controller/action/fee_test.go b/controller/action/fee_test.go index fd291220..62b1f585 100644 --- a/controller/action/fee_test.go +++ b/controller/action/fee_test.go @@ -109,7 +109,7 @@ func TestGetAttributes(t *testing.T) { } deps := mocks.NewDependencies(t) - m := mocks.NewMocks() + m := mocks.NewMocks(deps) controller, err := controllers.NewFeeController(deps.Logger, deps.EventService, m.BankKeeper) require.NoError(t, err) @@ -292,7 +292,7 @@ func TestComputeFeesToDistribute(t *testing.T) { } deps := mocks.NewDependencies(t) - m := mocks.NewMocks() + m := mocks.NewMocks(deps) controller, err := controllers.NewFeeController(deps.Logger, deps.EventService, m.BankKeeper) require.NoError(t, err) @@ -455,7 +455,7 @@ func TestValidateAttributes(t *testing.T) { } deps := mocks.NewDependencies(t) - m := mocks.NewMocks() + m := mocks.NewMocks(deps) controller, err := controllers.NewFeeController(deps.Logger, deps.EventService, m.BankKeeper) require.NoError(t, err) @@ -550,7 +550,7 @@ func TestHandlePacket(t *testing.T) { } deps := mocks.NewDependencies(t) - m := mocks.NewMocks() + m := mocks.NewMocks(deps) controller, err := controllers.NewFeeController(deps.Logger, deps.EventService, m.BankKeeper) require.NoError(t, err) diff --git a/controller/adapter/hyperlane.go b/controller/adapter/hyperlane.go index 1742b736..d66697c4 100644 --- a/controller/adapter/hyperlane.go +++ b/controller/adapter/hyperlane.go @@ -87,5 +87,5 @@ func (h *HyperlaneAdapter) ParsePayload( return false, nil, errorsmod.Wrap(err, "failed to get pending payload") } - return true, pendingPayload.CorePayload(), nil + return true, pendingPayload.Payload, nil } diff --git a/go.mod b/go.mod index 2784f0c9..4667cd84 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( github.com/cosmos/cosmos-sdk v0.50.13 github.com/cosmos/gogoproto v1.7.0 github.com/cosmos/ibc-go/v8 v8.6.1 + github.com/ethereum/go-ethereum v1.16.2 github.com/golang/protobuf v1.5.4 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/stretchr/testify v1.10.0 @@ -67,7 +68,6 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/emicklei/dot v1.6.2 // indirect - github.com/ethereum/go-ethereum v1.16.2 // indirect github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect diff --git a/keeper/keeper.go b/keeper/keeper.go index 6e6f01f2..b2444bc7 100644 --- a/keeper/keeper.go +++ b/keeper/keeper.go @@ -38,18 +38,18 @@ import ( dispatchercomp "github.com/noble-assets/orbiter/keeper/component/dispatcher" executorcomp "github.com/noble-assets/orbiter/keeper/component/executor" forwardercomp "github.com/noble-assets/orbiter/keeper/component/forwarder" - "github.com/noble-assets/orbiter/types" + orbitertypes "github.com/noble-assets/orbiter/types" "github.com/noble-assets/orbiter/types/core" - "github.com/noble-assets/orbiter/types/hyperlane" ) var ( - // General interface compliance - _ types.Authorizer = &Keeper{} + // General interface compliance. + _ orbitertypes.Authorizer = &Keeper{} + _ orbitertypes.MsgServer = &Keeper{} - // Hyperlane interface compliance - _ hyperlaneutil.HyperlaneApp = &Keeper{} - _ types.HyperlaneStateHandler = &Keeper{} + // Hyperlane interface compliance. + _ hyperlaneutil.HyperlaneApp = &Keeper{} + _ orbitertypes.HyperlaneStateHandler = &Keeper{} ) // Keeper is the main module keeper. @@ -68,14 +68,14 @@ type Keeper struct { adapter *adaptercomp.Adapter // pendingPayloads stores the pending payloads addressed by their keccak256 hash. - pendingPayloads collections.Map[[]byte, hyperlane.PendingPayload] + pendingPayloads collections.Map[[]byte, orbitertypes.PendingPayload] // pendingPayloadsSequence is the unique identifier of a given pending payload handled by the // orbiter. pendingPayloadsSequence collections.Sequence // Hyperlane dependencies - hyperlaneCoreKeeper types.HyperlaneCoreKeeper - hyperlaneWarpKeeper types.HyperlaneWarpKeeper + hyperlaneCoreKeeper orbitertypes.HyperlaneCoreKeeper + hyperlaneWarpKeeper orbitertypes.HyperlaneWarpKeeper } // NewKeeper returns a reference to a validated instance of the keeper. @@ -87,8 +87,8 @@ func NewKeeper( eventService event.Service, storeService store.KVStoreService, authority string, - bankKeeper types.BankKeeper, - coreKeeper types.HyperlaneCoreKeeper, + bankKeeper orbitertypes.BankKeeper, + coreKeeper orbitertypes.HyperlaneCoreKeeper, ) *Keeper { if err := validateKeeperInputs(cdc, addressCdc, logger, eventService, storeService, bankKeeper, coreKeeper, authority); err != nil { panic(err) @@ -107,12 +107,14 @@ func NewKeeper( core.PendingPayloadsSequencePrefix, core.PendingPayloadsSequenceName, ), - pendingPayloads: collections.NewMap[[]byte, hyperlane.PendingPayload]( + pendingPayloads: collections.NewMap[[]byte, orbitertypes.PendingPayload]( sb, core.PendingPayloadsPrefix, core.PendingPayloadsName, collections.BytesKey, - &hyperlane.PendingPayloadCollValue{}, + //// TODO: why does CollValue not work for the proto type PendingPayload? + // codec.CollValue[&orbitertypes.PendingPayload{}], + &orbitertypes.PendingPayloadCollValue{}, ), hyperlaneCoreKeeper: coreKeeper, @@ -143,8 +145,8 @@ func validateKeeperInputs( logger log.Logger, eventService event.Service, storeService store.KVStoreService, - bankKeeper types.BankKeeper, - coreKeeper types.HyperlaneCoreKeeper, + bankKeeper orbitertypes.BankKeeper, + coreKeeper orbitertypes.HyperlaneCoreKeeper, authority string, ) error { if cdc == nil { @@ -221,7 +223,7 @@ func (k *Keeper) Adapter() *adaptercomp.Adapter { return k.adapter } -func (k *Keeper) SetForwardingControllers(controllers ...types.ForwardingController) { +func (k *Keeper) SetForwardingControllers(controllers ...orbitertypes.ForwardingController) { router := k.forwarder.Router() for _, c := range controllers { if err := router.AddRoute(c); err != nil { @@ -233,7 +235,7 @@ func (k *Keeper) SetForwardingControllers(controllers ...types.ForwardingControl } } -func (k *Keeper) SetActionControllers(controllers ...types.ActionController) { +func (k *Keeper) SetActionControllers(controllers ...orbitertypes.ActionController) { router := k.executor.Router() for _, c := range controllers { if err := router.AddRoute(c); err != nil { @@ -245,7 +247,7 @@ func (k *Keeper) SetActionControllers(controllers ...types.ActionController) { } } -func (k *Keeper) SetAdapterControllers(controllers ...types.AdapterController) { +func (k *Keeper) SetAdapterControllers(controllers ...orbitertypes.AdapterController) { router := k.adapter.Router() for _, c := range controllers { if err := router.AddRoute(c); err != nil { @@ -273,7 +275,7 @@ func (k *Keeper) setComponents( logger log.Logger, eventService event.Service, sb *collections.SchemaBuilder, - bankKeeper types.BankKeeper, + bankKeeper orbitertypes.BankKeeper, ) error { executor, err := executorcomp.New(cdc, sb, logger, eventService) if err != nil { diff --git a/keeper/msg_server.go b/keeper/msg_server.go new file mode 100644 index 00000000..7c3849f6 --- /dev/null +++ b/keeper/msg_server.go @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + orbitertypes "github.com/noble-assets/orbiter/types" +) + +func (k *Keeper) SubmitPayload( + ctx context.Context, + req *orbitertypes.MsgSubmitPayload, +) (*orbitertypes.MsgSubmitPayloadResponse, error) { + if req == nil { + return nil, sdkerrors.ErrInvalidRequest + } + + if err := req.Payload.Validate(); err != nil { + return nil, sdkerrors.ErrInvalidRequest.Wrap(err.Error()) + } + + // TODO: move this into the internal method? + seq, err := k.pendingPayloadsSequence.Next(ctx) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to obtain sequence number") + } + + payloadHash, err := k.AcceptPayload( + ctx, + &orbitertypes.PendingPayload{ + Sequence: seq, + Payload: &req.Payload, + }, + ) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to accept payload") + } + + return &orbitertypes.MsgSubmitPayloadResponse{ + Hash: payloadHash, + }, nil +} diff --git a/keeper/state_handler.go b/keeper/state_handler.go index 8cca619d..0ad3d27a 100644 --- a/keeper/state_handler.go +++ b/keeper/state_handler.go @@ -22,37 +22,41 @@ package keeper import ( "context" + "encoding/hex" "errors" errorsmod "cosmossdk.io/errors" orbitertypes "github.com/noble-assets/orbiter/types" - hyperlaneorbitertypes "github.com/noble-assets/orbiter/types/hyperlane" ) var _ orbitertypes.HyperlaneStateHandler = &Keeper{} -// AcceptPendingPayload adds a new pending payload into the module storage. +// AcceptPayload adds a new pending payload into the module storage. // If the payload's hash is already set, an error is returned. -func (k *Keeper) AcceptPendingPayload( +func (k *Keeper) AcceptPayload( ctx context.Context, - payload *hyperlaneorbitertypes.PendingPayload, -) error { - hash, err := payload.Hash() + payload *orbitertypes.PendingPayload, +) ([]byte, error) { + hash, err := payload.Keccak256Hash() if err != nil { - return err + return nil, err } found, err := k.pendingPayloads.Has(ctx, hash.Bytes()) if err != nil { - return errorsmod.Wrap(err, "failed to check pending payloads") + return nil, errorsmod.Wrap(err, "failed to check pending payloads") } if found { - return errors.New("payload hash already exists") + k.Logger().Error("payload hash already registered", "hash", hash.String()) + + return nil, errors.New("payload hash already registered") } - return k.pendingPayloads.Set(ctx, hash.Bytes(), *payload) + k.Logger().Debug("payload hash registered", "hash", hash.String(), "payload", payload.String()) + + return hash.Bytes(), k.pendingPayloads.Set(ctx, hash.Bytes(), *payload) } // GetPendingPayloadWithHash returns the pending payload with the given hash @@ -62,7 +66,7 @@ func (k *Keeper) AcceptPendingPayload( func (k *Keeper) GetPendingPayloadWithHash( ctx context.Context, hash []byte, -) (*hyperlaneorbitertypes.PendingPayload, error) { +) (*orbitertypes.PendingPayload, error) { payload, err := k.pendingPayloads.Get(ctx, hash) if err != nil { return nil, errorsmod.Wrap(err, "pending payload not found") @@ -75,19 +79,12 @@ func (k *Keeper) GetPendingPayloadWithHash( // If a payload is not found, it is a no-op but does not return an error. // // TODO: probably this needs to have more fields other than just the payload like the sender and -// origin account +// origin account. func (k *Keeper) CompletePayloadWithHash( ctx context.Context, - payload *hyperlaneorbitertypes.PendingPayload, + hash []byte, ) error { - if payload == nil { - return errors.New("payload must not be nil") - } - - hash, err := payload.Hash() - if err != nil { - return err - } + k.Logger().Debug("completing payload", "hash", hex.EncodeToString(hash)) - return k.pendingPayloads.Remove(ctx, hash.Bytes()) + return k.pendingPayloads.Remove(ctx, hash) } diff --git a/proto/noble/orbiter/v1/tx.proto b/proto/noble/orbiter/v1/tx.proto index 0cfd25ff..e7d9e2d0 100644 --- a/proto/noble/orbiter/v1/tx.proto +++ b/proto/noble/orbiter/v1/tx.proto @@ -37,10 +37,8 @@ message MsgSubmitPayload { // MsgSubmitPayloadResponse returns the sequence number of the registered message MsgSubmitPayloadResponse { - // The sequence number of the submitted payload. - uint64 sequence = 1; // The keccak256 hash by which to reference the submitted payload. - bytes hash = 2; + bytes hash = 1; } // PendingPayload holds the information that goes into the stored payload hash. diff --git a/testutil/mocks/hyperlane.go b/testutil/mocks/hyperlane.go index 47c69f7a..e96fa51f 100644 --- a/testutil/mocks/hyperlane.go +++ b/testutil/mocks/hyperlane.go @@ -25,8 +25,11 @@ import ( "errors" hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" + hyperlanecoretypes "github.com/bcp-innovations/hyperlane-cosmos/x/core/types" warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" + "cosmossdk.io/collections" + "github.com/noble-assets/orbiter/types" "github.com/noble-assets/orbiter/types/controller/forwarding" ) @@ -72,6 +75,18 @@ type HyperlaneCoreKeeper struct { appRouter *hyperlaneutil.Router[hyperlaneutil.HyperlaneApp] } +// newMockHyperlaneCoreKeeper creates a new mocked hyperlane core keeper and sets +// a testing application router up. +func newMockHyperlaneCoreKeeper(deps Dependencies) *HyperlaneCoreKeeper { + return &HyperlaneCoreKeeper{ + appRouter: hyperlaneutil.NewRouter[hyperlaneutil.HyperlaneApp]( + hyperlanecoretypes.AppRouterKey, + "router_app", + collections.NewSchemaBuilder(deps.StoreService), + ), + } +} + func (hck HyperlaneCoreKeeper) AppRouter() *hyperlaneutil.Router[hyperlaneutil.HyperlaneApp] { return hck.appRouter } diff --git a/testutil/mocks/mocks.go b/testutil/mocks/mocks.go index 2373d737..f3f17e57 100644 --- a/testutil/mocks/mocks.go +++ b/testutil/mocks/mocks.go @@ -46,7 +46,7 @@ type Mocks struct { HyperlaneCoreKeeper *HyperlaneCoreKeeper } -func NewMocks() Mocks { +func NewMocks(deps Dependencies) Mocks { bk := BankKeeper{ Balances: make(map[string]sdk.Coins), } @@ -56,7 +56,7 @@ func NewMocks() Mocks { BankKeeper: &bk, // Circle CCTPMsgServer: &CCTPMsgServer{}, - HyperlaneCoreKeeper: &HyperlaneCoreKeeper{}, + HyperlaneCoreKeeper: newMockHyperlaneCoreKeeper(deps), } return mocks diff --git a/testutil/mocks/orbiter/orbiter.go b/testutil/mocks/orbiter/orbiter.go index 61c8fd96..f617fa38 100644 --- a/testutil/mocks/orbiter/orbiter.go +++ b/testutil/mocks/orbiter/orbiter.go @@ -36,7 +36,7 @@ func OrbiterKeeper(tb testing.TB) (sdk.Context, *mocks.Mocks, *keeper.Keeper) { tb.Helper() deps := mocks.NewDependencies(tb) - mocks := mocks.NewMocks() + mocks := mocks.NewMocks(deps) k, ctx := orbiterKeeperWithMocks(&deps, &mocks) return ctx, &mocks, k diff --git a/types/expected_keepers.go b/types/expected_keepers.go index b214df22..e3786f72 100644 --- a/types/expected_keepers.go +++ b/types/expected_keepers.go @@ -26,8 +26,6 @@ import ( hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/noble-assets/orbiter/types/hyperlane" ) // BankKeeper wraps the bank behaviors expected by the orbiter @@ -76,7 +74,7 @@ type HyperlaneWarpKeeper interface { // HyperlaneStateHandler defines the interface to adjust and query the Orbiter module // state as it relates to Hyperlane bookkeeping. type HyperlaneStateHandler interface { - AcceptPendingPayload(ctx context.Context, payload *hyperlane.PendingPayload) error - CompletePayloadWithHash(ctx context.Context, payload *hyperlane.PendingPayload) error - GetPendingPayloadWithHash(ctx context.Context, hash []byte) (*hyperlane.PendingPayload, error) + AcceptPayload(ctx context.Context, payload *PendingPayload) ([]byte, error) + CompletePayloadWithHash(ctx context.Context, hash []byte) error + GetPendingPayloadWithHash(ctx context.Context, hash []byte) (*PendingPayload, error) } diff --git a/types/hyperlane/payload.go b/types/hyperlane/payload.go index 956b494e..8fc292bc 100644 --- a/types/hyperlane/payload.go +++ b/types/hyperlane/payload.go @@ -21,35 +21,11 @@ package hyperlane import ( - "encoding/json" "fmt" hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - - "github.com/noble-assets/orbiter/types/core" ) -// PendingPayload is the storage type for information on incoming Orbiter payloads. -// In order for them to be unique in the hashes they produce, the sequence number -// is included in the hash. -type PendingPayload struct { - Contents *core.Payload `json:"contents"` - Sequence uint64 `json:"sequence"` -} - -func (p *PendingPayload) CorePayload() *core.Payload { return p.Contents } - -func (p *PendingPayload) Hash() (common.Hash, error) { - bz, err := json.Marshal(p) - if err != nil { - return common.Hash{}, err - } - - return crypto.Keccak256Hash(bz), nil -} - // GetPayloadHashFromWarpMessageBody grabs the orbiter payload hash from a Hyperlane message body. // This hash is stored in the last 32 bytes of the passed byte slice. func GetPayloadHashFromWarpMessageBody(body []byte) ([]byte, error) { diff --git a/types/hyperlane/payload_test.go b/types/hyperlane/payload_test.go index 8247ecd4..a6bf6ef5 100644 --- a/types/hyperlane/payload_test.go +++ b/types/hyperlane/payload_test.go @@ -21,10 +21,10 @@ package hyperlane_test import ( - hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" "math/big" "testing" + hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" diff --git a/types/hyperlane/collections.go b/types/payload.go similarity index 82% rename from types/hyperlane/collections.go rename to types/payload.go index 32bd07fd..4115440a 100644 --- a/types/hyperlane/collections.go +++ b/types/payload.go @@ -18,14 +18,29 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package hyperlane +package types import ( "encoding/json" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "cosmossdk.io/collections/codec" ) +// Keccak256Hash returns the keccak 256 hash of the payload contents. +// To guarantee uniqueness the sequence number is included. +func (p *PendingPayload) Keccak256Hash() (common.Hash, error) { + bz, err := json.Marshal(p) + if err != nil { + return common.Hash{}, err + } + + return crypto.Keccak256Hash(bz), nil +} + +// TODO: check if this is required? var _ codec.ValueCodec[PendingPayload] = &PendingPayloadCollValue{} // PendingPayloadCollValue implements the ValueCodec interface so that PendingPayload diff --git a/types/tx.pb.go b/types/tx.pb.go index 9f364104..50fa29f5 100644 --- a/types/tx.pb.go +++ b/types/tx.pb.go @@ -90,10 +90,8 @@ func (m *MsgSubmitPayload) GetPayload() core.Payload { // MsgSubmitPayloadResponse returns the sequence number of the registered type MsgSubmitPayloadResponse struct { - // The sequence number of the submitted payload. - Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` // The keccak256 hash by which to reference the submitted payload. - Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` } func (m *MsgSubmitPayloadResponse) Reset() { *m = MsgSubmitPayloadResponse{} } @@ -129,13 +127,6 @@ func (m *MsgSubmitPayloadResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgSubmitPayloadResponse proto.InternalMessageInfo -func (m *MsgSubmitPayloadResponse) GetSequence() uint64 { - if m != nil { - return m.Sequence - } - return 0 -} - func (m *MsgSubmitPayloadResponse) GetHash() []byte { if m != nil { return m.Hash @@ -209,33 +200,33 @@ func init() { func init() { proto.RegisterFile("noble/orbiter/v1/tx.proto", fileDescriptor_4f89c0e5a76b9120) } var fileDescriptor_4f89c0e5a76b9120 = []byte{ - // 416 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x3d, 0xab, 0x13, 0x41, - 0x14, 0xdd, 0xd1, 0xe7, 0xd3, 0x37, 0x7e, 0xf0, 0x5c, 0x02, 0x6e, 0xb6, 0x58, 0xc3, 0x8a, 0x10, - 0x16, 0x32, 0x6b, 0x62, 0x13, 0x6c, 0x24, 0xb1, 0x13, 0x02, 0x61, 0xd3, 0xd9, 0x84, 0xfd, 0x18, - 0x27, 0x0b, 0xd9, 0x99, 0x75, 0xef, 0x24, 0x98, 0x4e, 0x2c, 0xad, 0xfc, 0x19, 0x96, 0x29, 0xfc, - 0x07, 0x36, 0x29, 0x83, 0x95, 0x95, 0x48, 0x52, 0xe4, 0x6f, 0xc8, 0xce, 0x4e, 0x02, 0x1b, 0x41, - 0xb1, 0x19, 0xe6, 0xce, 0xb9, 0xf7, 0x9c, 0x39, 0x87, 0x8b, 0x9b, 0x5c, 0x44, 0x73, 0xea, 0x8b, - 0x22, 0x4a, 0x25, 0x2d, 0xfc, 0x65, 0xd7, 0x97, 0xef, 0x49, 0x5e, 0x08, 0x29, 0xcc, 0x6b, 0x05, - 0x11, 0x0d, 0x91, 0x65, 0xd7, 0x7e, 0x18, 0x66, 0x29, 0x17, 0xbe, 0x3a, 0xab, 0x26, 0xfb, 0x51, - 0x2c, 0x20, 0x13, 0xe0, 0x67, 0xc0, 0xca, 0xe1, 0x0c, 0x98, 0x06, 0x9a, 0x15, 0x30, 0x55, 0x95, - 0x5f, 0x15, 0x1a, 0x6a, 0x30, 0xc1, 0x44, 0xf5, 0x5e, 0xde, 0xf4, 0xeb, 0x93, 0xfa, 0x4f, 0x62, - 0x51, 0xd0, 0x92, 0xf1, 0x28, 0xaf, 0x9a, 0xdc, 0x6f, 0x08, 0x5f, 0x8f, 0x80, 0x4d, 0x16, 0x51, - 0x96, 0xca, 0x71, 0xb8, 0x9a, 0x8b, 0x30, 0x31, 0x9f, 0xe1, 0x4b, 0x48, 0x19, 0xa7, 0x85, 0x85, - 0x5a, 0xa8, 0x7d, 0x35, 0xb4, 0xbe, 0x7f, 0xed, 0x34, 0xb4, 0xe2, 0x20, 0x49, 0x0a, 0x0a, 0x30, - 0x91, 0x45, 0xca, 0x59, 0xa0, 0xfb, 0xcc, 0x57, 0xf8, 0x76, 0x5e, 0x0d, 0x5b, 0x37, 0x5a, 0xa8, - 0x7d, 0xb7, 0xe7, 0x90, 0xba, 0xd9, 0x52, 0x9d, 0x2c, 0xbb, 0x44, 0x4b, 0x0c, 0xaf, 0x36, 0x3f, - 0x1f, 0x1b, 0x5f, 0x0e, 0x6b, 0x0f, 0x05, 0xc7, 0xc9, 0x17, 0xfd, 0x8f, 0x87, 0xb5, 0xa7, 0x19, - 0x3f, 0x1d, 0xd6, 0x5e, 0xfb, 0x8f, 0x28, 0x47, 0xc0, 0x06, 0x71, 0x4c, 0x73, 0x39, 0xa6, 0x3c, - 0x49, 0x39, 0xd3, 0x6c, 0xee, 0x6b, 0x6c, 0x9d, 0x9b, 0x08, 0x28, 0xe4, 0x82, 0x03, 0x35, 0x6d, - 0x7c, 0x07, 0xe8, 0xbb, 0x05, 0xe5, 0x31, 0x55, 0x76, 0x2e, 0x82, 0x53, 0x6d, 0x9a, 0xf8, 0x62, - 0x16, 0xc2, 0x4c, 0xfd, 0xf9, 0x5e, 0xa0, 0xee, 0xee, 0x5b, 0xfc, 0xa0, 0xce, 0xfe, 0x57, 0x86, - 0xfe, 0x7f, 0x1a, 0x3f, 0xb9, 0xed, 0x65, 0xf8, 0xe6, 0x08, 0x98, 0x39, 0xc5, 0xf7, 0xeb, 0xe1, - 0xbb, 0xe4, 0x7c, 0x4d, 0xc8, 0xb9, 0x37, 0xdb, 0xfb, 0x77, 0xcf, 0xd1, 0xbf, 0x7d, 0xeb, 0x43, - 0x99, 0xf2, 0xf0, 0xe5, 0x66, 0xe7, 0xa0, 0xed, 0xce, 0x41, 0xbf, 0x76, 0x0e, 0xfa, 0xbc, 0x77, - 0x8c, 0xed, 0xde, 0x31, 0x7e, 0xec, 0x1d, 0xe3, 0xcd, 0x53, 0x96, 0xca, 0xd9, 0x22, 0x22, 0xb1, - 0xc8, 0x7c, 0x45, 0xdb, 0x09, 0x01, 0xa8, 0x84, 0x53, 0xf0, 0x72, 0x95, 0x53, 0x88, 0x2e, 0xd5, - 0xc2, 0x3c, 0xff, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xe9, 0xb1, 0x70, 0x7b, 0xe1, 0x02, 0x00, 0x00, + // 414 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x3d, 0xaf, 0xd3, 0x30, + 0x14, 0x8d, 0xe1, 0xf1, 0xe0, 0x99, 0x0f, 0x3d, 0xac, 0x27, 0x91, 0x97, 0x21, 0x3c, 0x05, 0x21, + 0x55, 0x91, 0xea, 0xd0, 0xb2, 0x54, 0x2c, 0xa8, 0x65, 0xae, 0x54, 0xa5, 0x1b, 0x4b, 0x95, 0x0f, + 0xe3, 0x46, 0x6a, 0xec, 0x90, 0xeb, 0x56, 0x74, 0x43, 0x8c, 0x4c, 0xfc, 0x0c, 0xc6, 0x0e, 0xfc, + 0x03, 0x96, 0x8e, 0x15, 0x13, 0x13, 0x42, 0xed, 0xd0, 0xbf, 0x81, 0xe2, 0xb8, 0x95, 0x52, 0x06, + 0xc4, 0x62, 0xf9, 0xfa, 0x9c, 0x7b, 0xae, 0xcf, 0xd1, 0xc5, 0xd7, 0x42, 0xc6, 0x33, 0x16, 0xc8, + 0x32, 0xce, 0x14, 0x2b, 0x83, 0x45, 0x27, 0x50, 0x1f, 0x68, 0x51, 0x4a, 0x25, 0xc9, 0xa5, 0x86, + 0xa8, 0x81, 0xe8, 0xa2, 0xe3, 0x3c, 0x8e, 0xf2, 0x4c, 0xc8, 0x40, 0x9f, 0x35, 0xc9, 0x79, 0x92, + 0x48, 0xc8, 0x25, 0x04, 0x39, 0xf0, 0xaa, 0x39, 0x07, 0x6e, 0x80, 0xeb, 0x1a, 0x98, 0xe8, 0x2a, + 0xa8, 0x0b, 0x03, 0x5d, 0x71, 0xc9, 0x65, 0xfd, 0x5e, 0xdd, 0xcc, 0xeb, 0xb3, 0xe6, 0x4f, 0x12, + 0x59, 0xb2, 0x4a, 0xf1, 0x30, 0x5e, 0x93, 0xbc, 0xef, 0x08, 0x5f, 0x0e, 0x81, 0x8f, 0xe7, 0x71, + 0x9e, 0xa9, 0x51, 0xb4, 0x9c, 0xc9, 0x28, 0x25, 0x2f, 0xf0, 0x39, 0x64, 0x5c, 0xb0, 0xd2, 0x46, + 0x37, 0xa8, 0x75, 0x31, 0xb0, 0x7f, 0x7c, 0x6b, 0x5f, 0x99, 0x89, 0xfd, 0x34, 0x2d, 0x19, 0xc0, + 0x58, 0x95, 0x99, 0xe0, 0xa1, 0xe1, 0x91, 0x37, 0xf8, 0x6e, 0x51, 0x37, 0xdb, 0xb7, 0x6e, 0x50, + 0xeb, 0x7e, 0xd7, 0xa5, 0x4d, 0xb3, 0xd5, 0x74, 0xba, 0xe8, 0x50, 0x33, 0x62, 0x70, 0xb1, 0xfe, + 0xf5, 0xd4, 0xfa, 0xba, 0x5f, 0xf9, 0x28, 0x3c, 0x74, 0xbe, 0xea, 0x7d, 0xda, 0xaf, 0x7c, 0xa3, + 0xf8, 0x79, 0xbf, 0xf2, 0x5b, 0x7f, 0x45, 0x39, 0x04, 0xde, 0x4f, 0x12, 0x56, 0xa8, 0x11, 0x13, + 0x69, 0x26, 0xb8, 0x51, 0xf3, 0x28, 0xb6, 0x4f, 0x4d, 0x84, 0x0c, 0x0a, 0x29, 0x80, 0x11, 0x82, + 0xcf, 0xa6, 0x11, 0x4c, 0xb5, 0x95, 0x07, 0xa1, 0xbe, 0x7b, 0xef, 0xf0, 0xa3, 0xa6, 0x02, 0x71, + 0xf0, 0x3d, 0x60, 0xef, 0xe7, 0x4c, 0x24, 0x4c, 0x33, 0xcf, 0xc2, 0x63, 0x4d, 0x7a, 0xff, 0x69, + 0xee, 0xe8, 0xa8, 0x9b, 0xe3, 0xdb, 0x43, 0xe0, 0x64, 0x82, 0x1f, 0x36, 0x03, 0xf6, 0xe8, 0xe9, + 0x2a, 0xd0, 0xd3, 0xff, 0x3b, 0xfe, 0xbf, 0x39, 0x07, 0x8f, 0xce, 0x9d, 0x8f, 0x55, 0x92, 0x83, + 0xd7, 0xeb, 0xad, 0x8b, 0x36, 0x5b, 0x17, 0xfd, 0xde, 0xba, 0xe8, 0xcb, 0xce, 0xb5, 0x36, 0x3b, + 0xd7, 0xfa, 0xb9, 0x73, 0xad, 0xb7, 0xcf, 0x79, 0xa6, 0xa6, 0xf3, 0x98, 0x26, 0x32, 0x0f, 0xb4, + 0x6c, 0x3b, 0x02, 0x60, 0x0a, 0x8e, 0xe1, 0xaa, 0x65, 0xc1, 0x20, 0x3e, 0xd7, 0x4b, 0xf1, 0xf2, + 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0x0e, 0x11, 0x43, 0xc5, 0x02, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -388,12 +379,7 @@ func (m *MsgSubmitPayloadResponse) MarshalToSizedBuffer(dAtA []byte) (int, error copy(dAtA[i:], m.Hash) i = encodeVarintTx(dAtA, i, uint64(len(m.Hash))) i-- - dAtA[i] = 0x12 - } - if m.Sequence != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.Sequence)) - i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -470,9 +456,6 @@ func (m *MsgSubmitPayloadResponse) Size() (n int) { } var l int _ = l - if m.Sequence != 0 { - n += 1 + sovTx(uint64(m.Sequence)) - } l = len(m.Hash) if l > 0 { n += 1 + l + sovTx(uint64(l)) @@ -647,25 +630,6 @@ func (m *MsgSubmitPayloadResponse) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) - } - m.Sequence = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Sequence |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) } From 8a421a684f6f9887722ed8be1230c709aa4e2da0 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 1 Oct 2025 23:59:32 +0200 Subject: [PATCH 16/34] wip adding unit tests --- keeper/state_handler.go | 4 + keeper/state_handler_test.go | 194 +++++++++++++++++++++++++++++++++++ types/payload.go | 36 ++++--- 3 files changed, 220 insertions(+), 14 deletions(-) create mode 100644 keeper/state_handler_test.go diff --git a/keeper/state_handler.go b/keeper/state_handler.go index 0ad3d27a..95b68a8a 100644 --- a/keeper/state_handler.go +++ b/keeper/state_handler.go @@ -38,6 +38,10 @@ func (k *Keeper) AcceptPayload( ctx context.Context, payload *orbitertypes.PendingPayload, ) ([]byte, error) { + if err := payload.Validate(); err != nil { + return nil, errorsmod.Wrap(err, "invalid pending payload") + } + hash, err := payload.Keccak256Hash() if err != nil { return nil, err diff --git a/keeper/state_handler_test.go b/keeper/state_handler_test.go new file mode 100644 index 00000000..002ea018 --- /dev/null +++ b/keeper/state_handler_test.go @@ -0,0 +1,194 @@ +package keeper_test + +import ( + "context" + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/noble-assets/orbiter/testutil" + orbitertypes "github.com/noble-assets/orbiter/types" + "github.com/noble-assets/orbiter/types/controller/forwarding" + "github.com/stretchr/testify/require" + "testing" + + mockorbiter "github.com/noble-assets/orbiter/testutil/mocks/orbiter" + "github.com/noble-assets/orbiter/types/core" +) + +func TestAcceptPayload(t *testing.T) { + t.Parallel() + + validPayload := createTestPendingPayloadWithSequence(t, 0) + + expHash, err := validPayload.Keccak256Hash() + require.NoError(t, err, "failed to hash payload") + + testcases := []struct { + name string + payload *orbitertypes.PendingPayload + errContains string + expHash []byte + }{ + { + name: "success - valid payload", + payload: validPayload, + expHash: expHash.Bytes(), + }, + { + name: "error - nil pending payload", + payload: nil, + errContains: "invalid pending payload: pending payload: invalid nil pointer", + }, + { + name: "error - invalid (empty) pending payload", + payload: &orbitertypes.PendingPayload{}, + errContains: "invalid pending payload: payload is not set", + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ctx, _, k := mockorbiter.OrbiterKeeper(t) + hash, err := k.AcceptPayload(ctx, tc.payload) + + if tc.errContains == "" { + require.NoError(t, err, "failed to accept payload") + require.Equal(t, tc.expHash, hash) + } else { + require.ErrorContains(t, err, tc.errContains, "expected different error") + } + }) + } +} + +func TestGetPendingPayloadWithHash(t *testing.T) { + t.Parallel() + + validPayload := createTestPendingPayloadWithSequence(t, 0) + expHash, err := validPayload.Keccak256Hash() + require.NoError(t, err, "failed to hash payload") + + testcases := []struct { + name string + setup func(*testing.T, context.Context, orbitertypes.HyperlaneStateHandler) + hash []byte + expPayload *orbitertypes.PendingPayload + errContains string + }{ + { + name: "success - hash found", + setup: func(t *testing.T, ctx context.Context, handler orbitertypes.HyperlaneStateHandler) { + t.Helper() + + _, err := handler.AcceptPayload(ctx, validPayload) + require.NoError(t, err) + }, + expPayload: validPayload, + hash: expHash.Bytes(), + }, + { + name: "error - hash not found", + setup: nil, + expPayload: validPayload, + errContains: "pending payload not found", + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ctx, _, k := mockorbiter.OrbiterKeeper(t) + + if tc.setup != nil { + tc.setup(t, ctx, k) + } + + got, err := k.GetPendingPayloadWithHash(ctx, tc.hash) + + if tc.errContains == "" { + require.NoError(t, err, "failed to get pending payload") + require.Equal(t, tc.expPayload.String(), got.String(), "expected different payload") + } else { + require.ErrorContains(t, err, tc.errContains, "expected different error") + } + }) + } +} + +// TestSubsequentSubmissions asserts that two subsequently submitted +// identical orbiter payloads generate different hashes so that they can +// be uniquely identified. +func TestSubsequentSubmissions(t *testing.T) { + ctx, _, k := mockorbiter.OrbiterKeeper(t) + + validPayload := createTestPendingPayloadWithSequence(t, 0) + expHash, err := validPayload.Keccak256Hash() + require.NoError(t, err, "failed to hash payload") + + // ACT: submit first payload + res, err := k.SubmitPayload(ctx, &orbitertypes.MsgSubmitPayload{ + Signer: testutil.NewNobleAddress(), + Payload: *validPayload.Payload, + }) + require.NoError(t, err, "failed to submit payload") + + // ASSERT: expected hash is returned + gotHash := ethcommon.BytesToHash(res.Hash) + require.Equal(t, expHash.String(), gotHash.String(), "expected different hash") + + // ACT: submit identical payload again + res2, err := k.SubmitPayload(ctx, &orbitertypes.MsgSubmitPayload{ + Signer: testutil.NewNobleAddress(), + Payload: *validPayload.Payload, + }) + require.NoError(t, err, "failed to submit payload") + + validPayload.Sequence = uint64(1) + expHash2, err := validPayload.Keccak256Hash() + require.NoError(t, err, "failed to hash payload") + + // ASSERT: expected hash is returned + gotHash2 := ethcommon.BytesToHash(res2.Hash) + require.Equal(t, expHash2.String(), gotHash2.String(), "expected different hash") + + // ASSERT: hashes of subsequent submissions of the same payload are different + require.NotEqual(t, gotHash.String(), gotHash2.String(), "expected different hashes") +} + +func TestDifferentSequenceGeneratesDifferentHash(t *testing.T) { + // ACT: Generate pending payload with sequence 1 + validForwarding := createTestPendingPayloadWithSequence(t, 1) + expHash, err := validForwarding.Keccak256Hash() + require.NoError(t, err, "failed to hash payload") + + // ACT: Generate pending payload with sequence 2 + validForwarding2 := createTestPendingPayloadWithSequence(t, 1) + expHash2, err := validForwarding2.Keccak256Hash() + require.NoError(t, err, "failed to hash payload") + + // ASSERT: hash 1 and hash 2 are NOT equal + require.NotEqual(t, expHash.String(), expHash2.String(), "expected different hash") +} + +func createTestPendingPayloadWithSequence(t *testing.T, sequence uint64) *orbitertypes.PendingPayload { + t.Helper() + + validForwarding, err := forwarding.NewCCTPForwarding( + 0, + testutil.RandomBytes(32), + testutil.RandomBytes(32), + nil, + ) + require.NoError(t, err, "failed to create valid forwarding") + + validPayload := &core.Payload{ + PreActions: nil, + Forwarding: validForwarding, + } + + return &orbitertypes.PendingPayload{ + Sequence: sequence, + Payload: validPayload, + } +} diff --git a/types/payload.go b/types/payload.go index 4115440a..e5a3a670 100644 --- a/types/payload.go +++ b/types/payload.go @@ -21,10 +21,9 @@ package types import ( - "encoding/json" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" + "github.com/noble-assets/orbiter/types/core" "cosmossdk.io/collections/codec" ) @@ -32,7 +31,7 @@ import ( // Keccak256Hash returns the keccak 256 hash of the payload contents. // To guarantee uniqueness the sequence number is included. func (p *PendingPayload) Keccak256Hash() (common.Hash, error) { - bz, err := json.Marshal(p) + bz, err := p.Marshal() if err != nil { return common.Hash{}, err } @@ -40,6 +39,15 @@ func (p *PendingPayload) Keccak256Hash() (common.Hash, error) { return crypto.Keccak256Hash(bz), nil } +// Validate checks that the pending payload contents are valid. +func (p *PendingPayload) Validate() error { + if p == nil { + return core.ErrNilPointer.Wrap("pending payload") + } + + return p.Payload.Validate() +} + // TODO: check if this is required? var _ codec.ValueCodec[PendingPayload] = &PendingPayloadCollValue{} @@ -49,30 +57,30 @@ type PendingPayloadCollValue struct{} // TODO: this could use e.g. `abi` encoding to be aligned with Ethereum? func (v *PendingPayloadCollValue) Encode(p PendingPayload) ([]byte, error) { - panic("implement me") + return p.Marshal() } func (v *PendingPayloadCollValue) Decode(data []byte) (PendingPayload, error) { - panic("implement me") + var p PendingPayload + if err := (&p).Unmarshal(data); err != nil { + return PendingPayload{}, err + } + + return p, nil } func (v *PendingPayloadCollValue) EncodeJSON(payload PendingPayload) ([]byte, error) { - return json.Marshal(payload) + panic("implement me (EncodeJSON)") } func (v *PendingPayloadCollValue) DecodeJSON(data []byte) (PendingPayload, error) { - var payload PendingPayload - if err := json.Unmarshal(data, &payload); err != nil { - return PendingPayload{}, err - } - - return payload, nil + panic("implement me (DecodeJSON)") } func (v *PendingPayloadCollValue) Stringify(_ PendingPayload) string { - panic("implement me") + panic("implement me (Stringify)") } func (v *PendingPayloadCollValue) ValueType() string { - panic("implement me") + return "noble/orbiter/v1/PendingPayload" } From 9070a026f0fb9917806d010a5c39b3f4079ccde2 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 2 Oct 2025 10:12:40 +0200 Subject: [PATCH 17/34] add complete payload tests --- keeper/state_handler.go | 6 ++ keeper/state_handler_test.go | 103 ++++++++++++++++++++++++++++-- testutil/mocks/orbiter/orbiter.go | 6 +- types/payload.go | 3 +- 4 files changed, 109 insertions(+), 9 deletions(-) diff --git a/keeper/state_handler.go b/keeper/state_handler.go index 95b68a8a..9147dc82 100644 --- a/keeper/state_handler.go +++ b/keeper/state_handler.go @@ -76,6 +76,12 @@ func (k *Keeper) GetPendingPayloadWithHash( return nil, errorsmod.Wrap(err, "pending payload not found") } + k.Logger().Debug( + "retrieved pending payload", + "hash", hex.EncodeToString(hash), + "payload", payload.String(), + ) + return &payload, nil } diff --git a/keeper/state_handler_test.go b/keeper/state_handler_test.go index 002ea018..e687dd0b 100644 --- a/keeper/state_handler_test.go +++ b/keeper/state_handler_test.go @@ -1,15 +1,36 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 ( "context" + "testing" + ethcommon "github.com/ethereum/go-ethereum/common" - "github.com/noble-assets/orbiter/testutil" - orbitertypes "github.com/noble-assets/orbiter/types" - "github.com/noble-assets/orbiter/types/controller/forwarding" "github.com/stretchr/testify/require" - "testing" + "github.com/noble-assets/orbiter/testutil" mockorbiter "github.com/noble-assets/orbiter/testutil/mocks/orbiter" + orbitertypes "github.com/noble-assets/orbiter/types" + "github.com/noble-assets/orbiter/types/controller/forwarding" "github.com/noble-assets/orbiter/types/core" ) @@ -116,6 +137,73 @@ func TestGetPendingPayloadWithHash(t *testing.T) { } } +func TestCompletePayload(t *testing.T) { + t.Parallel() + + validPayload := createTestPendingPayloadWithSequence(t, 0) + expHash, err := validPayload.Keccak256Hash() + require.NoError(t, err, "failed to hash payload") + + testcases := []struct { + name string + setup func(*testing.T, context.Context, orbitertypes.HyperlaneStateHandler) + hash []byte + errContains string + }{ + { + name: "success - valid payload", + setup: func(t *testing.T, ctx context.Context, handler orbitertypes.HyperlaneStateHandler) { + t.Helper() + _, err := handler.AcceptPayload(ctx, validPayload) + require.NoError(t, err, "failed to setup testcase; accepting payload") + + gotPayload, err := handler.GetPendingPayloadWithHash(ctx, expHash.Bytes()) + require.NoError(t, err, "error getting pending payload") + require.Equal( + t, + validPayload.String(), + gotPayload.String(), + "expected different payload", + ) + }, + hash: expHash.Bytes(), + }, + { + name: "no-op - valid payload but not found in store", + setup: nil, + hash: expHash.Bytes(), + }, + { + name: "no-op - nil hash", + setup: nil, + hash: nil, + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ctx, _, k := mockorbiter.OrbiterKeeper(t) + + if tc.setup != nil { + tc.setup(t, ctx, k) + } + + err = k.CompletePayloadWithHash(ctx, tc.hash) + if tc.errContains == "" { + require.NoError(t, err, "failed to complete payload") + + gotPayload, err := k.GetPendingPayloadWithHash(ctx, tc.hash) + require.Error(t, err, "payload should not be present anymore") + require.Nil(t, gotPayload, "expected nil payload") + } else { + require.ErrorContains(t, err, tc.errContains, "expected different error") + } + }) + } +} + // TestSubsequentSubmissions asserts that two subsequently submitted // identical orbiter payloads generate different hashes so that they can // be uniquely identified. @@ -171,7 +259,12 @@ func TestDifferentSequenceGeneratesDifferentHash(t *testing.T) { require.NotEqual(t, expHash.String(), expHash2.String(), "expected different hash") } -func createTestPendingPayloadWithSequence(t *testing.T, sequence uint64) *orbitertypes.PendingPayload { +// createTestPendingPayloadWithSequence creates a new example payload that can be submitted +// to the state handler. +func createTestPendingPayloadWithSequence( + t *testing.T, + sequence uint64, +) *orbitertypes.PendingPayload { t.Helper() validForwarding, err := forwarding.NewCCTPForwarding( diff --git a/testutil/mocks/orbiter/orbiter.go b/testutil/mocks/orbiter/orbiter.go index f617fa38..a349f24a 100644 --- a/testutil/mocks/orbiter/orbiter.go +++ b/testutil/mocks/orbiter/orbiter.go @@ -36,10 +36,10 @@ func OrbiterKeeper(tb testing.TB) (sdk.Context, *mocks.Mocks, *keeper.Keeper) { tb.Helper() deps := mocks.NewDependencies(tb) - mocks := mocks.NewMocks(deps) - k, ctx := orbiterKeeperWithMocks(&deps, &mocks) + m := mocks.NewMocks(deps) + k, ctx := orbiterKeeperWithMocks(&deps, &m) - return ctx, &mocks, k + return ctx, &m, k } func orbiterKeeperWithMocks( diff --git a/types/payload.go b/types/payload.go index e5a3a670..e5bbb30f 100644 --- a/types/payload.go +++ b/types/payload.go @@ -23,9 +23,10 @@ package types import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/noble-assets/orbiter/types/core" "cosmossdk.io/collections/codec" + + "github.com/noble-assets/orbiter/types/core" ) // Keccak256Hash returns the keccak 256 hash of the payload contents. From e15bdd741b751144140dab32853788c7a09ff5a1 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 2 Oct 2025 10:36:40 +0200 Subject: [PATCH 18/34] address some comments from stefano --- contracts/README.md | 8 ++++---- contracts/foundry.toml | 6 +++++- contracts/src/OrbiterGateway.sol | 6 ++++++ contracts/src/OrbiterTransientStorage.sol | 16 +++++++++++----- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/contracts/README.md b/contracts/README.md index ab28519b..12161e91 100644 --- a/contracts/README.md +++ b/contracts/README.md @@ -7,14 +7,14 @@ through smart contracts on an EVM chain. To use this repository, you need the following software installed: -- `bun` -- `foundry` +- [`bun`](https://bun.sh) +- [`foundry`](https://getfoundry.sh) ## Dependencies To download the required dependencies, run: -```shell +```sh make deps ``` @@ -22,7 +22,7 @@ make deps To compile the contracts, run: -```shell +```sh make compile ``` diff --git a/contracts/foundry.toml b/contracts/foundry.toml index f0dd6c9e..6df7750a 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -3,6 +3,10 @@ src = "src" out = "out" libs = ["node_modules"] auto_detect_remappings = false -remappings = ["forge-std=node_modules/forge-std/src", "@hyperlane=node_modules/@hyperlane-xyz/core/contracts", "@openzeppelin=node_modules/@openzeppelin"] +remappings = [ + "forge-std=node_modules/forge-std/src", + "@hyperlane=node_modules/@hyperlane-xyz/core/contracts", + "@openzeppelin=node_modules/@openzeppelin" +] # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options \ No newline at end of file diff --git a/contracts/src/OrbiterGateway.sol b/contracts/src/OrbiterGateway.sol index e132ebe7..b622f27d 100644 --- a/contracts/src/OrbiterGateway.sol +++ b/contracts/src/OrbiterGateway.sol @@ -31,6 +31,12 @@ import { OrbiterHypERC20 } from "./OrbiterHypERC20.sol"; /// /// TODO: make upgradeable contract OrbiterGateway { + uint32 private destinationDomain; + + function constructor(uint32 _domain) { + destinationDomain = _domain; + } + /// @notice Send an asset transfer to the Orbiter, that should be forwarded to another Hyperlane domain. /// @param tokenAddress Address of the token to forward using Orbiter. /// @param destinationDomain The destination domain of the Noble chain (where the Orbiter lives). diff --git a/contracts/src/OrbiterTransientStorage.sol b/contracts/src/OrbiterTransientStorage.sol index 58bdf0b7..d22a4574 100644 --- a/contracts/src/OrbiterTransientStorage.sol +++ b/contracts/src/OrbiterTransientStorage.sol @@ -17,19 +17,25 @@ */ pragma solidity ^0.8.28; -import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; - /// @title Orbiter Transient Storage /// @author Noble Core Team /// @notice Holds pending payload hashes of transfers that should be executed /// through the Orbiter. -contract OrbiterTransientStorage is Ownable { +contract OrbiterTransientStorage { + address private owner; bytes32 transient private pendingPayloadHash; + + /// @notice Throws if called by any account other than the owner. + modifier onlyOwner() { + require(msg.sender == owner, "caller is not the owner"); + _; + } + /// @notice Initializes the contract by setting the owner to be the Orbiter gateway contract. /// @param _gateway The address of the associated Orbiter gateway contract, which is set as the owner. - constructor(address _gateway) Ownable() { - transferOwnership(_gateway); + constructor(address _gateway) { + owner = _gateway; } /// @notice Retrieves the currently pending payload hash. From 6443097b2fa3c110c100cbe64b57fc801d2fe3b9 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 2 Oct 2025 13:53:27 +0200 Subject: [PATCH 19/34] some more adjustments and todos --- controller/adapter/hyperlane.go | 6 ++--- controller/forwarding/hyperlane.go | 2 ++ depinject.go | 1 + keeper/keeper.go | 8 +++--- keeper/state_handler.go | 13 ++++------ keeper/state_handler_test.go | 16 ++++++------ types/expected_keepers.go | 10 ++++---- types/payload.go | 39 ------------------------------ 8 files changed, 27 insertions(+), 68 deletions(-) diff --git a/controller/adapter/hyperlane.go b/controller/adapter/hyperlane.go index d66697c4..8c55d967 100644 --- a/controller/adapter/hyperlane.go +++ b/controller/adapter/hyperlane.go @@ -42,13 +42,13 @@ type HyperlaneAdapter struct { logger log.Logger - stateHandler orbitertypes.HyperlaneStateHandler + stateHandler orbitertypes.PendingPayloadsHandler } // NewHyperlaneAdapter returns a reference to a new HyperlaneAdapter instance. func NewHyperlaneAdapter( logger log.Logger, - orbiterStateHandler orbitertypes.HyperlaneStateHandler, + orbiterStateHandler orbitertypes.PendingPayloadsHandler, ) (*HyperlaneAdapter, error) { if logger == nil { return nil, core.ErrNilPointer.Wrap("logger cannot be nil") @@ -82,7 +82,7 @@ func (h *HyperlaneAdapter) ParsePayload( return false, nil, errorsmod.Wrap(err, "failed to parse payload") } - pendingPayload, err := h.stateHandler.GetPendingPayloadWithHash(ctx, payloadHash) + pendingPayload, err := h.stateHandler.PendingPayload(ctx, payloadHash) if err != nil { return false, nil, errorsmod.Wrap(err, "failed to get pending payload") } diff --git a/controller/forwarding/hyperlane.go b/controller/forwarding/hyperlane.go index 303a2a86..58bd0e97 100644 --- a/controller/forwarding/hyperlane.go +++ b/controller/forwarding/hyperlane.go @@ -40,6 +40,8 @@ import ( var _ types.ForwardingController = &HyperlaneController{} // HyperlaneController is the forwarding controller for the Hyperlane protocol. +// +// TODO: implement hyperlane interfaces here instead of the main keeper type HyperlaneController struct { *controller.BaseController[core.ProtocolID] diff --git a/depinject.go b/depinject.go index ba0b9e99..159b0dbe 100644 --- a/depinject.go +++ b/depinject.go @@ -124,6 +124,7 @@ func InjectForwardingControllers(in ComponentsInputs) { panic(errorsmod.Wrap(err, "error creating CCTP controller")) } + // TODO: pass hyperlane core and warp dependencies here instead of to the main keeper hyperlane, err := forwardingctrl.NewHyperlaneController( in.Orbiters.Forwarder().Logger(), forwardingtypes.NewHyperlaneHandler( diff --git a/keeper/keeper.go b/keeper/keeper.go index b2444bc7..7a6e9e72 100644 --- a/keeper/keeper.go +++ b/keeper/keeper.go @@ -48,8 +48,8 @@ var ( _ orbitertypes.MsgServer = &Keeper{} // Hyperlane interface compliance. - _ hyperlaneutil.HyperlaneApp = &Keeper{} - _ orbitertypes.HyperlaneStateHandler = &Keeper{} + _ hyperlaneutil.HyperlaneApp = &Keeper{} + _ orbitertypes.PendingPayloadsHandler = &Keeper{} ) // Keeper is the main module keeper. @@ -112,9 +112,7 @@ func NewKeeper( core.PendingPayloadsPrefix, core.PendingPayloadsName, collections.BytesKey, - //// TODO: why does CollValue not work for the proto type PendingPayload? - // codec.CollValue[&orbitertypes.PendingPayload{}], - &orbitertypes.PendingPayloadCollValue{}, + codec.CollValue[orbitertypes.PendingPayload](cdc), ), hyperlaneCoreKeeper: coreKeeper, diff --git a/keeper/state_handler.go b/keeper/state_handler.go index 9147dc82..6fdccc45 100644 --- a/keeper/state_handler.go +++ b/keeper/state_handler.go @@ -30,7 +30,7 @@ import ( orbitertypes "github.com/noble-assets/orbiter/types" ) -var _ orbitertypes.HyperlaneStateHandler = &Keeper{} +var _ orbitertypes.PendingPayloadsHandler = &Keeper{} // AcceptPayload adds a new pending payload into the module storage. // If the payload's hash is already set, an error is returned. @@ -63,11 +63,11 @@ func (k *Keeper) AcceptPayload( return hash.Bytes(), k.pendingPayloads.Set(ctx, hash.Bytes(), *payload) } -// GetPendingPayloadWithHash returns the pending payload with the given hash +// PendingPayload returns the pending payload with the given hash // if it is found in the module storage. // // TODO: move into own abstraction type (Hyperlane state handler or smth.?) -func (k *Keeper) GetPendingPayloadWithHash( +func (k *Keeper) PendingPayload( ctx context.Context, hash []byte, ) (*orbitertypes.PendingPayload, error) { @@ -85,12 +85,9 @@ func (k *Keeper) GetPendingPayloadWithHash( return &payload, nil } -// CompletePayloadWithHash removes the pending payload from the module state. +// RemovePendingPayload removes the pending payload from the module state. // If a payload is not found, it is a no-op but does not return an error. -// -// TODO: probably this needs to have more fields other than just the payload like the sender and -// origin account. -func (k *Keeper) CompletePayloadWithHash( +func (k *Keeper) RemovePendingPayload( ctx context.Context, hash []byte, ) error { diff --git a/keeper/state_handler_test.go b/keeper/state_handler_test.go index e687dd0b..5db5f2dc 100644 --- a/keeper/state_handler_test.go +++ b/keeper/state_handler_test.go @@ -91,14 +91,14 @@ func TestGetPendingPayloadWithHash(t *testing.T) { testcases := []struct { name string - setup func(*testing.T, context.Context, orbitertypes.HyperlaneStateHandler) + setup func(*testing.T, context.Context, orbitertypes.PendingPayloadsHandler) hash []byte expPayload *orbitertypes.PendingPayload errContains string }{ { name: "success - hash found", - setup: func(t *testing.T, ctx context.Context, handler orbitertypes.HyperlaneStateHandler) { + setup: func(t *testing.T, ctx context.Context, handler orbitertypes.PendingPayloadsHandler) { t.Helper() _, err := handler.AcceptPayload(ctx, validPayload) @@ -125,7 +125,7 @@ func TestGetPendingPayloadWithHash(t *testing.T) { tc.setup(t, ctx, k) } - got, err := k.GetPendingPayloadWithHash(ctx, tc.hash) + got, err := k.PendingPayload(ctx, tc.hash) if tc.errContains == "" { require.NoError(t, err, "failed to get pending payload") @@ -146,18 +146,18 @@ func TestCompletePayload(t *testing.T) { testcases := []struct { name string - setup func(*testing.T, context.Context, orbitertypes.HyperlaneStateHandler) + setup func(*testing.T, context.Context, orbitertypes.PendingPayloadsHandler) hash []byte errContains string }{ { name: "success - valid payload", - setup: func(t *testing.T, ctx context.Context, handler orbitertypes.HyperlaneStateHandler) { + setup: func(t *testing.T, ctx context.Context, handler orbitertypes.PendingPayloadsHandler) { t.Helper() _, err := handler.AcceptPayload(ctx, validPayload) require.NoError(t, err, "failed to setup testcase; accepting payload") - gotPayload, err := handler.GetPendingPayloadWithHash(ctx, expHash.Bytes()) + gotPayload, err := handler.PendingPayload(ctx, expHash.Bytes()) require.NoError(t, err, "error getting pending payload") require.Equal( t, @@ -190,11 +190,11 @@ func TestCompletePayload(t *testing.T) { tc.setup(t, ctx, k) } - err = k.CompletePayloadWithHash(ctx, tc.hash) + err = k.RemovePendingPayload(ctx, tc.hash) if tc.errContains == "" { require.NoError(t, err, "failed to complete payload") - gotPayload, err := k.GetPendingPayloadWithHash(ctx, tc.hash) + gotPayload, err := k.PendingPayload(ctx, tc.hash) require.Error(t, err, "payload should not be present anymore") require.Nil(t, gotPayload, "expected nil payload") } else { diff --git a/types/expected_keepers.go b/types/expected_keepers.go index e3786f72..0fe3de19 100644 --- a/types/expected_keepers.go +++ b/types/expected_keepers.go @@ -71,10 +71,10 @@ type HyperlaneWarpKeeper interface { ) error } -// HyperlaneStateHandler defines the interface to adjust and query the Orbiter module -// state as it relates to Hyperlane bookkeeping. -type HyperlaneStateHandler interface { +// PendingPayloadsHandler defines the interface to adjust and query the Orbiter module +// state as it relates to the bookkeeping of pending payloads. +type PendingPayloadsHandler interface { AcceptPayload(ctx context.Context, payload *PendingPayload) ([]byte, error) - CompletePayloadWithHash(ctx context.Context, hash []byte) error - GetPendingPayloadWithHash(ctx context.Context, hash []byte) (*PendingPayload, error) + RemovePendingPayload(ctx context.Context, hash []byte) error + PendingPayload(ctx context.Context, hash []byte) (*PendingPayload, error) } diff --git a/types/payload.go b/types/payload.go index e5bbb30f..b0987263 100644 --- a/types/payload.go +++ b/types/payload.go @@ -24,8 +24,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "cosmossdk.io/collections/codec" - "github.com/noble-assets/orbiter/types/core" ) @@ -48,40 +46,3 @@ func (p *PendingPayload) Validate() error { return p.Payload.Validate() } - -// TODO: check if this is required? -var _ codec.ValueCodec[PendingPayload] = &PendingPayloadCollValue{} - -// PendingPayloadCollValue implements the ValueCodec interface so that PendingPayload -// can be used with collections maps. -type PendingPayloadCollValue struct{} - -// TODO: this could use e.g. `abi` encoding to be aligned with Ethereum? -func (v *PendingPayloadCollValue) Encode(p PendingPayload) ([]byte, error) { - return p.Marshal() -} - -func (v *PendingPayloadCollValue) Decode(data []byte) (PendingPayload, error) { - var p PendingPayload - if err := (&p).Unmarshal(data); err != nil { - return PendingPayload{}, err - } - - return p, nil -} - -func (v *PendingPayloadCollValue) EncodeJSON(payload PendingPayload) ([]byte, error) { - panic("implement me (EncodeJSON)") -} - -func (v *PendingPayloadCollValue) DecodeJSON(data []byte) (PendingPayload, error) { - panic("implement me (DecodeJSON)") -} - -func (v *PendingPayloadCollValue) Stringify(_ PendingPayload) string { - panic("implement me (Stringify)") -} - -func (v *PendingPayloadCollValue) ValueType() string { - return "noble/orbiter/v1/PendingPayload" -} From 93096d180a9d831125265e9add6853120123e378 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 2 Oct 2025 14:16:43 +0200 Subject: [PATCH 20/34] address more review comments --- keeper/keeper.go | 8 +++++--- keeper/msg_server.go | 15 +------------- keeper/state_handler.go | 19 ++++++++++++++---- keeper/state_handler_test.go | 39 ++++++++++++++++++++++++++++-------- types/core/keys.go | 2 +- types/expected_keepers.go | 4 +++- types/parser.go | 2 -- 7 files changed, 56 insertions(+), 33 deletions(-) diff --git a/keeper/keeper.go b/keeper/keeper.go index 7a6e9e72..355eedd6 100644 --- a/keeper/keeper.go +++ b/keeper/keeper.go @@ -69,9 +69,11 @@ type Keeper struct { // pendingPayloads stores the pending payloads addressed by their keccak256 hash. pendingPayloads collections.Map[[]byte, orbitertypes.PendingPayload] - // pendingPayloadsSequence is the unique identifier of a given pending payload handled by the + // PendingPayloadsSequence is the unique identifier of a given pending payload handled by the // orbiter. - pendingPayloadsSequence collections.Sequence + // + // TODO: this is only exported to be able to set the sequence in tests -- make private again? + PendingPayloadsSequence collections.Sequence // Hyperlane dependencies hyperlaneCoreKeeper orbitertypes.HyperlaneCoreKeeper @@ -102,7 +104,7 @@ func NewKeeper( logger: logger.With("module", fmt.Sprintf("x/%s", core.ModuleName)), authority: authority, - pendingPayloadsSequence: collections.NewSequence( + PendingPayloadsSequence: collections.NewSequence( sb, core.PendingPayloadsSequencePrefix, core.PendingPayloadsSequenceName, diff --git a/keeper/msg_server.go b/keeper/msg_server.go index 7c3849f6..7f8b3839 100644 --- a/keeper/msg_server.go +++ b/keeper/msg_server.go @@ -33,26 +33,13 @@ func (k *Keeper) SubmitPayload( ctx context.Context, req *orbitertypes.MsgSubmitPayload, ) (*orbitertypes.MsgSubmitPayloadResponse, error) { - if req == nil { - return nil, sdkerrors.ErrInvalidRequest - } - if err := req.Payload.Validate(); err != nil { return nil, sdkerrors.ErrInvalidRequest.Wrap(err.Error()) } - // TODO: move this into the internal method? - seq, err := k.pendingPayloadsSequence.Next(ctx) - if err != nil { - return nil, errorsmod.Wrap(err, "failed to obtain sequence number") - } - payloadHash, err := k.AcceptPayload( ctx, - &orbitertypes.PendingPayload{ - Sequence: seq, - Payload: &req.Payload, - }, + &req.Payload, ) if err != nil { return nil, errorsmod.Wrap(err, "failed to accept payload") diff --git a/keeper/state_handler.go b/keeper/state_handler.go index 6fdccc45..a141abf9 100644 --- a/keeper/state_handler.go +++ b/keeper/state_handler.go @@ -28,6 +28,7 @@ import ( errorsmod "cosmossdk.io/errors" orbitertypes "github.com/noble-assets/orbiter/types" + "github.com/noble-assets/orbiter/types/core" ) var _ orbitertypes.PendingPayloadsHandler = &Keeper{} @@ -36,13 +37,23 @@ var _ orbitertypes.PendingPayloadsHandler = &Keeper{} // If the payload's hash is already set, an error is returned. func (k *Keeper) AcceptPayload( ctx context.Context, - payload *orbitertypes.PendingPayload, + payload *core.Payload, ) ([]byte, error) { if err := payload.Validate(); err != nil { - return nil, errorsmod.Wrap(err, "invalid pending payload") + return nil, errorsmod.Wrap(err, "invalid payload") } - hash, err := payload.Keccak256Hash() + next, err := k.PendingPayloadsSequence.Next(ctx) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to get next sequence number") + } + + pendingPayload := orbitertypes.PendingPayload{ + Sequence: next, + Payload: payload, + } + + hash, err := pendingPayload.Keccak256Hash() if err != nil { return nil, err } @@ -60,7 +71,7 @@ func (k *Keeper) AcceptPayload( k.Logger().Debug("payload hash registered", "hash", hash.String(), "payload", payload.String()) - return hash.Bytes(), k.pendingPayloads.Set(ctx, hash.Bytes(), *payload) + return hash.Bytes(), k.pendingPayloads.Set(ctx, hash.Bytes(), pendingPayload) } // PendingPayload returns the pending payload with the given hash diff --git a/keeper/state_handler_test.go b/keeper/state_handler_test.go index 5db5f2dc..b80c2c4b 100644 --- a/keeper/state_handler_test.go +++ b/keeper/state_handler_test.go @@ -27,6 +27,7 @@ import ( ethcommon "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" + orbiterkeeper "github.com/noble-assets/orbiter/keeper" "github.com/noble-assets/orbiter/testutil" mockorbiter "github.com/noble-assets/orbiter/testutil/mocks/orbiter" orbitertypes "github.com/noble-assets/orbiter/types" @@ -44,6 +45,7 @@ func TestAcceptPayload(t *testing.T) { testcases := []struct { name string + setup func(*testing.T, context.Context, *orbiterkeeper.Keeper) payload *orbitertypes.PendingPayload errContains string expHash []byte @@ -54,14 +56,30 @@ func TestAcceptPayload(t *testing.T) { expHash: expHash.Bytes(), }, { - name: "error - nil pending payload", - payload: nil, - errContains: "invalid pending payload: pending payload: invalid nil pointer", + name: "error - payload already registered", + setup: func(t *testing.T, ctx context.Context, k *orbiterkeeper.Keeper) { + t.Helper() + + _, err := k.AcceptPayload(ctx, validPayload.Payload) + require.NoError(t, err, "failed to accept payload during setup") + + // NOTE: we're resetting the pending payloads sequence to generate the same hash for + // the next submission + err = k.PendingPayloadsSequence.Set(ctx, 0) + require.NoError(t, err, "failed to set pending payloads sequence") + }, + payload: validPayload, + errContains: "already registered", }, { - name: "error - invalid (empty) pending payload", + name: "error - nil payload", payload: &orbitertypes.PendingPayload{}, - errContains: "invalid pending payload: payload is not set", + errContains: "invalid payload: payload is not set", + }, + { + name: "error - invalid (empty) payload", + payload: &orbitertypes.PendingPayload{Payload: &core.Payload{}}, + errContains: "invalid payload: forwarding is not set", }, } @@ -70,7 +88,12 @@ func TestAcceptPayload(t *testing.T) { t.Parallel() ctx, _, k := mockorbiter.OrbiterKeeper(t) - hash, err := k.AcceptPayload(ctx, tc.payload) + + if tc.setup != nil { + tc.setup(t, ctx, k) + } + + hash, err := k.AcceptPayload(ctx, tc.payload.Payload) if tc.errContains == "" { require.NoError(t, err, "failed to accept payload") @@ -101,7 +124,7 @@ func TestGetPendingPayloadWithHash(t *testing.T) { setup: func(t *testing.T, ctx context.Context, handler orbitertypes.PendingPayloadsHandler) { t.Helper() - _, err := handler.AcceptPayload(ctx, validPayload) + _, err := handler.AcceptPayload(ctx, validPayload.Payload) require.NoError(t, err) }, expPayload: validPayload, @@ -154,7 +177,7 @@ func TestCompletePayload(t *testing.T) { name: "success - valid payload", setup: func(t *testing.T, ctx context.Context, handler orbitertypes.PendingPayloadsHandler) { t.Helper() - _, err := handler.AcceptPayload(ctx, validPayload) + _, err := handler.AcceptPayload(ctx, validPayload.Payload) require.NoError(t, err, "failed to setup testcase; accepting payload") gotPayload, err := handler.PendingPayload(ctx, expHash.Bytes()) diff --git a/types/core/keys.go b/types/core/keys.go index a3c6a697..404d7ce4 100644 --- a/types/core/keys.go +++ b/types/core/keys.go @@ -116,7 +116,7 @@ var OrbiterPrefix = ModuleName var AdapterParamsPrefix = collections.NewPrefix(40) // ==================================================================================================== -// Pending Orbiter Payloads +// Keeper // ====================================================================================================. const ( diff --git a/types/expected_keepers.go b/types/expected_keepers.go index 0fe3de19..9b0a2537 100644 --- a/types/expected_keepers.go +++ b/types/expected_keepers.go @@ -26,6 +26,8 @@ import ( hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/noble-assets/orbiter/types/core" ) // BankKeeper wraps the bank behaviors expected by the orbiter @@ -74,7 +76,7 @@ type HyperlaneWarpKeeper interface { // PendingPayloadsHandler defines the interface to adjust and query the Orbiter module // state as it relates to the bookkeeping of pending payloads. type PendingPayloadsHandler interface { - AcceptPayload(ctx context.Context, payload *PendingPayload) ([]byte, error) + AcceptPayload(ctx context.Context, payload *core.Payload) ([]byte, error) RemovePendingPayload(ctx context.Context, hash []byte) error PendingPayload(ctx context.Context, hash []byte) (*PendingPayload, error) } diff --git a/types/parser.go b/types/parser.go index 85995390..9c131626 100644 --- a/types/parser.go +++ b/types/parser.go @@ -33,7 +33,5 @@ type PayloadParser interface { // orbiter payload. It returns a boolean to inform if // the bytes represent an orbiter payload or not. The // parsing is executed only if the boolean is true. - // - // TODO: had to pass context here; remove again?? ParsePayload(context.Context, core.ProtocolID, []byte) (bool, *core.Payload, error) } From a1975b3787732430501b35d44f608a377d8e0426 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 2 Oct 2025 15:29:59 +0200 Subject: [PATCH 21/34] add stateful validation of payloads --- keeper/state_handler.go | 55 +++++++++++++++++- keeper/state_handler_test.go | 104 ++++++++++++++++++++++++++++++----- 2 files changed, 145 insertions(+), 14 deletions(-) diff --git a/keeper/state_handler.go b/keeper/state_handler.go index a141abf9..2ed5e4aa 100644 --- a/keeper/state_handler.go +++ b/keeper/state_handler.go @@ -24,6 +24,7 @@ import ( "context" "encoding/hex" "errors" + "fmt" errorsmod "cosmossdk.io/errors" @@ -43,6 +44,10 @@ func (k *Keeper) AcceptPayload( return nil, errorsmod.Wrap(err, "invalid payload") } + if err := k.validatePayloadAgainstState(ctx, payload); err != nil { + return nil, errorsmod.Wrap(err, "payload failed stateful checks") + } + next, err := k.PendingPayloadsSequence.Next(ctx) if err != nil { return nil, errorsmod.Wrap(err, "failed to get next sequence number") @@ -69,11 +74,59 @@ func (k *Keeper) AcceptPayload( return nil, errors.New("payload hash already registered") } - k.Logger().Debug("payload hash registered", "hash", hash.String(), "payload", payload.String()) + k.Logger().Debug("payload registered", "hash", hash.String(), "payload", payload.String()) return hash.Bytes(), k.pendingPayloads.Set(ctx, hash.Bytes(), pendingPayload) } +// validatePayloadAgainstState checks if the payload is valid with respect +// to the current state of the chain. +// This asserts that no actions or forwarding configurations contained in the payload +// are paused. +func (k *Keeper) validatePayloadAgainstState( + ctx context.Context, + payload *core.Payload, +) error { + for _, action := range payload.PreActions { + paused, err := k.executor.IsActionPaused(ctx, action.ID()) + if err != nil { + return errorsmod.Wrap(err, "failed to check if action is paused") + } + + if paused { + return fmt.Errorf("action %s is paused", action.ID()) + } + } + + paused, err := k.forwarder.IsProtocolPaused(ctx, payload.Forwarding.ProtocolId) + if err != nil { + return errorsmod.Wrap(err, "failed to check if forwarder is paused") + } + + if paused { + return fmt.Errorf("protocol %s is paused", payload.Forwarding.ProtocolId) + } + + cachedAttrs, err := payload.Forwarding.CachedAttributes() + if err != nil { + return err + } + + paused, err = k.forwarder.IsCrossChainPaused(ctx, core.CrossChainID{ + ProtocolId: payload.Forwarding.ProtocolId, + CounterpartyId: cachedAttrs.CounterpartyID(), + }) + if err != nil { + return errorsmod.Wrap(err, "failed to check if cross-chain paused") + } + + if paused { + return fmt.Errorf("cross-chain paused") + } + + return nil +} + // PendingPayload returns the pending payload with the given hash // if it is found in the module storage. // diff --git a/keeper/state_handler_test.go b/keeper/state_handler_test.go index b80c2c4b..ea16dc47 100644 --- a/keeper/state_handler_test.go +++ b/keeper/state_handler_test.go @@ -31,6 +31,7 @@ import ( "github.com/noble-assets/orbiter/testutil" mockorbiter "github.com/noble-assets/orbiter/testutil/mocks/orbiter" orbitertypes "github.com/noble-assets/orbiter/types" + "github.com/noble-assets/orbiter/types/controller/action" "github.com/noble-assets/orbiter/types/controller/forwarding" "github.com/noble-assets/orbiter/types/core" ) @@ -38,7 +39,10 @@ import ( func TestAcceptPayload(t *testing.T) { t.Parallel() - validPayload := createTestPendingPayloadWithSequence(t, 0) + seq := uint64(0) + destDomain := uint32(1) + recipient := testutil.RandomBytes(32) + validPayload := createTestPendingPayloadWithSequence(t, seq) expHash, err := validPayload.Keccak256Hash() require.NoError(t, err, "failed to hash payload") @@ -46,14 +50,14 @@ func TestAcceptPayload(t *testing.T) { testcases := []struct { name string setup func(*testing.T, context.Context, *orbiterkeeper.Keeper) - payload *orbitertypes.PendingPayload + payload func() *orbitertypes.PendingPayload errContains string - expHash []byte + expHash string }{ { name: "success - valid payload", - payload: validPayload, - expHash: expHash.Bytes(), + payload: func() *orbitertypes.PendingPayload { return validPayload }, + expHash: expHash.String(), }, { name: "error - payload already registered", @@ -65,20 +69,92 @@ func TestAcceptPayload(t *testing.T) { // NOTE: we're resetting the pending payloads sequence to generate the same hash for // the next submission - err = k.PendingPayloadsSequence.Set(ctx, 0) + err = k.PendingPayloadsSequence.Set(ctx, seq) require.NoError(t, err, "failed to set pending payloads sequence") }, - payload: validPayload, + payload: func() *orbitertypes.PendingPayload { return validPayload }, errContains: "already registered", }, { - name: "error - nil payload", - payload: &orbitertypes.PendingPayload{}, + name: "error - payload contains paused action", + setup: func(t *testing.T, ctx context.Context, k *orbiterkeeper.Keeper) { + t.Helper() + + err := k.Executor().Pause(ctx, core.ACTION_FEE) + require.NoError(t, err, "failed to pause fee action") + }, + payload: func() *orbitertypes.PendingPayload { + p := *validPayload + + preAction, err := core.NewAction(core.ACTION_FEE, &action.FeeAttributes{}) + require.NoError(t, err, "failed to construct fee action") + + p.Payload.PreActions = append( + p.Payload.PreActions, + preAction, + ) + + return &p + }, + errContains: "action ACTION_FEE is paused", + }, + { + name: "error - payload contains paused protocol", + setup: func(t *testing.T, ctx context.Context, k *orbiterkeeper.Keeper) { + t.Helper() + + err := k.Forwarder().Pause(ctx, core.PROTOCOL_CCTP, nil) + require.NoError(t, err, "failed to unpause fee action") + }, + payload: func() *orbitertypes.PendingPayload { + p := *validPayload + + fw, err := forwarding.NewCCTPForwarding(destDomain, recipient, nil, nil) + require.NoError(t, err, "failed to construct forwarding") + + p.Payload.Forwarding = fw + + return &p + }, + errContains: "protocol PROTOCOL_CCTP is paused", + }, + { + name: "error - payload contains paused cross-chain", + setup: func(t *testing.T, ctx context.Context, k *orbiterkeeper.Keeper) { + t.Helper() + + cID := (&forwarding.CCTPAttributes{ + DestinationDomain: destDomain, + MintRecipient: recipient, + }).CounterpartyID() + + err = k.Forwarder().Pause(ctx, core.PROTOCOL_CCTP, []string{cID}) + require.NoError(t, err, "failed to unpause cross-chain forwarding") + }, + payload: func() *orbitertypes.PendingPayload { + p := *validPayload + + fw, err := forwarding.NewCCTPForwarding(destDomain, recipient, nil, nil) + require.NoError(t, err, "failed to construct forwarding") + + p.Payload.Forwarding = fw + + return &p + }, + errContains: "cross-chain paused", + }, + { + name: "error - nil payload", + payload: func() *orbitertypes.PendingPayload { + return &orbitertypes.PendingPayload{} + }, errContains: "invalid payload: payload is not set", }, { - name: "error - invalid (empty) payload", - payload: &orbitertypes.PendingPayload{Payload: &core.Payload{}}, + name: "error - invalid (empty) payload", + payload: func() *orbitertypes.PendingPayload { + return &orbitertypes.PendingPayload{Payload: &core.Payload{}} + }, errContains: "invalid payload: forwarding is not set", }, } @@ -93,11 +169,13 @@ func TestAcceptPayload(t *testing.T) { tc.setup(t, ctx, k) } - hash, err := k.AcceptPayload(ctx, tc.payload.Payload) + pendingPayload := tc.payload() + + hash, err := k.AcceptPayload(ctx, pendingPayload.Payload) if tc.errContains == "" { require.NoError(t, err, "failed to accept payload") - require.Equal(t, tc.expHash, hash) + require.Equal(t, tc.expHash, ethcommon.BytesToHash(hash).String()) } else { require.ErrorContains(t, err, tc.errContains, "expected different error") } From 8c320359eb42f0494a9d9a89c0ed71ce9b3647e1 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 2 Oct 2025 15:34:30 +0200 Subject: [PATCH 22/34] add todo about println usage --- controller/adapter/ibc_test.go | 4 ++-- types/packet.go | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/controller/adapter/ibc_test.go b/controller/adapter/ibc_test.go index 72e1f161..76b465d6 100644 --- a/controller/adapter/ibc_test.go +++ b/controller/adapter/ibc_test.go @@ -21,7 +21,6 @@ package adapter_test import ( - "fmt" "testing" "github.com/stretchr/testify/require" @@ -162,7 +161,8 @@ func TestParsePayload(t *testing.T) { parser, err := adapterctrl.NewIBCParser(encCfg.Codec) require.NoError(t, err) - fmt.Println("len of payload:", len(tc.payloadBz)) + t.Log("len of payload:", len(tc.payloadBz)) + isOrbiterPayload, payload, err := parser.ParsePayload( t.Context(), core.PROTOCOL_IBC, diff --git a/types/packet.go b/types/packet.go index 787914f6..8cbc0df3 100644 --- a/types/packet.go +++ b/types/packet.go @@ -139,6 +139,7 @@ func (a *TransferAttributes) DestinationDenom() string { // nil defensively for robustness. func (a *TransferAttributes) SetDestinationAmount(amount math.Int) { if a == nil { + // TODO: saw this use of print here, should this use something else? or return an error? fmt.Println("Warning: SetDestinationAmount() called on nil TransferAttributes") return @@ -159,6 +160,7 @@ func (a *TransferAttributes) SetDestinationAmount(amount math.Int) { // nil defensively for robustness. func (a *TransferAttributes) SetDestinationDenom(denom string) { if a == nil { + // TODO: ditto as above; replace println here? fmt.Println("Warning: SetDestinationDenom() called on nil TransferAttributes") return From bbf6a008fbc03da1c99d5600538f318322d2efb8 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 2 Oct 2025 16:29:54 +0200 Subject: [PATCH 23/34] move hyperlane dependencies from keeper to hyperlane adapter --- controller/adapter/hyperlane.go | 35 ++++++++++++++---- .../adapter/hyperlane_app.go | 36 ++++++++++--------- depinject.go | 14 +++++--- keeper/keeper.go | 28 ++++----------- testutil/mocks/hyperlane.go | 4 +-- testutil/mocks/orbiter/orbiter.go | 1 - types/component/adapter/interfaces.go | 23 ++++++++++++ types/expected_keepers.go | 18 ---------- 8 files changed, 89 insertions(+), 70 deletions(-) rename keeper/hyperlane.go => controller/adapter/hyperlane_app.go (78%) create mode 100644 types/component/adapter/interfaces.go diff --git a/controller/adapter/hyperlane.go b/controller/adapter/hyperlane.go index 8c55d967..be119e1f 100644 --- a/controller/adapter/hyperlane.go +++ b/controller/adapter/hyperlane.go @@ -28,11 +28,15 @@ import ( "github.com/noble-assets/orbiter/controller" orbitertypes "github.com/noble-assets/orbiter/types" + adaptertypes "github.com/noble-assets/orbiter/types/component/adapter" "github.com/noble-assets/orbiter/types/core" "github.com/noble-assets/orbiter/types/hyperlane" ) -var _ orbitertypes.AdapterController = &HyperlaneAdapter{} +var ( + _ orbitertypes.Adapter = &HyperlaneAdapter{} + _ orbitertypes.AdapterController = &HyperlaneAdapter{} +) // HyperlaneAdapter is the type component to convert // an incoming Hyperlane message body to the common payload @@ -40,15 +44,24 @@ var _ orbitertypes.AdapterController = &HyperlaneAdapter{} type HyperlaneAdapter struct { *controller.BaseController[core.ProtocolID] + orbitertypes.Adapter + logger log.Logger stateHandler orbitertypes.PendingPayloadsHandler + + // Hyperlane dependencies + hyperlaneCore adaptertypes.HyperlaneCoreKeeper + hyperlaneWarp adaptertypes.HyperlaneWarpKeeper } // NewHyperlaneAdapter returns a reference to a new HyperlaneAdapter instance. func NewHyperlaneAdapter( logger log.Logger, - orbiterStateHandler orbitertypes.PendingPayloadsHandler, + payloadsHandler orbitertypes.PendingPayloadsHandler, + // TODO: move interface definition in this package + hyperlaneCoreKeeper adaptertypes.HyperlaneCoreKeeper, + hyperlaneWarpKeeper adaptertypes.HyperlaneWarpKeeper, ) (*HyperlaneAdapter, error) { if logger == nil { return nil, core.ErrNilPointer.Wrap("logger cannot be nil") @@ -59,20 +72,30 @@ func NewHyperlaneAdapter( return nil, errorsmod.Wrap(err, "failed to create base controller") } - if orbiterStateHandler == nil { + if payloadsHandler == nil { return nil, core.ErrNilPointer.Wrap("orbiter state handler cannot be nil") } + if hyperlaneCoreKeeper == nil { + return nil, core.ErrNilPointer.Wrap("hyperlane core keeper cannot be nil") + } + + if hyperlaneWarpKeeper == nil { + return nil, core.ErrNilPointer.Wrap("warp keeper cannot be nil") + } + return &HyperlaneAdapter{ BaseController: baseController, logger: logger.With(core.AdapterControllerName, baseController.Name()), - stateHandler: orbiterStateHandler, + stateHandler: payloadsHandler, + hyperlaneCore: hyperlaneCoreKeeper, + hyperlaneWarp: hyperlaneWarpKeeper, }, nil } // ParsePayload delegates the parsing of a Hyperlane message body to the underlying // Parser implementation. -func (h *HyperlaneAdapter) ParsePayload( +func (ha *HyperlaneAdapter) ParsePayload( ctx context.Context, _ core.ProtocolID, payloadBz []byte, @@ -82,7 +105,7 @@ func (h *HyperlaneAdapter) ParsePayload( return false, nil, errorsmod.Wrap(err, "failed to parse payload") } - pendingPayload, err := h.stateHandler.PendingPayload(ctx, payloadHash) + pendingPayload, err := ha.stateHandler.PendingPayload(ctx, payloadHash) if err != nil { return false, nil, errorsmod.Wrap(err, "failed to get pending payload") } diff --git a/keeper/hyperlane.go b/controller/adapter/hyperlane_app.go similarity index 78% rename from keeper/hyperlane.go rename to controller/adapter/hyperlane_app.go index eb92ff76..5bb21612 100644 --- a/keeper/hyperlane.go +++ b/controller/adapter/hyperlane_app.go @@ -18,7 +18,7 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package keeper +package adapter import ( "context" @@ -29,25 +29,29 @@ import ( errorsmod "cosmossdk.io/errors" + "github.com/noble-assets/orbiter/types" "github.com/noble-assets/orbiter/types/core" hyperlaneorbitertypes "github.com/noble-assets/orbiter/types/hyperlane" ) +// Hyperlane interface compliance. +var _ hyperlaneutil.HyperlaneApp = &HyperlaneAdapter{} + // OrbiterHyperlaneAppID defines the module identifier of the Orbiter Hyperlane application. const OrbiterHyperlaneAppID uint8 = 255 // RegisterHyperlaneAppRoute registers the Orbiter Hyperlane application in the main application // router. -func (k *Keeper) RegisterHyperlaneAppRoute() { - k.hyperlaneCoreKeeper.AppRouter().RegisterModule(OrbiterHyperlaneAppID, k) +func (ha *HyperlaneAdapter) RegisterHyperlaneAppRoute() { + ha.hyperlaneCore.AppRouter().RegisterModule(OrbiterHyperlaneAppID, ha) } -func (k *Keeper) Handle( +func (ha *HyperlaneAdapter) Handle( ctx context.Context, mailboxId hyperlaneutil.HexAddress, message hyperlaneutil.HyperlaneMessage, ) error { - _, payload, err := k.adapter.ParsePayload(ctx, core.PROTOCOL_HYPERLANE, message.Body) + _, payload, err := ha.ParsePayload(ctx, core.PROTOCOL_HYPERLANE, message.Body) if err != nil { return errorsmod.Wrap(err, "failed to parse payload") } @@ -59,7 +63,7 @@ func (k *Keeper) Handle( // TODO: I guess here should be where the BeforeTransferHook is called? however the transfer // should already have been processed at this point - if err = k.adapter.BeforeTransferHook( + if err = types.Adapter(ha).BeforeTransferHook( ctx, ccID, payload, ); err != nil { return errorsmod.Wrap(err, "failed during before transfer hook") @@ -75,7 +79,7 @@ func (k *Keeper) Handle( return errorsmod.Wrap(err, "failed to create reduced warp message") } - if err = k.hyperlaneWarpKeeper.Handle( + if err = ha.hyperlaneWarp.Handle( ctx, mailboxId, reducedWarpMessage, @@ -83,12 +87,12 @@ func (k *Keeper) Handle( return errorsmod.Wrap(err, "internal warp handling failed") } - transferAttr, err := k.adapter.AfterTransferHook(ctx, ccID, payload) + transferAttr, err := ha.AfterTransferHook(ctx, ccID, payload) if err != nil { return errorsmod.Wrap(err, "failed to run AfterTransferHook") } - if err = k.adapter.ProcessPayload(ctx, transferAttr, payload); err != nil { + if err = ha.ProcessPayload(ctx, transferAttr, payload); err != nil { return errorsmod.Wrap(err, "failed to process payload") } @@ -99,11 +103,11 @@ func (k *Keeper) Handle( // but we don't need that? // // TODO: should we delegate to the Warp method here? -func (k *Keeper) Exists( - ctx context.Context, - handledPayload hyperlaneutil.HexAddress, +func (ha *HyperlaneAdapter) Exists( + _ context.Context, + _ hyperlaneutil.HexAddress, ) (bool, error) { - // return k.HandledHyperlaneTransfers.Has(ctx, handledPayload.GetInternalId()) + // return ha.HandledHyperlaneTransfers.Has(ctx, handledPayload.GetInternalId()) return true, nil } @@ -112,9 +116,9 @@ func (k *Keeper) Exists( // but we won't keep track of any specific assets that would need to be registered. // // TODO: should we delegate to the Warp method here? -func (k *Keeper) ReceiverIsmId( - ctx context.Context, - recipient hyperlaneutil.HexAddress, +func (ha *HyperlaneAdapter) ReceiverIsmId( + _ context.Context, + _ hyperlaneutil.HexAddress, ) (*hyperlaneutil.HexAddress, error) { return nil, errors.New("not implemented") } diff --git a/depinject.go b/depinject.go index 159b0dbe..d13e092a 100644 --- a/depinject.go +++ b/depinject.go @@ -91,7 +91,6 @@ func ProvideModule(in ModuleInputs) ModuleOutputs { in.StoreService, authority.String(), in.BankKeeper, - in.CoreKeeper, ) m := NewAppModule(k) @@ -106,7 +105,9 @@ type ComponentsInputs struct { BankKeeper bankkeeper.Keeper CCTPKeeper *cctpkeeper.Keeper - WarpKeeper warpkeeper.Keeper + + HyperlaneCoreKeeper *hyperlanecorekeeper.Keeper + WarpKeeper *warpkeeper.Keeper } func InjectComponents(in ComponentsInputs) { @@ -124,12 +125,11 @@ func InjectForwardingControllers(in ComponentsInputs) { panic(errorsmod.Wrap(err, "error creating CCTP controller")) } - // TODO: pass hyperlane core and warp dependencies here instead of to the main keeper hyperlane, err := forwardingctrl.NewHyperlaneController( in.Orbiters.Forwarder().Logger(), forwardingtypes.NewHyperlaneHandler( - warpkeeper.NewMsgServerImpl(in.WarpKeeper), - warpkeeper.NewQueryServerImpl(in.WarpKeeper), + warpkeeper.NewMsgServerImpl(*in.WarpKeeper), + warpkeeper.NewQueryServerImpl(*in.WarpKeeper), ), ) if err != nil { @@ -172,10 +172,14 @@ func InjectAdapterControllers(in ComponentsInputs) { hyperlane, err := adapterctrl.NewHyperlaneAdapter( in.Orbiters.Logger(), in.Orbiters, + in.HyperlaneCoreKeeper, + in.WarpKeeper, ) if err != nil { panic(errorsmod.Wrap(err, "error creating Hyperlane adapter")) } + hyperlane.RegisterHyperlaneAppRoute() + in.Orbiters.SetAdapterControllers(ibc, hyperlane) } diff --git a/keeper/keeper.go b/keeper/keeper.go index 355eedd6..e24fc77e 100644 --- a/keeper/keeper.go +++ b/keeper/keeper.go @@ -24,8 +24,6 @@ import ( "errors" "fmt" - hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" - "cosmossdk.io/collections" "cosmossdk.io/core/address" "cosmossdk.io/core/event" @@ -44,11 +42,8 @@ import ( var ( // General interface compliance. - _ orbitertypes.Authorizer = &Keeper{} - _ orbitertypes.MsgServer = &Keeper{} - - // Hyperlane interface compliance. - _ hyperlaneutil.HyperlaneApp = &Keeper{} + _ orbitertypes.Authorizer = &Keeper{} + _ orbitertypes.MsgServer = &Keeper{} _ orbitertypes.PendingPayloadsHandler = &Keeper{} ) @@ -74,10 +69,6 @@ type Keeper struct { // // TODO: this is only exported to be able to set the sequence in tests -- make private again? PendingPayloadsSequence collections.Sequence - - // Hyperlane dependencies - hyperlaneCoreKeeper orbitertypes.HyperlaneCoreKeeper - hyperlaneWarpKeeper orbitertypes.HyperlaneWarpKeeper } // NewKeeper returns a reference to a validated instance of the keeper. @@ -90,9 +81,8 @@ func NewKeeper( storeService store.KVStoreService, authority string, bankKeeper orbitertypes.BankKeeper, - coreKeeper orbitertypes.HyperlaneCoreKeeper, ) *Keeper { - if err := validateKeeperInputs(cdc, addressCdc, logger, eventService, storeService, bankKeeper, coreKeeper, authority); err != nil { + if err := validateKeeperInputs(cdc, addressCdc, logger, eventService, storeService, bankKeeper, authority); err != nil { panic(err) } @@ -116,8 +106,6 @@ func NewKeeper( collections.BytesKey, codec.CollValue[orbitertypes.PendingPayload](cdc), ), - - hyperlaneCoreKeeper: coreKeeper, } if err := k.setComponents(k.cdc, k.logger, k.eventService, sb, bankKeeper); err != nil { @@ -132,12 +120,13 @@ func NewKeeper( panic(err) } - k.RegisterHyperlaneAppRoute() + // // TODO: check if registration of route also works during setup of the adapter controller + // k.RegisterHyperlaneAppRoute() return &k } -// validateKeeperInputs check that all Keeper inputs +// validateKeeperInputs checks that all Keeper inputs // are valid or panic. func validateKeeperInputs( cdc codec.Codec, @@ -146,7 +135,6 @@ func validateKeeperInputs( eventService event.Service, storeService store.KVStoreService, bankKeeper orbitertypes.BankKeeper, - coreKeeper orbitertypes.HyperlaneCoreKeeper, authority string, ) error { if cdc == nil { @@ -168,10 +156,6 @@ func validateKeeperInputs( return core.ErrNilPointer.Wrap("bank keeper cannot be nil") } - if coreKeeper == nil { - return core.ErrNilPointer.Wrap("hyperlane core keeper cannot be nil") - } - _, err := addressCdc.StringToBytes(authority) if err != nil { return errors.New("authority for x/orbiter module is not valid") diff --git a/testutil/mocks/hyperlane.go b/testutil/mocks/hyperlane.go index e96fa51f..d039cefe 100644 --- a/testutil/mocks/hyperlane.go +++ b/testutil/mocks/hyperlane.go @@ -30,7 +30,7 @@ import ( "cosmossdk.io/collections" - "github.com/noble-assets/orbiter/types" + "github.com/noble-assets/orbiter/types/component/adapter" "github.com/noble-assets/orbiter/types/controller/forwarding" ) @@ -69,7 +69,7 @@ func (h HyperlaneHandler) Token( }, nil } -var _ types.HyperlaneCoreKeeper = HyperlaneCoreKeeper{} +var _ adapter.HyperlaneCoreKeeper = HyperlaneCoreKeeper{} type HyperlaneCoreKeeper struct { appRouter *hyperlaneutil.Router[hyperlaneutil.HyperlaneApp] diff --git a/testutil/mocks/orbiter/orbiter.go b/testutil/mocks/orbiter/orbiter.go index a349f24a..a8aa4e9f 100644 --- a/testutil/mocks/orbiter/orbiter.go +++ b/testutil/mocks/orbiter/orbiter.go @@ -58,7 +58,6 @@ func orbiterKeeperWithMocks( deps.StoreService, testutil.Authority, m.BankKeeper, - m.HyperlaneCoreKeeper, ) return k, deps.SdkCtx diff --git a/types/component/adapter/interfaces.go b/types/component/adapter/interfaces.go new file mode 100644 index 00000000..f64f1e60 --- /dev/null +++ b/types/component/adapter/interfaces.go @@ -0,0 +1,23 @@ +package adapter + +import ( + "context" + + "github.com/bcp-innovations/hyperlane-cosmos/util" +) + +// HyperlaneCoreKeeper specifies the expected interface of Hyperlane +// core functionality that is required for the Orbiter execution. +type HyperlaneCoreKeeper interface { + AppRouter() *util.Router[util.HyperlaneApp] +} + +// HyperlaneWarpKeeper specifies the expected interface of Hyperlane +// warp functionality that is required for the Orbiter execution. +type HyperlaneWarpKeeper interface { + Handle( + ctx context.Context, + mailboxId util.HexAddress, + message util.HyperlaneMessage, + ) error +} diff --git a/types/expected_keepers.go b/types/expected_keepers.go index 9b0a2537..5deafec1 100644 --- a/types/expected_keepers.go +++ b/types/expected_keepers.go @@ -23,8 +23,6 @@ package types import ( "context" - hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/noble-assets/orbiter/types/core" @@ -57,22 +55,6 @@ type BankKeeperAdapter interface { ) error } -// HyperlaneCoreKeeper specifies the expected interface of Hyperlane -// core functionality that is required for the Orbiter execution. -type HyperlaneCoreKeeper interface { - AppRouter() *hyperlaneutil.Router[hyperlaneutil.HyperlaneApp] -} - -// HyperlaneWarpKeeper specifies the expected interface of Hyperlane -// warp functionality that is required for the Orbiter execution. -type HyperlaneWarpKeeper interface { - Handle( - ctx context.Context, - mailboxId hyperlaneutil.HexAddress, - message hyperlaneutil.HyperlaneMessage, - ) error -} - // PendingPayloadsHandler defines the interface to adjust and query the Orbiter module // state as it relates to the bookkeeping of pending payloads. type PendingPayloadsHandler interface { From 066d628cd9e7805528b2ccf4f2294536862a322b Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Thu, 2 Oct 2025 16:32:12 +0200 Subject: [PATCH 24/34] remove some outdated todos --- controller/adapter/hyperlane_app.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/controller/adapter/hyperlane_app.go b/controller/adapter/hyperlane_app.go index 5bb21612..8cecb61f 100644 --- a/controller/adapter/hyperlane_app.go +++ b/controller/adapter/hyperlane_app.go @@ -61,8 +61,6 @@ func (ha *HyperlaneAdapter) Handle( return errorsmod.Wrap(err, "failed to parse cross chain ID") } - // TODO: I guess here should be where the BeforeTransferHook is called? however the transfer - // should already have been processed at this point if err = types.Adapter(ha).BeforeTransferHook( ctx, ccID, payload, ); err != nil { @@ -71,7 +69,6 @@ func (ha *HyperlaneAdapter) Handle( // TODO: what to do with mailbox ID? do we need to check this? - // TODO: this should be where the underlying warp logic is called. reducedWarpMessage, err := hyperlaneorbitertypes.GetReducedWarpMessageFromOrbiterMessage( message, ) From a61b25f5df706b616dc8f326c0e83ee31206bdc8 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Fri, 3 Oct 2025 23:47:16 +0200 Subject: [PATCH 25/34] move pending payload to orbiter.proto in core & fix proto path --- api/core/v1/orbiter.pulsar.go | 608 ++++++++++++++++++++- api/v1/tx.pulsar.go | 631 ++-------------------- keeper/keeper.go | 6 +- keeper/state_handler.go | 4 +- keeper/state_handler_test.go | 26 +- proto/noble/orbiter/core/v1/orbiter.proto | 8 + proto/noble/orbiter/v1/tx.proto | 15 +- simapp/orbiter.go | 2 +- types/component/adapter/interfaces.go | 20 + types/core/orbiter.pb.go | 279 +++++++++- types/{ => core}/payload.go | 6 +- types/expected_keepers.go | 2 +- types/tx.pb.go | 274 +--------- 13 files changed, 948 insertions(+), 933 deletions(-) rename types/{ => core}/payload.go (93%) diff --git a/api/core/v1/orbiter.pulsar.go b/api/core/v1/orbiter.pulsar.go index 8b1b4ba1..166f36a8 100644 --- a/api/core/v1/orbiter.pulsar.go +++ b/api/core/v1/orbiter.pulsar.go @@ -2055,6 +2055,489 @@ func (x *fastReflection_PayloadWrapper) ProtoMethods() *protoiface.Methods { } } +var ( + md_PendingPayload protoreflect.MessageDescriptor + fd_PendingPayload_sequence protoreflect.FieldDescriptor + fd_PendingPayload_payload protoreflect.FieldDescriptor +) + +func init() { + file_noble_orbiter_core_v1_orbiter_proto_init() + md_PendingPayload = File_noble_orbiter_core_v1_orbiter_proto.Messages().ByName("PendingPayload") + fd_PendingPayload_sequence = md_PendingPayload.Fields().ByName("sequence") + fd_PendingPayload_payload = md_PendingPayload.Fields().ByName("payload") +} + +var _ protoreflect.Message = (*fastReflection_PendingPayload)(nil) + +type fastReflection_PendingPayload PendingPayload + +func (x *PendingPayload) ProtoReflect() protoreflect.Message { + return (*fastReflection_PendingPayload)(x) +} + +func (x *PendingPayload) slowProtoReflect() protoreflect.Message { + mi := &file_noble_orbiter_core_v1_orbiter_proto_msgTypes[4] + 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_PendingPayload_messageType fastReflection_PendingPayload_messageType +var _ protoreflect.MessageType = fastReflection_PendingPayload_messageType{} + +type fastReflection_PendingPayload_messageType struct{} + +func (x fastReflection_PendingPayload_messageType) Zero() protoreflect.Message { + return (*fastReflection_PendingPayload)(nil) +} +func (x fastReflection_PendingPayload_messageType) New() protoreflect.Message { + return new(fastReflection_PendingPayload) +} +func (x fastReflection_PendingPayload_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_PendingPayload +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_PendingPayload) Descriptor() protoreflect.MessageDescriptor { + return md_PendingPayload +} + +// 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_PendingPayload) Type() protoreflect.MessageType { + return _fastReflection_PendingPayload_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_PendingPayload) New() protoreflect.Message { + return new(fastReflection_PendingPayload) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_PendingPayload) Interface() protoreflect.ProtoMessage { + return (*PendingPayload)(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_PendingPayload) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Sequence != uint64(0) { + value := protoreflect.ValueOfUint64(x.Sequence) + if !f(fd_PendingPayload_sequence, value) { + return + } + } + if x.Payload != nil { + value := protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) + if !f(fd_PendingPayload_payload, 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_PendingPayload) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "noble.orbiter.core.v1.PendingPayload.sequence": + return x.Sequence != uint64(0) + case "noble.orbiter.core.v1.PendingPayload.payload": + return x.Payload != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.core.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.core.v1.PendingPayload 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_PendingPayload) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "noble.orbiter.core.v1.PendingPayload.sequence": + x.Sequence = uint64(0) + case "noble.orbiter.core.v1.PendingPayload.payload": + x.Payload = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.core.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.core.v1.PendingPayload 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_PendingPayload) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "noble.orbiter.core.v1.PendingPayload.sequence": + value := x.Sequence + return protoreflect.ValueOfUint64(value) + case "noble.orbiter.core.v1.PendingPayload.payload": + value := x.Payload + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.core.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.core.v1.PendingPayload 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_PendingPayload) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "noble.orbiter.core.v1.PendingPayload.sequence": + x.Sequence = value.Uint() + case "noble.orbiter.core.v1.PendingPayload.payload": + x.Payload = value.Message().Interface().(*Payload) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.core.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.core.v1.PendingPayload 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_PendingPayload) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.core.v1.PendingPayload.payload": + if x.Payload == nil { + x.Payload = new(Payload) + } + return protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) + case "noble.orbiter.core.v1.PendingPayload.sequence": + panic(fmt.Errorf("field sequence of message noble.orbiter.core.v1.PendingPayload is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.core.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.core.v1.PendingPayload 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_PendingPayload) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.core.v1.PendingPayload.sequence": + return protoreflect.ValueOfUint64(uint64(0)) + case "noble.orbiter.core.v1.PendingPayload.payload": + m := new(Payload) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.core.v1.PendingPayload")) + } + panic(fmt.Errorf("message noble.orbiter.core.v1.PendingPayload 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_PendingPayload) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in noble.orbiter.core.v1.PendingPayload", 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_PendingPayload) 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_PendingPayload) 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_PendingPayload) 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_PendingPayload) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*PendingPayload) + 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.Sequence != 0 { + n += 1 + runtime.Sov(uint64(x.Sequence)) + } + if x.Payload != nil { + l = options.Size(x.Payload) + 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().(*PendingPayload) + 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 x.Payload != nil { + encoded, err := options.Marshal(x.Payload) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x12 + } + if x.Sequence != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.Sequence)) + i-- + dAtA[i] = 0x8 + } + 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().(*PendingPayload) + 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: PendingPayload: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PendingPayload: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) + } + x.Sequence = 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.Sequence |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var msglen 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++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + 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 + } + if x.Payload == nil { + x.Payload = &Payload{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Payload); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + 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, + } +} + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.0 @@ -2272,6 +2755,52 @@ func (x *PayloadWrapper) GetOrbiter() *Payload { return nil } +// PendingPayload holds the information that goes into the stored payload hash. +type PendingPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The sequence number of the pending payload. + Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` + // The submitted payload that will is registered as pending. + Payload *Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *PendingPayload) Reset() { + *x = PendingPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_noble_orbiter_core_v1_orbiter_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PendingPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PendingPayload) ProtoMessage() {} + +// Deprecated: Use PendingPayload.ProtoReflect.Descriptor instead. +func (*PendingPayload) Descriptor() ([]byte, []int) { + return file_noble_orbiter_core_v1_orbiter_proto_rawDescGZIP(), []int{4} +} + +func (x *PendingPayload) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *PendingPayload) GetPayload() *Payload { + if x != nil { + return x.Payload + } + return nil +} + var File_noble_orbiter_core_v1_orbiter_proto protoreflect.FileDescriptor var file_noble_orbiter_core_v1_orbiter_proto_rawDesc = []byte{ @@ -2323,22 +2852,29 @@ var file_noble_orbiter_core_v1_orbiter_proto_rawDesc = []byte{ 0x70, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x42, 0xe2, 0x01, - 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, - 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x4f, 0x72, 0x62, - 0x69, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2d, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6f, 0x72, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, - 0x4e, 0x4f, 0x43, 0xaa, 0x02, 0x15, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x62, 0x69, - 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x15, 0x4e, 0x6f, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x22, 0x66, 0x0a, + 0x0e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, + 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0xe2, 0x01, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, + 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x40, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, + 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, + 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x63, + 0x6f, 0x72, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x43, 0xaa, 0x02, 0x15, 0x4e, 0x6f, + 0x62, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x72, 0x65, + 0x2e, 0x56, 0x31, 0xca, 0x02, 0x15, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, + 0x74, 0x65, 0x72, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x21, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x43, 0x6f, 0x72, 0x65, - 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x21, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, - 0x74, 0x65, 0x72, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x3a, - 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x18, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, + 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -2353,29 +2889,31 @@ func file_noble_orbiter_core_v1_orbiter_proto_rawDescGZIP() []byte { return file_noble_orbiter_core_v1_orbiter_proto_rawDescData } -var file_noble_orbiter_core_v1_orbiter_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_noble_orbiter_core_v1_orbiter_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_noble_orbiter_core_v1_orbiter_proto_goTypes = []interface{}{ (*Action)(nil), // 0: noble.orbiter.core.v1.Action (*Forwarding)(nil), // 1: noble.orbiter.core.v1.Forwarding (*Payload)(nil), // 2: noble.orbiter.core.v1.Payload (*PayloadWrapper)(nil), // 3: noble.orbiter.core.v1.PayloadWrapper - (ActionID)(0), // 4: noble.orbiter.core.v1.ActionID - (*anypb.Any)(nil), // 5: google.protobuf.Any - (ProtocolID)(0), // 6: noble.orbiter.core.v1.ProtocolID + (*PendingPayload)(nil), // 4: noble.orbiter.core.v1.PendingPayload + (ActionID)(0), // 5: noble.orbiter.core.v1.ActionID + (*anypb.Any)(nil), // 6: google.protobuf.Any + (ProtocolID)(0), // 7: noble.orbiter.core.v1.ProtocolID } var file_noble_orbiter_core_v1_orbiter_proto_depIdxs = []int32{ - 4, // 0: noble.orbiter.core.v1.Action.id:type_name -> noble.orbiter.core.v1.ActionID - 5, // 1: noble.orbiter.core.v1.Action.attributes:type_name -> google.protobuf.Any - 6, // 2: noble.orbiter.core.v1.Forwarding.protocol_id:type_name -> noble.orbiter.core.v1.ProtocolID - 5, // 3: noble.orbiter.core.v1.Forwarding.attributes:type_name -> google.protobuf.Any + 5, // 0: noble.orbiter.core.v1.Action.id:type_name -> noble.orbiter.core.v1.ActionID + 6, // 1: noble.orbiter.core.v1.Action.attributes:type_name -> google.protobuf.Any + 7, // 2: noble.orbiter.core.v1.Forwarding.protocol_id:type_name -> noble.orbiter.core.v1.ProtocolID + 6, // 3: noble.orbiter.core.v1.Forwarding.attributes:type_name -> google.protobuf.Any 0, // 4: noble.orbiter.core.v1.Payload.pre_actions:type_name -> noble.orbiter.core.v1.Action 1, // 5: noble.orbiter.core.v1.Payload.forwarding:type_name -> noble.orbiter.core.v1.Forwarding 2, // 6: noble.orbiter.core.v1.PayloadWrapper.orbiter:type_name -> noble.orbiter.core.v1.Payload - 7, // [7:7] is the sub-list for method output_type - 7, // [7:7] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 2, // 7: noble.orbiter.core.v1.PendingPayload.payload:type_name -> noble.orbiter.core.v1.Payload + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_noble_orbiter_core_v1_orbiter_proto_init() } @@ -2433,6 +2971,18 @@ func file_noble_orbiter_core_v1_orbiter_proto_init() { return nil } } + file_noble_orbiter_core_v1_orbiter_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PendingPayload); 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{ @@ -2440,7 +2990,7 @@ func file_noble_orbiter_core_v1_orbiter_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_noble_orbiter_core_v1_orbiter_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 5, NumExtensions: 0, NumServices: 0, }, diff --git a/api/v1/tx.pulsar.go b/api/v1/tx.pulsar.go index 5126343c..bb211b9d 100644 --- a/api/v1/tx.pulsar.go +++ b/api/v1/tx.pulsar.go @@ -938,489 +938,6 @@ func (x *fastReflection_MsgSubmitPayloadResponse) ProtoMethods() *protoiface.Met } } -var ( - md_PendingPayload protoreflect.MessageDescriptor - fd_PendingPayload_sequence protoreflect.FieldDescriptor - fd_PendingPayload_payload protoreflect.FieldDescriptor -) - -func init() { - file_noble_orbiter_v1_tx_proto_init() - md_PendingPayload = File_noble_orbiter_v1_tx_proto.Messages().ByName("PendingPayload") - fd_PendingPayload_sequence = md_PendingPayload.Fields().ByName("sequence") - fd_PendingPayload_payload = md_PendingPayload.Fields().ByName("payload") -} - -var _ protoreflect.Message = (*fastReflection_PendingPayload)(nil) - -type fastReflection_PendingPayload PendingPayload - -func (x *PendingPayload) ProtoReflect() protoreflect.Message { - return (*fastReflection_PendingPayload)(x) -} - -func (x *PendingPayload) slowProtoReflect() protoreflect.Message { - mi := &file_noble_orbiter_v1_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_PendingPayload_messageType fastReflection_PendingPayload_messageType -var _ protoreflect.MessageType = fastReflection_PendingPayload_messageType{} - -type fastReflection_PendingPayload_messageType struct{} - -func (x fastReflection_PendingPayload_messageType) Zero() protoreflect.Message { - return (*fastReflection_PendingPayload)(nil) -} -func (x fastReflection_PendingPayload_messageType) New() protoreflect.Message { - return new(fastReflection_PendingPayload) -} -func (x fastReflection_PendingPayload_messageType) Descriptor() protoreflect.MessageDescriptor { - return md_PendingPayload -} - -// Descriptor returns message descriptor, which contains only the protobuf -// type information for the message. -func (x *fastReflection_PendingPayload) Descriptor() protoreflect.MessageDescriptor { - return md_PendingPayload -} - -// 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_PendingPayload) Type() protoreflect.MessageType { - return _fastReflection_PendingPayload_messageType -} - -// New returns a newly allocated and mutable empty message. -func (x *fastReflection_PendingPayload) New() protoreflect.Message { - return new(fastReflection_PendingPayload) -} - -// Interface unwraps the message reflection interface and -// returns the underlying ProtoMessage interface. -func (x *fastReflection_PendingPayload) Interface() protoreflect.ProtoMessage { - return (*PendingPayload)(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_PendingPayload) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { - if x.Sequence != uint64(0) { - value := protoreflect.ValueOfUint64(x.Sequence) - if !f(fd_PendingPayload_sequence, value) { - return - } - } - if x.Payload != nil { - value := protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) - if !f(fd_PendingPayload_payload, 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_PendingPayload) Has(fd protoreflect.FieldDescriptor) bool { - switch fd.FullName() { - case "noble.orbiter.v1.PendingPayload.sequence": - return x.Sequence != uint64(0) - case "noble.orbiter.v1.PendingPayload.payload": - return x.Payload != nil - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) - } - panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) Clear(fd protoreflect.FieldDescriptor) { - switch fd.FullName() { - case "noble.orbiter.v1.PendingPayload.sequence": - x.Sequence = uint64(0) - case "noble.orbiter.v1.PendingPayload.payload": - x.Payload = nil - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) - } - panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { - switch descriptor.FullName() { - case "noble.orbiter.v1.PendingPayload.sequence": - value := x.Sequence - return protoreflect.ValueOfUint64(value) - case "noble.orbiter.v1.PendingPayload.payload": - value := x.Payload - return protoreflect.ValueOfMessage(value.ProtoReflect()) - default: - if descriptor.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) - } - panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { - switch fd.FullName() { - case "noble.orbiter.v1.PendingPayload.sequence": - x.Sequence = value.Uint() - case "noble.orbiter.v1.PendingPayload.payload": - x.Payload = value.Message().Interface().(*v1.Payload) - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) - } - panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { - switch fd.FullName() { - case "noble.orbiter.v1.PendingPayload.payload": - if x.Payload == nil { - x.Payload = new(v1.Payload) - } - return protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) - case "noble.orbiter.v1.PendingPayload.sequence": - panic(fmt.Errorf("field sequence of message noble.orbiter.v1.PendingPayload is not mutable")) - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) - } - panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { - switch fd.FullName() { - case "noble.orbiter.v1.PendingPayload.sequence": - return protoreflect.ValueOfUint64(uint64(0)) - case "noble.orbiter.v1.PendingPayload.payload": - m := new(v1.Payload) - return protoreflect.ValueOfMessage(m.ProtoReflect()) - default: - if fd.IsExtension() { - panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.PendingPayload")) - } - panic(fmt.Errorf("message noble.orbiter.v1.PendingPayload 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_PendingPayload) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { - switch d.FullName() { - default: - panic(fmt.Errorf("%s is not a oneof field in noble.orbiter.v1.PendingPayload", 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_PendingPayload) 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_PendingPayload) 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_PendingPayload) 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_PendingPayload) ProtoMethods() *protoiface.Methods { - size := func(input protoiface.SizeInput) protoiface.SizeOutput { - x := input.Message.Interface().(*PendingPayload) - 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.Sequence != 0 { - n += 1 + runtime.Sov(uint64(x.Sequence)) - } - if x.Payload != nil { - l = options.Size(x.Payload) - 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().(*PendingPayload) - 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 x.Payload != nil { - encoded, err := options.Marshal(x.Payload) - if err != nil { - return protoiface.MarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Buf: input.Buf, - }, err - } - i -= len(encoded) - copy(dAtA[i:], encoded) - i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) - i-- - dAtA[i] = 0x12 - } - if x.Sequence != 0 { - i = runtime.EncodeVarint(dAtA, i, uint64(x.Sequence)) - i-- - dAtA[i] = 0x8 - } - 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().(*PendingPayload) - 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: PendingPayload: wiretype end group for non-group") - } - if fieldNum <= 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PendingPayload: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) - } - x.Sequence = 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.Sequence |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) - } - var msglen 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++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength - } - postIndex := iNdEx + msglen - 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 - } - if x.Payload == nil { - x.Payload = &v1.Payload{} - } - if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Payload); err != nil { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err - } - 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, - } -} - // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.0 @@ -1481,7 +998,8 @@ func (x *MsgSubmitPayload) GetPayload() *v1.Payload { return nil } -// MsgSubmitPayloadResponse returns the sequence number of the registered +// MsgSubmitPayloadResponse returns the keccak256 of the registered +// pending payload. type MsgSubmitPayloadResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1518,54 +1036,6 @@ func (x *MsgSubmitPayloadResponse) GetHash() []byte { return nil } -// PendingPayload holds the information that goes into the stored payload hash. -// -// TODO: move to different file? hyperlane.proto or something? -type PendingPayload struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The sequence number of the pending payload. - Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` - // The submitted payload that will is registered as pending. - Payload *v1.Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` -} - -func (x *PendingPayload) Reset() { - *x = PendingPayload{} - if protoimpl.UnsafeEnabled { - mi := &file_noble_orbiter_v1_tx_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PendingPayload) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PendingPayload) ProtoMessage() {} - -// Deprecated: Use PendingPayload.ProtoReflect.Descriptor instead. -func (*PendingPayload) Descriptor() ([]byte, []int) { - return file_noble_orbiter_v1_tx_proto_rawDescGZIP(), []int{2} -} - -func (x *PendingPayload) GetSequence() uint64 { - if x != nil { - return x.Sequence - } - return 0 -} - -func (x *PendingPayload) GetPayload() *v1.Payload { - if x != nil { - return x.Payload - } - return nil -} - var File_noble_orbiter_v1_tx_proto protoreflect.FileDescriptor var file_noble_orbiter_v1_tx_proto_rawDesc = []byte{ @@ -1580,7 +1050,7 @@ var file_noble_orbiter_v1_tx_proto_rawDesc = []byte{ 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0xc3, 0x01, 0x0a, 0x10, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, + 0xbc, 0x01, 0x0a, 0x10, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, @@ -1588,40 +1058,33 @@ var file_noble_orbiter_v1_tx_proto_rawDesc = []byte{ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, - 0x2a, 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x38, 0x82, 0xe7, 0xb0, - 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x28, 0x6e, 0x6f, 0x62, + + 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x21, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x4d, 0x73, - 0x67, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2e, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x66, 0x0a, 0x0e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, - 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x32, 0x6d, 0x0a, - 0x03, 0x4d, 0x73, 0x67, 0x12, 0x5f, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, - 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x2a, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, - 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, 0x0a, - 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, - 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, - 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, - 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, 0x31, - 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, - 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, - 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, - 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x6f, - 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2e, + 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x32, 0x6d, + 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x5f, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, + 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x2a, 0x2e, 0x6e, 0x6f, 0x62, + 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, + 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, + 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, + 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, + 0x62, 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, + 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, + 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, + 0x31, 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, + 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, + 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, + 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, + 0x6f, 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1636,23 +1099,21 @@ func file_noble_orbiter_v1_tx_proto_rawDescGZIP() []byte { return file_noble_orbiter_v1_tx_proto_rawDescData } -var file_noble_orbiter_v1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_noble_orbiter_v1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_noble_orbiter_v1_tx_proto_goTypes = []interface{}{ (*MsgSubmitPayload)(nil), // 0: noble.orbiter.v1.MsgSubmitPayload (*MsgSubmitPayloadResponse)(nil), // 1: noble.orbiter.v1.MsgSubmitPayloadResponse - (*PendingPayload)(nil), // 2: noble.orbiter.v1.PendingPayload - (*v1.Payload)(nil), // 3: noble.orbiter.core.v1.Payload + (*v1.Payload)(nil), // 2: noble.orbiter.core.v1.Payload } var file_noble_orbiter_v1_tx_proto_depIdxs = []int32{ - 3, // 0: noble.orbiter.v1.MsgSubmitPayload.payload:type_name -> noble.orbiter.core.v1.Payload - 3, // 1: noble.orbiter.v1.PendingPayload.payload:type_name -> noble.orbiter.core.v1.Payload - 0, // 2: noble.orbiter.v1.Msg.SubmitPayload:input_type -> noble.orbiter.v1.MsgSubmitPayload - 1, // 3: noble.orbiter.v1.Msg.SubmitPayload:output_type -> noble.orbiter.v1.MsgSubmitPayloadResponse - 3, // [3:4] is the sub-list for method output_type - 2, // [2:3] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 2, // 0: noble.orbiter.v1.MsgSubmitPayload.payload:type_name -> noble.orbiter.core.v1.Payload + 0, // 1: noble.orbiter.v1.Msg.SubmitPayload:input_type -> noble.orbiter.v1.MsgSubmitPayload + 1, // 2: noble.orbiter.v1.Msg.SubmitPayload:output_type -> noble.orbiter.v1.MsgSubmitPayloadResponse + 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_noble_orbiter_v1_tx_proto_init() } @@ -1685,18 +1146,6 @@ func file_noble_orbiter_v1_tx_proto_init() { return nil } } - file_noble_orbiter_v1_tx_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PendingPayload); 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{ @@ -1704,7 +1153,7 @@ func file_noble_orbiter_v1_tx_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_noble_orbiter_v1_tx_proto_rawDesc, NumEnums: 0, - NumMessages: 3, + NumMessages: 2, NumExtensions: 0, NumServices: 1, }, diff --git a/keeper/keeper.go b/keeper/keeper.go index e24fc77e..399c0b1a 100644 --- a/keeper/keeper.go +++ b/keeper/keeper.go @@ -63,7 +63,7 @@ type Keeper struct { adapter *adaptercomp.Adapter // pendingPayloads stores the pending payloads addressed by their keccak256 hash. - pendingPayloads collections.Map[[]byte, orbitertypes.PendingPayload] + pendingPayloads collections.Map[[]byte, core.PendingPayload] // PendingPayloadsSequence is the unique identifier of a given pending payload handled by the // orbiter. // @@ -99,12 +99,12 @@ func NewKeeper( core.PendingPayloadsSequencePrefix, core.PendingPayloadsSequenceName, ), - pendingPayloads: collections.NewMap[[]byte, orbitertypes.PendingPayload]( + pendingPayloads: collections.NewMap[[]byte, core.PendingPayload]( sb, core.PendingPayloadsPrefix, core.PendingPayloadsName, collections.BytesKey, - codec.CollValue[orbitertypes.PendingPayload](cdc), + codec.CollValue[core.PendingPayload](cdc), ), } diff --git a/keeper/state_handler.go b/keeper/state_handler.go index 2ed5e4aa..a1d97215 100644 --- a/keeper/state_handler.go +++ b/keeper/state_handler.go @@ -53,7 +53,7 @@ func (k *Keeper) AcceptPayload( return nil, errorsmod.Wrap(err, "failed to get next sequence number") } - pendingPayload := orbitertypes.PendingPayload{ + pendingPayload := core.PendingPayload{ Sequence: next, Payload: payload, } @@ -134,7 +134,7 @@ func (k *Keeper) validatePayloadAgainstState( func (k *Keeper) PendingPayload( ctx context.Context, hash []byte, -) (*orbitertypes.PendingPayload, error) { +) (*core.PendingPayload, error) { payload, err := k.pendingPayloads.Get(ctx, hash) if err != nil { return nil, errorsmod.Wrap(err, "pending payload not found") diff --git a/keeper/state_handler_test.go b/keeper/state_handler_test.go index ea16dc47..8d17e4d1 100644 --- a/keeper/state_handler_test.go +++ b/keeper/state_handler_test.go @@ -50,13 +50,13 @@ func TestAcceptPayload(t *testing.T) { testcases := []struct { name string setup func(*testing.T, context.Context, *orbiterkeeper.Keeper) - payload func() *orbitertypes.PendingPayload + payload func() *core.PendingPayload errContains string expHash string }{ { name: "success - valid payload", - payload: func() *orbitertypes.PendingPayload { return validPayload }, + payload: func() *core.PendingPayload { return validPayload }, expHash: expHash.String(), }, { @@ -72,7 +72,7 @@ func TestAcceptPayload(t *testing.T) { err = k.PendingPayloadsSequence.Set(ctx, seq) require.NoError(t, err, "failed to set pending payloads sequence") }, - payload: func() *orbitertypes.PendingPayload { return validPayload }, + payload: func() *core.PendingPayload { return validPayload }, errContains: "already registered", }, { @@ -83,7 +83,7 @@ func TestAcceptPayload(t *testing.T) { err := k.Executor().Pause(ctx, core.ACTION_FEE) require.NoError(t, err, "failed to pause fee action") }, - payload: func() *orbitertypes.PendingPayload { + payload: func() *core.PendingPayload { p := *validPayload preAction, err := core.NewAction(core.ACTION_FEE, &action.FeeAttributes{}) @@ -106,7 +106,7 @@ func TestAcceptPayload(t *testing.T) { err := k.Forwarder().Pause(ctx, core.PROTOCOL_CCTP, nil) require.NoError(t, err, "failed to unpause fee action") }, - payload: func() *orbitertypes.PendingPayload { + payload: func() *core.PendingPayload { p := *validPayload fw, err := forwarding.NewCCTPForwarding(destDomain, recipient, nil, nil) @@ -131,7 +131,7 @@ func TestAcceptPayload(t *testing.T) { err = k.Forwarder().Pause(ctx, core.PROTOCOL_CCTP, []string{cID}) require.NoError(t, err, "failed to unpause cross-chain forwarding") }, - payload: func() *orbitertypes.PendingPayload { + payload: func() *core.PendingPayload { p := *validPayload fw, err := forwarding.NewCCTPForwarding(destDomain, recipient, nil, nil) @@ -145,15 +145,15 @@ func TestAcceptPayload(t *testing.T) { }, { name: "error - nil payload", - payload: func() *orbitertypes.PendingPayload { - return &orbitertypes.PendingPayload{} + payload: func() *core.PendingPayload { + return &core.PendingPayload{} }, errContains: "invalid payload: payload is not set", }, { name: "error - invalid (empty) payload", - payload: func() *orbitertypes.PendingPayload { - return &orbitertypes.PendingPayload{Payload: &core.Payload{}} + payload: func() *core.PendingPayload { + return &core.PendingPayload{Payload: &core.Payload{}} }, errContains: "invalid payload: forwarding is not set", }, @@ -194,7 +194,7 @@ func TestGetPendingPayloadWithHash(t *testing.T) { name string setup func(*testing.T, context.Context, orbitertypes.PendingPayloadsHandler) hash []byte - expPayload *orbitertypes.PendingPayload + expPayload *core.PendingPayload errContains string }{ { @@ -365,7 +365,7 @@ func TestDifferentSequenceGeneratesDifferentHash(t *testing.T) { func createTestPendingPayloadWithSequence( t *testing.T, sequence uint64, -) *orbitertypes.PendingPayload { +) *core.PendingPayload { t.Helper() validForwarding, err := forwarding.NewCCTPForwarding( @@ -381,7 +381,7 @@ func createTestPendingPayloadWithSequence( Forwarding: validForwarding, } - return &orbitertypes.PendingPayload{ + return &core.PendingPayload{ Sequence: sequence, Payload: validPayload, } diff --git a/proto/noble/orbiter/core/v1/orbiter.proto b/proto/noble/orbiter/core/v1/orbiter.proto index cc6d2056..838a9add 100644 --- a/proto/noble/orbiter/core/v1/orbiter.proto +++ b/proto/noble/orbiter/core/v1/orbiter.proto @@ -74,3 +74,11 @@ message PayloadWrapper { // routing info and possibly pre routing actions. Payload orbiter = 1; } + +// PendingPayload holds the information that goes into the stored payload hash. +message PendingPayload { + // The sequence number of the pending payload. + uint64 sequence = 1; + // The submitted payload that will is registered as pending. + Payload payload = 2; +} diff --git a/proto/noble/orbiter/v1/tx.proto b/proto/noble/orbiter/v1/tx.proto index e7d9e2d0..20a0cb00 100644 --- a/proto/noble/orbiter/v1/tx.proto +++ b/proto/noble/orbiter/v1/tx.proto @@ -23,7 +23,7 @@ service Msg { // forwarding operations. message MsgSubmitPayload { option (cosmos.msg.v1.signer) = "signer"; - option (amino.name) = "noble/orbiter/v1/MsgAcceptPendingPayload"; + option (amino.name) = "noble/orbiter/v1/MsgSubmitPayload"; // The signer of the transaction. string signer = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; @@ -35,18 +35,9 @@ message MsgSubmitPayload { ]; } -// MsgSubmitPayloadResponse returns the sequence number of the registered +// MsgSubmitPayloadResponse returns the keccak256 of the registered +// pending payload. message MsgSubmitPayloadResponse { // The keccak256 hash by which to reference the submitted payload. bytes hash = 1; } - -// PendingPayload holds the information that goes into the stored payload hash. -// -// TODO: move to different file? hyperlane.proto or something? -message PendingPayload { - // The sequence number of the pending payload. - uint64 sequence = 1; - // The submitted payload that will is registered as pending. - noble.orbiter.core.v1.Payload payload = 2; -} diff --git a/simapp/orbiter.go b/simapp/orbiter.go index 834c2117..9adaf3f7 100644 --- a/simapp/orbiter.go +++ b/simapp/orbiter.go @@ -9,7 +9,7 @@ func (app *SimApp) RegisterOrbiterControllers() { Orbiters: app.OrbiterKeeper, BankKeeper: app.BankKeeper, CCTPKeeper: app.CCTPKeeper, - WarpKeeper: app.WarpKeeper, + WarpKeeper: &app.WarpKeeper, } orbiter.InjectComponents(in) diff --git a/types/component/adapter/interfaces.go b/types/component/adapter/interfaces.go index f64f1e60..5d8b340e 100644 --- a/types/component/adapter/interfaces.go +++ b/types/component/adapter/interfaces.go @@ -1,3 +1,23 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 adapter import ( diff --git a/types/core/orbiter.pb.go b/types/core/orbiter.pb.go index c22e01d5..98c2b8a2 100644 --- a/types/core/orbiter.pb.go +++ b/types/core/orbiter.pb.go @@ -230,11 +230,67 @@ func (m *PayloadWrapper) GetOrbiter() *Payload { return nil } +// PendingPayload holds the information that goes into the stored payload hash. +type PendingPayload struct { + // The sequence number of the pending payload. + Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` + // The submitted payload that will is registered as pending. + Payload *Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (m *PendingPayload) Reset() { *m = PendingPayload{} } +func (m *PendingPayload) String() string { return proto.CompactTextString(m) } +func (*PendingPayload) ProtoMessage() {} +func (*PendingPayload) Descriptor() ([]byte, []int) { + return fileDescriptor_24aab38bf890c9f2, []int{4} +} +func (m *PendingPayload) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PendingPayload) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PendingPayload.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 *PendingPayload) XXX_Merge(src proto.Message) { + xxx_messageInfo_PendingPayload.Merge(m, src) +} +func (m *PendingPayload) XXX_Size() int { + return m.Size() +} +func (m *PendingPayload) XXX_DiscardUnknown() { + xxx_messageInfo_PendingPayload.DiscardUnknown(m) +} + +var xxx_messageInfo_PendingPayload proto.InternalMessageInfo + +func (m *PendingPayload) GetSequence() uint64 { + if m != nil { + return m.Sequence + } + return 0 +} + +func (m *PendingPayload) GetPayload() *Payload { + if m != nil { + return m.Payload + } + return nil +} + func init() { proto.RegisterType((*Action)(nil), "noble.orbiter.core.v1.Action") proto.RegisterType((*Forwarding)(nil), "noble.orbiter.core.v1.Forwarding") proto.RegisterType((*Payload)(nil), "noble.orbiter.core.v1.Payload") proto.RegisterType((*PayloadWrapper)(nil), "noble.orbiter.core.v1.PayloadWrapper") + proto.RegisterType((*PendingPayload)(nil), "noble.orbiter.core.v1.PendingPayload") } func init() { @@ -242,36 +298,38 @@ func init() { } var fileDescriptor_24aab38bf890c9f2 = []byte{ - // 451 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x6a, 0x13, 0x41, - 0x18, 0xc7, 0x33, 0xa9, 0xb4, 0x30, 0x91, 0x1e, 0xc6, 0x0a, 0x69, 0xc1, 0x6d, 0x1a, 0x29, 0x44, - 0x21, 0x33, 0x34, 0x5e, 0xc4, 0x83, 0x90, 0x10, 0x84, 0x78, 0x2a, 0x7b, 0x11, 0xf4, 0xb0, 0xcc, - 0xee, 0x4e, 0x37, 0x03, 0xe9, 0x7e, 0xcb, 0xcc, 0xa4, 0x92, 0x37, 0xf0, 0xe0, 0xc1, 0x07, 0xf0, - 0xe0, 0x43, 0xf4, 0x21, 0xa4, 0xa7, 0x1e, 0x3d, 0x4a, 0x72, 0xf1, 0x31, 0x64, 0x67, 0x66, 0x37, - 0x11, 0x13, 0xf1, 0x36, 0xf3, 0x7d, 0xff, 0xef, 0xcf, 0xef, 0xff, 0xcd, 0xe0, 0xa7, 0x39, 0xc4, - 0x33, 0xc1, 0x40, 0xc5, 0xd2, 0x08, 0xc5, 0x12, 0x50, 0x82, 0xdd, 0x5c, 0x54, 0x77, 0x5a, 0x28, - 0x30, 0x40, 0x1e, 0x5b, 0x11, 0xad, 0x8a, 0xa5, 0x88, 0xde, 0x5c, 0x9c, 0x1c, 0x27, 0xa0, 0xaf, - 0x41, 0x47, 0x56, 0xc4, 0xdc, 0xc5, 0x4d, 0x9c, 0x1c, 0x65, 0x90, 0x81, 0xab, 0x97, 0x27, 0x5f, - 0x3d, 0xce, 0x00, 0xb2, 0x99, 0x60, 0xf6, 0x16, 0xcf, 0xaf, 0x18, 0xcf, 0x17, 0xbe, 0x15, 0x6c, - 0xe7, 0x90, 0xa9, 0xeb, 0x77, 0xbf, 0x22, 0xbc, 0x3f, 0x4c, 0x8c, 0x84, 0x9c, 0x30, 0xdc, 0x94, - 0x69, 0x1b, 0x75, 0x50, 0xef, 0x70, 0x70, 0x4a, 0xb7, 0xa2, 0x51, 0x27, 0x9d, 0x8c, 0xc3, 0xa6, - 0x4c, 0xc9, 0x07, 0x8c, 0xb9, 0x31, 0x4a, 0xc6, 0x73, 0x23, 0x74, 0xbb, 0xd9, 0x41, 0xbd, 0xd6, - 0xe0, 0x88, 0x3a, 0x16, 0x5a, 0xb1, 0xd0, 0x61, 0xbe, 0x18, 0x9d, 0xdf, 0xdd, 0xf6, 0xcf, 0xfe, - 0x74, 0xac, 0xcd, 0x86, 0xb5, 0x45, 0xb8, 0x61, 0xf7, 0xea, 0xc1, 0xa7, 0x6f, 0xa7, 0x8d, 0xee, - 0x2f, 0x84, 0xf1, 0x1b, 0x50, 0x1f, 0xb9, 0x4a, 0x65, 0x9e, 0x91, 0x11, 0x6e, 0x59, 0xdf, 0x04, - 0x66, 0x51, 0xcd, 0x7a, 0xb6, 0x83, 0xf5, 0xd2, 0x2b, 0x27, 0xe3, 0x10, 0x57, 0x53, 0x93, 0x94, - 0x44, 0xff, 0x4d, 0xfd, 0xec, 0xee, 0xb6, 0x7f, 0xfe, 0x17, 0xf5, 0x1a, 0x67, 0x3b, 0x39, 0x61, - 0xf8, 0x51, 0xc1, 0xb5, 0x36, 0x53, 0x05, 0xf3, 0x6c, 0x1a, 0x15, 0x7c, 0x31, 0x03, 0x9e, 0xb6, - 0xf7, 0x3a, 0xa8, 0xf7, 0x30, 0x24, 0x1b, 0xad, 0x4b, 0xd7, 0xf1, 0x51, 0x3f, 0x23, 0x7c, 0xe0, - 0x2b, 0xe4, 0x75, 0x99, 0x53, 0x44, 0xdc, 0x2e, 0x48, 0xb7, 0x51, 0x67, 0xaf, 0xd7, 0x1a, 0x3c, - 0xf9, 0xe7, 0x9b, 0x94, 0x19, 0x85, 0x3b, 0x6a, 0x32, 0xc4, 0xf8, 0xaa, 0xc6, 0xf4, 0x19, 0x77, - 0xad, 0x69, 0x9d, 0x27, 0xdc, 0x18, 0xea, 0xbe, 0xc5, 0x87, 0x9e, 0xe6, 0x9d, 0xe2, 0x45, 0x21, - 0x14, 0x79, 0x89, 0x0f, 0xfc, 0xac, 0x5d, 0x7c, 0x6b, 0x10, 0xec, 0x5a, 0xbc, 0x9b, 0x0b, 0x2b, - 0xf9, 0x68, 0xfc, 0x7d, 0x19, 0xa0, 0xfb, 0x65, 0x80, 0x7e, 0x2e, 0x03, 0xf4, 0x65, 0x15, 0x34, - 0xee, 0x57, 0x41, 0xe3, 0xc7, 0x2a, 0x68, 0xbc, 0x7f, 0x9e, 0x49, 0x33, 0x9d, 0xc7, 0x34, 0x81, - 0x6b, 0x66, 0xcd, 0xfa, 0x5c, 0x6b, 0x61, 0x74, 0xfd, 0x61, 0xcd, 0xa2, 0x10, 0xda, 0x7e, 0xdb, - 0x78, 0xdf, 0x3e, 0xce, 0x8b, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x35, 0x38, 0x44, 0x94, 0x5b, - 0x03, 0x00, 0x00, + // 484 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x41, 0x8b, 0xd3, 0x40, + 0x14, 0xc7, 0x3b, 0xdd, 0x65, 0x57, 0xa6, 0xd2, 0xc3, 0xb8, 0x42, 0xb7, 0x60, 0xb6, 0x5b, 0x59, + 0xa8, 0x42, 0x33, 0x6c, 0xbd, 0x88, 0x07, 0xa1, 0xa5, 0x08, 0xf5, 0x54, 0x72, 0x11, 0xf4, 0x10, + 0x26, 0xc9, 0x34, 0x0d, 0x74, 0xf3, 0xe2, 0xcc, 0x64, 0xa5, 0xdf, 0xc0, 0x83, 0x07, 0x3f, 0x80, + 0x07, 0x3f, 0xc4, 0x7e, 0x08, 0xd9, 0xd3, 0x1e, 0x3d, 0x4a, 0x7b, 0xf1, 0x63, 0x48, 0x66, 0x26, + 0xd9, 0x8a, 0xad, 0xf4, 0x36, 0xef, 0xbd, 0xff, 0xfb, 0xcf, 0xef, 0xbd, 0x64, 0xf0, 0xd3, 0x14, + 0x82, 0x05, 0xa7, 0x20, 0x82, 0x44, 0x71, 0x41, 0x43, 0x10, 0x9c, 0x5e, 0x5f, 0x96, 0xb1, 0x9b, + 0x09, 0x50, 0x40, 0x1e, 0x6b, 0x91, 0x5b, 0x26, 0x0b, 0x91, 0x7b, 0x7d, 0xd9, 0x3e, 0x0d, 0x41, + 0x5e, 0x81, 0xf4, 0xb5, 0x88, 0x9a, 0xc0, 0x74, 0xb4, 0x4f, 0x62, 0x88, 0xc1, 0xe4, 0x8b, 0x93, + 0xcd, 0x9e, 0xc6, 0x00, 0xf1, 0x82, 0x53, 0x1d, 0x05, 0xf9, 0x8c, 0xb2, 0x74, 0x69, 0x4b, 0xce, + 0x76, 0x8e, 0x24, 0x32, 0xf5, 0xee, 0x37, 0x84, 0x8f, 0x86, 0xa1, 0x4a, 0x20, 0x25, 0x14, 0xd7, + 0x93, 0xa8, 0x85, 0x3a, 0xa8, 0xd7, 0x1c, 0x9c, 0xb9, 0x5b, 0xd1, 0x5c, 0x23, 0x9d, 0x8c, 0xbd, + 0x7a, 0x12, 0x91, 0x0f, 0x18, 0x33, 0xa5, 0x44, 0x12, 0xe4, 0x8a, 0xcb, 0x56, 0xbd, 0x83, 0x7a, + 0x8d, 0xc1, 0x89, 0x6b, 0x58, 0xdc, 0x92, 0xc5, 0x1d, 0xa6, 0xcb, 0xd1, 0xc5, 0xed, 0x4d, 0xff, + 0xfc, 0x6f, 0xc7, 0xca, 0x6c, 0x58, 0x59, 0x78, 0x1b, 0x76, 0xaf, 0x0e, 0x3f, 0x7f, 0x3f, 0xab, + 0x75, 0x7f, 0x23, 0x8c, 0xdf, 0x80, 0xf8, 0xc4, 0x44, 0x94, 0xa4, 0x31, 0x19, 0xe1, 0x86, 0xf6, + 0x0d, 0x61, 0xe1, 0x57, 0xac, 0xe7, 0x3b, 0x58, 0xa7, 0x56, 0x39, 0x19, 0x7b, 0xb8, 0xec, 0x9a, + 0x44, 0xc4, 0xdf, 0x9b, 0xfa, 0xd9, 0xed, 0x4d, 0xff, 0xe2, 0x1f, 0xea, 0x7b, 0x9c, 0xed, 0xe4, + 0x84, 0xe2, 0x47, 0x19, 0x93, 0x52, 0xcd, 0x05, 0xe4, 0xf1, 0xdc, 0xcf, 0xd8, 0x72, 0x01, 0x2c, + 0x6a, 0x1d, 0x74, 0x50, 0xef, 0xa1, 0x47, 0x36, 0x4a, 0x53, 0x53, 0xb1, 0xa3, 0x7e, 0x41, 0xf8, + 0xd8, 0x66, 0xc8, 0xeb, 0x62, 0x4e, 0xee, 0x33, 0xbd, 0x20, 0xd9, 0x42, 0x9d, 0x83, 0x5e, 0x63, + 0xf0, 0xe4, 0xbf, 0xdf, 0xa4, 0x98, 0x91, 0x9b, 0xa3, 0x24, 0x43, 0x8c, 0x67, 0x15, 0xa6, 0x9d, + 0x71, 0xd7, 0x9a, 0xee, 0xe7, 0xf1, 0x36, 0x9a, 0xba, 0x6f, 0x71, 0xd3, 0xd2, 0xbc, 0x13, 0x2c, + 0xcb, 0xb8, 0x20, 0x2f, 0xf1, 0xb1, 0xed, 0xd5, 0x8b, 0x6f, 0x0c, 0x9c, 0x5d, 0x8b, 0x37, 0x7d, + 0x5e, 0x29, 0xef, 0xce, 0x70, 0x73, 0xca, 0xd3, 0xc2, 0xb6, 0x1c, 0xb0, 0x8d, 0x1f, 0x48, 0xfe, + 0x31, 0xe7, 0x69, 0xc8, 0xb5, 0xd9, 0xa1, 0x57, 0xc5, 0xc5, 0x3d, 0xe5, 0xce, 0xea, 0xfb, 0xdd, + 0x63, 0xe5, 0xa3, 0xf1, 0x8f, 0x95, 0x83, 0xee, 0x56, 0x0e, 0xfa, 0xb5, 0x72, 0xd0, 0xd7, 0xb5, + 0x53, 0xbb, 0x5b, 0x3b, 0xb5, 0x9f, 0x6b, 0xa7, 0xf6, 0xfe, 0x79, 0x9c, 0xa8, 0x79, 0x1e, 0xb8, + 0x21, 0x5c, 0x51, 0x6d, 0xd6, 0x67, 0x52, 0x72, 0x25, 0xab, 0x87, 0xa1, 0x96, 0x19, 0x97, 0xfa, + 0x79, 0x04, 0x47, 0xfa, 0x27, 0x78, 0xf1, 0x27, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x87, 0x28, 0x68, + 0xc3, 0x03, 0x00, 0x00, } func (m *Action) Marshal() (dAtA []byte, err error) { @@ -445,6 +503,46 @@ func (m *PayloadWrapper) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PendingPayload) 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 *PendingPayload) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PendingPayload) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Payload != nil { + { + size, err := m.Payload.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOrbiter(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Sequence != 0 { + i = encodeVarintOrbiter(dAtA, i, uint64(m.Sequence)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintOrbiter(dAtA []byte, offset int, v uint64) int { offset -= sovOrbiter(v) base := offset @@ -524,6 +622,22 @@ func (m *PayloadWrapper) Size() (n int) { return n } +func (m *PendingPayload) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Sequence != 0 { + n += 1 + sovOrbiter(uint64(m.Sequence)) + } + if m.Payload != nil { + l = m.Payload.Size() + n += 1 + l + sovOrbiter(uint64(l)) + } + return n +} + func sovOrbiter(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -980,6 +1094,111 @@ func (m *PayloadWrapper) Unmarshal(dAtA []byte) error { } return nil } +func (m *PendingPayload) 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 ErrIntOverflowOrbiter + } + 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: PendingPayload: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PendingPayload: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) + } + m.Sequence = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOrbiter + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Sequence |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOrbiter + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOrbiter + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOrbiter + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Payload == nil { + m.Payload = &Payload{} + } + if err := m.Payload.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOrbiter(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthOrbiter + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipOrbiter(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/types/payload.go b/types/core/payload.go similarity index 93% rename from types/payload.go rename to types/core/payload.go index b0987263..32ec4d1c 100644 --- a/types/payload.go +++ b/types/core/payload.go @@ -18,13 +18,11 @@ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND // TITLE. -package types +package core import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - - "github.com/noble-assets/orbiter/types/core" ) // Keccak256Hash returns the keccak 256 hash of the payload contents. @@ -41,7 +39,7 @@ func (p *PendingPayload) Keccak256Hash() (common.Hash, error) { // Validate checks that the pending payload contents are valid. func (p *PendingPayload) Validate() error { if p == nil { - return core.ErrNilPointer.Wrap("pending payload") + return ErrNilPointer.Wrap("pending payload") } return p.Payload.Validate() diff --git a/types/expected_keepers.go b/types/expected_keepers.go index 5deafec1..65041fc4 100644 --- a/types/expected_keepers.go +++ b/types/expected_keepers.go @@ -60,5 +60,5 @@ type BankKeeperAdapter interface { type PendingPayloadsHandler interface { AcceptPayload(ctx context.Context, payload *core.Payload) ([]byte, error) RemovePendingPayload(ctx context.Context, hash []byte) error - PendingPayload(ctx context.Context, hash []byte) (*PendingPayload, error) + PendingPayload(ctx context.Context, hash []byte) (*core.PendingPayload, error) } diff --git a/types/tx.pb.go b/types/tx.pb.go index 50fa29f5..f523f85f 100644 --- a/types/tx.pb.go +++ b/types/tx.pb.go @@ -88,7 +88,8 @@ func (m *MsgSubmitPayload) GetPayload() core.Payload { return core.Payload{} } -// MsgSubmitPayloadResponse returns the sequence number of the registered +// MsgSubmitPayloadResponse returns the keccak256 of the registered +// pending payload. type MsgSubmitPayloadResponse struct { // The keccak256 hash by which to reference the submitted payload. Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` @@ -134,99 +135,39 @@ func (m *MsgSubmitPayloadResponse) GetHash() []byte { return nil } -// PendingPayload holds the information that goes into the stored payload hash. -// -// TODO: move to different file? hyperlane.proto or something? -type PendingPayload struct { - // The sequence number of the pending payload. - Sequence uint64 `protobuf:"varint,1,opt,name=sequence,proto3" json:"sequence,omitempty"` - // The submitted payload that will is registered as pending. - Payload *core.Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` -} - -func (m *PendingPayload) Reset() { *m = PendingPayload{} } -func (m *PendingPayload) String() string { return proto.CompactTextString(m) } -func (*PendingPayload) ProtoMessage() {} -func (*PendingPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_4f89c0e5a76b9120, []int{2} -} -func (m *PendingPayload) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PendingPayload) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PendingPayload.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 *PendingPayload) XXX_Merge(src proto.Message) { - xxx_messageInfo_PendingPayload.Merge(m, src) -} -func (m *PendingPayload) XXX_Size() int { - return m.Size() -} -func (m *PendingPayload) XXX_DiscardUnknown() { - xxx_messageInfo_PendingPayload.DiscardUnknown(m) -} - -var xxx_messageInfo_PendingPayload proto.InternalMessageInfo - -func (m *PendingPayload) GetSequence() uint64 { - if m != nil { - return m.Sequence - } - return 0 -} - -func (m *PendingPayload) GetPayload() *core.Payload { - if m != nil { - return m.Payload - } - return nil -} - func init() { proto.RegisterType((*MsgSubmitPayload)(nil), "noble.orbiter.v1.MsgSubmitPayload") proto.RegisterType((*MsgSubmitPayloadResponse)(nil), "noble.orbiter.v1.MsgSubmitPayloadResponse") - proto.RegisterType((*PendingPayload)(nil), "noble.orbiter.v1.PendingPayload") } func init() { proto.RegisterFile("noble/orbiter/v1/tx.proto", fileDescriptor_4f89c0e5a76b9120) } var fileDescriptor_4f89c0e5a76b9120 = []byte{ - // 414 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x3d, 0xaf, 0xd3, 0x30, - 0x14, 0x8d, 0xe1, 0xf1, 0xe0, 0x99, 0x0f, 0x3d, 0xac, 0x27, 0x91, 0x97, 0x21, 0x3c, 0x05, 0x21, - 0x55, 0x91, 0xea, 0xd0, 0xb2, 0x54, 0x2c, 0xa8, 0x65, 0xae, 0x54, 0xa5, 0x1b, 0x4b, 0x95, 0x0f, - 0xe3, 0x46, 0x6a, 0xec, 0x90, 0xeb, 0x56, 0x74, 0x43, 0x8c, 0x4c, 0xfc, 0x0c, 0xc6, 0x0e, 0xfc, - 0x03, 0x96, 0x8e, 0x15, 0x13, 0x13, 0x42, 0xed, 0xd0, 0xbf, 0x81, 0xe2, 0xb8, 0x95, 0x52, 0x06, - 0xc4, 0x62, 0xf9, 0xfa, 0x9c, 0x7b, 0xae, 0xcf, 0xd1, 0xc5, 0xd7, 0x42, 0xc6, 0x33, 0x16, 0xc8, - 0x32, 0xce, 0x14, 0x2b, 0x83, 0x45, 0x27, 0x50, 0x1f, 0x68, 0x51, 0x4a, 0x25, 0xc9, 0xa5, 0x86, - 0xa8, 0x81, 0xe8, 0xa2, 0xe3, 0x3c, 0x8e, 0xf2, 0x4c, 0xc8, 0x40, 0x9f, 0x35, 0xc9, 0x79, 0x92, - 0x48, 0xc8, 0x25, 0x04, 0x39, 0xf0, 0xaa, 0x39, 0x07, 0x6e, 0x80, 0xeb, 0x1a, 0x98, 0xe8, 0x2a, - 0xa8, 0x0b, 0x03, 0x5d, 0x71, 0xc9, 0x65, 0xfd, 0x5e, 0xdd, 0xcc, 0xeb, 0xb3, 0xe6, 0x4f, 0x12, - 0x59, 0xb2, 0x4a, 0xf1, 0x30, 0x5e, 0x93, 0xbc, 0xef, 0x08, 0x5f, 0x0e, 0x81, 0x8f, 0xe7, 0x71, - 0x9e, 0xa9, 0x51, 0xb4, 0x9c, 0xc9, 0x28, 0x25, 0x2f, 0xf0, 0x39, 0x64, 0x5c, 0xb0, 0xd2, 0x46, - 0x37, 0xa8, 0x75, 0x31, 0xb0, 0x7f, 0x7c, 0x6b, 0x5f, 0x99, 0x89, 0xfd, 0x34, 0x2d, 0x19, 0xc0, - 0x58, 0x95, 0x99, 0xe0, 0xa1, 0xe1, 0x91, 0x37, 0xf8, 0x6e, 0x51, 0x37, 0xdb, 0xb7, 0x6e, 0x50, - 0xeb, 0x7e, 0xd7, 0xa5, 0x4d, 0xb3, 0xd5, 0x74, 0xba, 0xe8, 0x50, 0x33, 0x62, 0x70, 0xb1, 0xfe, - 0xf5, 0xd4, 0xfa, 0xba, 0x5f, 0xf9, 0x28, 0x3c, 0x74, 0xbe, 0xea, 0x7d, 0xda, 0xaf, 0x7c, 0xa3, - 0xf8, 0x79, 0xbf, 0xf2, 0x5b, 0x7f, 0x45, 0x39, 0x04, 0xde, 0x4f, 0x12, 0x56, 0xa8, 0x11, 0x13, - 0x69, 0x26, 0xb8, 0x51, 0xf3, 0x28, 0xb6, 0x4f, 0x4d, 0x84, 0x0c, 0x0a, 0x29, 0x80, 0x11, 0x82, - 0xcf, 0xa6, 0x11, 0x4c, 0xb5, 0x95, 0x07, 0xa1, 0xbe, 0x7b, 0xef, 0xf0, 0xa3, 0xa6, 0x02, 0x71, - 0xf0, 0x3d, 0x60, 0xef, 0xe7, 0x4c, 0x24, 0x4c, 0x33, 0xcf, 0xc2, 0x63, 0x4d, 0x7a, 0xff, 0x69, - 0xee, 0xe8, 0xa8, 0x9b, 0xe3, 0xdb, 0x43, 0xe0, 0x64, 0x82, 0x1f, 0x36, 0x03, 0xf6, 0xe8, 0xe9, - 0x2a, 0xd0, 0xd3, 0xff, 0x3b, 0xfe, 0xbf, 0x39, 0x07, 0x8f, 0xce, 0x9d, 0x8f, 0x55, 0x92, 0x83, - 0xd7, 0xeb, 0xad, 0x8b, 0x36, 0x5b, 0x17, 0xfd, 0xde, 0xba, 0xe8, 0xcb, 0xce, 0xb5, 0x36, 0x3b, - 0xd7, 0xfa, 0xb9, 0x73, 0xad, 0xb7, 0xcf, 0x79, 0xa6, 0xa6, 0xf3, 0x98, 0x26, 0x32, 0x0f, 0xb4, - 0x6c, 0x3b, 0x02, 0x60, 0x0a, 0x8e, 0xe1, 0xaa, 0x65, 0xc1, 0x20, 0x3e, 0xd7, 0x4b, 0xf1, 0xf2, - 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x74, 0x0e, 0x11, 0x43, 0xc5, 0x02, 0x00, 0x00, + // 370 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcb, 0x4f, 0xca, + 0x49, 0xd5, 0xcf, 0x2f, 0x4a, 0xca, 0x2c, 0x49, 0x2d, 0xd2, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, + 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x00, 0x4b, 0xe9, 0x41, 0xa5, 0xf4, 0xca, 0x0c, 0xa5, + 0x04, 0x13, 0x73, 0x33, 0xf3, 0xf2, 0xf5, 0xc1, 0x24, 0x44, 0x91, 0x94, 0x78, 0x72, 0x7e, 0x71, + 0x6e, 0x7e, 0xb1, 0x7e, 0x6e, 0x71, 0x3a, 0x48, 0x73, 0x6e, 0x71, 0x3a, 0x54, 0x42, 0x12, 0x22, + 0x11, 0x0f, 0xe6, 0xe9, 0x43, 0x38, 0x50, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, 0x88, 0x38, 0x88, + 0x05, 0x15, 0x55, 0x46, 0x75, 0x49, 0x72, 0x7e, 0x51, 0x2a, 0xc8, 0x44, 0x98, 0xf5, 0x60, 0x45, + 0x4a, 0x7b, 0x18, 0xb9, 0x04, 0x7c, 0x8b, 0xd3, 0x83, 0x4b, 0x93, 0x72, 0x33, 0x4b, 0x02, 0x12, + 0x2b, 0x73, 0xf2, 0x13, 0x53, 0x84, 0x0c, 0xb8, 0xd8, 0x8a, 0x33, 0xd3, 0xf3, 0x52, 0x8b, 0x24, + 0x18, 0x15, 0x18, 0x35, 0x38, 0x9d, 0x24, 0x2e, 0x6d, 0xd1, 0x15, 0x81, 0xda, 0xe8, 0x98, 0x92, + 0x52, 0x94, 0x5a, 0x5c, 0x1c, 0x5c, 0x52, 0x94, 0x99, 0x97, 0x1e, 0x04, 0x55, 0x27, 0xe4, 0xcc, + 0xc5, 0x5e, 0x00, 0xd1, 0x2c, 0xc1, 0xa4, 0xc0, 0xa8, 0xc1, 0x6d, 0x24, 0xa7, 0x87, 0xea, 0x59, + 0x90, 0xed, 0x7a, 0x65, 0x86, 0x7a, 0x50, 0x2b, 0x9c, 0x38, 0x4f, 0xdc, 0x93, 0x67, 0x58, 0xf1, + 0x7c, 0x83, 0x16, 0x63, 0x10, 0x4c, 0xa7, 0x95, 0x61, 0xd3, 0xf3, 0x0d, 0x5a, 0x50, 0x13, 0xbb, + 0x9e, 0x6f, 0xd0, 0x52, 0xc4, 0x08, 0x4a, 0x74, 0x97, 0x2a, 0xe9, 0x71, 0x49, 0xa0, 0x8b, 0x05, + 0xa5, 0x16, 0x17, 0xe4, 0xe7, 0x15, 0xa7, 0x0a, 0x09, 0x71, 0xb1, 0x64, 0x24, 0x16, 0x67, 0x80, + 0xfd, 0xc0, 0x13, 0x04, 0x66, 0x1b, 0xe5, 0x72, 0x31, 0xfb, 0x16, 0xa7, 0x0b, 0xc5, 0x73, 0xf1, + 0xa2, 0xfa, 0x58, 0x49, 0x0f, 0x3d, 0x6e, 0xf4, 0xd0, 0xcd, 0x95, 0xd2, 0x22, 0xac, 0x06, 0x66, + 0xb7, 0x14, 0x6b, 0x03, 0xc8, 0x6b, 0x4e, 0xf6, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, + 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, + 0xc7, 0x10, 0xa5, 0x9a, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x36, + 0x56, 0x37, 0xb1, 0xb8, 0x38, 0xb5, 0xa4, 0x18, 0xee, 0xdb, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, + 0x36, 0x70, 0x2c, 0x19, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x9d, 0x29, 0x97, 0x56, 0x02, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -384,46 +325,6 @@ func (m *MsgSubmitPayloadResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *PendingPayload) 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 *PendingPayload) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PendingPayload) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Payload != nil { - { - size, err := m.Payload.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.Sequence != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.Sequence)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -463,22 +364,6 @@ func (m *MsgSubmitPayloadResponse) Size() (n int) { return n } -func (m *PendingPayload) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Sequence != 0 { - n += 1 + sovTx(uint64(m.Sequence)) - } - if m.Payload != nil { - l = m.Payload.Size() - n += 1 + l + sovTx(uint64(l)) - } - return n -} - func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -684,111 +569,6 @@ func (m *MsgSubmitPayloadResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *PendingPayload) 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: PendingPayload: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PendingPayload: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Sequence", wireType) - } - m.Sequence = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Sequence |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Payload == nil { - m.Payload = &core.Payload{} - } - if err := m.Payload.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - 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 skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From 825458e41cacc6ef1bbf5fc599a9e00326da5a72 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Mon, 6 Oct 2025 14:21:09 +0200 Subject: [PATCH 26/34] remove outdated todos --- controller/adapter/hyperlane.go | 1 - controller/forwarding/hyperlane.go | 5 ++--- depinject.go | 3 --- keeper/state_handler.go | 2 -- 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/controller/adapter/hyperlane.go b/controller/adapter/hyperlane.go index be119e1f..0cf78e38 100644 --- a/controller/adapter/hyperlane.go +++ b/controller/adapter/hyperlane.go @@ -59,7 +59,6 @@ type HyperlaneAdapter struct { func NewHyperlaneAdapter( logger log.Logger, payloadsHandler orbitertypes.PendingPayloadsHandler, - // TODO: move interface definition in this package hyperlaneCoreKeeper adaptertypes.HyperlaneCoreKeeper, hyperlaneWarpKeeper adaptertypes.HyperlaneWarpKeeper, ) (*HyperlaneAdapter, error) { diff --git a/controller/forwarding/hyperlane.go b/controller/forwarding/hyperlane.go index 58bd0e97..560bec02 100644 --- a/controller/forwarding/hyperlane.go +++ b/controller/forwarding/hyperlane.go @@ -40,12 +40,11 @@ import ( var _ types.ForwardingController = &HyperlaneController{} // HyperlaneController is the forwarding controller for the Hyperlane protocol. -// -// TODO: implement hyperlane interfaces here instead of the main keeper type HyperlaneController struct { *controller.BaseController[core.ProtocolID] - logger log.Logger + logger log.Logger + handler forwardingtypes.HyperlaneHandler } diff --git a/depinject.go b/depinject.go index d13e092a..14281c23 100644 --- a/depinject.go +++ b/depinject.go @@ -64,9 +64,6 @@ type ModuleInputs struct { StoreService store.KVStoreService BankKeeper types.BankKeeper - - // TODO: use abstracted interfaces - CoreKeeper *hyperlanecorekeeper.Keeper } type ModuleOutputs struct { diff --git a/keeper/state_handler.go b/keeper/state_handler.go index a1d97215..b5a7d356 100644 --- a/keeper/state_handler.go +++ b/keeper/state_handler.go @@ -129,8 +129,6 @@ func (k *Keeper) validatePayloadAgainstState( // PendingPayload returns the pending payload with the given hash // if it is found in the module storage. -// -// TODO: move into own abstraction type (Hyperlane state handler or smth.?) func (k *Keeper) PendingPayload( ctx context.Context, hash []byte, From 2ef35858641b7366a9abb4973df2021c7a5cb913 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Mon, 6 Oct 2025 19:01:45 +0200 Subject: [PATCH 27/34] add event emitting and tests --- api/v1/tx.pulsar.go | 1185 ++++++++++++++++++++++++++++++- keeper/msg_server.go | 6 +- keeper/msg_server_test.go | 78 ++ keeper/state_handler.go | 46 +- keeper/state_handler_test.go | 77 +- proto/noble/orbiter/v1/tx.proto | 19 + types/core/errors.go | 2 + types/tx.pb.go | 475 ++++++++++++- 8 files changed, 1813 insertions(+), 75 deletions(-) create mode 100644 keeper/msg_server_test.go diff --git a/api/v1/tx.pulsar.go b/api/v1/tx.pulsar.go index bb211b9d..548f9e9b 100644 --- a/api/v1/tx.pulsar.go +++ b/api/v1/tx.pulsar.go @@ -938,6 +938,993 @@ func (x *fastReflection_MsgSubmitPayloadResponse) ProtoMethods() *protoiface.Met } } +var ( + md_EventPayloadSubmitted protoreflect.MessageDescriptor + fd_EventPayloadSubmitted_hash protoreflect.FieldDescriptor + fd_EventPayloadSubmitted_submitter protoreflect.FieldDescriptor + fd_EventPayloadSubmitted_payload protoreflect.FieldDescriptor +) + +func init() { + file_noble_orbiter_v1_tx_proto_init() + md_EventPayloadSubmitted = File_noble_orbiter_v1_tx_proto.Messages().ByName("EventPayloadSubmitted") + fd_EventPayloadSubmitted_hash = md_EventPayloadSubmitted.Fields().ByName("hash") + fd_EventPayloadSubmitted_submitter = md_EventPayloadSubmitted.Fields().ByName("submitter") + fd_EventPayloadSubmitted_payload = md_EventPayloadSubmitted.Fields().ByName("payload") +} + +var _ protoreflect.Message = (*fastReflection_EventPayloadSubmitted)(nil) + +type fastReflection_EventPayloadSubmitted EventPayloadSubmitted + +func (x *EventPayloadSubmitted) ProtoReflect() protoreflect.Message { + return (*fastReflection_EventPayloadSubmitted)(x) +} + +func (x *EventPayloadSubmitted) slowProtoReflect() protoreflect.Message { + mi := &file_noble_orbiter_v1_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_EventPayloadSubmitted_messageType fastReflection_EventPayloadSubmitted_messageType +var _ protoreflect.MessageType = fastReflection_EventPayloadSubmitted_messageType{} + +type fastReflection_EventPayloadSubmitted_messageType struct{} + +func (x fastReflection_EventPayloadSubmitted_messageType) Zero() protoreflect.Message { + return (*fastReflection_EventPayloadSubmitted)(nil) +} +func (x fastReflection_EventPayloadSubmitted_messageType) New() protoreflect.Message { + return new(fastReflection_EventPayloadSubmitted) +} +func (x fastReflection_EventPayloadSubmitted_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_EventPayloadSubmitted +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_EventPayloadSubmitted) Descriptor() protoreflect.MessageDescriptor { + return md_EventPayloadSubmitted +} + +// 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_EventPayloadSubmitted) Type() protoreflect.MessageType { + return _fastReflection_EventPayloadSubmitted_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_EventPayloadSubmitted) New() protoreflect.Message { + return new(fastReflection_EventPayloadSubmitted) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_EventPayloadSubmitted) Interface() protoreflect.ProtoMessage { + return (*EventPayloadSubmitted)(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_EventPayloadSubmitted) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Hash) != 0 { + value := protoreflect.ValueOfBytes(x.Hash) + if !f(fd_EventPayloadSubmitted_hash, value) { + return + } + } + if x.Submitter != "" { + value := protoreflect.ValueOfString(x.Submitter) + if !f(fd_EventPayloadSubmitted_submitter, value) { + return + } + } + if x.Payload != nil { + value := protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) + if !f(fd_EventPayloadSubmitted_payload, 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_EventPayloadSubmitted) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadSubmitted.hash": + return len(x.Hash) != 0 + case "noble.orbiter.v1.EventPayloadSubmitted.submitter": + return x.Submitter != "" + case "noble.orbiter.v1.EventPayloadSubmitted.payload": + return x.Payload != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadSubmitted")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadSubmitted 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_EventPayloadSubmitted) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadSubmitted.hash": + x.Hash = nil + case "noble.orbiter.v1.EventPayloadSubmitted.submitter": + x.Submitter = "" + case "noble.orbiter.v1.EventPayloadSubmitted.payload": + x.Payload = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadSubmitted")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadSubmitted 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_EventPayloadSubmitted) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "noble.orbiter.v1.EventPayloadSubmitted.hash": + value := x.Hash + return protoreflect.ValueOfBytes(value) + case "noble.orbiter.v1.EventPayloadSubmitted.submitter": + value := x.Submitter + return protoreflect.ValueOfString(value) + case "noble.orbiter.v1.EventPayloadSubmitted.payload": + value := x.Payload + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadSubmitted")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadSubmitted 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_EventPayloadSubmitted) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadSubmitted.hash": + x.Hash = value.Bytes() + case "noble.orbiter.v1.EventPayloadSubmitted.submitter": + x.Submitter = value.Interface().(string) + case "noble.orbiter.v1.EventPayloadSubmitted.payload": + x.Payload = value.Message().Interface().(*v1.Payload) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadSubmitted")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadSubmitted 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_EventPayloadSubmitted) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadSubmitted.payload": + if x.Payload == nil { + x.Payload = new(v1.Payload) + } + return protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) + case "noble.orbiter.v1.EventPayloadSubmitted.hash": + panic(fmt.Errorf("field hash of message noble.orbiter.v1.EventPayloadSubmitted is not mutable")) + case "noble.orbiter.v1.EventPayloadSubmitted.submitter": + panic(fmt.Errorf("field submitter of message noble.orbiter.v1.EventPayloadSubmitted is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadSubmitted")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadSubmitted 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_EventPayloadSubmitted) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadSubmitted.hash": + return protoreflect.ValueOfBytes(nil) + case "noble.orbiter.v1.EventPayloadSubmitted.submitter": + return protoreflect.ValueOfString("") + case "noble.orbiter.v1.EventPayloadSubmitted.payload": + m := new(v1.Payload) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadSubmitted")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadSubmitted 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_EventPayloadSubmitted) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in noble.orbiter.v1.EventPayloadSubmitted", 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_EventPayloadSubmitted) 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_EventPayloadSubmitted) 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_EventPayloadSubmitted) 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_EventPayloadSubmitted) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*EventPayloadSubmitted) + 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.Hash) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.Submitter) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.Payload != nil { + l = options.Size(x.Payload) + 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().(*EventPayloadSubmitted) + 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 x.Payload != nil { + encoded, err := options.Marshal(x.Payload) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x1a + } + if len(x.Submitter) > 0 { + i -= len(x.Submitter) + copy(dAtA[i:], x.Submitter) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Submitter))) + i-- + dAtA[i] = 0x12 + } + if len(x.Hash) > 0 { + i -= len(x.Hash) + copy(dAtA[i:], x.Hash) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Hash))) + 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().(*EventPayloadSubmitted) + 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: EventPayloadSubmitted: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventPayloadSubmitted: 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 Hash", 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.Hash = append(x.Hash[:0], dAtA[iNdEx:postIndex]...) + if x.Hash == nil { + x.Hash = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Submitter", wireType) + } + var stringLen 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++ + stringLen |= uint64(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.Submitter = 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 Payload", wireType) + } + var msglen 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++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + 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 + } + if x.Payload == nil { + x.Payload = &v1.Payload{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Payload); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + 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_EventPayloadRemoved protoreflect.MessageDescriptor + fd_EventPayloadRemoved_hash protoreflect.FieldDescriptor +) + +func init() { + file_noble_orbiter_v1_tx_proto_init() + md_EventPayloadRemoved = File_noble_orbiter_v1_tx_proto.Messages().ByName("EventPayloadRemoved") + fd_EventPayloadRemoved_hash = md_EventPayloadRemoved.Fields().ByName("hash") +} + +var _ protoreflect.Message = (*fastReflection_EventPayloadRemoved)(nil) + +type fastReflection_EventPayloadRemoved EventPayloadRemoved + +func (x *EventPayloadRemoved) ProtoReflect() protoreflect.Message { + return (*fastReflection_EventPayloadRemoved)(x) +} + +func (x *EventPayloadRemoved) slowProtoReflect() protoreflect.Message { + mi := &file_noble_orbiter_v1_tx_proto_msgTypes[3] + 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_EventPayloadRemoved_messageType fastReflection_EventPayloadRemoved_messageType +var _ protoreflect.MessageType = fastReflection_EventPayloadRemoved_messageType{} + +type fastReflection_EventPayloadRemoved_messageType struct{} + +func (x fastReflection_EventPayloadRemoved_messageType) Zero() protoreflect.Message { + return (*fastReflection_EventPayloadRemoved)(nil) +} +func (x fastReflection_EventPayloadRemoved_messageType) New() protoreflect.Message { + return new(fastReflection_EventPayloadRemoved) +} +func (x fastReflection_EventPayloadRemoved_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_EventPayloadRemoved +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_EventPayloadRemoved) Descriptor() protoreflect.MessageDescriptor { + return md_EventPayloadRemoved +} + +// 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_EventPayloadRemoved) Type() protoreflect.MessageType { + return _fastReflection_EventPayloadRemoved_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_EventPayloadRemoved) New() protoreflect.Message { + return new(fastReflection_EventPayloadRemoved) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_EventPayloadRemoved) Interface() protoreflect.ProtoMessage { + return (*EventPayloadRemoved)(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_EventPayloadRemoved) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Hash) != 0 { + value := protoreflect.ValueOfBytes(x.Hash) + if !f(fd_EventPayloadRemoved_hash, 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_EventPayloadRemoved) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadRemoved.hash": + return len(x.Hash) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadRemoved")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadRemoved 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_EventPayloadRemoved) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadRemoved.hash": + x.Hash = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadRemoved")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadRemoved 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_EventPayloadRemoved) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "noble.orbiter.v1.EventPayloadRemoved.hash": + value := x.Hash + return protoreflect.ValueOfBytes(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadRemoved")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadRemoved 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_EventPayloadRemoved) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadRemoved.hash": + x.Hash = value.Bytes() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadRemoved")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadRemoved 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_EventPayloadRemoved) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadRemoved.hash": + panic(fmt.Errorf("field hash of message noble.orbiter.v1.EventPayloadRemoved is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadRemoved")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadRemoved 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_EventPayloadRemoved) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.EventPayloadRemoved.hash": + return protoreflect.ValueOfBytes(nil) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.EventPayloadRemoved")) + } + panic(fmt.Errorf("message noble.orbiter.v1.EventPayloadRemoved 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_EventPayloadRemoved) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in noble.orbiter.v1.EventPayloadRemoved", 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_EventPayloadRemoved) 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_EventPayloadRemoved) 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_EventPayloadRemoved) 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_EventPayloadRemoved) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*EventPayloadRemoved) + 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.Hash) + 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().(*EventPayloadRemoved) + 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.Hash) > 0 { + i -= len(x.Hash) + copy(dAtA[i:], x.Hash) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Hash))) + 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().(*EventPayloadRemoved) + 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: EventPayloadRemoved: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventPayloadRemoved: 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 Hash", 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.Hash = append(x.Hash[:0], dAtA[iNdEx:postIndex]...) + if x.Hash == nil { + x.Hash = []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, + } +} + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.0 @@ -1036,6 +2023,98 @@ func (x *MsgSubmitPayloadResponse) GetHash() []byte { return nil } +// EventPayloadSubmitted is emitted after successful submission of a payload. +type EventPayloadSubmitted struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The keccak256 hash of the now pending payload. + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + // The address that has submitted the payload. + Submitter string `protobuf:"bytes,2,opt,name=submitter,proto3" json:"submitter,omitempty"` + // The submitted payload. + Payload *v1.Payload `protobuf:"bytes,3,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *EventPayloadSubmitted) Reset() { + *x = EventPayloadSubmitted{} + if protoimpl.UnsafeEnabled { + mi := &file_noble_orbiter_v1_tx_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventPayloadSubmitted) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventPayloadSubmitted) ProtoMessage() {} + +// Deprecated: Use EventPayloadSubmitted.ProtoReflect.Descriptor instead. +func (*EventPayloadSubmitted) Descriptor() ([]byte, []int) { + return file_noble_orbiter_v1_tx_proto_rawDescGZIP(), []int{2} +} + +func (x *EventPayloadSubmitted) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *EventPayloadSubmitted) GetSubmitter() string { + if x != nil { + return x.Submitter + } + return "" +} + +func (x *EventPayloadSubmitted) GetPayload() *v1.Payload { + if x != nil { + return x.Payload + } + return nil +} + +// EventPayloadRemoved is emitted after removing a pending payload from the queue. +type EventPayloadRemoved struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The keccak256 hash of the removed payload. + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` +} + +func (x *EventPayloadRemoved) Reset() { + *x = EventPayloadRemoved{} + if protoimpl.UnsafeEnabled { + mi := &file_noble_orbiter_v1_tx_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventPayloadRemoved) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventPayloadRemoved) ProtoMessage() {} + +// Deprecated: Use EventPayloadRemoved.ProtoReflect.Descriptor instead. +func (*EventPayloadRemoved) Descriptor() ([]byte, []int) { + return file_noble_orbiter_v1_tx_proto_rawDescGZIP(), []int{3} +} + +func (x *EventPayloadRemoved) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + var File_noble_orbiter_v1_tx_proto protoreflect.FileDescriptor var file_noble_orbiter_v1_tx_proto_rawDesc = []byte{ @@ -1058,33 +2137,46 @@ var file_noble_orbiter_v1_tx_proto_rawDesc = []byte{ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, - + 0x2a, 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x31, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x21, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2e, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x32, 0x6d, - 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x5f, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, - 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, - 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x2a, 0x2e, 0x6e, 0x6f, 0x62, - 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, - 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, - 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, - 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, - 0x62, 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, - 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, - 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, - 0x31, 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, - 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, - 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, - 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, - 0x6f, 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0xa8, + 0x01, 0x0a, 0x15, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, + 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, + 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x29, 0x0a, 0x13, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x32, 0x6d, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x5f, 0x0a, 0x0d, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x6e, + 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x1a, 0x2a, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, + 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, + 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, 0x62, + 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x72, + 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x58, 0xaa, 0x02, 0x10, + 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, + 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, + 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, + 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, 0x69, + 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1099,21 +2191,24 @@ func file_noble_orbiter_v1_tx_proto_rawDescGZIP() []byte { return file_noble_orbiter_v1_tx_proto_rawDescData } -var file_noble_orbiter_v1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_noble_orbiter_v1_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_noble_orbiter_v1_tx_proto_goTypes = []interface{}{ (*MsgSubmitPayload)(nil), // 0: noble.orbiter.v1.MsgSubmitPayload (*MsgSubmitPayloadResponse)(nil), // 1: noble.orbiter.v1.MsgSubmitPayloadResponse - (*v1.Payload)(nil), // 2: noble.orbiter.core.v1.Payload + (*EventPayloadSubmitted)(nil), // 2: noble.orbiter.v1.EventPayloadSubmitted + (*EventPayloadRemoved)(nil), // 3: noble.orbiter.v1.EventPayloadRemoved + (*v1.Payload)(nil), // 4: noble.orbiter.core.v1.Payload } var file_noble_orbiter_v1_tx_proto_depIdxs = []int32{ - 2, // 0: noble.orbiter.v1.MsgSubmitPayload.payload:type_name -> noble.orbiter.core.v1.Payload - 0, // 1: noble.orbiter.v1.Msg.SubmitPayload:input_type -> noble.orbiter.v1.MsgSubmitPayload - 1, // 2: noble.orbiter.v1.Msg.SubmitPayload:output_type -> noble.orbiter.v1.MsgSubmitPayloadResponse - 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 + 4, // 0: noble.orbiter.v1.MsgSubmitPayload.payload:type_name -> noble.orbiter.core.v1.Payload + 4, // 1: noble.orbiter.v1.EventPayloadSubmitted.payload:type_name -> noble.orbiter.core.v1.Payload + 0, // 2: noble.orbiter.v1.Msg.SubmitPayload:input_type -> noble.orbiter.v1.MsgSubmitPayload + 1, // 3: noble.orbiter.v1.Msg.SubmitPayload:output_type -> noble.orbiter.v1.MsgSubmitPayloadResponse + 3, // [3:4] is the sub-list for method output_type + 2, // [2:3] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } func init() { file_noble_orbiter_v1_tx_proto_init() } @@ -1146,6 +2241,30 @@ func file_noble_orbiter_v1_tx_proto_init() { return nil } } + file_noble_orbiter_v1_tx_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventPayloadSubmitted); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_noble_orbiter_v1_tx_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventPayloadRemoved); 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{ @@ -1153,7 +2272,7 @@ func file_noble_orbiter_v1_tx_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_noble_orbiter_v1_tx_proto_rawDesc, NumEnums: 0, - NumMessages: 2, + NumMessages: 4, NumExtensions: 0, NumServices: 1, }, diff --git a/keeper/msg_server.go b/keeper/msg_server.go index 7f8b3839..39306da9 100644 --- a/keeper/msg_server.go +++ b/keeper/msg_server.go @@ -23,12 +23,14 @@ package keeper import ( "context" - errorsmod "cosmossdk.io/errors" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" orbitertypes "github.com/noble-assets/orbiter/types" + "github.com/noble-assets/orbiter/types/core" ) +var _ orbitertypes.MsgServer = &Keeper{} + func (k *Keeper) SubmitPayload( ctx context.Context, req *orbitertypes.MsgSubmitPayload, @@ -42,7 +44,7 @@ func (k *Keeper) SubmitPayload( &req.Payload, ) if err != nil { - return nil, errorsmod.Wrap(err, "failed to accept payload") + return nil, core.ErrSubmitPayload.Wrap(err.Error()) } return &orbitertypes.MsgSubmitPayloadResponse{ diff --git a/keeper/msg_server_test.go b/keeper/msg_server_test.go new file mode 100644 index 00000000..ce133f04 --- /dev/null +++ b/keeper/msg_server_test.go @@ -0,0 +1,78 @@ +package keeper_test + +import ( + "context" + "testing" + + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" + + orbiterkeeper "github.com/noble-assets/orbiter/keeper" + mockorbiter "github.com/noble-assets/orbiter/testutil/mocks/orbiter" + orbitertypes "github.com/noble-assets/orbiter/types" + "github.com/noble-assets/orbiter/types/core" +) + +func TestSubmitPayload(t *testing.T) { + seq := uint64(0) + validPayload := createTestPendingPayloadWithSequence(t, seq) + + expHash, err := validPayload.Keccak256Hash() + require.NoError(t, err, "failed to hash payload") + + testcases := []struct { + name string + setup func(*testing.T, context.Context, *orbiterkeeper.Keeper) + payload *core.Payload + errContains string + expHash string + }{ + { + name: "success - valid payload", + payload: validPayload.Payload, + expHash: expHash.String(), + }, + { + name: "error - invalid (empty) payload", + payload: &core.Payload{}, + errContains: "forwarding is not set: invalid nil pointer", + }, + { + name: "error - hash already set", + setup: func(t *testing.T, ctx context.Context, k *orbiterkeeper.Keeper) { + t.Helper() + + preSeq, err := k.PendingPayloadsSequence.Peek(ctx) + require.NoError(t, err, "failed to get current payloads sequence") + + _, err = k.AcceptPayload(ctx, validPayload.Payload) + require.NoError(t, err, "failed to accept payload") + + // NOTE: we're resetting the nonce here to get the exact same hash bytes + require.NoError(t, k.PendingPayloadsSequence.Set(ctx, preSeq)) + }, + payload: validPayload.Payload, + errContains: core.ErrSubmitPayload.Error(), + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + ctx, _, k := mockorbiter.OrbiterKeeper(t) + + if tc.setup != nil { + tc.setup(t, ctx, k) + } + + res, err := k.SubmitPayload(ctx, &orbitertypes.MsgSubmitPayload{ + Payload: *tc.payload, + }) + if tc.errContains == "" { + require.NoError(t, err, "failed to accept payload") + require.Equal(t, tc.expHash, ethcommon.BytesToHash(res.Hash).String()) + } else { + require.ErrorContains(t, err, tc.errContains, "expected different error") + } + }) + } +} diff --git a/keeper/state_handler.go b/keeper/state_handler.go index b5a7d356..acb49e61 100644 --- a/keeper/state_handler.go +++ b/keeper/state_handler.go @@ -26,6 +26,8 @@ import ( "errors" "fmt" + ethcommon "github.com/ethereum/go-ethereum/common" + errorsmod "cosmossdk.io/errors" orbitertypes "github.com/noble-assets/orbiter/types" @@ -63,7 +65,9 @@ func (k *Keeper) AcceptPayload( return nil, err } - found, err := k.pendingPayloads.Has(ctx, hash.Bytes()) + hashBz := hash.Bytes() + + found, err := k.pendingPayloads.Has(ctx, hashBz) if err != nil { return nil, errorsmod.Wrap(err, "failed to check pending payloads") } @@ -76,7 +80,21 @@ func (k *Keeper) AcceptPayload( k.Logger().Debug("payload registered", "hash", hash.String(), "payload", payload.String()) - return hash.Bytes(), k.pendingPayloads.Set(ctx, hash.Bytes(), pendingPayload) + if err = k.pendingPayloads.Set(ctx, hashBz, pendingPayload); err != nil { + return nil, errorsmod.Wrap(err, "failed to set pending payload") + } + + if err = k.eventService.EventManager(ctx).Emit( + ctx, + &orbitertypes.EventPayloadSubmitted{ + Hash: hashBz, + Payload: *payload, + }, + ); err != nil { + return nil, errorsmod.Wrap(err, "failed to emit payload submitted event") + } + + return hashBz, nil } // validatePayloadAgainstState checks if the payload is valid with respect @@ -153,7 +171,27 @@ func (k *Keeper) RemovePendingPayload( ctx context.Context, hash []byte, ) error { - k.Logger().Debug("completing payload", "hash", hex.EncodeToString(hash)) + found, err := k.pendingPayloads.Has(ctx, hash) + if err != nil { + return errorsmod.Wrap(err, "failed to check pending payloads") + } - return k.pendingPayloads.Remove(ctx, hash) + if !found { + return fmt.Errorf("payload with hash %s not found", ethcommon.BytesToHash(hash).Hex()) + } + + if err = k.pendingPayloads.Remove(ctx, hash); err != nil { + return core.ErrRemovePayload.Wrap(err.Error()) + } + + k.Logger().Debug("removed pending payload", "hash", hex.EncodeToString(hash)) + + if err = k.eventService.EventManager(ctx).Emit( + ctx, + &orbitertypes.EventPayloadRemoved{Hash: hash}, + ); err != nil { + return errorsmod.Wrap(err, "failed to emit remove pending payload event") + } + + return nil } diff --git a/keeper/state_handler_test.go b/keeper/state_handler_test.go index 8d17e4d1..e0c9353e 100644 --- a/keeper/state_handler_test.go +++ b/keeper/state_handler_test.go @@ -22,6 +22,8 @@ package keeper_test import ( "context" + "fmt" + "strings" "testing" ethcommon "github.com/ethereum/go-ethereum/common" @@ -37,8 +39,6 @@ import ( ) func TestAcceptPayload(t *testing.T) { - t.Parallel() - seq := uint64(0) destDomain := uint32(1) recipient := testutil.RandomBytes(32) @@ -143,26 +143,17 @@ func TestAcceptPayload(t *testing.T) { }, errContains: "cross-chain paused", }, - { - name: "error - nil payload", - payload: func() *core.PendingPayload { - return &core.PendingPayload{} - }, - errContains: "invalid payload: payload is not set", - }, { name: "error - invalid (empty) payload", payload: func() *core.PendingPayload { return &core.PendingPayload{Payload: &core.Payload{}} }, - errContains: "invalid payload: forwarding is not set", + errContains: "forwarding is not set: invalid nil pointer", }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { - t.Parallel() - ctx, _, k := mockorbiter.OrbiterKeeper(t) if tc.setup != nil { @@ -171,11 +162,25 @@ func TestAcceptPayload(t *testing.T) { pendingPayload := tc.payload() - hash, err := k.AcceptPayload(ctx, pendingPayload.Payload) - + gotHash, err := k.AcceptPayload(ctx, pendingPayload.Payload) if tc.errContains == "" { require.NoError(t, err, "failed to accept payload") - require.Equal(t, tc.expHash, ethcommon.BytesToHash(hash).String()) + + // ASSERT: expected hash returned + require.Equal(t, tc.expHash, ethcommon.BytesToHash(gotHash).String()) + + // ASSERT: expected event emitted + events := ctx.EventManager().Events() + require.Len(t, events, 1, "expected 1 event, got %d", len(events)) + + found := false + for _, e := range events { + if strings.Contains(e.Type, "EventPayloadSubmitted") { + require.False(t, found, "expected event to be emitted just once") + found = true + } + } + require.True(t, found, "expected event payload submitted to be found") } else { require.ErrorContains(t, err, tc.errContains, "expected different error") } @@ -238,7 +243,7 @@ func TestGetPendingPayloadWithHash(t *testing.T) { } } -func TestCompletePayload(t *testing.T) { +func TestRemovePayload(t *testing.T) { t.Parallel() validPayload := createTestPendingPayloadWithSequence(t, 0) @@ -270,14 +275,16 @@ func TestCompletePayload(t *testing.T) { hash: expHash.Bytes(), }, { - name: "no-op - valid payload but not found in store", - setup: nil, - hash: expHash.Bytes(), + name: "error - valid payload but not found in store", + setup: nil, + hash: expHash.Bytes(), + errContains: fmt.Sprintf("payload with hash %s not found", expHash.Hex()), }, { - name: "no-op - nil hash", - setup: nil, - hash: nil, + name: "error - nil hash", + setup: nil, + hash: nil, + errContains: fmt.Sprintf("payload with hash %s not found", ethcommon.Hash{}.Hex()), }, } @@ -293,11 +300,23 @@ func TestCompletePayload(t *testing.T) { err = k.RemovePendingPayload(ctx, tc.hash) if tc.errContains == "" { - require.NoError(t, err, "failed to complete payload") + require.NoError(t, err, "failed to remove payload") + // ASSERT: value with hash was removed. gotPayload, err := k.PendingPayload(ctx, tc.hash) require.Error(t, err, "payload should not be present anymore") require.Nil(t, gotPayload, "expected nil payload") + + // ASSERT: event was emitted. + found := false + for _, event := range ctx.EventManager().ABCIEvents() { + if strings.Contains(event.Type, "EventPayloadRemoved") { + require.False(t, found, "event should only be emitted once") + + found = true + } + } + require.True(t, found, "expected event to be emitted") } else { require.ErrorContains(t, err, tc.errContains, "expected different error") } @@ -347,12 +366,13 @@ func TestSubsequentSubmissions(t *testing.T) { func TestDifferentSequenceGeneratesDifferentHash(t *testing.T) { // ACT: Generate pending payload with sequence 1 - validForwarding := createTestPendingPayloadWithSequence(t, 1) + seq := uint64(1) + validForwarding := createTestPendingPayloadWithSequence(t, seq) expHash, err := validForwarding.Keccak256Hash() require.NoError(t, err, "failed to hash payload") // ACT: Generate pending payload with sequence 2 - validForwarding2 := createTestPendingPayloadWithSequence(t, 1) + validForwarding2 := createTestPendingPayloadWithSequence(t, seq+1) expHash2, err := validForwarding2.Keccak256Hash() require.NoError(t, err, "failed to hash payload") @@ -368,10 +388,13 @@ func createTestPendingPayloadWithSequence( ) *core.PendingPayload { t.Helper() + recipient := make([]byte, 32) + copy(recipient[32-3:], []byte{1, 2, 3}) + validForwarding, err := forwarding.NewCCTPForwarding( 0, - testutil.RandomBytes(32), - testutil.RandomBytes(32), + recipient, + recipient, nil, ) require.NoError(t, err, "failed to create valid forwarding") diff --git a/proto/noble/orbiter/v1/tx.proto b/proto/noble/orbiter/v1/tx.proto index 20a0cb00..7493f744 100644 --- a/proto/noble/orbiter/v1/tx.proto +++ b/proto/noble/orbiter/v1/tx.proto @@ -41,3 +41,22 @@ message MsgSubmitPayloadResponse { // The keccak256 hash by which to reference the submitted payload. bytes hash = 1; } + +// EventPayloadSubmitted is emitted after successful submission of a payload. +message EventPayloadSubmitted { + // The keccak256 hash of the now pending payload. + bytes hash = 1; + // The address that has submitted the payload. + string submitter = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + // The submitted payload. + noble.orbiter.core.v1.Payload payload = 3 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; +} + +// EventPayloadRemoved is emitted after removing a pending payload from the queue. +message EventPayloadRemoved { + // The keccak256 hash of the removed payload. + bytes hash = 1; +} diff --git a/types/core/errors.go b/types/core/errors.go index f4679851..b1049d2d 100644 --- a/types/core/errors.go +++ b/types/core/errors.go @@ -33,4 +33,6 @@ var ( ErrUnableToPause = errorsmod.Register(ModuleName, 8, "unable to pause") ErrUnableToUnpause = errorsmod.Register(ModuleName, 9, "unable to unpause") ErrAlreadySet = errorsmod.Register(ModuleName, 10, "value already set") + ErrSubmitPayload = errorsmod.Register(ModuleName, 11, "payload submission failed") + ErrRemovePayload = errorsmod.Register(ModuleName, 12, "payload removal failed") ) diff --git a/types/tx.pb.go b/types/tx.pb.go index f523f85f..7c02a962 100644 --- a/types/tx.pb.go +++ b/types/tx.pb.go @@ -135,15 +135,127 @@ func (m *MsgSubmitPayloadResponse) GetHash() []byte { return nil } +// EventPayloadSubmitted is emitted after successful submission of a payload. +type EventPayloadSubmitted struct { + // The keccak256 hash of the now pending payload. + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + // The address that has submitted the payload. + Submitter string `protobuf:"bytes,2,opt,name=submitter,proto3" json:"submitter,omitempty"` + // The submitted payload. + Payload core.Payload `protobuf:"bytes,3,opt,name=payload,proto3" json:"payload"` +} + +func (m *EventPayloadSubmitted) Reset() { *m = EventPayloadSubmitted{} } +func (m *EventPayloadSubmitted) String() string { return proto.CompactTextString(m) } +func (*EventPayloadSubmitted) ProtoMessage() {} +func (*EventPayloadSubmitted) Descriptor() ([]byte, []int) { + return fileDescriptor_4f89c0e5a76b9120, []int{2} +} +func (m *EventPayloadSubmitted) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventPayloadSubmitted) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventPayloadSubmitted.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 *EventPayloadSubmitted) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventPayloadSubmitted.Merge(m, src) +} +func (m *EventPayloadSubmitted) XXX_Size() int { + return m.Size() +} +func (m *EventPayloadSubmitted) XXX_DiscardUnknown() { + xxx_messageInfo_EventPayloadSubmitted.DiscardUnknown(m) +} + +var xxx_messageInfo_EventPayloadSubmitted proto.InternalMessageInfo + +func (m *EventPayloadSubmitted) GetHash() []byte { + if m != nil { + return m.Hash + } + return nil +} + +func (m *EventPayloadSubmitted) GetSubmitter() string { + if m != nil { + return m.Submitter + } + return "" +} + +func (m *EventPayloadSubmitted) GetPayload() core.Payload { + if m != nil { + return m.Payload + } + return core.Payload{} +} + +// EventPayloadRemoved is emitted after removing a pending payload from the queue. +type EventPayloadRemoved struct { + // The keccak256 hash of the removed payload. + Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` +} + +func (m *EventPayloadRemoved) Reset() { *m = EventPayloadRemoved{} } +func (m *EventPayloadRemoved) String() string { return proto.CompactTextString(m) } +func (*EventPayloadRemoved) ProtoMessage() {} +func (*EventPayloadRemoved) Descriptor() ([]byte, []int) { + return fileDescriptor_4f89c0e5a76b9120, []int{3} +} +func (m *EventPayloadRemoved) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventPayloadRemoved) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventPayloadRemoved.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 *EventPayloadRemoved) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventPayloadRemoved.Merge(m, src) +} +func (m *EventPayloadRemoved) XXX_Size() int { + return m.Size() +} +func (m *EventPayloadRemoved) XXX_DiscardUnknown() { + xxx_messageInfo_EventPayloadRemoved.DiscardUnknown(m) +} + +var xxx_messageInfo_EventPayloadRemoved proto.InternalMessageInfo + +func (m *EventPayloadRemoved) GetHash() []byte { + if m != nil { + return m.Hash + } + return nil +} + func init() { proto.RegisterType((*MsgSubmitPayload)(nil), "noble.orbiter.v1.MsgSubmitPayload") proto.RegisterType((*MsgSubmitPayloadResponse)(nil), "noble.orbiter.v1.MsgSubmitPayloadResponse") + proto.RegisterType((*EventPayloadSubmitted)(nil), "noble.orbiter.v1.EventPayloadSubmitted") + proto.RegisterType((*EventPayloadRemoved)(nil), "noble.orbiter.v1.EventPayloadRemoved") } func init() { proto.RegisterFile("noble/orbiter/v1/tx.proto", fileDescriptor_4f89c0e5a76b9120) } var fileDescriptor_4f89c0e5a76b9120 = []byte{ - // 370 bytes of a gzipped FileDescriptorProto + // 424 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcb, 0x4f, 0xca, 0x49, 0xd5, 0xcf, 0x2f, 0x4a, 0xca, 0x2c, 0x49, 0x2d, 0xd2, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x00, 0x4b, 0xe9, 0x41, 0xa5, 0xf4, 0xca, 0x0c, 0xa5, @@ -160,14 +272,17 @@ var fileDescriptor_4f89c0e5a76b9120 = []byte{ 0x7c, 0x83, 0x16, 0x63, 0x10, 0x4c, 0xa7, 0x95, 0x61, 0xd3, 0xf3, 0x0d, 0x5a, 0x50, 0x13, 0xbb, 0x9e, 0x6f, 0xd0, 0x52, 0xc4, 0x08, 0x4a, 0x74, 0x97, 0x2a, 0xe9, 0x71, 0x49, 0xa0, 0x8b, 0x05, 0xa5, 0x16, 0x17, 0xe4, 0xe7, 0x15, 0xa7, 0x0a, 0x09, 0x71, 0xb1, 0x64, 0x24, 0x16, 0x67, 0x80, - 0xfd, 0xc0, 0x13, 0x04, 0x66, 0x1b, 0xe5, 0x72, 0x31, 0xfb, 0x16, 0xa7, 0x0b, 0xc5, 0x73, 0xf1, - 0xa2, 0xfa, 0x58, 0x49, 0x0f, 0x3d, 0x6e, 0xf4, 0xd0, 0xcd, 0x95, 0xd2, 0x22, 0xac, 0x06, 0x66, - 0xb7, 0x14, 0x6b, 0x03, 0xc8, 0x6b, 0x4e, 0xf6, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, - 0xf8, 0xe0, 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, - 0xc7, 0x10, 0xa5, 0x9a, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x36, - 0x56, 0x37, 0xb1, 0xb8, 0x38, 0xb5, 0xa4, 0x18, 0xee, 0xdb, 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, - 0x36, 0x70, 0x2c, 0x19, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x9d, 0x29, 0x97, 0x56, 0x02, - 0x00, 0x00, + 0xfd, 0xc0, 0x13, 0x04, 0x66, 0x2b, 0xad, 0x60, 0xe4, 0x12, 0x75, 0x2d, 0x4b, 0xcd, 0x83, 0x29, + 0x86, 0xe8, 0x2c, 0x49, 0x4d, 0xc1, 0xa6, 0x5a, 0xc8, 0x8c, 0x8b, 0xb3, 0x18, 0xaa, 0xa0, 0x08, + 0xec, 0x2f, 0x7c, 0x41, 0x81, 0x50, 0x8a, 0x1c, 0x1a, 0xcc, 0xe4, 0x86, 0x86, 0x92, 0x26, 0x97, + 0x30, 0xb2, 0x4b, 0x83, 0x52, 0x73, 0xf3, 0xcb, 0xb0, 0xbb, 0xd3, 0x28, 0x97, 0x8b, 0xd9, 0xb7, + 0x38, 0x5d, 0x28, 0x9e, 0x8b, 0x17, 0x35, 0x1e, 0x95, 0xf4, 0xd0, 0x53, 0x9c, 0x1e, 0x7a, 0x68, + 0x49, 0x69, 0x11, 0x56, 0x03, 0x0b, 0x51, 0x29, 0xd6, 0x06, 0x90, 0x13, 0x9d, 0xec, 0x4f, 0x3c, + 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, + 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x35, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, + 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6c, 0xac, 0x6e, 0x62, 0x71, 0x71, 0x6a, 0x49, 0x31, 0x3c, 0x0e, + 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x69, 0xcf, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, + 0x5d, 0x7e, 0xab, 0x4d, 0x2c, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -325,6 +440,83 @@ func (m *MsgSubmitPayloadResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } +func (m *EventPayloadSubmitted) 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 *EventPayloadSubmitted) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventPayloadSubmitted) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Payload.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.Submitter) > 0 { + i -= len(m.Submitter) + copy(dAtA[i:], m.Submitter) + i = encodeVarintTx(dAtA, i, uint64(len(m.Submitter))) + i-- + dAtA[i] = 0x12 + } + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTx(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *EventPayloadRemoved) 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 *EventPayloadRemoved) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventPayloadRemoved) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Hash) > 0 { + i -= len(m.Hash) + copy(dAtA[i:], m.Hash) + i = encodeVarintTx(dAtA, i, uint64(len(m.Hash))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -364,6 +556,38 @@ func (m *MsgSubmitPayloadResponse) Size() (n int) { return n } +func (m *EventPayloadSubmitted) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Submitter) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Payload.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *EventPayloadRemoved) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hash) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -569,6 +793,239 @@ func (m *MsgSubmitPayloadResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *EventPayloadSubmitted) 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: EventPayloadSubmitted: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventPayloadSubmitted: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", 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.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Submitter", 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.Submitter = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Payload.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + 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 *EventPayloadRemoved) 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: EventPayloadRemoved: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventPayloadRemoved: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", 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.Hash = append(m.Hash[:0], dAtA[iNdEx:postIndex]...) + if m.Hash == nil { + m.Hash = []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 skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From 8ef10f6f20c8493146c7dc997cb1662d1d8010cc Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Tue, 7 Oct 2025 15:09:47 +0200 Subject: [PATCH 28/34] add pending payloads query --- api/v1/query.pulsar.go | 1209 +++++++++++++++++++++++++++- api/v1/query_grpc.pb.go | 51 +- keeper/query_server.go | 37 + keeper/query_server_test.go | 76 ++ proto/noble/orbiter/v1/query.proto | 24 +- types/query.pb.go | 605 +++++++++++++- types/query.pb.gw.go | 171 ++++ 7 files changed, 2133 insertions(+), 40 deletions(-) create mode 100644 keeper/query_server.go create mode 100644 keeper/query_server_test.go create mode 100644 types/query.pb.gw.go diff --git a/api/v1/query.pulsar.go b/api/v1/query.pulsar.go index 6695c8be..80087124 100644 --- a/api/v1/query.pulsar.go +++ b/api/v1/query.pulsar.go @@ -2,11 +2,1013 @@ package orbiterv1 import ( + v1beta1 "cosmossdk.io/api/cosmos/base/query/v1beta1" + _ "cosmossdk.io/api/cosmos/query/v1" + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + _ "google.golang.org/genproto/googleapis/api/annotations" 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_QueryPendingPayloadsRequest protoreflect.MessageDescriptor + fd_QueryPendingPayloadsRequest_pagination protoreflect.FieldDescriptor +) + +func init() { + file_noble_orbiter_v1_query_proto_init() + md_QueryPendingPayloadsRequest = File_noble_orbiter_v1_query_proto.Messages().ByName("QueryPendingPayloadsRequest") + fd_QueryPendingPayloadsRequest_pagination = md_QueryPendingPayloadsRequest.Fields().ByName("pagination") +} + +var _ protoreflect.Message = (*fastReflection_QueryPendingPayloadsRequest)(nil) + +type fastReflection_QueryPendingPayloadsRequest QueryPendingPayloadsRequest + +func (x *QueryPendingPayloadsRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryPendingPayloadsRequest)(x) +} + +func (x *QueryPendingPayloadsRequest) slowProtoReflect() protoreflect.Message { + mi := &file_noble_orbiter_v1_query_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_QueryPendingPayloadsRequest_messageType fastReflection_QueryPendingPayloadsRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryPendingPayloadsRequest_messageType{} + +type fastReflection_QueryPendingPayloadsRequest_messageType struct{} + +func (x fastReflection_QueryPendingPayloadsRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryPendingPayloadsRequest)(nil) +} +func (x fastReflection_QueryPendingPayloadsRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryPendingPayloadsRequest) +} +func (x fastReflection_QueryPendingPayloadsRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryPendingPayloadsRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryPendingPayloadsRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryPendingPayloadsRequest +} + +// 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_QueryPendingPayloadsRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryPendingPayloadsRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryPendingPayloadsRequest) New() protoreflect.Message { + return new(fastReflection_QueryPendingPayloadsRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryPendingPayloadsRequest) Interface() protoreflect.ProtoMessage { + return (*QueryPendingPayloadsRequest)(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_QueryPendingPayloadsRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Pagination != nil { + value := protoreflect.ValueOfMessage(x.Pagination.ProtoReflect()) + if !f(fd_QueryPendingPayloadsRequest_pagination, 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_QueryPendingPayloadsRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsRequest.pagination": + return x.Pagination != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsRequest")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsRequest 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_QueryPendingPayloadsRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsRequest.pagination": + x.Pagination = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsRequest")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsRequest 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_QueryPendingPayloadsRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsRequest.pagination": + value := x.Pagination + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsRequest")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsRequest 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_QueryPendingPayloadsRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsRequest.pagination": + x.Pagination = value.Message().Interface().(*v1beta1.PageRequest) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsRequest")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsRequest 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_QueryPendingPayloadsRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsRequest.pagination": + if x.Pagination == nil { + x.Pagination = new(v1beta1.PageRequest) + } + return protoreflect.ValueOfMessage(x.Pagination.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsRequest")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsRequest 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_QueryPendingPayloadsRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsRequest.pagination": + m := new(v1beta1.PageRequest) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsRequest")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsRequest 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_QueryPendingPayloadsRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in noble.orbiter.v1.QueryPendingPayloadsRequest", 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_QueryPendingPayloadsRequest) 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_QueryPendingPayloadsRequest) 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_QueryPendingPayloadsRequest) 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_QueryPendingPayloadsRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryPendingPayloadsRequest) + 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.Pagination != nil { + l = options.Size(x.Pagination) + 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().(*QueryPendingPayloadsRequest) + 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 x.Pagination != nil { + encoded, err := options.Marshal(x.Pagination) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + 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().(*QueryPendingPayloadsRequest) + 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: QueryPendingPayloadsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryPendingPayloadsRequest: 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 Pagination", wireType) + } + var msglen 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++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + 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 + } + if x.Pagination == nil { + x.Pagination = &v1beta1.PageRequest{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Pagination); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + 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 _ protoreflect.List = (*_QueryPendingPayloadsResponse_1_list)(nil) + +type _QueryPendingPayloadsResponse_1_list struct { + list *[]string +} + +func (x *_QueryPendingPayloadsResponse_1_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_QueryPendingPayloadsResponse_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfString((*x.list)[i]) +} + +func (x *_QueryPendingPayloadsResponse_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_QueryPendingPayloadsResponse_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_QueryPendingPayloadsResponse_1_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message QueryPendingPayloadsResponse at list field Hashes as it is not of Message kind")) +} + +func (x *_QueryPendingPayloadsResponse_1_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_QueryPendingPayloadsResponse_1_list) NewElement() protoreflect.Value { + v := "" + return protoreflect.ValueOfString(v) +} + +func (x *_QueryPendingPayloadsResponse_1_list) IsValid() bool { + return x.list != nil +} + +var ( + md_QueryPendingPayloadsResponse protoreflect.MessageDescriptor + fd_QueryPendingPayloadsResponse_hashes protoreflect.FieldDescriptor + fd_QueryPendingPayloadsResponse_pagination protoreflect.FieldDescriptor +) + +func init() { + file_noble_orbiter_v1_query_proto_init() + md_QueryPendingPayloadsResponse = File_noble_orbiter_v1_query_proto.Messages().ByName("QueryPendingPayloadsResponse") + fd_QueryPendingPayloadsResponse_hashes = md_QueryPendingPayloadsResponse.Fields().ByName("hashes") + fd_QueryPendingPayloadsResponse_pagination = md_QueryPendingPayloadsResponse.Fields().ByName("pagination") +} + +var _ protoreflect.Message = (*fastReflection_QueryPendingPayloadsResponse)(nil) + +type fastReflection_QueryPendingPayloadsResponse QueryPendingPayloadsResponse + +func (x *QueryPendingPayloadsResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryPendingPayloadsResponse)(x) +} + +func (x *QueryPendingPayloadsResponse) slowProtoReflect() protoreflect.Message { + mi := &file_noble_orbiter_v1_query_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_QueryPendingPayloadsResponse_messageType fastReflection_QueryPendingPayloadsResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryPendingPayloadsResponse_messageType{} + +type fastReflection_QueryPendingPayloadsResponse_messageType struct{} + +func (x fastReflection_QueryPendingPayloadsResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryPendingPayloadsResponse)(nil) +} +func (x fastReflection_QueryPendingPayloadsResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryPendingPayloadsResponse) +} +func (x fastReflection_QueryPendingPayloadsResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryPendingPayloadsResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryPendingPayloadsResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryPendingPayloadsResponse +} + +// 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_QueryPendingPayloadsResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryPendingPayloadsResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryPendingPayloadsResponse) New() protoreflect.Message { + return new(fastReflection_QueryPendingPayloadsResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryPendingPayloadsResponse) Interface() protoreflect.ProtoMessage { + return (*QueryPendingPayloadsResponse)(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_QueryPendingPayloadsResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Hashes) != 0 { + value := protoreflect.ValueOfList(&_QueryPendingPayloadsResponse_1_list{list: &x.Hashes}) + if !f(fd_QueryPendingPayloadsResponse_hashes, value) { + return + } + } + if x.Pagination != nil { + value := protoreflect.ValueOfMessage(x.Pagination.ProtoReflect()) + if !f(fd_QueryPendingPayloadsResponse_pagination, 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_QueryPendingPayloadsResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsResponse.hashes": + return len(x.Hashes) != 0 + case "noble.orbiter.v1.QueryPendingPayloadsResponse.pagination": + return x.Pagination != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsResponse 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_QueryPendingPayloadsResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsResponse.hashes": + x.Hashes = nil + case "noble.orbiter.v1.QueryPendingPayloadsResponse.pagination": + x.Pagination = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsResponse 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_QueryPendingPayloadsResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsResponse.hashes": + if len(x.Hashes) == 0 { + return protoreflect.ValueOfList(&_QueryPendingPayloadsResponse_1_list{}) + } + listValue := &_QueryPendingPayloadsResponse_1_list{list: &x.Hashes} + return protoreflect.ValueOfList(listValue) + case "noble.orbiter.v1.QueryPendingPayloadsResponse.pagination": + value := x.Pagination + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsResponse 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_QueryPendingPayloadsResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsResponse.hashes": + lv := value.List() + clv := lv.(*_QueryPendingPayloadsResponse_1_list) + x.Hashes = *clv.list + case "noble.orbiter.v1.QueryPendingPayloadsResponse.pagination": + x.Pagination = value.Message().Interface().(*v1beta1.PageResponse) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsResponse 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_QueryPendingPayloadsResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsResponse.hashes": + if x.Hashes == nil { + x.Hashes = []string{} + } + value := &_QueryPendingPayloadsResponse_1_list{list: &x.Hashes} + return protoreflect.ValueOfList(value) + case "noble.orbiter.v1.QueryPendingPayloadsResponse.pagination": + if x.Pagination == nil { + x.Pagination = new(v1beta1.PageResponse) + } + return protoreflect.ValueOfMessage(x.Pagination.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsResponse 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_QueryPendingPayloadsResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "noble.orbiter.v1.QueryPendingPayloadsResponse.hashes": + list := []string{} + return protoreflect.ValueOfList(&_QueryPendingPayloadsResponse_1_list{list: &list}) + case "noble.orbiter.v1.QueryPendingPayloadsResponse.pagination": + m := new(v1beta1.PageResponse) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.QueryPendingPayloadsResponse")) + } + panic(fmt.Errorf("message noble.orbiter.v1.QueryPendingPayloadsResponse 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_QueryPendingPayloadsResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in noble.orbiter.v1.QueryPendingPayloadsResponse", 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_QueryPendingPayloadsResponse) 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_QueryPendingPayloadsResponse) 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_QueryPendingPayloadsResponse) 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_QueryPendingPayloadsResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryPendingPayloadsResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if len(x.Hashes) > 0 { + for _, s := range x.Hashes { + l = len(s) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.Pagination != nil { + l = options.Size(x.Pagination) + 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().(*QueryPendingPayloadsResponse) + 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 x.Pagination != nil { + encoded, err := options.Marshal(x.Pagination) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x12 + } + if len(x.Hashes) > 0 { + for iNdEx := len(x.Hashes) - 1; iNdEx >= 0; iNdEx-- { + i -= len(x.Hashes[iNdEx]) + copy(dAtA[i:], x.Hashes[iNdEx]) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Hashes[iNdEx]))) + 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().(*QueryPendingPayloadsResponse) + 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: QueryPendingPayloadsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryPendingPayloadsResponse: 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 Hashes", wireType) + } + var stringLen 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++ + stringLen |= uint64(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.Hashes = append(x.Hashes, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen 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++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + 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 + } + if x.Pagination == nil { + x.Pagination = &v1beta1.PageResponse{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Pagination); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + 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, + } +} + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.27.0 @@ -20,35 +1022,169 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type QueryPendingPayloadsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // pagination defines an optional pagination for the request. + Pagination *v1beta1.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (x *QueryPendingPayloadsRequest) Reset() { + *x = QueryPendingPayloadsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_noble_orbiter_v1_query_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryPendingPayloadsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryPendingPayloadsRequest) ProtoMessage() {} + +// Deprecated: Use QueryPendingPayloadsRequest.ProtoReflect.Descriptor instead. +func (*QueryPendingPayloadsRequest) Descriptor() ([]byte, []int) { + return file_noble_orbiter_v1_query_proto_rawDescGZIP(), []int{0} +} + +func (x *QueryPendingPayloadsRequest) GetPagination() *v1beta1.PageRequest { + if x != nil { + return x.Pagination + } + return nil +} + +type QueryPendingPayloadsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Hex-formatted hashes of the currently pending payloads + Hashes []string `protobuf:"bytes,1,rep,name=hashes,proto3" json:"hashes,omitempty"` + // pagination defines the pagination in the response. + Pagination *v1beta1.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (x *QueryPendingPayloadsResponse) Reset() { + *x = QueryPendingPayloadsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_noble_orbiter_v1_query_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryPendingPayloadsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryPendingPayloadsResponse) ProtoMessage() {} + +// Deprecated: Use QueryPendingPayloadsResponse.ProtoReflect.Descriptor instead. +func (*QueryPendingPayloadsResponse) Descriptor() ([]byte, []int) { + return file_noble_orbiter_v1_query_proto_rawDescGZIP(), []int{1} +} + +func (x *QueryPendingPayloadsResponse) GetHashes() []string { + if x != nil { + return x.Hashes + } + return nil +} + +func (x *QueryPendingPayloadsResponse) GetPagination() *v1beta1.PageResponse { + if x != nil { + return x.Pagination + } + return nil +} + var File_noble_orbiter_v1_query_proto protoreflect.FileDescriptor var file_noble_orbiter_v1_query_proto_rawDesc = []byte{ 0x0a, 0x1c, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x32, 0x07, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0xc4, 0x01, 0x0a, 0x14, 0x63, 0x6f, - 0x6d, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, - 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, - 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, - 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, 0x31, - 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, - 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, - 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, - 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x6f, - 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var file_noble_orbiter_v1_query_proto_goTypes = []interface{}{} + 0x1a, 0x2a, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x65, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7f, + 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, + 0xab, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x2d, 0x2e, + 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6e, + 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x88, 0xe7, + 0xb0, 0x2a, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, + 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x42, 0xc4, 0x01, + 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, + 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, + 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, + 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x72, 0x62, 0x69, 0x74, + 0x65, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x6f, 0x62, + 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, + 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x1c, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x12, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_noble_orbiter_v1_query_proto_rawDescOnce sync.Once + file_noble_orbiter_v1_query_proto_rawDescData = file_noble_orbiter_v1_query_proto_rawDesc +) + +func file_noble_orbiter_v1_query_proto_rawDescGZIP() []byte { + file_noble_orbiter_v1_query_proto_rawDescOnce.Do(func() { + file_noble_orbiter_v1_query_proto_rawDescData = protoimpl.X.CompressGZIP(file_noble_orbiter_v1_query_proto_rawDescData) + }) + return file_noble_orbiter_v1_query_proto_rawDescData +} + +var file_noble_orbiter_v1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_noble_orbiter_v1_query_proto_goTypes = []interface{}{ + (*QueryPendingPayloadsRequest)(nil), // 0: noble.orbiter.v1.QueryPendingPayloadsRequest + (*QueryPendingPayloadsResponse)(nil), // 1: noble.orbiter.v1.QueryPendingPayloadsResponse + (*v1beta1.PageRequest)(nil), // 2: cosmos.base.query.v1beta1.PageRequest + (*v1beta1.PageResponse)(nil), // 3: cosmos.base.query.v1beta1.PageResponse +} var file_noble_orbiter_v1_query_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 + 2, // 0: noble.orbiter.v1.QueryPendingPayloadsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 3, // 1: noble.orbiter.v1.QueryPendingPayloadsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 0, // 2: noble.orbiter.v1.Query.PendingPayloads:input_type -> noble.orbiter.v1.QueryPendingPayloadsRequest + 1, // 3: noble.orbiter.v1.Query.PendingPayloads:output_type -> noble.orbiter.v1.QueryPendingPayloadsResponse + 3, // [3:4] is the sub-list for method output_type + 2, // [2:3] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } func init() { file_noble_orbiter_v1_query_proto_init() } @@ -56,18 +1192,45 @@ func file_noble_orbiter_v1_query_proto_init() { if File_noble_orbiter_v1_query_proto != nil { return } + if !protoimpl.UnsafeEnabled { + file_noble_orbiter_v1_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryPendingPayloadsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_noble_orbiter_v1_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryPendingPayloadsResponse); 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_noble_orbiter_v1_query_proto_rawDesc, NumEnums: 0, - NumMessages: 0, + NumMessages: 2, NumExtensions: 0, NumServices: 1, }, GoTypes: file_noble_orbiter_v1_query_proto_goTypes, DependencyIndexes: file_noble_orbiter_v1_query_proto_depIdxs, + MessageInfos: file_noble_orbiter_v1_query_proto_msgTypes, }.Build() File_noble_orbiter_v1_query_proto = out.File file_noble_orbiter_v1_query_proto_rawDesc = nil diff --git a/api/v1/query_grpc.pb.go b/api/v1/query_grpc.pb.go index f0ac45b5..404ea816 100644 --- a/api/v1/query_grpc.pb.go +++ b/api/v1/query_grpc.pb.go @@ -7,7 +7,10 @@ package orbiterv1 import ( + context "context" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" ) // This is a compile-time assertion to ensure that this generated file @@ -15,12 +18,17 @@ import ( // Requires gRPC-Go v1.64.0 or later. const _ = grpc.SupportPackageIsVersion9 +const ( + Query_PendingPayloads_FullMethodName = "/noble.orbiter.v1.Query/PendingPayloads" +) + // QueryClient is the client API for Query service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. // // Query defines the gRPC query service for the Orbiter module. type QueryClient interface { + PendingPayloads(ctx context.Context, in *QueryPendingPayloadsRequest, opts ...grpc.CallOption) (*QueryPendingPayloadsResponse, error) } type queryClient struct { @@ -31,12 +39,23 @@ func NewQueryClient(cc grpc.ClientConnInterface) QueryClient { return &queryClient{cc} } +func (c *queryClient) PendingPayloads(ctx context.Context, in *QueryPendingPayloadsRequest, opts ...grpc.CallOption) (*QueryPendingPayloadsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryPendingPayloadsResponse) + err := c.cc.Invoke(ctx, Query_PendingPayloads_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. // All implementations must embed UnimplementedQueryServer // for forward compatibility. // // Query defines the gRPC query service for the Orbiter module. type QueryServer interface { + PendingPayloads(context.Context, *QueryPendingPayloadsRequest) (*QueryPendingPayloadsResponse, error) mustEmbedUnimplementedQueryServer() } @@ -47,6 +66,9 @@ type QueryServer interface { // pointer dereference when methods are called. type UnimplementedQueryServer struct{} +func (UnimplementedQueryServer) PendingPayloads(context.Context, *QueryPendingPayloadsRequest) (*QueryPendingPayloadsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PendingPayloads not implemented") +} func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {} func (UnimplementedQueryServer) testEmbeddedByValue() {} @@ -68,13 +90,36 @@ func RegisterQueryServer(s grpc.ServiceRegistrar, srv QueryServer) { s.RegisterService(&Query_ServiceDesc, srv) } +func _Query_PendingPayloads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPendingPayloadsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).PendingPayloads(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_PendingPayloads_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).PendingPayloads(ctx, req.(*QueryPendingPayloadsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Query_ServiceDesc is the grpc.ServiceDesc for Query service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var Query_ServiceDesc = grpc.ServiceDesc{ ServiceName: "noble.orbiter.v1.Query", HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{}, - Metadata: "noble/orbiter/v1/query.proto", + Methods: []grpc.MethodDesc{ + { + MethodName: "PendingPayloads", + Handler: _Query_PendingPayloads_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "noble/orbiter/v1/query.proto", } diff --git a/keeper/query_server.go b/keeper/query_server.go new file mode 100644 index 00000000..4924fdae --- /dev/null +++ b/keeper/query_server.go @@ -0,0 +1,37 @@ +package keeper + +import ( + "context" + + ethcommon "github.com/ethereum/go-ethereum/common" + + errorsmod "cosmossdk.io/errors" + "github.com/cosmos/cosmos-sdk/types/query" + + orbitertypes "github.com/noble-assets/orbiter/types" + "github.com/noble-assets/orbiter/types/core" +) + +var _ orbitertypes.QueryServer = &Keeper{} + +func (k *Keeper) PendingPayloads( + ctx context.Context, + req *orbitertypes.QueryPendingPayloadsRequest, +) (*orbitertypes.QueryPendingPayloadsResponse, error) { + hashes, pageRes, err := query.CollectionPaginate( + ctx, + k.pendingPayloads, + req.Pagination, + func(hash []byte, _ core.PendingPayload) (string, error) { + return ethcommon.BytesToHash(hash).Hex(), nil + }, + ) + if err != nil { + return nil, errorsmod.Wrap(err, "failed to paginate pending payloads") + } + + return &orbitertypes.QueryPendingPayloadsResponse{ + Hashes: hashes, + Pagination: pageRes, + }, nil +} diff --git a/keeper/query_server_test.go b/keeper/query_server_test.go new file mode 100644 index 00000000..48b49b35 --- /dev/null +++ b/keeper/query_server_test.go @@ -0,0 +1,76 @@ +package keeper_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/types/query" + + "github.com/noble-assets/orbiter/testutil/mocks/orbiter" + orbitertypes "github.com/noble-assets/orbiter/types" +) + +func TestPendingPayloads(t *testing.T) { + examplePayload := createTestPendingPayloadWithSequence(t, 0).Payload + + testcases := []struct { + name string + nPayloads int + pagination *query.PageRequest + expLen int + }{ + { + name: "success - no hashes stored", + nPayloads: 0, + expLen: 0, + }, + { + name: "success - 1 hashes stored", + nPayloads: 1, + expLen: 1, + }, + { + name: "success - 5 hashes stored", + nPayloads: 5, + expLen: 5, + }, + { + name: "success - 5 hashes stored with 2 pagination", + nPayloads: 5, + pagination: &query.PageRequest{Offset: 1, Limit: 2}, + expLen: 2, + }, + { + name: "success - 5 hashes stored with offset out of range so no results returned", + nPayloads: 5, + pagination: &query.PageRequest{Offset: 6, Limit: 2}, + expLen: 0, + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + ctx, _, k := orbiter.OrbiterKeeper(t) + + for range tc.nPayloads { + _, err := k.AcceptPayload(ctx, examplePayload) + require.NoError(t, err, "failed to setup payloads") + } + + res, err := k.PendingPayloads( + ctx, + &orbitertypes.QueryPendingPayloadsRequest{ + Pagination: tc.pagination, + }, + ) + require.NoError(t, err, "failed to query pending payloads") + require.Equal( + t, + tc.expLen, + len(res.Hashes), + "expected different number of hashes returned", + ) + }) + } +} diff --git a/proto/noble/orbiter/v1/query.proto b/proto/noble/orbiter/v1/query.proto index 33472197..42067058 100644 --- a/proto/noble/orbiter/v1/query.proto +++ b/proto/noble/orbiter/v1/query.proto @@ -2,7 +2,29 @@ syntax = "proto3"; package noble.orbiter.v1; +import "cosmos/base/query/v1beta1/pagination.proto"; +import "cosmos/query/v1/query.proto"; +import "google/api/annotations.proto"; + option go_package = "github.com/noble-assets/orbiter/types"; // Query defines the gRPC query service for the Orbiter module. -service Query {} +service Query { + rpc PendingPayloads(QueryPendingPayloadsRequest) returns (QueryPendingPayloadsResponse) { + option (cosmos.query.v1.module_query_safe) = true; + option (google.api.http).get = "/noble/orbiter/v1/pending-payloads"; + } +} + +message QueryPendingPayloadsRequest { + // pagination defines an optional pagination for the request. + cosmos.base.query.v1beta1.PageRequest pagination = 1; +} + +message QueryPendingPayloadsResponse { + // Hex-formatted hashes of the currently pending payloads + repeated string hashes = 1; + + // pagination defines the pagination in the response. + cosmos.base.query.v1beta1.PageResponse pagination = 2; +} diff --git a/types/query.pb.go b/types/query.pb.go index 4397f2cf..8d1967e9 100644 --- a/types/query.pb.go +++ b/types/query.pb.go @@ -6,10 +6,16 @@ package types import ( context "context" fmt "fmt" + query "github.com/cosmos/cosmos-sdk/types/query" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" 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. @@ -23,19 +29,137 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +type QueryPendingPayloadsRequest struct { + // pagination defines an optional pagination for the request. + Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryPendingPayloadsRequest) Reset() { *m = QueryPendingPayloadsRequest{} } +func (m *QueryPendingPayloadsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPendingPayloadsRequest) ProtoMessage() {} +func (*QueryPendingPayloadsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_390782105f057f99, []int{0} +} +func (m *QueryPendingPayloadsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPendingPayloadsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPendingPayloadsRequest.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 *QueryPendingPayloadsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPendingPayloadsRequest.Merge(m, src) +} +func (m *QueryPendingPayloadsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPendingPayloadsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPendingPayloadsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPendingPayloadsRequest proto.InternalMessageInfo + +func (m *QueryPendingPayloadsRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +type QueryPendingPayloadsResponse struct { + // Hex-formatted hashes of the currently pending payloads + Hashes []string `protobuf:"bytes,1,rep,name=hashes,proto3" json:"hashes,omitempty"` + // pagination defines the pagination in the response. + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryPendingPayloadsResponse) Reset() { *m = QueryPendingPayloadsResponse{} } +func (m *QueryPendingPayloadsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPendingPayloadsResponse) ProtoMessage() {} +func (*QueryPendingPayloadsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_390782105f057f99, []int{1} +} +func (m *QueryPendingPayloadsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPendingPayloadsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPendingPayloadsResponse.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 *QueryPendingPayloadsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPendingPayloadsResponse.Merge(m, src) +} +func (m *QueryPendingPayloadsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPendingPayloadsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPendingPayloadsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPendingPayloadsResponse proto.InternalMessageInfo + +func (m *QueryPendingPayloadsResponse) GetHashes() []string { + if m != nil { + return m.Hashes + } + return nil +} + +func (m *QueryPendingPayloadsResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + +func init() { + proto.RegisterType((*QueryPendingPayloadsRequest)(nil), "noble.orbiter.v1.QueryPendingPayloadsRequest") + proto.RegisterType((*QueryPendingPayloadsResponse)(nil), "noble.orbiter.v1.QueryPendingPayloadsResponse") +} + func init() { proto.RegisterFile("noble/orbiter/v1/query.proto", fileDescriptor_390782105f057f99) } var fileDescriptor_390782105f057f99 = []byte{ - // 133 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xc9, 0xcb, 0x4f, 0xca, - 0x49, 0xd5, 0xcf, 0x2f, 0x4a, 0xca, 0x2c, 0x49, 0x2d, 0xd2, 0x2f, 0x33, 0xd4, 0x2f, 0x2c, 0x4d, - 0x2d, 0xaa, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x00, 0xcb, 0xea, 0x41, 0x65, 0xf5, - 0xca, 0x0c, 0x8d, 0xd8, 0xb9, 0x58, 0x03, 0x41, 0x0a, 0x9c, 0xec, 0x4f, 0x3c, 0x92, 0x63, 0xbc, - 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, - 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x35, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, - 0x57, 0x1f, 0xac, 0x5f, 0x37, 0xb1, 0xb8, 0x38, 0xb5, 0xa4, 0x18, 0x6e, 0x49, 0x49, 0x65, 0x41, - 0x6a, 0x71, 0x12, 0x1b, 0xd8, 0x0a, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x42, 0xef, 0x5b, - 0x58, 0x82, 0x00, 0x00, 0x00, + // 354 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xbd, 0x4a, 0x2b, 0x41, + 0x14, 0xc7, 0x33, 0xb9, 0xdc, 0xc0, 0x9d, 0x5b, 0x28, 0x53, 0x48, 0xd8, 0x84, 0x25, 0x2c, 0x7e, + 0x84, 0x40, 0x66, 0xd8, 0xf8, 0x00, 0x82, 0x85, 0xb6, 0x31, 0xa5, 0xdd, 0x6c, 0x72, 0xd8, 0x2c, + 0x24, 0x33, 0x93, 0x3d, 0x93, 0x40, 0x2a, 0xc1, 0xca, 0x52, 0xf0, 0x09, 0xac, 0x6d, 0x7c, 0x0c, + 0xcb, 0x80, 0x8d, 0xa5, 0x24, 0x82, 0xaf, 0x21, 0xd9, 0x59, 0x35, 0x46, 0x51, 0xcb, 0xe5, 0xff, + 0xf1, 0xfb, 0x73, 0x76, 0x68, 0x55, 0xe9, 0x68, 0x00, 0x42, 0xa7, 0x51, 0x62, 0x21, 0x15, 0x93, + 0x50, 0x8c, 0xc6, 0x90, 0x4e, 0xb9, 0x49, 0xb5, 0xd5, 0x6c, 0x33, 0x53, 0x79, 0xae, 0xf2, 0x49, + 0xe8, 0x35, 0xba, 0x1a, 0x87, 0x1a, 0x45, 0x24, 0x11, 0x9c, 0x55, 0x4c, 0xc2, 0x08, 0xac, 0x0c, + 0x85, 0x91, 0x71, 0xa2, 0xa4, 0x4d, 0xb4, 0x72, 0x69, 0xaf, 0x92, 0x7b, 0x5f, 0x6d, 0xab, 0xd5, + 0x5e, 0x35, 0xd6, 0x3a, 0x1e, 0x80, 0x90, 0x26, 0x11, 0x52, 0x29, 0x6d, 0xb3, 0x24, 0x3a, 0x35, + 0x00, 0x5a, 0x39, 0x59, 0x9a, 0xdb, 0xa0, 0x7a, 0x89, 0x8a, 0xdb, 0x72, 0x3a, 0xd0, 0xb2, 0x87, + 0x1d, 0x18, 0x8d, 0x01, 0x2d, 0x3b, 0xa2, 0xf4, 0x9d, 0x56, 0x26, 0x35, 0x52, 0xff, 0xdf, 0xda, + 0xe5, 0x0e, 0xc7, 0x97, 0xd3, 0xb8, 0x43, 0xe5, 0xd3, 0x78, 0x5b, 0xc6, 0x90, 0x67, 0x3b, 0x2b, + 0xc9, 0xe0, 0x8c, 0x56, 0xbf, 0xc6, 0xa0, 0xd1, 0x0a, 0x81, 0x6d, 0xd1, 0x52, 0x5f, 0x62, 0x1f, + 0xb0, 0x4c, 0x6a, 0x7f, 0xea, 0xff, 0x3a, 0xf9, 0x17, 0x3b, 0xfe, 0xc0, 0x2f, 0x66, 0xfc, 0xbd, + 0x1f, 0xf9, 0xae, 0x74, 0x75, 0x40, 0xeb, 0x86, 0xd0, 0xbf, 0xd9, 0x02, 0x76, 0x4d, 0xe8, 0xc6, + 0xda, 0x0c, 0xd6, 0xe4, 0xeb, 0xf7, 0xe7, 0xdf, 0x5c, 0xc5, 0xe3, 0xbf, 0xb5, 0xbb, 0x21, 0x81, + 0xb8, 0x78, 0xbe, 0x6d, 0x90, 0xf3, 0xfb, 0xa7, 0xab, 0xe2, 0x36, 0x0b, 0xc4, 0xa7, 0x97, 0x60, + 0x5c, 0xae, 0x69, 0xf2, 0xe0, 0xe1, 0xc1, 0xdd, 0xdc, 0x27, 0xb3, 0xb9, 0x4f, 0x1e, 0xe7, 0x3e, + 0xb9, 0x5c, 0xf8, 0x85, 0xd9, 0xc2, 0x2f, 0x3c, 0x2c, 0xfc, 0xc2, 0xe9, 0x4e, 0x9c, 0xd8, 0xfe, + 0x38, 0xe2, 0x5d, 0x3d, 0x74, 0x3d, 0x4d, 0x89, 0x08, 0x16, 0xdf, 0xea, 0xec, 0xd4, 0x00, 0x46, + 0xa5, 0xec, 0xef, 0xee, 0xbf, 0x04, 0x00, 0x00, 0xff, 0xff, 0x22, 0x29, 0x42, 0x97, 0x76, 0x02, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -50,6 +174,7 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type QueryClient interface { + PendingPayloads(ctx context.Context, in *QueryPendingPayloadsRequest, opts ...grpc.CallOption) (*QueryPendingPayloadsResponse, error) } type queryClient struct { @@ -60,23 +185,477 @@ func NewQueryClient(cc grpc1.ClientConn) QueryClient { return &queryClient{cc} } +func (c *queryClient) PendingPayloads(ctx context.Context, in *QueryPendingPayloadsRequest, opts ...grpc.CallOption) (*QueryPendingPayloadsResponse, error) { + out := new(QueryPendingPayloadsResponse) + err := c.cc.Invoke(ctx, "/noble.orbiter.v1.Query/PendingPayloads", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { + PendingPayloads(context.Context, *QueryPendingPayloadsRequest) (*QueryPendingPayloadsResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. type UnimplementedQueryServer struct { } +func (*UnimplementedQueryServer) PendingPayloads(ctx context.Context, req *QueryPendingPayloadsRequest) (*QueryPendingPayloadsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PendingPayloads not implemented") +} + func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) } +func _Query_PendingPayloads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPendingPayloadsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).PendingPayloads(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/noble.orbiter.v1.Query/PendingPayloads", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).PendingPayloads(ctx, req.(*QueryPendingPayloadsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var Query_serviceDesc = _Query_serviceDesc var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "noble.orbiter.v1.Query", HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{}, - Metadata: "noble/orbiter/v1/query.proto", + Methods: []grpc.MethodDesc{ + { + MethodName: "PendingPayloads", + Handler: _Query_PendingPayloads_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "noble/orbiter/v1/query.proto", +} + +func (m *QueryPendingPayloadsRequest) 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 *QueryPendingPayloadsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPendingPayloadsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryPendingPayloadsResponse) 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 *QueryPendingPayloadsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPendingPayloadsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Hashes) > 0 { + for iNdEx := len(m.Hashes) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Hashes[iNdEx]) + copy(dAtA[i:], m.Hashes[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Hashes[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil } + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryPendingPayloadsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryPendingPayloadsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Hashes) > 0 { + for _, s := range m.Hashes { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryPendingPayloadsRequest) 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 ErrIntOverflowQuery + } + 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: QueryPendingPayloadsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPendingPayloadsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPendingPayloadsResponse) 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 ErrIntOverflowQuery + } + 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: QueryPendingPayloadsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPendingPayloadsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hashes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hashes = append(m.Hashes, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(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, ErrIntOverflowQuery + } + 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, ErrIntOverflowQuery + } + 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, ErrIntOverflowQuery + } + 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, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/types/query.pb.gw.go b/types/query.pb.gw.go new file mode 100644 index 00000000..75c9baf6 --- /dev/null +++ b/types/query.pb.gw.go @@ -0,0 +1,171 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: noble/orbiter/v1/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +var ( + filter_Query_PendingPayloads_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_PendingPayloads_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPendingPayloadsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_PendingPayloads_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.PendingPayloads(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_PendingPayloads_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPendingPayloadsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_PendingPayloads_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.PendingPayloads(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_PendingPayloads_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_PendingPayloads_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PendingPayloads_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_PendingPayloads_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_PendingPayloads_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PendingPayloads_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_PendingPayloads_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"noble", "orbiter", "v1", "pending-payloads"}, "", runtime.AssumeColonVerbOpt(false))) +) + +var ( + forward_Query_PendingPayloads_0 = runtime.ForwardResponseMessage +) From 5ea8412f45329b0f45a954724e4c42998ddfe7d1 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Tue, 7 Oct 2025 15:23:03 +0200 Subject: [PATCH 29/34] add CLI wiring for payload handling --- autocli.go | 25 +++++++++++++++++++++++++ types/autocli.go | 27 +++++++++++++++++++++++++++ types/hyperlane/payload.go | 2 ++ 3 files changed, 54 insertions(+) create mode 100644 types/autocli.go diff --git a/autocli.go b/autocli.go index 3e2efd1e..09e3ab03 100644 --- a/autocli.go +++ b/autocli.go @@ -28,6 +28,7 @@ import ( "github.com/noble-assets/orbiter/keeper/component/dispatcher" "github.com/noble-assets/orbiter/keeper/component/executor" "github.com/noble-assets/orbiter/keeper/component/forwarder" + orbitertypes "github.com/noble-assets/orbiter/types" adaptertypes "github.com/noble-assets/orbiter/types/component/adapter" dispatchertypes "github.com/noble-assets/orbiter/types/component/dispatcher" executortypes "github.com/noble-assets/orbiter/types/component/executor" @@ -38,6 +39,13 @@ func (AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { return &autocliv1.ModuleOptions{ Tx: &autocliv1.ServiceCommandDescriptor{ Service: orbiterv1.Msg_ServiceDesc.ServiceName, + RpcCommandOptions: []*autocliv1.RpcCommandOptions{ + { + // NOTE: we're manually moving this to the `payload` sub command for better navigation + RpcMethod: "SubmitPayload", + Skip: true, + }, + }, SubCommands: map[string]*autocliv1.ServiceCommandDescriptor{ "executor": { Service: executortypes.Msg_serviceDesc.ServiceName, @@ -57,10 +65,22 @@ func (AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { SubCommands: map[string]*autocliv1.ServiceCommandDescriptor{}, RpcCommandOptions: adapter.TxCommandOptions(), }, + "payload": { + Service: orbitertypes.Msg_serviceDesc.ServiceName, + Short: "Payload management commands", + RpcCommandOptions: orbitertypes.TxCommandOptions(), + }, }, }, Query: &autocliv1.ServiceCommandDescriptor{ Service: orbiterv1.Query_ServiceDesc.ServiceName, + RpcCommandOptions: []*autocliv1.RpcCommandOptions{ + { + // NOTE: we're manually moving this to the `payload` sub command for better navigation + RpcMethod: "PendingPayloads", + Skip: true, + }, + }, SubCommands: map[string]*autocliv1.ServiceCommandDescriptor{ "adapter": { Service: adaptertypes.Query_serviceDesc.ServiceName, @@ -86,6 +106,11 @@ func (AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { SubCommands: map[string]*autocliv1.ServiceCommandDescriptor{}, RpcCommandOptions: forwarder.QueryCommandOptions(), }, + "payload": { + Service: orbitertypes.Query_serviceDesc.ServiceName, + Short: "Payload management commands", + RpcCommandOptions: orbitertypes.QueryCommandOptions(), + }, }, }, } diff --git a/types/autocli.go b/types/autocli.go new file mode 100644 index 00000000..76c46c4f --- /dev/null +++ b/types/autocli.go @@ -0,0 +1,27 @@ +package types + +import autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" + +func TxCommandOptions() []*autocliv1.RpcCommandOptions { + return []*autocliv1.RpcCommandOptions{ + { + RpcMethod: "SubmitPayload", + Use: "submit [payload]", + Short: "Submit a payload to be handled by the orbiter", + Long: `Submit a payload to be handled by the orbiter.`, + PositionalArgs: []*autocliv1.PositionalArgDescriptor{ + {ProtoField: "payload"}, + }, + }, + } +} + +func QueryCommandOptions() []*autocliv1.RpcCommandOptions { + return []*autocliv1.RpcCommandOptions{ + { + RpcMethod: "PendingPayloads", + Use: "pending", + Short: "Query pending payloads", + }, + } +} diff --git a/types/hyperlane/payload.go b/types/hyperlane/payload.go index 8fc292bc..f2fd6312 100644 --- a/types/hyperlane/payload.go +++ b/types/hyperlane/payload.go @@ -43,6 +43,8 @@ func GetPayloadHashFromWarpMessageBody(body []byte) ([]byte, error) { // GetReducedWarpMessageFromOrbiterMessage removes the extra payload bytes from the formatted // message body // which turns the custom Orbiter Hyperlane message format into a Warp compatible one. +// +// TODO: move into hyperlane adapter types func GetReducedWarpMessageFromOrbiterMessage( message hyperlaneutil.HyperlaneMessage, ) (hyperlaneutil.HyperlaneMessage, error) { From 65c4774d95891a9b7fbd5c1ddee0393122565739 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Tue, 7 Oct 2025 17:24:48 +0200 Subject: [PATCH 30/34] fix registration of servers --- keeper/servers_registration.go | 4 ++++ types/codec.go | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/keeper/servers_registration.go b/keeper/servers_registration.go index 328790a9..9cd85228 100644 --- a/keeper/servers_registration.go +++ b/keeper/servers_registration.go @@ -27,6 +27,7 @@ import ( "github.com/noble-assets/orbiter/keeper/component/dispatcher" "github.com/noble-assets/orbiter/keeper/component/executor" "github.com/noble-assets/orbiter/keeper/component/forwarder" + orbitertypes "github.com/noble-assets/orbiter/types" adaptertypes "github.com/noble-assets/orbiter/types/component/adapter" dispatchertypes "github.com/noble-assets/orbiter/types/component/dispatcher" executortypes "github.com/noble-assets/orbiter/types/component/executor" @@ -37,6 +38,7 @@ import ( // (Forwarder, Executor, and Adapter) with the module configurator. func RegisterMsgServers(cfg module.Configurator, k *Keeper) { ms := cfg.MsgServer() + orbitertypes.RegisterMsgServer(ms, k) forwardertypes.RegisterMsgServer(ms, forwarder.NewMsgServer(k.forwarder, k)) executortypes.RegisterMsgServer(ms, executor.NewMsgServer(k.executor, k)) adaptertypes.RegisterMsgServer(ms, adapter.NewMsgServer(k.adapter, k)) @@ -46,6 +48,8 @@ func RegisterMsgServers(cfg module.Configurator, k *Keeper) { // with the module configurator. func RegisterQueryServers(cfg module.Configurator, k *Keeper) { qs := cfg.QueryServer() + + orbitertypes.RegisterQueryServer(qs, k) forwardertypes.RegisterQueryServer(qs, forwarder.NewQueryServer(k.forwarder)) executortypes.RegisterQueryServer(qs, executor.NewQueryServer(k.executor)) adaptertypes.RegisterQueryServer(qs, adapter.NewQueryServer(k.adapter)) diff --git a/types/codec.go b/types/codec.go index efb05be7..587c2586 100644 --- a/types/codec.go +++ b/types/codec.go @@ -23,6 +23,7 @@ package types import ( "github.com/cosmos/cosmos-sdk/codec" codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/msgservice" "github.com/noble-assets/orbiter/types/component" @@ -31,6 +32,8 @@ import ( ) func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgSubmitPayload{}, "orbiter/v1/SubmitPayload", nil) + component.RegisterLegacyAminoCodec(cdc) } @@ -48,6 +51,11 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { (*core.ActionAttributes)(nil), ) + registry.RegisterImplementations( + (*sdk.Msg)(nil), + &MsgSubmitPayload{}, + ) + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) component.RegisterInterfaces(registry) From c551bc9a4d98f6d00a079fada2ae61b3f5fa3cd7 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Tue, 7 Oct 2025 17:25:27 +0200 Subject: [PATCH 31/34] fix hyperlane core keeper in component inputs --- simapp/orbiter.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/simapp/orbiter.go b/simapp/orbiter.go index 9adaf3f7..94240fbc 100644 --- a/simapp/orbiter.go +++ b/simapp/orbiter.go @@ -6,10 +6,18 @@ import ( func (app *SimApp) RegisterOrbiterControllers() { in := orbiter.ComponentsInputs{ - Orbiters: app.OrbiterKeeper, + // Orbiter + Orbiters: app.OrbiterKeeper, + + // Cosmos BankKeeper: app.BankKeeper, + + // Circle CCTPKeeper: app.CCTPKeeper, - WarpKeeper: &app.WarpKeeper, + + // Hyperlane + HyperlaneCoreKeeper: app.HyperlaneKeeper, + WarpKeeper: &app.WarpKeeper, } orbiter.InjectComponents(in) From 602587cb50d7da4ffbfb472996e8a309eb77f7e6 Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Tue, 7 Oct 2025 17:26:00 +0200 Subject: [PATCH 32/34] use json marshalled string as input in MsgSubmitPayload --- api/v1/tx.pulsar.go | 171 ++++++++++++++------------------ autocli.go | 6 +- keeper/msg_server.go | 9 +- keeper/msg_server_test.go | 25 ++++- keeper/query_server.go | 20 ++++ keeper/query_server_test.go | 20 ++++ keeper/state_handler_test.go | 7 +- proto/noble/orbiter/v1/tx.proto | 8 +- types/autocli.go | 20 ++++ types/tx.pb.go | 99 +++++++++--------- 10 files changed, 229 insertions(+), 156 deletions(-) diff --git a/api/v1/tx.pulsar.go b/api/v1/tx.pulsar.go index 548f9e9b..e7adfe43 100644 --- a/api/v1/tx.pulsar.go +++ b/api/v1/tx.pulsar.go @@ -101,8 +101,8 @@ func (x *fastReflection_MsgSubmitPayload) Range(f func(protoreflect.FieldDescrip return } } - if x.Payload != nil { - value := protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) + if x.Payload != "" { + value := protoreflect.ValueOfString(x.Payload) if !f(fd_MsgSubmitPayload_payload, value) { return } @@ -125,7 +125,7 @@ func (x *fastReflection_MsgSubmitPayload) Has(fd protoreflect.FieldDescriptor) b case "noble.orbiter.v1.MsgSubmitPayload.signer": return x.Signer != "" case "noble.orbiter.v1.MsgSubmitPayload.payload": - return x.Payload != nil + return x.Payload != "" default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) @@ -145,7 +145,7 @@ func (x *fastReflection_MsgSubmitPayload) Clear(fd protoreflect.FieldDescriptor) case "noble.orbiter.v1.MsgSubmitPayload.signer": x.Signer = "" case "noble.orbiter.v1.MsgSubmitPayload.payload": - x.Payload = nil + x.Payload = "" default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) @@ -167,7 +167,7 @@ func (x *fastReflection_MsgSubmitPayload) Get(descriptor protoreflect.FieldDescr return protoreflect.ValueOfString(value) case "noble.orbiter.v1.MsgSubmitPayload.payload": value := x.Payload - return protoreflect.ValueOfMessage(value.ProtoReflect()) + return protoreflect.ValueOfString(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) @@ -191,7 +191,7 @@ func (x *fastReflection_MsgSubmitPayload) Set(fd protoreflect.FieldDescriptor, v case "noble.orbiter.v1.MsgSubmitPayload.signer": x.Signer = value.Interface().(string) case "noble.orbiter.v1.MsgSubmitPayload.payload": - x.Payload = value.Message().Interface().(*v1.Payload) + x.Payload = value.Interface().(string) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) @@ -212,13 +212,10 @@ func (x *fastReflection_MsgSubmitPayload) Set(fd protoreflect.FieldDescriptor, v // Mutable is a mutating operation and unsafe for concurrent use. func (x *fastReflection_MsgSubmitPayload) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { - case "noble.orbiter.v1.MsgSubmitPayload.payload": - if x.Payload == nil { - x.Payload = new(v1.Payload) - } - return protoreflect.ValueOfMessage(x.Payload.ProtoReflect()) case "noble.orbiter.v1.MsgSubmitPayload.signer": panic(fmt.Errorf("field signer of message noble.orbiter.v1.MsgSubmitPayload is not mutable")) + case "noble.orbiter.v1.MsgSubmitPayload.payload": + panic(fmt.Errorf("field payload of message noble.orbiter.v1.MsgSubmitPayload is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) @@ -235,8 +232,7 @@ func (x *fastReflection_MsgSubmitPayload) NewField(fd protoreflect.FieldDescript case "noble.orbiter.v1.MsgSubmitPayload.signer": return protoreflect.ValueOfString("") case "noble.orbiter.v1.MsgSubmitPayload.payload": - m := new(v1.Payload) - return protoreflect.ValueOfMessage(m.ProtoReflect()) + return protoreflect.ValueOfString("") default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: noble.orbiter.v1.MsgSubmitPayload")) @@ -310,8 +306,8 @@ func (x *fastReflection_MsgSubmitPayload) ProtoMethods() *protoiface.Methods { if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } - if x.Payload != nil { - l = options.Size(x.Payload) + l = len(x.Payload) + if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } if x.unknownFields != nil { @@ -343,17 +339,10 @@ func (x *fastReflection_MsgSubmitPayload) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } - if x.Payload != nil { - encoded, err := options.Marshal(x.Payload) - if err != nil { - return protoiface.MarshalOutput{ - NoUnkeyedLiterals: input.NoUnkeyedLiterals, - Buf: input.Buf, - }, err - } - i -= len(encoded) - copy(dAtA[i:], encoded) - i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + if len(x.Payload) > 0 { + i -= len(x.Payload) + copy(dAtA[i:], x.Payload) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Payload))) i-- dAtA[i] = 0x12 } @@ -449,7 +438,7 @@ func (x *fastReflection_MsgSubmitPayload) ProtoMethods() *protoiface.Methods { if wireType != 2 { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow @@ -459,27 +448,23 @@ func (x *fastReflection_MsgSubmitPayload) ProtoMethods() *protoiface.Methods { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength } - postIndex := iNdEx + msglen + 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 } - if x.Payload == nil { - x.Payload = &v1.Payload{} - } - if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Payload); err != nil { - return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err - } + x.Payload = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -1947,8 +1932,9 @@ type MsgSubmitPayload struct { // The signer of the transaction. Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` - // The payload submitted to the Orbiter module. - Payload *v1.Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` + // The marshalled JSON representation of the payload that is + // submitted to the Orbiter. + Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` } func (x *MsgSubmitPayload) Reset() { @@ -1978,11 +1964,11 @@ func (x *MsgSubmitPayload) GetSigner() string { return "" } -func (x *MsgSubmitPayload) GetPayload() *v1.Payload { +func (x *MsgSubmitPayload) GetPayload() string { if x != nil { return x.Payload } - return nil + return "" } // MsgSubmitPayloadResponse returns the keccak256 of the registered @@ -2129,54 +2115,52 @@ var file_noble_orbiter_v1_tx_proto_rawDesc = []byte{ 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0xbc, 0x01, 0x0a, 0x10, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, + 0x91, 0x01, 0x0a, 0x10, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x06, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, - 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, - 0x2a, 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x3a, 0x31, 0x82, 0xe7, 0xb0, - 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x21, 0x6e, 0x6f, 0x62, - 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x4d, 0x73, - 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2e, - 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0xa8, - 0x01, 0x0a, 0x15, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x36, 0x0a, 0x09, - 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, - 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, - 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x29, 0x0a, 0x13, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x68, 0x61, 0x73, 0x68, 0x32, 0x6d, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x5f, 0x0a, 0x0d, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x6e, - 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x1a, 0x2a, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, - 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, - 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x54, 0x78, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6e, 0x6f, 0x62, - 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x72, - 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4e, 0x4f, 0x58, 0xaa, 0x02, 0x10, - 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, - 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, - 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, 0x62, 0x69, - 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x3a, 0x3a, 0x4f, 0x72, 0x62, 0x69, - 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x3a, 0x31, 0x82, 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x8a, 0xe7, 0xb0, + 0x2a, 0x21, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, + 0x76, 0x31, 0x2f, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x22, 0x2e, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, + 0x61, 0x73, 0x68, 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x09, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x07, 0x70, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x6f, 0x62, + 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, + 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x29, + 0x0a, 0x13, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x32, 0x6d, 0x0a, 0x03, 0x4d, 0x73, 0x67, + 0x12, 0x5f, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x22, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x1a, 0x2a, 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, + 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x73, 0x67, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xc1, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, + 0x2e, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2d, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x6e, 0x6f, 0x62, 0x6c, 0x65, 0x2f, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x2f, + 0x76, 0x31, 0x3b, 0x6f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4e, + 0x4f, 0x58, 0xaa, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x2e, 0x4f, 0x72, 0x62, 0x69, 0x74, + 0x65, 0x72, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x5c, 0x4f, 0x72, + 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4e, 0x6f, 0x62, 0x6c, 0x65, + 0x5c, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x12, 0x4e, 0x6f, 0x62, 0x6c, 0x65, 0x3a, + 0x3a, 0x4f, 0x72, 0x62, 0x69, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2200,15 +2184,14 @@ var file_noble_orbiter_v1_tx_proto_goTypes = []interface{}{ (*v1.Payload)(nil), // 4: noble.orbiter.core.v1.Payload } var file_noble_orbiter_v1_tx_proto_depIdxs = []int32{ - 4, // 0: noble.orbiter.v1.MsgSubmitPayload.payload:type_name -> noble.orbiter.core.v1.Payload - 4, // 1: noble.orbiter.v1.EventPayloadSubmitted.payload:type_name -> noble.orbiter.core.v1.Payload - 0, // 2: noble.orbiter.v1.Msg.SubmitPayload:input_type -> noble.orbiter.v1.MsgSubmitPayload - 1, // 3: noble.orbiter.v1.Msg.SubmitPayload:output_type -> noble.orbiter.v1.MsgSubmitPayloadResponse - 3, // [3:4] is the sub-list for method output_type - 2, // [2:3] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 4, // 0: noble.orbiter.v1.EventPayloadSubmitted.payload:type_name -> noble.orbiter.core.v1.Payload + 0, // 1: noble.orbiter.v1.Msg.SubmitPayload:input_type -> noble.orbiter.v1.MsgSubmitPayload + 1, // 2: noble.orbiter.v1.Msg.SubmitPayload:output_type -> noble.orbiter.v1.MsgSubmitPayloadResponse + 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_noble_orbiter_v1_tx_proto_init() } diff --git a/autocli.go b/autocli.go index 09e3ab03..462ac619 100644 --- a/autocli.go +++ b/autocli.go @@ -41,7 +41,8 @@ func (AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { Service: orbiterv1.Msg_ServiceDesc.ServiceName, RpcCommandOptions: []*autocliv1.RpcCommandOptions{ { - // NOTE: we're manually moving this to the `payload` sub command for better navigation + // NOTE: we're manually moving this to the `payload` sub command for better + // navigation RpcMethod: "SubmitPayload", Skip: true, }, @@ -76,7 +77,8 @@ func (AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { Service: orbiterv1.Query_ServiceDesc.ServiceName, RpcCommandOptions: []*autocliv1.RpcCommandOptions{ { - // NOTE: we're manually moving this to the `payload` sub command for better navigation + // NOTE: we're manually moving this to the `payload` sub command for better + // navigation RpcMethod: "PendingPayloads", Skip: true, }, diff --git a/keeper/msg_server.go b/keeper/msg_server.go index 39306da9..7a7ef4e5 100644 --- a/keeper/msg_server.go +++ b/keeper/msg_server.go @@ -35,13 +35,18 @@ func (k *Keeper) SubmitPayload( ctx context.Context, req *orbitertypes.MsgSubmitPayload, ) (*orbitertypes.MsgSubmitPayloadResponse, error) { - if err := req.Payload.Validate(); err != nil { + var payload core.Payload + if err := orbitertypes.UnmarshalJSON(k.cdc, []byte(req.Payload), &payload); err != nil { + return nil, sdkerrors.ErrInvalidRequest.Wrap(err.Error()) + } + + if err := (&payload).Validate(); err != nil { return nil, sdkerrors.ErrInvalidRequest.Wrap(err.Error()) } payloadHash, err := k.AcceptPayload( ctx, - &req.Payload, + &payload, ) if err != nil { return nil, core.ErrSubmitPayload.Wrap(err.Error()) diff --git a/keeper/msg_server_test.go b/keeper/msg_server_test.go index ce133f04..0b0d9c90 100644 --- a/keeper/msg_server_test.go +++ b/keeper/msg_server_test.go @@ -1,3 +1,23 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 ( @@ -64,8 +84,11 @@ func TestSubmitPayload(t *testing.T) { tc.setup(t, ctx, k) } + payloadJSON, err := orbitertypes.MarshalJSON(k.Codec(), tc.payload) + require.NoError(t, err, "failed to marshal payload") + res, err := k.SubmitPayload(ctx, &orbitertypes.MsgSubmitPayload{ - Payload: *tc.payload, + Payload: string(payloadJSON), }) if tc.errContains == "" { require.NoError(t, err, "failed to accept payload") diff --git a/keeper/query_server.go b/keeper/query_server.go index 4924fdae..9f2a0a69 100644 --- a/keeper/query_server.go +++ b/keeper/query_server.go @@ -1,3 +1,23 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 ( diff --git a/keeper/query_server_test.go b/keeper/query_server_test.go index 48b49b35..870cbcc8 100644 --- a/keeper/query_server_test.go +++ b/keeper/query_server_test.go @@ -1,3 +1,23 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 ( diff --git a/keeper/state_handler_test.go b/keeper/state_handler_test.go index e0c9353e..4e5caf08 100644 --- a/keeper/state_handler_test.go +++ b/keeper/state_handler_test.go @@ -334,10 +334,13 @@ func TestSubsequentSubmissions(t *testing.T) { expHash, err := validPayload.Keccak256Hash() require.NoError(t, err, "failed to hash payload") + validPayloadJSON, err := orbitertypes.MarshalJSON(k.Codec(), validPayload.Payload) + require.NoError(t, err, "failed to marshal payload into json") + // ACT: submit first payload res, err := k.SubmitPayload(ctx, &orbitertypes.MsgSubmitPayload{ Signer: testutil.NewNobleAddress(), - Payload: *validPayload.Payload, + Payload: string(validPayloadJSON), }) require.NoError(t, err, "failed to submit payload") @@ -348,7 +351,7 @@ func TestSubsequentSubmissions(t *testing.T) { // ACT: submit identical payload again res2, err := k.SubmitPayload(ctx, &orbitertypes.MsgSubmitPayload{ Signer: testutil.NewNobleAddress(), - Payload: *validPayload.Payload, + Payload: string(validPayloadJSON), }) require.NoError(t, err, "failed to submit payload") diff --git a/proto/noble/orbiter/v1/tx.proto b/proto/noble/orbiter/v1/tx.proto index 7493f744..e67b1755 100644 --- a/proto/noble/orbiter/v1/tx.proto +++ b/proto/noble/orbiter/v1/tx.proto @@ -28,11 +28,9 @@ message MsgSubmitPayload { // The signer of the transaction. string signer = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; - // The payload submitted to the Orbiter module. - noble.orbiter.core.v1.Payload payload = 2 [ - (gogoproto.nullable) = false, - (amino.dont_omitempty) = true - ]; + // The marshalled JSON representation of the payload that is + // submitted to the Orbiter. + string payload = 2; } // MsgSubmitPayloadResponse returns the keccak256 of the registered diff --git a/types/autocli.go b/types/autocli.go index 76c46c4f..8095b7cd 100644 --- a/types/autocli.go +++ b/types/autocli.go @@ -1,3 +1,23 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" diff --git a/types/tx.pb.go b/types/tx.pb.go index 7c02a962..1a45cbf8 100644 --- a/types/tx.pb.go +++ b/types/tx.pb.go @@ -37,8 +37,9 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type MsgSubmitPayload struct { // The signer of the transaction. Signer string `protobuf:"bytes,1,opt,name=signer,proto3" json:"signer,omitempty"` - // The payload submitted to the Orbiter module. - Payload core.Payload `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload"` + // The marshalled JSON representation of the payload that is + // submitted to the Orbiter. + Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` } func (m *MsgSubmitPayload) Reset() { *m = MsgSubmitPayload{} } @@ -81,11 +82,11 @@ func (m *MsgSubmitPayload) GetSigner() string { return "" } -func (m *MsgSubmitPayload) GetPayload() core.Payload { +func (m *MsgSubmitPayload) GetPayload() string { if m != nil { return m.Payload } - return core.Payload{} + return "" } // MsgSubmitPayloadResponse returns the keccak256 of the registered @@ -255,34 +256,34 @@ func init() { func init() { proto.RegisterFile("noble/orbiter/v1/tx.proto", fileDescriptor_4f89c0e5a76b9120) } var fileDescriptor_4f89c0e5a76b9120 = []byte{ - // 424 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcc, 0xcb, 0x4f, 0xca, - 0x49, 0xd5, 0xcf, 0x2f, 0x4a, 0xca, 0x2c, 0x49, 0x2d, 0xd2, 0x2f, 0x33, 0xd4, 0x2f, 0xa9, 0xd0, - 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x00, 0x4b, 0xe9, 0x41, 0xa5, 0xf4, 0xca, 0x0c, 0xa5, - 0x04, 0x13, 0x73, 0x33, 0xf3, 0xf2, 0xf5, 0xc1, 0x24, 0x44, 0x91, 0x94, 0x78, 0x72, 0x7e, 0x71, - 0x6e, 0x7e, 0xb1, 0x7e, 0x6e, 0x71, 0x3a, 0x48, 0x73, 0x6e, 0x71, 0x3a, 0x54, 0x42, 0x12, 0x22, - 0x11, 0x0f, 0xe6, 0xe9, 0x43, 0x38, 0x50, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, 0x88, 0x38, 0x88, - 0x05, 0x15, 0x55, 0x46, 0x75, 0x49, 0x72, 0x7e, 0x51, 0x2a, 0xc8, 0x44, 0x98, 0xf5, 0x60, 0x45, - 0x4a, 0x7b, 0x18, 0xb9, 0x04, 0x7c, 0x8b, 0xd3, 0x83, 0x4b, 0x93, 0x72, 0x33, 0x4b, 0x02, 0x12, - 0x2b, 0x73, 0xf2, 0x13, 0x53, 0x84, 0x0c, 0xb8, 0xd8, 0x8a, 0x33, 0xd3, 0xf3, 0x52, 0x8b, 0x24, - 0x18, 0x15, 0x18, 0x35, 0x38, 0x9d, 0x24, 0x2e, 0x6d, 0xd1, 0x15, 0x81, 0xda, 0xe8, 0x98, 0x92, - 0x52, 0x94, 0x5a, 0x5c, 0x1c, 0x5c, 0x52, 0x94, 0x99, 0x97, 0x1e, 0x04, 0x55, 0x27, 0xe4, 0xcc, - 0xc5, 0x5e, 0x00, 0xd1, 0x2c, 0xc1, 0xa4, 0xc0, 0xa8, 0xc1, 0x6d, 0x24, 0xa7, 0x87, 0xea, 0x59, - 0x90, 0xed, 0x7a, 0x65, 0x86, 0x7a, 0x50, 0x2b, 0x9c, 0x38, 0x4f, 0xdc, 0x93, 0x67, 0x58, 0xf1, - 0x7c, 0x83, 0x16, 0x63, 0x10, 0x4c, 0xa7, 0x95, 0x61, 0xd3, 0xf3, 0x0d, 0x5a, 0x50, 0x13, 0xbb, - 0x9e, 0x6f, 0xd0, 0x52, 0xc4, 0x08, 0x4a, 0x74, 0x97, 0x2a, 0xe9, 0x71, 0x49, 0xa0, 0x8b, 0x05, - 0xa5, 0x16, 0x17, 0xe4, 0xe7, 0x15, 0xa7, 0x0a, 0x09, 0x71, 0xb1, 0x64, 0x24, 0x16, 0x67, 0x80, - 0xfd, 0xc0, 0x13, 0x04, 0x66, 0x2b, 0xad, 0x60, 0xe4, 0x12, 0x75, 0x2d, 0x4b, 0xcd, 0x83, 0x29, - 0x86, 0xe8, 0x2c, 0x49, 0x4d, 0xc1, 0xa6, 0x5a, 0xc8, 0x8c, 0x8b, 0xb3, 0x18, 0xaa, 0xa0, 0x08, - 0xec, 0x2f, 0x7c, 0x41, 0x81, 0x50, 0x8a, 0x1c, 0x1a, 0xcc, 0xe4, 0x86, 0x86, 0x92, 0x26, 0x97, - 0x30, 0xb2, 0x4b, 0x83, 0x52, 0x73, 0xf3, 0xcb, 0xb0, 0xbb, 0xd3, 0x28, 0x97, 0x8b, 0xd9, 0xb7, - 0x38, 0x5d, 0x28, 0x9e, 0x8b, 0x17, 0x35, 0x1e, 0x95, 0xf4, 0xd0, 0x53, 0x9c, 0x1e, 0x7a, 0x68, - 0x49, 0x69, 0x11, 0x56, 0x03, 0x0b, 0x51, 0x29, 0xd6, 0x06, 0x90, 0x13, 0x9d, 0xec, 0x4f, 0x3c, - 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, - 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0x4a, 0x35, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, - 0x2f, 0x39, 0x3f, 0x57, 0x1f, 0x6c, 0xac, 0x6e, 0x62, 0x71, 0x71, 0x6a, 0x49, 0x31, 0x3c, 0x0e, - 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, 0xc0, 0x69, 0xcf, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, - 0x5d, 0x7e, 0xab, 0x4d, 0x2c, 0x03, 0x00, 0x00, + // 425 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x31, 0x6f, 0xd4, 0x30, + 0x14, 0x8e, 0x29, 0x14, 0x9d, 0x01, 0xa9, 0x98, 0x22, 0xd2, 0x0c, 0xa1, 0x04, 0x21, 0x95, 0x48, + 0x75, 0x48, 0x91, 0x18, 0x58, 0x10, 0x87, 0x18, 0x2b, 0xa1, 0x74, 0x63, 0xa9, 0x92, 0x8b, 0xe5, + 0x8b, 0x54, 0xc7, 0x91, 0x9f, 0x1b, 0xd1, 0x0d, 0x31, 0x32, 0xc1, 0xbf, 0xe8, 0x78, 0x03, 0x3f, + 0xa2, 0xe3, 0x89, 0x89, 0x09, 0xa1, 0xbb, 0xe1, 0xfe, 0x06, 0x8a, 0xe3, 0xdc, 0x71, 0xe1, 0x04, + 0x8b, 0xe5, 0xf7, 0xbe, 0xef, 0xf9, 0x7d, 0xfe, 0xde, 0xc3, 0x7b, 0xa5, 0xcc, 0xce, 0x58, 0x24, + 0x55, 0x56, 0x68, 0xa6, 0xa2, 0x3a, 0x8e, 0xf4, 0x07, 0x5a, 0x29, 0xa9, 0x25, 0xd9, 0x31, 0x10, + 0xb5, 0x10, 0xad, 0x63, 0xef, 0x6e, 0x2a, 0x8a, 0x52, 0x46, 0xe6, 0x6c, 0x49, 0xde, 0x83, 0x91, + 0x04, 0x21, 0x21, 0x12, 0xc0, 0x9b, 0x62, 0x01, 0xdc, 0x02, 0x7b, 0x2d, 0x70, 0x6a, 0xa2, 0xa8, + 0x0d, 0x2c, 0xb4, 0xcb, 0x25, 0x97, 0x6d, 0xbe, 0xb9, 0xd9, 0xec, 0xe3, 0x75, 0x25, 0x23, 0xa9, + 0x58, 0xf3, 0x62, 0xd7, 0xde, 0x90, 0x82, 0xaf, 0x08, 0xef, 0x1c, 0x03, 0x3f, 0x39, 0xcf, 0x44, + 0xa1, 0xdf, 0xa5, 0x17, 0x67, 0x32, 0xcd, 0xc9, 0x33, 0xbc, 0x0d, 0x05, 0x2f, 0x99, 0x72, 0xd1, + 0x3e, 0x3a, 0x18, 0x0c, 0xdd, 0xef, 0xdf, 0x0e, 0x77, 0x6d, 0xc7, 0xd7, 0x79, 0xae, 0x18, 0xc0, + 0x89, 0x56, 0x45, 0xc9, 0x13, 0xcb, 0x23, 0x2e, 0xbe, 0x59, 0xb5, 0xc5, 0xee, 0xb5, 0xa6, 0x24, + 0xe9, 0xc2, 0x97, 0xf1, 0xa7, 0xc5, 0x24, 0xb4, 0xb4, 0xcf, 0x8b, 0x49, 0xf8, 0xe8, 0x2f, 0x7f, + 0xfa, 0xed, 0x03, 0x8a, 0xdd, 0x7e, 0x2e, 0x61, 0x50, 0xc9, 0x12, 0x18, 0x21, 0xf8, 0xfa, 0x38, + 0x85, 0xb1, 0x11, 0x76, 0x3b, 0x31, 0xf7, 0xe0, 0x12, 0xe1, 0xfb, 0x6f, 0x6b, 0x56, 0x76, 0xe4, + 0xb6, 0x52, 0xb3, 0x7c, 0x13, 0x9b, 0xbc, 0xc0, 0x03, 0xb0, 0x04, 0xd5, 0x8a, 0xfd, 0xc7, 0xff, + 0x56, 0x54, 0xf2, 0x66, 0xf5, 0xc5, 0xad, 0x7d, 0x74, 0x70, 0xeb, 0xc8, 0xa7, 0xeb, 0xf3, 0x6c, + 0x0c, 0xa6, 0x75, 0x4c, 0xad, 0x8a, 0xe1, 0xe0, 0xea, 0xe7, 0x43, 0xe7, 0x72, 0x31, 0x09, 0xd1, + 0xd2, 0x8d, 0xe0, 0x29, 0xbe, 0xf7, 0xa7, 0xd2, 0x84, 0x09, 0x59, 0x6f, 0xd6, 0x79, 0x24, 0xf0, + 0xd6, 0x31, 0x70, 0x72, 0x8a, 0xef, 0xac, 0x0f, 0x27, 0xa0, 0xfd, 0x35, 0xa2, 0x7d, 0xb7, 0xbc, + 0xf0, 0xff, 0x9c, 0xce, 0x51, 0xef, 0xc6, 0xc7, 0x46, 0xe2, 0xf0, 0xd5, 0xd5, 0xcc, 0x47, 0xd3, + 0x99, 0x8f, 0x7e, 0xcd, 0x7c, 0xf4, 0x65, 0xee, 0x3b, 0xd3, 0xb9, 0xef, 0xfc, 0x98, 0xfb, 0xce, + 0xfb, 0x27, 0xbc, 0xd0, 0xe3, 0xf3, 0x8c, 0x8e, 0xa4, 0x88, 0xcc, 0xb3, 0x87, 0x29, 0x00, 0xd3, + 0xb0, 0x9c, 0xa1, 0xbe, 0xa8, 0x18, 0x64, 0xdb, 0x66, 0xa1, 0x9e, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0xff, 0x23, 0x59, 0x71, 0xc3, 0x01, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -390,16 +391,13 @@ func (m *MsgSubmitPayload) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - { - size, err := m.Payload.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) + if len(m.Payload) > 0 { + i -= len(m.Payload) + copy(dAtA[i:], m.Payload) + i = encodeVarintTx(dAtA, i, uint64(len(m.Payload))) + i-- + dAtA[i] = 0x12 } - i-- - dAtA[i] = 0x12 if len(m.Signer) > 0 { i -= len(m.Signer) copy(dAtA[i:], m.Signer) @@ -538,8 +536,10 @@ func (m *MsgSubmitPayload) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } - l = m.Payload.Size() - n += 1 + l + sovTx(uint64(l)) + l = len(m.Payload) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } return n } @@ -659,7 +659,7 @@ func (m *MsgSubmitPayload) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -669,24 +669,23 @@ func (m *MsgSubmitPayload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Payload.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Payload = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex From 03e7c3325ceb8f23e4a4d796fae801aa14bc246b Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 8 Oct 2025 12:36:22 +0200 Subject: [PATCH 33/34] wip e2e tests --- e2e/hyperlane_to_cctp_test.go | 141 ++++++++++++++++++++++++++++++++++ e2e/hyperlane_utils.go | 88 +++++++++++++++++++++ e2e/setup.go | 5 +- e2e/utils_payload.go | 21 +++++ 4 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 e2e/hyperlane_to_cctp_test.go create mode 100644 e2e/hyperlane_utils.go create mode 100644 e2e/utils_payload.go diff --git a/e2e/hyperlane_to_cctp_test.go b/e2e/hyperlane_to_cctp_test.go new file mode 100644 index 00000000..679c4ee8 --- /dev/null +++ b/e2e/hyperlane_to_cctp_test.go @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 e2e + +import ( + "context" + sdktypes "github.com/cosmos/cosmos-sdk/types" + ethcommon "github.com/ethereum/go-ethereum/common" + orbitertypes "github.com/noble-assets/orbiter/types" + "github.com/strangelove-ventures/interchaintest/v8" + "github.com/strangelove-ventures/interchaintest/v8/chain/cosmos" + "testing" + + "github.com/stretchr/testify/require" + + sdkmath "cosmossdk.io/math" + + "github.com/noble-assets/orbiter" + "github.com/noble-assets/orbiter/testutil" + "github.com/noble-assets/orbiter/types/controller/forwarding" + "github.com/noble-assets/orbiter/types/core" +) + +func TestHyperlaneToCCTP(t *testing.T) { + testutil.SetSDKConfig() + + ctx, s := NewSuite(t, true, false, true) + + orbiter.RegisterInterfaces(s.Chain.GetCodec().InterfaceRegistry()) + + transferAmount := sdkmath.NewInt(2 * OneE6) + fundAmount := transferAmount.MulRaw(2) + recipient := testutil.NewNobleAddress() + + relayer := interchaintest.GetAndFundTestUsers( + t, + ctx, + "relayer", + fundAmount, + s.Chain, + )[0] + + cctpDestinationCaller := make([]byte, 32) + copy(cctpDestinationCaller[32-3:], []byte{1, 2, 3}) + + fw, err := forwarding.NewCCTPForwarding( + s.destinationDomain, + cctpDestinationCaller, + cctpDestinationCaller, + nil, + ) + require.NoError(t, err, "invalid forwarding") + + submittedPayload, err := core.NewPayload(fw) + require.NoError(t, err, "invalid payload") + + submittedBytes, err := s.Chain.GetCodec().MarshalJSON(submittedPayload) + require.NoError(t, err, "failed to marshal submitted payload") + + node := s.Chain.GetFullNode() + + _, err = node.ExecTx( + ctx, + relayer.KeyName(), + "orbiter", + "payload", + "submit", + string(submittedBytes), + ) + require.NoError(t, err, "failed to submit payload") + + registeredHashes := getPendingPayloadHashes(t, ctx, node) + require.Len(t, registeredHashes, 1, "expected one registered hash") + + inputs := &orbHypTransferInputs{ + amount: transferAmount, + destinationDomain: s.hyperlaneDestinationDomain, + nonce: 0, + originDomain: s.hyperlaneOriginDomain, + payloadHash: ethcommon.HexToHash("0x" + registeredHashes[0]), + recipient: sdktypes.MustAccAddressFromBech32(recipient), + } + + mailbox, err := getHyperlaneMailbox(ctx, node) + require.NoError(t, err, "failed to get hyperlane mailbox") + + metadata := "" + + message, err := buildHyperlaneOrbiterMessage(inputs) + require.NoError(t, err, "failed to build orbiter message") + + // ACT: try to handle `MsgProcessMessage` with payload registered + _, err = node.ExecTx( + ctx, + relayer.KeyName(), + "hyperlane", + "mailbox", + "process", + mailbox.Id.String(), + metadata, + message.String(), + ) + require.NoError(t, err, "failed to handle orbiter message with hyperlane") +} + +func getPendingPayloadHashes( + t *testing.T, + ctx context.Context, + node *cosmos.ChainNode, +) []string { + t.Helper() + + stdOut, _, err := node.ExecQuery(ctx, "orbiter", "payload", "pending") + require.NoError(t, err, "failed to get pending payload") + + cc, ok := node.Chain.(*cosmos.CosmosChain) + require.True(t, ok) + + var res orbitertypes.QueryPendingPayloadsResponse + require.NoError(t, cc.GetCodec().UnmarshalJSON(stdOut, &res), "failed to unmarshal response") + + return res.Hashes +} diff --git a/e2e/hyperlane_utils.go b/e2e/hyperlane_utils.go new file mode 100644 index 00000000..568cfd1c --- /dev/null +++ b/e2e/hyperlane_utils.go @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 e2e + +import ( + "errors" + + hyperlaneutil "github.com/bcp-innovations/hyperlane-cosmos/util" + warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" + ethcommon "github.com/ethereum/go-ethereum/common" + + sdkmath "cosmossdk.io/math" + sdktypes "github.com/cosmos/cosmos-sdk/types" + + "github.com/noble-assets/orbiter/types/hyperlane" +) + +type orbHypTransferInputs struct { + amount sdkmath.Int + destinationDomain uint32 + nonce uint32 + originDomain uint32 + payloadHash ethcommon.Hash + recipient sdktypes.AccAddress +} + +func (o *orbHypTransferInputs) Validate() error { + if o.recipient.String() == (ethcommon.Address{}).String() { + return errors.New("empty recipient") + } + + if !o.amount.IsPositive() { + return errors.New("invalid amount") + } + + if o.payloadHash.Hex() == (ethcommon.Hash{}).Hex() { + return errors.New("empty payload hash") + } + + return nil +} + +// buildOrbHypConfig builds the required moving parts for an +// Orbiter transfer coming in through Hyperlane from the given inputs. +func buildHyperlaneOrbiterMessage( + in *orbHypTransferInputs, +) (*hyperlaneutil.HyperlaneMessage, error) { + if err := in.Validate(); err != nil { + return nil, err + } + + warpPayload, err := warptypes.NewWarpPayload(in.recipient.Bytes(), *in.amount.BigInt()) + if err != nil { + return nil, err + } + + fullPayload := make([]byte, hyperlane.ORBITER_PAYLOAD_SIZE) + copy(fullPayload[:len(warpPayload.Bytes())], warpPayload.Bytes()) + copy(fullPayload[hyperlane.ORBITER_PAYLOAD_SIZE-len(in.payloadHash):], in.payloadHash.Bytes()) + + return &hyperlaneutil.HyperlaneMessage{ + Version: 3, + Nonce: in.nonce, + Origin: in.originDomain, + Sender: hyperlaneutil.HexAddress{}, + Destination: in.destinationDomain, + Recipient: hyperlaneutil.HexAddress(in.recipient.Bytes()), + Body: fullPayload, + }, nil +} diff --git a/e2e/setup.go b/e2e/setup.go index 7188b34f..d463d520 100644 --- a/e2e/setup.go +++ b/e2e/setup.go @@ -84,6 +84,7 @@ type Suite struct { hyperlaneToken *warptypes.WrappedHypToken hyperlaneHook *hyperlanepostdispatchtypes.NoopHook hyperlaneDestinationDomain uint32 + hyperlaneOriginDomain uint32 } func NewSuite(t *testing.T, isZeroFees bool, isIBC, isHyperlane bool) (context.Context, Suite) { @@ -265,7 +266,9 @@ func NewSuite(t *testing.T, isZeroFees bool, isIBC, isHyperlane bool) (context.C suite.hyperlaneToken = collateralToken - suite.hyperlaneDestinationDomain = 1 + suite.hyperlaneOriginDomain = 1 + suite.hyperlaneDestinationDomain = 2 + receiverDomain := strconv.Itoa(int(suite.hyperlaneDestinationDomain)) receiverContract := "0x0000000000000000000000000000000000000000000000000000000000000000" gasAmount := "0" diff --git a/e2e/utils_payload.go b/e2e/utils_payload.go new file mode 100644 index 00000000..37a39722 --- /dev/null +++ b/e2e/utils_payload.go @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: BUSL-1.1 +// +// Copyright (C) 2025, NASD Inc. All rights reserved. +// Use of this software is governed 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 e2e From 37a314c6b178491c7d660cfbca2d87e4f69877cd Mon Sep 17 00:00:00 2001 From: Malte Herrmann Date: Wed, 22 Oct 2025 17:15:46 +0200 Subject: [PATCH 34/34] fix contracts --- contracts/script/DeployOrbiterGateway.s.sol | 4 +++- contracts/src/OrbiterGateway.sol | 2 +- contracts/test/TestOrbiterHypERC20.t.sol | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/contracts/script/DeployOrbiterGateway.s.sol b/contracts/script/DeployOrbiterGateway.s.sol index 64679a87..22ea6a3d 100644 --- a/contracts/script/DeployOrbiterGateway.s.sol +++ b/contracts/script/DeployOrbiterGateway.s.sol @@ -8,9 +8,11 @@ import { OrbiterGateway } from "../src/OrbiterGateway.sol"; contract DeployOrbiterGateway is Script { function run() external { + uint32 nobleDomain = 1; + vm.startBroadcast(); - OrbiterGateway gw = new OrbiterGateway(); + OrbiterGateway gw = new OrbiterGateway(nobleDomain); console.log("deployed hyperlane gateway at: ", address(gw)); vm.stopBroadcast(); diff --git a/contracts/src/OrbiterGateway.sol b/contracts/src/OrbiterGateway.sol index b622f27d..702283d4 100644 --- a/contracts/src/OrbiterGateway.sol +++ b/contracts/src/OrbiterGateway.sol @@ -33,7 +33,7 @@ import { OrbiterHypERC20 } from "./OrbiterHypERC20.sol"; contract OrbiterGateway { uint32 private destinationDomain; - function constructor(uint32 _domain) { + constructor(uint32 _domain) { destinationDomain = _domain; } diff --git a/contracts/test/TestOrbiterHypERC20.t.sol b/contracts/test/TestOrbiterHypERC20.t.sol index e677b41a..27f7bac1 100644 --- a/contracts/test/TestOrbiterHypERC20.t.sol +++ b/contracts/test/TestOrbiterHypERC20.t.sol @@ -98,7 +98,8 @@ contract TestOrbiterHypERC20 is Test { remoteMailbox.setRequiredHook(address(noopHook)); // Deploy the Orbiter gateway contract. - gateway = new OrbiterGateway(); + uint32 nobleDomain = 1; + gateway = new OrbiterGateway(nobleDomain); // Set up Orbiter transient store. OrbiterTransientStorage ots = new OrbiterTransientStorage(address(gateway));