diff --git a/.github/workflows/push-docker-image.yml b/.github/workflows/push-docker-image.yml index d2145583..7bf7157d 100644 --- a/.github/workflows/push-docker-image.yml +++ b/.github/workflows/push-docker-image.yml @@ -1,4 +1,4 @@ -# This workflow pushes new Bitsong docker images on every new tag. +# This workflow pushes new Bitsong docker images on every new tag or branch push. # # On every new `vX.Y.Z` tag the following images are pushed: # @@ -6,13 +6,11 @@ # bitsongofficial/go-bitsong:X.Y.Z # is pushed # bitsongofficial/go-bitsong:X.Y # is updated to X.Y.Z # bitsongofficial/go-bitsong:X # is updated to X.Y.Z -# bitsongofficial/go-bitsong:latest # is updated to X.Y.Z # -# bitsongofficial/go-bitsong-e2e:vX.Y.Z # is pushed -# bitsongofficial/go-bitsong-e2e:X.Y.Z # is pushed -# bitsongofficial/go-bitsong-e2e:X.Y # is updated to X.Y.Z -# bitsongofficial/go-bitsong-e2e:X # is updated to X.Y.Z -# bitsongofficial/go-bitsong-e2e:latest # is updated to X.Y.Z +# On branch pushes (e.g. feat-hyperlane) the following images are pushed: +# +# bitsongofficial/go-bitsong:feat-hyperlane # latest for that branch +# bitsongofficial/go-bitsong:feat-hyperlane-abc1234 # pinned to commit # # All the images above have support for linux/amd64 and linux/arm64. @@ -20,28 +18,27 @@ name: Push Docker Images env: DOCKER_REPOSITORY: bitsongofficial/go-bitsong - RUNNER_BASE_IMAGE_DISTROLESS: gcr.io/distroless/static-debian12 - RUNNER_BASE_IMAGE_NONROOT: gcr.io/distroless/static-debian12:nonroot - RUNNER_BASE_IMAGE_ALPINE: alpine:3.21 on: release: types: [published, created, edited] push: tags: - - 'v[0-9]+.[0-9]+.[0-9]+' # ignore rc + - 'v[0-9]+.[0-9]+.[0-9]+' # ignore rc + branches: + - 'feat-hyperlane' jobs: bitsong-images: runs-on: ubuntu-latest steps: - - + - name: Check out the repo uses: actions/checkout@v4 - - + - name: Set up QEMU uses: docker/setup-qemu-action@v3 - - + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to GitHub Container Registry @@ -51,19 +48,33 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Parse tag - id: tag + name: Determine image tags + id: tags run: | - VERSION=$(echo ${{ github.ref_name }} | sed "s/v//") - MAJOR_VERSION=$(echo $VERSION | cut -d '.' -f 1) - MINOR_VERSION=$(echo $VERSION | cut -d '.' -f 2) - PATCH_VERSION=$(echo $VERSION | cut -d '.' -f 3) - echo "VERSION=$VERSION" >> $GITHUB_ENV - echo "MAJOR_VERSION=$MAJOR_VERSION" >> $GITHUB_ENV - echo "MINOR_VERSION=$MINOR_VERSION" >> $GITHUB_ENV - echo "PATCH_VERSION=$PATCH_VERSION" >> $GITHUB_ENV - - - name: Build and push + SHORT_SHA=$(echo "${{ github.sha }}" | cut -c1-7) + + if [[ "${{ github.ref_type }}" == "tag" ]]; then + # Tag push: produce semver tags (e.g. v0.21.0 -> 0, 0.21, 0.21.0, v0.21.0) + VERSION=$(echo "${{ github.ref_name }}" | sed "s/v//") + MAJOR_VERSION=$(echo "$VERSION" | cut -d '.' -f 1) + MINOR_VERSION=$(echo "$VERSION" | cut -d '.' -f 2) + PATCH_VERSION=$(echo "$VERSION" | cut -d '.' -f 3) + IMAGE_TAGS="ghcr.io/${{ env.DOCKER_REPOSITORY }}:${MAJOR_VERSION} + ghcr.io/${{ env.DOCKER_REPOSITORY }}:${MAJOR_VERSION}.${MINOR_VERSION} + ghcr.io/${{ env.DOCKER_REPOSITORY }}:${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION} + ghcr.io/${{ env.DOCKER_REPOSITORY }}:v${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}" + else + # Branch push: produce branch + commit-pinned tags + BRANCH=$(echo "${{ github.ref_name }}" | sed 's/\//-/g') + IMAGE_TAGS="ghcr.io/${{ env.DOCKER_REPOSITORY }}:${BRANCH} + ghcr.io/${{ env.DOCKER_REPOSITORY }}:${BRANCH}-${SHORT_SHA}" + fi + + echo "IMAGE_TAGS<> $GITHUB_OUTPUT + echo "$IMAGE_TAGS" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + - + name: Build and push id: build_push_image uses: docker/build-push-action@v5 with: @@ -71,8 +82,4 @@ jobs: context: . push: true platforms: linux/amd64,linux/arm64 - tags: | - ghcr.io/bitsongofficial/go-bitsong:${{ env.MAJOR_VERSION }} - ghcr.io/bitsongofficial/go-bitsong:${{ env.MAJOR_VERSION }}.${{ env.MINOR_VERSION }} - ghcr.io/bitsongofficial/go-bitsong:${{ env.MAJOR_VERSION }}.${{ env.MINOR_VERSION }}.${{ env.PATCH_VERSION }} - ghcr.io/bitsongofficial/go-bitsong:v${{ env.MAJOR_VERSION }}.${{ env.MINOR_VERSION }}.${{ env.PATCH_VERSION }} + tags: ${{ steps.tags.outputs.IMAGE_TAGS }} diff --git a/.gitignore b/.gitignore index 208c93b8..3e5d8791 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,15 @@ state_export.json github.com* gogoproto* -target/ \ No newline at end of file +target/ + +.localbitsong-hyperlane/ + +evm/out/ +evm/cache/ +evm/broadcast/ +evm/node_modules/ + +scripts/hyperlane/.env +infra/.env.secrets +.docs-to-agent/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 4869b597..3b41db59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,12 +24,17 @@ Format: * (**scope**) Description (#PR or commit) ### State-Breaking +* (**hyperlane**) Integrate Hyperlane Core and Warp modules for cross-chain messaging and token bridging, registered via the `v024` upgrade handler (#301) + ### Features ### Bug Fixes ### Dependencies +* (**deps**) Add `hyperlane-cosmos v1.1.0` dependency (#301) +* (**deps**) Bump cosmos-sdk to v0.53.7, cometbft to v0.38.23, wasmd to v0.53.4 (#301) + ### Documentation ### CI diff --git a/app/app.go b/app/app.go index 65d5c7c6..6e0c456a 100644 --- a/app/app.go +++ b/app/app.go @@ -76,6 +76,7 @@ import ( v021 "github.com/bitsongofficial/go-bitsong/app/upgrades/v021" v022 "github.com/bitsongofficial/go-bitsong/app/upgrades/v022" v023 "github.com/bitsongofficial/go-bitsong/app/upgrades/v023" + v024 "github.com/bitsongofficial/go-bitsong/app/upgrades/v024" // unnamed import of statik for swagger UI support // _ "github.com/bitsongofficial/go-bitsong/swagger/statik" ) @@ -97,7 +98,7 @@ var ( Upgrades = []upgrades.Upgrade{ // v010.Upgrade, v011.Upgrade, v013.Upgrade, v014.Upgrade, // v015.Upgrade, v016.Upgrade, v018.Upgrade, v020.Upgrade, - v021.Upgrade, v022.Upgrade, v023.Upgrade, + v021.Upgrade, v022.Upgrade, v023.Upgrade, v024.Upgrade, } ) diff --git a/app/keepers/keepers.go b/app/keepers/keepers.go index 219868f9..eea32cc9 100644 --- a/app/keepers/keepers.go +++ b/app/keepers/keepers.go @@ -44,6 +44,10 @@ import ( distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + hyperlanekeeper "github.com/bcp-innovations/hyperlane-cosmos/x/core/keeper" + hyperlanetypes "github.com/bcp-innovations/hyperlane-cosmos/x/core/types" + warpkeeper "github.com/bcp-innovations/hyperlane-cosmos/x/warp/keeper" + warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" cadencekeeper "github.com/bitsongofficial/go-bitsong/x/cadence/keeper" cadencetypes "github.com/bitsongofficial/go-bitsong/x/cadence/types" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" @@ -116,6 +120,8 @@ var maccPerms = map[string][]string{ wasmtypes.ModuleName: {authtypes.Burner}, protocolpooltypes.ModuleName: nil, protocolpooltypes.ProtocolPoolEscrowAccount: nil, + hyperlanetypes.ModuleName: nil, + warptypes.ModuleName: {authtypes.Minter, authtypes.Burner}, } type AppKeepers struct { @@ -160,6 +166,10 @@ type AppKeepers struct { AuthenticatorManager *authenticator.AuthenticatorManager ProtocolPoolKeeper protocolpoolkeeper.Keeper + // Hyperlane keepers + HyperlaneKeeper *hyperlanekeeper.Keeper + WarpKeeper warpkeeper.Keeper + // Middleware wrapper Ics20WasmHooks *ibchooks.WasmHooks HooksICS4Wrapper ibchooks.ICS4Middleware @@ -245,6 +255,30 @@ func NewAppKeepers( govModAddress, bApp.Logger(), ) + // Hyperlane Core Keeper + hyperlaneKeeper := hyperlanekeeper.NewKeeper( + appCodec, + appKeepers.AccountKeeper.AddressCodec(), + runtime.NewKVStoreService(keys[hyperlanetypes.ModuleName]), + govModAddress, + appKeepers.BankKeeper, + ) + appKeepers.HyperlaneKeeper = &hyperlaneKeeper + + // Hyperlane Warp Keeper + appKeepers.WarpKeeper = warpkeeper.NewKeeper( + appCodec, + appKeepers.AccountKeeper.AddressCodec(), + runtime.NewKVStoreService(keys[warptypes.ModuleName]), + govModAddress, + appKeepers.BankKeeper, + appKeepers.HyperlaneKeeper, + []int32{ + int32(warptypes.HYP_TOKEN_TYPE_COLLATERAL), + int32(warptypes.HYP_TOKEN_TYPE_SYNTHETIC), + }, + ) + // Initialize authenticators appKeepers.AuthenticatorManager = authenticator.NewAuthenticatorManager() appKeepers.AuthenticatorManager.InitializeAuthenticators([]authenticator.Authenticator{ diff --git a/app/keepers/keys.go b/app/keepers/keys.go index 38128e93..11f653c0 100644 --- a/app/keepers/keys.go +++ b/app/keepers/keys.go @@ -5,6 +5,8 @@ import ( "cosmossdk.io/x/feegrant" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" + hyperlanetypes "github.com/bcp-innovations/hyperlane-cosmos/x/core/types" + warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" cadencetypes "github.com/bitsongofficial/go-bitsong/x/cadence/types" smartaccounttypes "github.com/bitsongofficial/go-bitsong/x/smart-account/types" authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" @@ -60,6 +62,8 @@ func (appKeepers *AppKeepers) GenerateKeys() { cadencetypes.StoreKey, smartaccounttypes.StoreKey, protocolpooltypes.StoreKey, + hyperlanetypes.ModuleName, // "hyperlane" — no StoreKey constant exported, ModuleName is the store key + warptypes.ModuleName, // "warp" — no StoreKey constant exported, ModuleName is the store key ) appKeepers.tkeys = storetypes.NewTransientStoreKeys(paramstypes.TStoreKey) diff --git a/app/modules.go b/app/modules.go index 9d368444..14179660 100644 --- a/app/modules.go +++ b/app/modules.go @@ -8,6 +8,10 @@ import ( "cosmossdk.io/x/upgrade" upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/CosmWasm/wasmd/x/wasm" + hyperlane "github.com/bcp-innovations/hyperlane-cosmos/x/core" + hyperlanetypes "github.com/bcp-innovations/hyperlane-cosmos/x/core/types" + warp "github.com/bcp-innovations/hyperlane-cosmos/x/warp" + warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" encparams "github.com/bitsongofficial/go-bitsong/app/params" "github.com/bitsongofficial/go-bitsong/x/cadence" "github.com/cosmos/cosmos-sdk/client" @@ -109,6 +113,8 @@ var AppModuleBasics = module.NewBasicManager( ibcwasm.AppModuleBasic{}, smartaccount.AppModuleBasic{}, protocolpool.AppModule{}, + hyperlane.AppModule{}, + warp.AppModule{}, ) func appModules( @@ -149,6 +155,8 @@ func appModules( cadence.NewAppModule(appCodec, app.CadenceKeeper), protocolpool.NewAppModule(app.ProtocolPoolKeeper, app.AccountKeeper, app.BankKeeper), smartaccount.NewAppModule(appCodec, *app.SmartAccountKeeper), + hyperlane.NewAppModule(appCodec, app.HyperlaneKeeper), + warp.NewAppModule(appCodec, app.WarpKeeper), crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), // always be last to make sure that it checks for all invariants and not only part of them } } @@ -158,7 +166,8 @@ func orderBeginBlockers() []string { capabilitytypes.ModuleName, minttypes.ModuleName, authtypes.ModuleName, banktypes.ModuleName, distrtypes.ModuleName, protocolpooltypes.ModuleName, slashingtypes.ModuleName, govtypes.ModuleName, crisistypes.ModuleName, stakingtypes.ModuleName, ibctransfertypes.ModuleName, ibcexported.ModuleName, packetforwardtypes.ModuleName, - icqtypes.ModuleName, authz.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, wasmtypes.ModuleName, + icqtypes.ModuleName, hyperlanetypes.ModuleName, warptypes.ModuleName, + authz.ModuleName, genutiltypes.ModuleName, evidencetypes.ModuleName, wasmtypes.ModuleName, feegrant.ModuleName, paramstypes.ModuleName, vestingtypes.ModuleName, cadencetypes.ModuleName, ibchookstypes.ModuleName, ibcwasmtypes.ModuleName, fantokentypes.ModuleName, } @@ -167,7 +176,8 @@ func orderBeginBlockers() []string { func orderEndBlockers() []string { return []string{ crisistypes.ModuleName, govtypes.ModuleName, stakingtypes.ModuleName, ibctransfertypes.ModuleName, ibcexported.ModuleName, - packetforwardtypes.ModuleName, icqtypes.ModuleName, feegrant.ModuleName, authz.ModuleName, capabilitytypes.ModuleName, authtypes.ModuleName, + packetforwardtypes.ModuleName, icqtypes.ModuleName, hyperlanetypes.ModuleName, warptypes.ModuleName, + feegrant.ModuleName, authz.ModuleName, capabilitytypes.ModuleName, authtypes.ModuleName, protocolpooltypes.ModuleName, // must be before bank banktypes.ModuleName, distrtypes.ModuleName, slashingtypes.ModuleName, minttypes.ModuleName, genutiltypes.ModuleName, wasmtypes.ModuleName, evidencetypes.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, cadencetypes.ModuleName, @@ -193,13 +203,13 @@ func orderInitBlockers() []string { evidencetypes.ModuleName, feegrant.ModuleName, authz.ModuleName, - authtypes.ModuleName, - ibcwasmtypes.ModuleName, smartaccounttypes.ModuleName, genutiltypes.ModuleName, paramstypes.ModuleName, upgradetypes.ModuleName, vestingtypes.ModuleName, + hyperlanetypes.ModuleName, + warptypes.ModuleName, wasmtypes.ModuleName, ibcwasmtypes.ModuleName, ibchookstypes.ModuleName, diff --git a/app/upgrades/v024/constants.go b/app/upgrades/v024/constants.go new file mode 100644 index 00000000..80c7b94d --- /dev/null +++ b/app/upgrades/v024/constants.go @@ -0,0 +1,26 @@ +package v024 + +import ( + store "cosmossdk.io/store/types" + + hyperlanetypes "github.com/bcp-innovations/hyperlane-cosmos/x/core/types" + warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" + + "github.com/bitsongofficial/go-bitsong/app/upgrades" +) + +const ( + UpgradeName = "v024" +) + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: CreateV024UpgradeHandler, + StoreUpgrades: store.StoreUpgrades{ + Added: []string{ + hyperlanetypes.ModuleName, + warptypes.ModuleName, + }, + Deleted: []string{}, + }, +} diff --git a/app/upgrades/v024/upgrades.go b/app/upgrades/v024/upgrades.go new file mode 100644 index 00000000..02e2ce32 --- /dev/null +++ b/app/upgrades/v024/upgrades.go @@ -0,0 +1,49 @@ +package v024 + +import ( + "context" + "fmt" + + upgradetypes "cosmossdk.io/x/upgrade/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + + hyperlanetypes "github.com/bcp-innovations/hyperlane-cosmos/x/core/types" + warptypes "github.com/bcp-innovations/hyperlane-cosmos/x/warp/types" + + "github.com/bitsongofficial/go-bitsong/app/keepers" + "github.com/bitsongofficial/go-bitsong/app/upgrades" +) + +func CreateV024UpgradeHandler(mm *module.Manager, configurator module.Configurator, bpm upgrades.BaseAppParamManager, k *keepers.AppKeepers) upgradetypes.UpgradeHandler { + return func(context context.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + sdkCtx := sdk.UnwrapSDKContext(context) + logger := sdkCtx.Logger().With("upgrade", UpgradeName) + + if _, found := vm[hyperlanetypes.ModuleName]; found { + return nil, fmt.Errorf("%s already present in version map; its InitGenesis would be skipped", hyperlanetypes.ModuleName) + } + if _, found := vm[warptypes.ModuleName]; found { + return nil, fmt.Errorf("%s already present in version map; its InitGenesis would be skipped", warptypes.ModuleName) + } + + logger.Info(fmt.Sprintf("pre migrate version map: %v", vm)) + + versionMap, err := mm.RunMigrations(sdkCtx, configurator, vm) + if err != nil { + return nil, err + } + + // materialize the hyperlane and warp module accounts at + // the upgrade height. GetModuleAccount lazily creates and persists the account + // the first time it is read; warp would otherwise only get created on its first + // synthetic-token mint. Forcing creation here guarantees the accounts exist + // exactly at the upgrade block. + _ = k.AccountKeeper.GetModuleAccount(sdkCtx, hyperlanetypes.ModuleName) + _ = k.AccountKeeper.GetModuleAccount(sdkCtx, warptypes.ModuleName) + + logger.Info(fmt.Sprintf("post migrate version map: %v", versionMap)) + logger.Info("Hyperlane (core + warp) modules initialized") + return versionMap, nil + } +} diff --git a/go.mod b/go.mod index 1c57085d..d871fc8f 100644 --- a/go.mod +++ b/go.mod @@ -4,25 +4,26 @@ go 1.23.2 require ( cosmossdk.io/api v0.9.2 - cosmossdk.io/client/v2 v2.0.0-beta.3 - cosmossdk.io/collections v1.2.0 + cosmossdk.io/client/v2 v2.0.0-beta.8 + cosmossdk.io/collections v1.3.1 cosmossdk.io/core v0.11.3 cosmossdk.io/errors v1.0.2 - cosmossdk.io/log v1.5.1 + cosmossdk.io/log v1.6.1 cosmossdk.io/math v1.5.3 cosmossdk.io/store v1.1.2 cosmossdk.io/x/evidence v0.1.1 cosmossdk.io/x/feegrant v0.1.1 cosmossdk.io/x/tx v0.14.0 cosmossdk.io/x/upgrade v0.1.4 - github.com/CosmWasm/wasmd v0.53.3 + github.com/CosmWasm/wasmd v0.53.4 github.com/CosmWasm/wasmvm/v2 v2.1.6 - github.com/cometbft/cometbft v0.38.21 - github.com/cosmos/cosmos-db v1.1.1 + github.com/bcp-innovations/hyperlane-cosmos v1.1.0 + github.com/cometbft/cometbft v0.38.23 + github.com/cosmos/cosmos-db v1.1.3 github.com/cosmos/cosmos-proto v1.0.0-beta.5 - github.com/cosmos/cosmos-sdk v0.53.0 + github.com/cosmos/cosmos-sdk v0.53.7 github.com/cosmos/go-bip39 v1.0.0 - github.com/cosmos/gogoproto v1.7.0 + github.com/cosmos/gogoproto v1.7.2 github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.1.1 github.com/cosmos/ibc-apps/modules/async-icq/v8 v8.0.0 github.com/cosmos/ibc-apps/modules/ibc-hooks/v8 v8.0.0-20250226172931-56b9c5e4400a @@ -35,30 +36,30 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/go-metrics v0.5.4 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.22.0 + github.com/prometheus/client_golang v1.23.0 github.com/rakyll/statik v0.1.7 - github.com/spf13/cast v1.7.1 - github.com/spf13/cobra v1.9.1 - github.com/spf13/pflag v1.0.6 - github.com/spf13/viper v1.20.1 - github.com/stretchr/testify v1.10.0 + github.com/spf13/cast v1.10.0 + github.com/spf13/cobra v1.10.1 + github.com/spf13/pflag v1.0.10 + github.com/spf13/viper v1.21.0 + github.com/stretchr/testify v1.11.1 golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 - golang.org/x/sync v0.13.0 - google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 - google.golang.org/grpc v1.72.0 + golang.org/x/sync v0.16.0 + google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 + google.golang.org/grpc v1.75.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cel.dev/expr v0.20.0 // indirect - cloud.google.com/go v0.118.2 // indirect - cloud.google.com/go/auth v0.14.1 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect - cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.4.0 // indirect - cloud.google.com/go/monitoring v1.23.0 // indirect + cel.dev/expr v0.24.0 // indirect + cloud.google.com/go v0.120.0 // indirect + cloud.google.com/go/auth v0.16.4 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.8.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect cloud.google.com/go/storage v1.50.0 // indirect - cosmossdk.io/depinject v1.2.0 // indirect + cosmossdk.io/depinject v1.2.1 // indirect cosmossdk.io/schema v1.1.0 // indirect cosmossdk.io/x/circuit v0.1.1 // indirect filippo.io/edwards25519 v1.1.0 // indirect @@ -66,24 +67,25 @@ require ( github.com/99designs/keyring v1.2.2 // indirect github.com/DataDog/datadog-go v4.8.3+incompatible // indirect github.com/DataDog/zstd v1.5.7 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/aws/aws-sdk-go v1.55.6 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.2.0 // indirect - github.com/bits-and-blooms/bitset v1.22.0 // indirect - github.com/bytedance/sonic v1.13.2 // indirect - github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/bits-and-blooms/bitset v1.24.3 // indirect + github.com/bytedance/gopkg v0.1.3 // indirect + github.com/bytedance/sonic v1.14.2 // indirect + github.com/bytedance/sonic/loader v0.4.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect - github.com/cloudwego/base64x v0.1.5 // indirect - github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect - github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/errors v1.12.0 // indirect github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 // indirect github.com/cockroachdb/pebble v1.1.5 // indirect @@ -94,7 +96,7 @@ require ( github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.2.2 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect + github.com/cosmos/ledger-cosmos-go v1.0.0 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect @@ -107,21 +109,22 @@ require ( github.com/emicklei/dot v1.6.4 // indirect github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect + github.com/ethereum/go-ethereum v1.14.12 // indirect github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/getsentry/sentry-go v0.31.1 // indirect - github.com/go-jose/go-jose/v4 v4.0.4 // indirect + github.com/getsentry/sentry-go v0.35.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-kit/kit v0.13.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect - github.com/golang/snappy v0.0.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/google/go-cmp v0.7.0 // indirect @@ -129,8 +132,8 @@ require ( github.com/google/orderedcode v0.0.1 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.14.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.15.0 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect @@ -146,6 +149,7 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/yamux v0.1.2 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect + github.com/holiman/uint256 v1.3.1 // indirect github.com/huandu/skiplist v1.2.1 // indirect github.com/iancoleman/orderedmap v0.3.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect @@ -157,13 +161,13 @@ require ( github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lib/pq v1.10.9 // indirect + github.com/lib/pq v1.12.0 // indirect github.com/linxGnu/grocksdb v1.9.8 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mdp/qrterminal/v3 v3.2.1 // indirect - github.com/minio/highwayhash v1.0.3 // indirect + github.com/minio/highwayhash v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mtibben/percent v0.2.1 // indirect @@ -172,21 +176,21 @@ require ( github.com/oklog/run v1.1.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect - github.com/petermattis/goid v0.0.0-20250211185408-f2b9d978cd7a // indirect + github.com/petermattis/goid v0.0.0-20250813065127-a731cc31b4fe // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.65.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/rs/cors v1.11.1 // indirect github.com/rs/zerolog v1.34.0 // indirect - github.com/sagikazarmark/locafero v0.7.0 // indirect - github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect + github.com/sasha-s/go-deadlock v0.3.9 // indirect github.com/shamaton/msgpack/v2 v2.2.2 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.12.0 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect + github.com/spf13/afero v1.15.0 // indirect github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect @@ -195,39 +199,43 @@ require ( github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ulikunitz/xz v0.5.12 // indirect github.com/zeebo/errs v1.4.0 // indirect + github.com/zondax/golem v0.27.0 // indirect github.com/zondax/hid v0.9.2 // indirect - github.com/zondax/ledger-go v1.0.0 // indirect + github.com/zondax/ledger-go v1.0.1 // indirect go.etcd.io/bbolt v1.4.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect - go.opentelemetry.io/otel v1.34.0 // indirect - go.opentelemetry.io/otel/metric v1.34.0 // indirect - go.opentelemetry.io/otel/sdk v1.34.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect - go.opentelemetry.io/otel/trace v1.34.0 // indirect - go.uber.org/mock v0.5.2 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/mock v0.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/arch v0.15.0 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/oauth2 v0.26.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/term v0.31.0 // indirect - golang.org/x/text v0.24.0 // indirect - golang.org/x/time v0.10.0 // indirect - google.golang.org/api v0.221.0 // indirect - google.golang.org/genproto v0.0.0-20250212204824-5a70512c5d8b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f // indirect - google.golang.org/protobuf v1.36.6 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/arch v0.17.0 // indirect + golang.org/x/crypto v0.41.0 // indirect + golang.org/x/net v0.43.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect + golang.org/x/time v0.12.0 // indirect + google.golang.org/api v0.247.0 // indirect + google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.2 // indirect nhooyr.io/websocket v1.8.17 // indirect pgregory.net/rapid v1.2.0 // indirect rsc.io/qr v0.2.0 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) replace ( diff --git a/go.sum b/go.sum index a926c24b..e342daf1 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= -cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -38,8 +38,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.118.2 h1:bKXO7RXMFDkniAAvvuMrAPtQ/VHrs9e7J5UT3yrGdTY= -cloud.google.com/go v0.118.2/go.mod h1:CFO4UPEPi8oV21xoezZCrd3d81K4fFkDTEJu4R8K+9M= +cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= +cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -101,10 +101,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0= -cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= -cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= -cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= +cloud.google.com/go/auth v0.16.4 h1:fXOAIQmkApVvcIn7Pc2+5J8QTMVbUGLscnSVNl11su8= +cloud.google.com/go/auth v0.16.4/go.mod h1:j10ncYwjX/g3cdX7GpEzsdM+d+ZNsXAbb6qXA7p1Y5M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= @@ -184,8 +184,8 @@ cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZ cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA= +cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= @@ -319,8 +319,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.4.0 h1:ZNfy/TYfn2uh/ukvhp783WhnbVluqf/tzOaqVUPlIPA= -cloud.google.com/go/iam v1.4.0/go.mod h1:gMBgqPaERlriaOV0CUl//XUzDhSfXevn4OEUbg6VRs4= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= @@ -355,8 +355,8 @@ cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhX cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.6.4 h1:3tyw9rO3E2XVXzSApn1gyEEnH2K9SynNQjMlBi3uHLg= -cloud.google.com/go/longrunning v0.6.4/go.mod h1:ttZpLCe6e7EXvn9OxpBRx7kZEB0efv8yBO6YnVMfhJs= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= @@ -380,8 +380,8 @@ cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhI cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.23.0 h1:M3nXww2gn9oZ/qWN2bZ35CjolnVHM3qnSbu6srCPgjk= -cloud.google.com/go/monitoring v1.23.0/go.mod h1:034NnlQPDzrQ64G2Gavhl0LUHZs9H3rRmhtnp7jiJgg= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= @@ -566,8 +566,8 @@ cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE= -cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= @@ -616,18 +616,18 @@ cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= cosmossdk.io/api v0.9.2 h1:9i9ptOBdmoIEVEVWLtYYHjxZonlF/aOVODLFaxpmNtg= cosmossdk.io/api v0.9.2/go.mod h1:CWt31nVohvoPMTlPv+mMNCtC0a7BqRdESjCsstHcTkU= -cosmossdk.io/client/v2 v2.0.0-beta.3 h1:+TTuH0DwQYsUq2JFAl3fDZzKq5gQG7nt3dAattkjFDU= -cosmossdk.io/client/v2 v2.0.0-beta.3/go.mod h1:CZcL41HpJPOOayTCO28j8weNBQprG+SRiKX39votypo= -cosmossdk.io/collections v1.2.0 h1:IesfVG8G/+FYCMVMP01frS/Cw99Omk5vBh3cHbO01Gg= -cosmossdk.io/collections v1.2.0/go.mod h1:4NkMoYw6qRA8fnSH/yn1D/MOutr8qyQnwsO50Mz9ItU= +cosmossdk.io/client/v2 v2.0.0-beta.8 h1:RXMJdA4V9H1H3/3BfMD6dAW3lF8W9DpNPPYnKD+ArxY= +cosmossdk.io/client/v2 v2.0.0-beta.8/go.mod h1:x+E2eji+ToMtUIqKzoJ5mJIhat+Zak47xZ8jOYjJQBA= +cosmossdk.io/collections v1.3.1 h1:09e+DUId2brWsNOQ4nrk+bprVmMUaDH9xvtZkeqIjVw= +cosmossdk.io/collections v1.3.1/go.mod h1:ynvkP0r5ruAjbmedE+vQ07MT6OtJ0ZIDKrtJHK7Q/4c= cosmossdk.io/core v0.11.3 h1:mei+MVDJOwIjIniaKelE3jPDqShCc/F4LkNNHh+4yfo= cosmossdk.io/core v0.11.3/go.mod h1:9rL4RE1uDt5AJ4Tg55sYyHWXA16VmpHgbe0PbJc6N2Y= -cosmossdk.io/depinject v1.2.0 h1:6NW/FSK1IkWTrX7XxUpBmX1QMBozpEI9SsWkKTBc5zw= -cosmossdk.io/depinject v1.2.0/go.mod h1:pvitjtUxZZZTQESKNS9KhGjWVslJZxtO9VooRJYyPjk= +cosmossdk.io/depinject v1.2.1 h1:eD6FxkIjlVaNZT+dXTQuwQTKZrFZ4UrfCq1RKgzyhMw= +cosmossdk.io/depinject v1.2.1/go.mod h1:lqQEycz0H2JXqvOgVwTsjEdMI0plswI7p6KX+MVqFOM= cosmossdk.io/errors v1.0.2 h1:wcYiJz08HThbWxd/L4jObeLaLySopyyuUFB5w4AGpCo= cosmossdk.io/errors v1.0.2/go.mod h1:0rjgiHkftRYPj//3DrD6y8hcm40HcPv/dR4R/4efr0k= -cosmossdk.io/log v1.5.1 h1:wLwiYXmfrort/O+j6EkjF+HvbdrRQd+4cYCPKFSm+zM= -cosmossdk.io/log v1.5.1/go.mod h1:5cXXBvfBkR2/BcXmosdCSLXllvgSjphrrDVdfVRmBGM= +cosmossdk.io/log v1.6.1 h1:YXNwAgbDwMEKwDlCdH8vPcoggma48MgZrTQXCfmMBeI= +cosmossdk.io/log v1.6.1/go.mod h1:gMwsWyyDBjpdG9u2avCFdysXqxq28WJapJvu+vF1y+E= cosmossdk.io/math v1.5.3 h1:WH6tu6Z3AUCeHbeOSHg2mt9rnoiUWVWaQ2t6Gkll96U= cosmossdk.io/math v1.5.3/go.mod h1:uqcZv7vexnhMFJF+6zh9EWdm/+Ylyln34IvPnBauPCQ= cosmossdk.io/schema v1.1.0 h1:mmpuz3dzouCoyjjcMcA/xHBEmMChN+EHh8EHxHRHhzE= @@ -657,8 +657,8 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25 github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CosmWasm/wasmd v0.53.3 h1:kZkkSM2hf0Le7iJPLLNm0QTi2j+wiuLMMn7SyOqBiYw= -github.com/CosmWasm/wasmd v0.53.3/go.mod h1:gP10E56tuToU5rsZR7vZLBL5ssW2mie6KN/WrQLG7/I= +github.com/CosmWasm/wasmd v0.53.4 h1:yZq7xuWMxY9q5niD0HxOSyYSfHvATXgV3KI1IqkALKg= +github.com/CosmWasm/wasmd v0.53.4/go.mod h1:zk6V7X9VPYAosyD6VMC+VaVsG33aTnmqDoIIFNkD31E= github.com/CosmWasm/wasmvm/v2 v2.1.6 h1:TBJovKsc2PdLngXJx9Cozo4SnxaC/z6SJLZrxw9wv+M= github.com/CosmWasm/wasmvm/v2 v2.1.6/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZbT4ztOl6bg= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -666,14 +666,14 @@ github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bp github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE= github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 h1:f2Qw/Ehhimh5uO1fayV0QIW7DShEQqhtUfhYc+cBPlw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0 h1:o90wcURuxekmXrtxmYWTyNla0+ZEHhud6DI1ZTxd1vI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0/go.mod h1:6fTWu4m3jocfUZLYF5KsZC1TUfRvEjs7lM4crme/irw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0 h1:jJKWl98inONJAr/IZrdFQUWcwUO95DLY1XMD1ZIut+g= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0/go.mod h1:l2fIqmwB+FKSfvn3bAD/0i+AXAxhIZjTK2svT/mgUXs= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 h1:GYUJLfvd++4DMuMhCFLgLXvFwofIxh/qOwoGuS/LTew= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 h1:5IT7xOdq17MtcdtL/vtl6mGfzhaq4m4vpollPRmlsBQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0 h1:nNMpRpnkWDAaqcpxMJvxa/Ud98gjbYwayJY4/9bdjiU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 h1:ig/FpDD2JofP/NExKQUbn7uOSZzJAQqogfqluZK4ed4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= @@ -715,6 +715,8 @@ github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/bcp-innovations/hyperlane-cosmos v1.1.0 h1:WXt+WrKv2DG/xVIkLvggDRbi/2law104Vj6AWZGxHNw= +github.com/bcp-innovations/hyperlane-cosmos v1.1.0/go.mod h1:NP59yKAk2qFaT7+FSCh7kkoKKLlTxXNdIlxMstAJ5no= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -725,21 +727,22 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.2.0 h1:tgObeVOf8WAvtuAX6DhJ4xks4CFNwPDZiqzGqIHE51E= github.com/bgentry/speakeasy v0.2.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= -github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.24.3 h1:Bte86SlO3lwPQqww+7BE9ZuUCKIjfqnG5jtEyqA9y9Y= +github.com/bits-and-blooms/bitset v1.24.3/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcec/v2 v2.3.5 h1:dpAlnAwmT1yIBm3exhT1/8iUSD98RDJM5vqJVQDQLiU= +github.com/btcsuite/btcd/btcec/v2 v2.3.5/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ= github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= -github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= -github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= -github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= -github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= +github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/sonic v1.14.2 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE= +github.com/bytedance/sonic v1.14.2/go.mod h1:T80iDELeHiHKSc0C9tubFygiuXoGzrkjKzX2quAx980= +github.com/bytedance/sonic/loader v0.4.0 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2NYzevs+o= +github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -768,9 +771,8 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= -github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= -github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -784,15 +786,15 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk= -github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= -github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/errors v1.12.0 h1:d7oCs6vuIMUQRVbi6jWWWEJZahLCfJpnJSVobd1/sUo= +github.com/cockroachdb/errors v1.12.0/go.mod h1:SvzfYNNBshAVbZ8wzNc/UPK3w1vf0dKDUP41ucAIf7g= github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 h1:pU88SPhIFid6/k0egdR5V6eALQYq2qbSmukrkgIh/0A= github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 h1:ASDL+UJcILMqgNeV5jiqR4j+sTuvQNHdf2chuKj1M5k= @@ -804,8 +806,8 @@ github.com/cockroachdb/redact v1.1.6/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/cometbft/cometbft v0.38.21 h1:qcIJSH9LiwU5s6ZgKR5eRbsLNucbubfraDs5bzgjtOI= -github.com/cometbft/cometbft v0.38.21/go.mod h1:UCu8dlHqvkAsmAFmWDRWNZJPlu6ya2fTWZlDrWsivwo= +github.com/cometbft/cometbft v0.38.23 h1:jtCe5Do4EcHVf/FCyZMvkBm+AmsRGGyvswImXYAabdM= +github.com/cometbft/cometbft v0.38.23/go.mod h1:jtH//cs5e2U5dNiaYIPMBwWXZsedXJfIie77gVhuRaA= github.com/cometbft/cometbft-db v0.14.1 h1:SxoamPghqICBAIcGpleHbmoPqy+crij/++eZz3DlerQ= github.com/cometbft/cometbft-db v0.14.1/go.mod h1:KHP1YghilyGV/xjD5DP3+2hyigWx0WTp9X+0Gnx0RxQ= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= @@ -816,19 +818,19 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= -github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= +github.com/cosmos/cosmos-db v1.1.3 h1:7QNT77+vkefostcKkhrzDK9uoIEryzFrU9eoMeaQOPY= +github.com/cosmos/cosmos-db v1.1.3/go.mod h1:kN+wGsnwUJZYn8Sy5Q2O0vCYA99MJllkKASbs6Unb9U= github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= -github.com/cosmos/cosmos-sdk v0.53.0 h1:ZsB2tnBVudumV059oPuElcr0K1lLOutaI6WJ+osNTbI= -github.com/cosmos/cosmos-sdk v0.53.0/go.mod h1:UPcRyFwOUy2PfSFBWxBceO/HTjZOuBVqY583WyazIGs= +github.com/cosmos/cosmos-sdk v0.53.7 h1:CqY48EB118WuR2EcTobiFACOQbfP8Dyyb5C5nAOq3XM= +github.com/cosmos/cosmos-sdk v0.53.7/go.mod h1:N6YuprhAabInbT3YGumGDKONbvPX5dNro7RjHvkQoKE= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= -github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cosmos/gogoproto v1.7.2 h1:5G25McIraOC0mRFv9TVO139Uh3OklV2hczr13KKVHCA= +github.com/cosmos/gogoproto v1.7.2/go.mod h1:8S7w53P1Y1cHwND64o0BnArT6RmdgIvsBuco6uTllsk= github.com/cosmos/iavl v1.2.2 h1:qHhKW3I70w+04g5KdsdVSHRbFLgt3yY3qTMd4Xa4rC8= github.com/cosmos/iavl v1.2.2/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v8 v8.1.1 h1:+EGYrTsQ2hu8pBwCWAgqc0g/zSklvBFehda9URLfvOU= @@ -849,8 +851,8 @@ github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5Rtn github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= -github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= -github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cosmos/ledger-cosmos-go v1.0.0 h1:jNKW89nPf0vR0EkjHG8Zz16h6p3zqwYEOxlHArwgYtw= +github.com/cosmos/ledger-cosmos-go v1.0.0/go.mod h1:mGaw2wDOf+Z6SfRJsMGxU9DIrBa4du0MAiPlpPhLAOE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -917,6 +919,8 @@ github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0+ github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/ethereum/go-ethereum v1.14.12 h1:8hl57x77HSUo+cXExrURjU/w1VhL+ShCTJrTwcCQSe4= +github.com/ethereum/go-ethereum v1.14.12/go.mod h1:RAC2gVMWJ6FkxSPESfbshrcKpIokgQKsVKmAuqdekDY= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -935,8 +939,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/getsentry/sentry-go v0.31.1 h1:ELVc0h7gwyhnXHDouXkhqTFSO5oslsRDk0++eyE0KJ4= -github.com/getsentry/sentry-go v0.31.1/go.mod h1:CYNcMMz73YigoHljQRG+qPF+eMq8gG72XcGN/p71BAY= +github.com/getsentry/sentry-go v0.35.0 h1:+FJNlnjJsZMG3g0/rmmP7GiKjQoUF5EXfEtBwtPtkzY= +github.com/getsentry/sentry-go v0.35.0/go.mod h1:C55omcY9ChRQIUcVcGcs+Zdy4ZpQGvNJ7JYHIoSWOtE= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= @@ -950,8 +954,8 @@ github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmn github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E= -github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -968,8 +972,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= @@ -980,8 +984,8 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= @@ -1045,8 +1049,9 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= @@ -1114,8 +1119,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -1127,8 +1132,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= -github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= +github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -1204,6 +1209,8 @@ github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8 github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= @@ -1263,7 +1270,6 @@ github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYW github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -1280,8 +1286,8 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.12.0 h1:mC1zeiNamwKBecjHarAr26c/+d8V5w/u4J0I/yASbJo= +github.com/lib/pq v1.12.0/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.9.8 h1:vOIKv9/+HKiqJAElJIEYv3ZLcihRxyP7Suu/Mu8Dxjs= @@ -1317,8 +1323,8 @@ github.com/mdp/qrterminal/v3 v3.2.1/go.mod h1:jOTmXvnBsMy5xqLniO0R++Jmjs2sTm9dFS github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= -github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/minio/highwayhash v1.0.4 h1:asJizugGgchQod2ja9NJlGOWq4s7KsAWr5XUc9Clgl4= +github.com/minio/highwayhash v1.0.4/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -1367,6 +1373,8 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.7.0 h1:/XxtEV3I3Eif/HobnVx9YmJgk8ENdRsuUmM+fLCFNow= +github.com/onsi/ginkgo/v2 v2.7.0/go.mod h1:yjiuMwPokqY1XauOgju45q3sJt6VzQ/Fict1LFVcsAo= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -1398,9 +1406,8 @@ github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZO github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/petermattis/goid v0.0.0-20250211185408-f2b9d978cd7a h1:ckxP/kGzsxvxXo8jO6E/0QJ8MMmwI7IRj4Fys9QbAZA= -github.com/petermattis/goid v0.0.0-20250211185408-f2b9d978cd7a/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/petermattis/goid v0.0.0-20250813065127-a731cc31b4fe h1:vHpqOnPlnkba8iSxU4j/CvDSS9J4+F4473esQsYLGoE= +github.com/petermattis/goid v0.0.0-20250813065127-a731cc31b4fe/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= @@ -1430,8 +1437,8 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1439,8 +1446,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= @@ -1448,8 +1455,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= -github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1457,8 +1464,8 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1484,11 +1491,11 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= -github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= -github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sasha-s/go-deadlock v0.3.9 h1:fiaT9rB7g5sr5ddNZvlwheclN9IP86eFW9WgqlEQV+w= +github.com/sasha-s/go-deadlock v0.3.9/go.mod h1:KuZj51ZFmx42q/mPaYbRk0P1xcwe697zsJKE03vD4/Y= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shamaton/msgpack/v2 v2.2.2 h1:GOIg0c9LV04VwzOOqZSrmsv/JzjNOOMxnS/HvOHGdgs= github.com/shamaton/msgpack/v2 v2.2.2/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI= @@ -1503,25 +1510,26 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= -github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= -github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1544,8 +1552,10 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -1577,10 +1587,12 @@ github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zondax/golem v0.27.0 h1:IbBjGIXF3SoGOZHsILJvIM/F/ylwJzMcHAcggiqniPw= +github.com/zondax/golem v0.27.0/go.mod h1:AmorCgJPt00L8xN1VrMBe13PSifoZksnQ1Ge906bu4A= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v1.0.0 h1:BvNoksIyRqyQTW78rIZP9A44WwAminKiomQa7jXp9EI= -github.com/zondax/ledger-go v1.0.0/go.mod h1:HpgkgFh3Jkwi9iYLDATdyRxc8CxqxcywsFj6QerWzvo= +github.com/zondax/ledger-go v1.0.1 h1:Ks/2tz/dOF+dbRynfZ0dEhcdL1lqw43Sa0zMXHpQ3aQ= +github.com/zondax/ledger-go v1.0.1/go.mod h1:j7IgMY39f30apthJYMd1YsHZRqdyu4KbVmUp0nU78X0= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= @@ -1598,24 +1610,24 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= -go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= -go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= -go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= -go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= -go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -1626,8 +1638,8 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= -go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1637,8 +1649,14 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= -golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.17.0 h1:4O3dfLzd+lQewptAHqjewQZQDyEdejz3VwgeYwkZneU= +golang.org/x/arch v0.17.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1657,8 +1675,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1796,8 +1814,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1827,8 +1845,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= -golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1849,8 +1867,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1961,8 +1979,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1977,8 +1995,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1999,8 +2017,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2008,8 +2026,8 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= -golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2095,6 +2113,8 @@ gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJ gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= @@ -2157,8 +2177,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.221.0 h1:qzaJfLhDsbMeFee8zBRdt/Nc+xmOuafD/dbdgGfutOU= -google.golang.org/api v0.221.0/go.mod h1:7sOU2+TL4TxUTdbi0gWgAIg7tH5qBXxoyhtL+9x3biQ= +google.golang.org/api v0.247.0 h1:tSd/e0QrUlLsrwMKmkbQhYVa109qIintOls2Wh6bngc= +google.golang.org/api v0.247.0/go.mod h1:r1qZOPmxXffXg6xS5uhx16Fa/UFY8QU/K4bfKrnvovM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2304,12 +2324,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20250212204824-5a70512c5d8b h1:TdBaFxGAABTI8sz9jYHPtjje677pS4XXup9vJMlj8hQ= -google.golang.org/genproto v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:0TrvLFkilZy+XULmuoWfiTbTRXLWXJ1S44jQTW3lWwE= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f h1:N/PrbTw4kdkqNRzVfWPrBekzLuarFREcbFOiOLkXon4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c h1:qXWI/sQtv5UKboZ/zUk7h+mrf/lXORyI+n9DKDAusdg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -2357,8 +2377,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= -google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2378,8 +2398,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2458,7 +2478,6 @@ modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= -nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= @@ -2468,6 +2487,6 @@ rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/scripts/hyperlane/.env.example b/scripts/hyperlane/.env.example new file mode 100644 index 00000000..46b824b1 --- /dev/null +++ b/scripts/hyperlane/.env.example @@ -0,0 +1,15 @@ +# ============================================================================= +# Copy to .env and fill in real values: +# cp .env.example .env +# +# .env is gitignored +# ============================================================================= + +# BitSong validator mnemonic (coin-type 639 — derives bitsong1... address) +VAL_MNEMONIC="your 24-word mnemonic here" + +# EVM / Hyperlane agent keys (hex, 0x-prefixed) +HYP_KEY=0x... +VALIDATOR_KEY=0x... +COSMOS_SIGNER_KEY=$VALIDATOR_KEY +EVM_RELAYER_KEY=$HYP_KEY diff --git a/scripts/hyperlane/01-chain.sh b/scripts/hyperlane/01-chain.sh new file mode 100755 index 00000000..4ee98542 --- /dev/null +++ b/scripts/hyperlane/01-chain.sh @@ -0,0 +1,171 @@ +#!/usr/bin/env bash +# ============================================================================= +# 01-chain.sh — Initialize and start a single-validator BitSong localnet +# +# Usage: +# bash 01-chain.sh # Init (if needed) + start +# bash 01-chain.sh --clean # Wipe state and re-init +# ============================================================================= + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" + +# Test accounts (from tests/localbitsong/scripts/setup.sh) +TEST_ADDRESSES=( + "bitsong1regz7kj3ylg2dn9rl8vwrhclkgz528mf0tfsck" + "bitsong1hvrhhex6wfxh7r7nnc3y39p0qlmff6v9t5rc25" + "bitsong175vgzztymvvcxvqun54nlu9dq6856thgvyl5sa" + "bitsong1t8nznzj4sd6zzutwdmslgy4dcxyd2jafz7822x" + "bitsong14vdrvstsffj8mq5e4fhm6y2hpfxtedajczsj5d" + "bitsong1vwe5hay74v0vhuzdhadteyqfasu5d7tdf83pyy" + "bitsong16866dezn6ez2qpmpcrrv9cyud8v8c7ufnzwhhh" + "bitsong1tlwh75lvu35nw9vcg557mxhspz5s88t6vzscd8" + "bitsong16z9wj8n5f3zgzwspw0r9sj9v7k7hdasqj95us9" + "bitsong1gulaxnca7rped0grw0lz4h4zy0xn3ttvmlad8x" +) +GENESIS_AMOUNT="10000000000000${DENOM}" +STAKE_AMOUNT="5000000000000${DENOM}" + +# ─── Init ──────────────────────────────────────────────────────────────────── + +init_chain() { + log_step "Initializing Chain" + + log "Initializing chain (chain-id=$CHAIN_ID)..." + echo "$VAL_MNEMONIC" | "$BINARY" init "$MONIKER" \ + --chain-id="$CHAIN_ID" --home="$BITSONG_HOME" --recover -o > /dev/null 2>&1 + + # Genesis modifications + log "Modifying genesis.json..." + local genesis="$BITSONG_HOME/config/genesis.json" + local tmp="${genesis}.tmp" + jq ' + .app_state.staking.params.bond_denom = "ubtsg" | + .app_state.staking.params.unbonding_time = "240s" | + .app_state.crisis.constant_fee.denom = "ubtsg" | + .app_state.gov.params.voting_period = "60s" | + .app_state.gov.params.expedited_voting_period = "30s" | + .app_state.gov.params.min_deposit[0].denom = "ubtsg" | + .app_state.gov.params.expedited_min_deposit[0].denom = "ubtsg" | + .app_state.mint.params.mint_denom = "ubtsg" | + .app_state.bank.denom_metadata = [{ + "description": "denom ubtsg for testing", + "denom_units": [{"denom": "ubtsg", "exponent": 0}], + "base": "ubtsg", "display": "ubtsg", "name": "ubtsg", "symbol": "ubtsg" + }] | + .app_state.fantoken.params.issue_fee = {"denom": "ubtsg", "amount": "1000000000"} | + .app_state.fantoken.params.mint_fee = {"denom": "ubtsg", "amount": "0"} | + .app_state.fantoken.params.burn_fee = {"denom": "ubtsg", "amount": "0"} + ' "$genesis" > "$tmp" && mv "$tmp" "$genesis" + log_ok "Genesis modified" + + # Keys + accounts + log "Adding validator key (coin-type 639)..." + echo "$VAL_MNEMONIC" | "$BINARY" keys add "$KEY_NAME" \ + --recover --coin-type 639 --keyring-backend="$KEYRING_BACKEND" --home="$BITSONG_HOME" > /dev/null 2>&1 + + # Derive VAL_ADDRESS from the just-created key + VAL_ADDRESS=$("$BINARY" keys show "$KEY_NAME" \ + --keyring-backend "$KEYRING_BACKEND" --home "$BITSONG_HOME" -a 2>/dev/null) + [[ -n "$VAL_ADDRESS" ]] || { log_err "Failed to derive VAL_ADDRESS from keyring"; return 1; } + log_ok "Validator address: $VAL_ADDRESS" + + log "Adding genesis accounts..." + "$BINARY" genesis add-genesis-account "$VAL_ADDRESS" "$GENESIS_AMOUNT" \ + --home="$BITSONG_HOME" > /dev/null 2>&1 + for addr in "${TEST_ADDRESSES[@]}"; do + "$BINARY" genesis add-genesis-account "$addr" "$GENESIS_AMOUNT" \ + --home="$BITSONG_HOME" > /dev/null 2>&1 + done + log_ok "Added $(( ${#TEST_ADDRESSES[@]} + 1 )) genesis accounts" + + # Gentx + log "Creating gentx..." + "$BINARY" genesis gentx "$KEY_NAME" "$STAKE_AMOUNT" \ + --keyring-backend="$KEYRING_BACKEND" --chain-id="$CHAIN_ID" \ + --home="$BITSONG_HOME" > /dev/null 2>&1 + "$BINARY" genesis collect-gentxs --home="$BITSONG_HOME" > /dev/null 2>&1 + "$BINARY" genesis validate-genesis --home="$BITSONG_HOME" > /dev/null 2>&1 + log_ok "Genesis validated" + + # Config tweaks + log "Modifying config.toml + app.toml..." + local config="$BITSONG_HOME/config/config.toml" + local app_toml="$BITSONG_HOME/config/app.toml" + sed -i 's/seeds = ".*"/seeds = ""/' "$config" + sed -i 's|laddr = "tcp://127.0.0.1:26657"|laddr = "tcp://0.0.0.0:26657"|' "$config" + sed -i 's/cors_allowed_origins = \[\]/cors_allowed_origins = ["*"]/' "$config" + sed -i '/^\[api\]/,/^\[/{s/^enable = false/enable = true/}' "$app_toml" + sed -i 's/^swagger = false/swagger = true/' "$app_toml" + sed -i 's/^enabled-unsafe-cors = false/enabled-unsafe-cors = true/' "$app_toml" + sed -i 's/^minimum-gas-prices = ".*"/minimum-gas-prices = "0ubtsg"/' "$app_toml" + log_ok "Config files modified" +} + +# ─── Start ─────────────────────────────────────────────────────────────────── + +start_chain() { + log_step "Starting Chain" + + if [[ -f "$BITSONG_HOME/chain.pid" ]]; then + local pid; pid=$(cat "$BITSONG_HOME/chain.pid") + if kill -0 "$pid" 2>/dev/null; then + log_ok "Chain already running (PID=$pid)" + wait_for_block; return 0 + fi + log_warn "Stale PID file, removing" + rm -f "$BITSONG_HOME/chain.pid" + fi + + log "Starting bitsongd (logs: $BITSONG_HOME/chain.log)..." + "$BINARY" start --home "$BITSONG_HOME" > "$BITSONG_HOME/chain.log" 2>&1 & + local chain_pid=$!; disown "$chain_pid" + echo "$chain_pid" > "$BITSONG_HOME/chain.pid" + + sleep 3 + if ! kill -0 "$chain_pid" 2>/dev/null; then + log_err "Chain died immediately. Last 20 lines:" + tail -20 "$BITSONG_HOME/chain.log" || true + return 1 + fi + + log_ok "Chain started (PID=$chain_pid)" + wait_for_block +} + +# ─── Main ──────────────────────────────────────────────────────────────────── + +CLEAN=false +while [[ $# -gt 0 ]]; do + case "$1" in + --clean) CLEAN=true; shift ;; + -h|--help) + echo "Usage: $0 [--clean]" + echo " --clean Remove existing chain data before starting" + exit 0 ;; + *) echo "Unknown flag: $1"; exit 1 ;; + esac +done + +require_binary +require_jq +[[ -n "$VAL_MNEMONIC" ]] || { log_err "Set VAL_MNEMONIC in scripts/hyperlane/.env"; exit 1; } + +banner "BitSong Localnet (Hyperlane)" "Chain: $CHAIN_ID" + +if [[ "$CLEAN" == "true" ]]; then + log "Cleaning previous state at $BITSONG_HOME..." + if [[ -f "$BITSONG_HOME/chain.pid" ]]; then + kill "$(cat "$BITSONG_HOME/chain.pid")" 2>/dev/null || true; sleep 2 + fi + rm -rf "$BITSONG_HOME" + log_ok "Clean complete" +fi + +if [[ ! -d "$BITSONG_HOME/config" ]]; then + init_chain +else + log_ok "Chain already initialized at $BITSONG_HOME" +fi + +start_chain +log_ok "Chain ready!" diff --git a/scripts/hyperlane/02-hyperlane.sh b/scripts/hyperlane/02-hyperlane.sh new file mode 100755 index 00000000..00bc7664 --- /dev/null +++ b/scripts/hyperlane/02-hyperlane.sh @@ -0,0 +1,224 @@ +#!/usr/bin/env bash +# ============================================================================= +# 02-hyperlane.sh — Configure Hyperlane bridge on the local chain (9 txs) +# +# Usage: +# bash 02-hyperlane.sh # Full 9-step setup +# bash 02-hyperlane.sh --update-enrollment 0xABC...DEF # Re-enroll with real EVM addr +# ============================================================================= + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" + +# EVM_RECEIVER_CONTRACT is only used if set externally (not enrolled with zero placeholder) +EVM_RECEIVER_CONTRACT="${EVM_RECEIVER_CONTRACT:-}" + +# ─── 9-Step Hyperlane Setup ────────────────────────────────────────────────── + +setup_hyperlane() { + log_step "Configuring Hyperlane Bridge (9 Steps)" + + local multisig_ism_id routing_ism_id mailbox_id merkle_hook_id igp_id token_id + + # Step 1: MultisigISM + multisig_ism_id=$(load_state "multisig_ism_id") + if [[ -n "$multisig_ism_id" ]]; then + log_ok "1/9: MultisigISM exists ($multisig_ism_id)" + else + submit_tx "1/9: Create MessageIdMultisigISM" \ + "$BINARY" tx hyperlane ism create-message-id-multisig \ + "$VALIDATOR_ADDRESSES" "$VALIDATOR_THRESHOLD" + multisig_ism_id=$(extract_id) + [[ -n "$multisig_ism_id" ]] || { log_err "Failed to extract MultisigISM ID"; return 1; } + save_state "multisig_ism_id" "$multisig_ism_id" + log_ok "1/9: MultisigISM = $multisig_ism_id" + fi + + # Step 2: RoutingISM + routing_ism_id=$(load_state "routing_ism_id") + if [[ -n "$routing_ism_id" ]]; then + log_ok "2/9: RoutingISM exists ($routing_ism_id)" + else + submit_tx "2/9: Create RoutingISM" \ + "$BINARY" tx hyperlane ism create-routing \ + --routes="[{\"domain\":${REMOTE_DOMAIN},\"ism\":\"${multisig_ism_id}\"}]" + routing_ism_id=$(extract_id) + [[ -n "$routing_ism_id" ]] || { log_err "Failed to extract RoutingISM ID"; return 1; } + save_state "routing_ism_id" "$routing_ism_id" + log_ok "2/9: RoutingISM = $routing_ism_id" + fi + + # Step 3: Mailbox + mailbox_id=$(load_state "mailbox_id") + if [[ -n "$mailbox_id" ]]; then + log_ok "3/9: Mailbox exists ($mailbox_id)" + else + submit_tx "3/9: Create Mailbox (domain=$DOMAIN_ID)" \ + "$BINARY" tx hyperlane mailbox create "$routing_ism_id" "$DOMAIN_ID" + mailbox_id=$(extract_id) + [[ -n "$mailbox_id" ]] || { log_err "Failed to extract Mailbox ID"; return 1; } + save_state "mailbox_id" "$mailbox_id" + log_ok "3/9: Mailbox = $mailbox_id" + fi + + # Step 4: MerkleTreeHook + merkle_hook_id=$(load_state "merkle_hook_id") + if [[ -n "$merkle_hook_id" ]]; then + log_ok "4/9: MerkleTreeHook exists ($merkle_hook_id)" + else + submit_tx "4/9: Create MerkleTreeHook" \ + "$BINARY" tx hyperlane hooks merkle create "$mailbox_id" + merkle_hook_id=$(extract_id) + [[ -n "$merkle_hook_id" ]] || { log_err "Failed to extract MerkleTreeHook ID"; return 1; } + save_state "merkle_hook_id" "$merkle_hook_id" + log_ok "4/9: MerkleTreeHook = $merkle_hook_id" + fi + + # Step 5: IGP + igp_id=$(load_state "igp_id") + if [[ -n "$igp_id" ]]; then + log_ok "5/9: IGP exists ($igp_id)" + else + submit_tx "5/9: Create IGP (denom=$DENOM)" \ + "$BINARY" tx hyperlane hooks igp create "$DENOM" + igp_id=$(extract_id) + [[ -n "$igp_id" ]] || { log_err "Failed to extract IGP ID"; return 1; } + save_state "igp_id" "$igp_id" + log_ok "5/9: IGP = $igp_id" + fi + + # Step 6: IGP Gas Oracle + if [[ "$(load_state "igp_configured")" == "true" ]]; then + log_ok "6/9: IGP gas config already set" + else + submit_tx "6/9: Set IGP destination gas config (remote=$REMOTE_DOMAIN)" \ + "$BINARY" tx hyperlane hooks igp set-destination-gas-config \ + "$igp_id" "$REMOTE_DOMAIN" "$TOKEN_EXCHANGE_RATE" "$GAS_PRICE" "$GAS_OVERHEAD" + save_state "igp_configured" "true" + log_ok "6/9: IGP gas config set for domain $REMOTE_DOMAIN" + fi + + # Step 7: Set Mailbox Hooks + if [[ "$(load_state "mailbox_updated")" == "true" ]]; then + log_ok "7/9: Mailbox hooks already set" + else + submit_tx "7/9: Set Mailbox hooks (default=IGP, required=MerkleTree)" \ + "$BINARY" tx hyperlane mailbox set "$mailbox_id" \ + --default-hook="$igp_id" --required-hook="$merkle_hook_id" + save_state "mailbox_updated" "true" + log_ok "7/9: Mailbox updated with hooks" + fi + + # Step 8: Collateral Token + token_id=$(load_state "token_id") + if [[ -n "$token_id" ]]; then + log_ok "8/9: Collateral token exists ($token_id)" + else + submit_tx "8/9: Create collateral token ($DENOM)" \ + "$BINARY" tx warp create-collateral-token "$mailbox_id" "$DENOM" + token_id=$(extract_id) + [[ -n "$token_id" ]] || { log_err "Failed to extract Token ID"; return 1; } + save_state "token_id" "$token_id" + log_ok "8/9: Token = $token_id" + fi + + # Step 9: Enroll Remote Router (only if real EVM address is available) + if [[ "$(load_state "router_enrolled")" == "true" ]]; then + log_ok "9/9: Remote router already enrolled" + elif [[ -n "$EVM_RECEIVER_CONTRACT" ]]; then + submit_tx "9/9: Enroll remote router (domain=$REMOTE_DOMAIN)" \ + "$BINARY" tx warp enroll-remote-router \ + "$token_id" "$REMOTE_DOMAIN" "$EVM_RECEIVER_CONTRACT" "$ENROLL_GAS" + save_state "router_enrolled" "true" + log_ok "9/9: Remote router enrolled for domain $REMOTE_DOMAIN" + else + log_warn "9/9: Skipped — no EVM address yet. Run 03-evm-deploy.sh to deploy + enroll." + fi +} + +# ─── Verify ────────────────────────────────────────────────────────────────── + +verify_setup() { + log_step "Verifying Hyperlane Setup" + + local qf=(--output json --node "$NODE" --home "$BITSONG_HOME") + + log "Mailboxes:"; "$BINARY" query hyperlane mailboxes "${qf[@]}" | jq '.' 2>/dev/null || true; echo + log "ISMs:"; "$BINARY" query hyperlane ism isms "${qf[@]}" | jq '.' 2>/dev/null || true; echo + log "IGPs:"; "$BINARY" query hyperlane hooks igps "${qf[@]}" | jq '.' 2>/dev/null || true; echo + log "MerkleTree hooks:"; "$BINARY" query hyperlane hooks merkle-tree-hooks "${qf[@]}" | jq '.' 2>/dev/null || true; echo + log "Warp tokens:"; "$BINARY" query warp tokens "${qf[@]}" | jq '.' 2>/dev/null || true; echo + + local token_id; token_id=$(load_state "token_id") + if [[ -n "$token_id" ]]; then + log "Remote routers for $token_id:" + "$BINARY" query warp remote-routers "$token_id" "${qf[@]}" | jq '.' 2>/dev/null || true; echo + fi + + # Summary + log_step "Summary" + echo -e "${BOLD}Chain${NC}: $CHAIN_ID (RPC: $NODE)" + echo -e "${BOLD}Domain${NC}: $DOMAIN_ID (Remote: $REMOTE_DOMAIN)" + echo -e "${BOLD}Mailbox${NC}: $(load_state mailbox_id)" + echo -e "${BOLD}ISM${NC}: $(load_state routing_ism_id)" + echo -e "${BOLD}Hooks${NC}: merkle=$(load_state merkle_hook_id) igp=$(load_state igp_id)" + echo -e "${BOLD}Token${NC}: $(load_state token_id)" + echo -e "${BOLD}State${NC}: $STATE_FILE" +} + +# ─── Update Enrollment ─────────────────────────────────────────────────────── + +update_enrollment() { + local evm_addr="$1" + log_step "Updating Remote Router Enrollment" + + [[ "$evm_addr" =~ ^0x[0-9a-fA-F]{40}$ ]] || { log_err "Invalid EVM address: $evm_addr"; return 1; } + + local evm_bytes32; evm_bytes32=$(evm_to_bytes32 "$evm_addr") + local token_id; token_id=$(load_state "token_id") + [[ -n "$token_id" ]] || { log_err "No token_id in state. Run full setup first."; return 1; } + + log "EVM address: $evm_addr" + log "As bytes32: $evm_bytes32" + log "Token: $token_id" + + submit_tx "Update remote router (domain=$REMOTE_DOMAIN)" \ + "$BINARY" tx warp enroll-remote-router \ + "$token_id" "$REMOTE_DOMAIN" "$evm_bytes32" "$ENROLL_GAS" + + save_state "evm_hyp_erc20" "$evm_addr" + save_state "evm_hyp_erc20_bytes32" "$evm_bytes32" + save_state "evm_enrollment_updated" "true" + log_ok "Enrollment updated" + + "$BINARY" query warp remote-routers "$token_id" \ + --output json --node "$NODE" --home "$BITSONG_HOME" | jq '.' 2>/dev/null || true +} + +# ─── Main ──────────────────────────────────────────────────────────────────── + +UPDATE_EVM_ADDR="" +while [[ $# -gt 0 ]]; do + case "$1" in + --update-enrollment) UPDATE_EVM_ADDR="$2"; shift 2 ;; + -h|--help) + echo "Usage: $0 [--update-enrollment ]" + exit 0 ;; + *) echo "Unknown flag: $1"; exit 1 ;; + esac +done + +require_binary +require_jq +require_chain_running +log "Using binary: $BINARY ($("$BINARY" version 2>&1))" + +banner "Hyperlane Bridge Setup" "Domain: $DOMAIN_ID" + +setup_hyperlane +verify_setup + +if [[ -n "$UPDATE_EVM_ADDR" ]]; then + update_enrollment "$UPDATE_EVM_ADDR" +fi + +log_ok "Done!" diff --git a/scripts/hyperlane/03-evm-deploy.sh b/scripts/hyperlane/03-evm-deploy.sh new file mode 100755 index 00000000..43c7075c --- /dev/null +++ b/scripts/hyperlane/03-evm-deploy.sh @@ -0,0 +1,270 @@ +#!/usr/bin/env bash +# ============================================================================= +# 03-evm-deploy.sh — Deploy HypERC20 on Base Sepolia + bidirectional enrollment +# +# Deploys via Hyperlane CLI, then uses cast for EVM enrollment + verification. +# +# Usage: +# bash 03-evm-deploy.sh # Deploy + enroll +# bash 03-evm-deploy.sh --clean # Wipe Phase 4 state and redo +# +# Required environment: +# HYP_KEY (or EVM_PRIVATE_KEY) — EVM deployer private key (0x...) +# ============================================================================= + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" + +HYP_CHAINS_DIR="${HYP_CHAINS_DIR:-$HOME/.hyperlane/chains}" + +# ─── Step 1: Register Chain Metadata ───────────────────────────────────────── + +register_chain_metadata() { + log_step "Step 1: Register Chain Metadata" + + local mailbox_id; mailbox_id=$(require_state "mailbox_id" "mailbox_id") + + mkdir -p "$HYP_CHAINS_DIR/bitsong" + + cat > "$HYP_CHAINS_DIR/bitsong/metadata.yaml" << EOF +chainId: $CHAIN_ID +domainId: $DOMAIN_ID +name: bitsong +protocol: cosmos +bech32Prefix: bitsong +slip44: 639 +rpcUrls: + - http: http://localhost:26657 +restUrls: + - http: http://localhost:1317 +grpcUrls: + - http: http://localhost:9090 +nativeToken: + name: BitSong + symbol: BTSG + decimals: 6 + denom: $DENOM +blocks: + confirmations: 1 + estimateBlockTime: 6 +isTestnet: true +EOF + + cat > "$HYP_CHAINS_DIR/bitsong/addresses.yaml" << EOF +mailbox: "$mailbox_id" +EOF + + log_ok "Chain metadata: $HYP_CHAINS_DIR/bitsong/" +} + +# ─── Step 2: Deploy HypERC20 ──────────────────────────────────────────────── + +deploy_hyp_erc20() { + log_step "Step 2: Deploy HypERC20 on Base Sepolia" + + DEPLOYED_EVM=$(load_state "evm_hyp_erc20") + if [[ -n "$DEPLOYED_EVM" && "$DEPLOYED_EVM" =~ ^0x[0-9a-fA-F]{40}$ ]]; then + log_ok "HypERC20 already deployed: $DEPLOYED_EVM" + return 0 + fi + + # Generate single-chain warp config + local warp_config="$BITSONG_HOME/warp-route-basesepolia.yaml" + cat > "$warp_config" << EOF +basesepolia: + type: synthetic + name: "BitSong" + symbol: "BTSG" + decimals: 6 + mailbox: "$BASESEPOLIA_MAILBOX" + owner: "$DEPLOYER_ADDR" + interchainSecurityModule: "0x0000000000000000000000000000000000000000" +EOF + + log "Warp config:" + cat "$warp_config"; echo + + export HYP_KEY="$EVM_KEY" + log "Running: hyperlane warp deploy ..." + + # The CLI attempts Etherscan verification (requires API key we don't have). + hyperlane warp deploy --config "$warp_config" --yes + + # Extract deployed address from CLI artifacts + log "Looking for deployment artifacts..." + local latest_warp + latest_warp=$(find "$HOME/.hyperlane/deployments/warp_routes" -name "*basesepolia*config.yaml" 2>/dev/null \ + | sort -r | head -1) || true + + if [[ -n "$latest_warp" ]]; then + log "Artifact: $latest_warp" + DEPLOYED_EVM=$(grep -oP '(?<=addressOrDenom: ")[^"]+' "$latest_warp" 2>/dev/null | head -1) || true + fi + + if [[ -z "$DEPLOYED_EVM" || ! "$DEPLOYED_EVM" =~ ^0x[0-9a-fA-F]{40}$ ]]; then + log_err "Could not extract HypERC20 address from CLI artifacts." + log_err "Set manually: jq '.evm_hyp_erc20=\"0xADDR\"' $STATE_FILE > /tmp/s && mv /tmp/s $STATE_FILE" + exit 1 + fi + + save_state "evm_hyp_erc20" "$DEPLOYED_EVM" + log_ok "HypERC20: $DEPLOYED_EVM" + + # Compute bytes32 + local evm_bytes32; evm_bytes32=$(evm_to_bytes32 "$DEPLOYED_EVM") + save_state "evm_hyp_erc20_bytes32" "$evm_bytes32" + log " bytes32: $evm_bytes32" +} + +# ─── Step 3: Create Cosmos Collateral Token ────────────────────────────────── + +create_cosmos_token() { + log_step "Step 3: Create Cosmos Collateral Token" + + TOKEN_ID=$(load_state "token_id") + if [[ -n "$TOKEN_ID" ]]; then + log_ok "Cosmos token already exists: $TOKEN_ID" + return 0 + fi + + local mailbox_id; mailbox_id=$(require_state "mailbox_id" "mailbox_id") + + submit_tx "MsgCreateCollateralToken (denom=$DENOM)" \ + "$BINARY" tx warp create-collateral-token "$mailbox_id" "$DENOM" + + TOKEN_ID=$(extract_id) + [[ -n "$TOKEN_ID" ]] || { log_err "Could not extract token_id"; exit 1; } + save_state "token_id" "$TOKEN_ID" + log_ok "Cosmos token: $TOKEN_ID" +} + +# ─── Step 4: Enroll EVM Router on Cosmos ───────────────────────────────────── + +enroll_cosmos_side() { + log_step "Step 4: Enroll EVM Router on Cosmos" + + local evm_bytes32; evm_bytes32=$(require_state "evm_hyp_erc20_bytes32" "evm_hyp_erc20_bytes32") + + submit_tx "MsgEnrollRemoteRouter (domain=$REMOTE_DOMAIN)" \ + "$BINARY" tx warp enroll-remote-router \ + "$TOKEN_ID" "$REMOTE_DOMAIN" "$evm_bytes32" "$ENROLL_GAS" + + save_state "router_enrolled" "true" + log_ok "Cosmos side enrolled: domain $REMOTE_DOMAIN -> $evm_bytes32" +} + +# ─── Step 5: Enroll Cosmos Router on EVM ───────────────────────────────────── + +enroll_evm_side() { + log_step "Step 5: Enroll Cosmos Router on EVM" + + log "enrollRemoteRouter($DOMAIN_ID, $TOKEN_ID) on $DEPLOYED_EVM ..." + local tx; tx=$(cast send "$DEPLOYED_EVM" \ + "enrollRemoteRouter(uint32,bytes32)" "$DOMAIN_ID" "$TOKEN_ID" \ + --private-key "$EVM_KEY" --rpc-url "$EVM_RPC" --json 2>&1) || true + + local status; status=$(echo "$tx" | jq -r '.status // empty' 2>/dev/null) || true + local hash; hash=$(echo "$tx" | jq -r '.transactionHash // empty' 2>/dev/null) || true + + if [[ "$status" == "0x1" || "$status" == "1" ]]; then + save_state "evm_router_enrolled" "true" + log_ok "EVM enrolled: domain $DOMAIN_ID -> $TOKEN_ID (tx: $hash)" + else + log_err "EVM enrollment failed (status: $status)" + echo "$tx" | jq -c '.' 2>/dev/null || echo "$tx" + exit 1 + fi +} + +# ─── Step 6: Verify ───────────────────────────────────────────────────────── + +verify_deployment() { + log_step "Step 6: Verify" + + log "--- EVM HypERC20 ($DEPLOYED_EVM) ---" + local decimals mailbox supply router_on_evm + decimals=$(cast call "$DEPLOYED_EVM" "decimals()(uint8)" --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + mailbox=$(cast call "$DEPLOYED_EVM" "mailbox()(address)" --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + supply=$(cast call "$DEPLOYED_EVM" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + router_on_evm=$(cast call "$DEPLOYED_EVM" "routers(uint32)(bytes32)" "$DOMAIN_ID" \ + --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + + echo " decimals: $decimals (expected 6)" + echo " mailbox: $mailbox" + echo " totalSupply: $supply (expected 0)" + echo " router($DOMAIN_ID): $router_on_evm" + echo + + log "--- Cosmos warp token ($TOKEN_ID) ---" + "$BINARY" query warp remote-routers "$TOKEN_ID" \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | jq '.' || true +} + +# ─── Summary ───────────────────────────────────────────────────────────────── + +print_summary() { + log_step "Summary" + echo -e "${BOLD}Warp Route${NC}" + echo " Cosmos token: $(load_state token_id)" + echo " EVM HypERC20: $(load_state evm_hyp_erc20)" + echo " EVM (bytes32): $(load_state evm_hyp_erc20_bytes32)" + echo " State file: $STATE_FILE" + echo + echo -e "${BOLD}BaseScan${NC}: https://sepolia.basescan.org/address/$(load_state evm_hyp_erc20)" + echo + echo -e "${BOLD}Next${NC}: Run 04-agents.sh to start validators + relayer" +} + +# ─── Main ──────────────────────────────────────────────────────────────────── + +CLEAN=false +while [[ $# -gt 0 ]]; do + case "$1" in + --clean) CLEAN=true; shift ;; + -h|--help) + echo "Usage: $0 [--clean]" + echo " --clean Wipe Phase 4 state keys and redo" + echo "" + echo "Required: HYP_KEY or EVM_PRIVATE_KEY (deployer private key)" + exit 0 ;; + *) echo "Unknown flag: $1"; exit 1 ;; + esac +done + +# Preflight +require_jq +command -v hyperlane >/dev/null 2>&1 || { log_err "Hyperlane CLI missing: npm install -g @hyperlane-xyz/cli"; exit 1; } +command -v cast >/dev/null 2>&1 || { log_err "cast missing: foundryup"; exit 1; } + +[[ -f "$STATE_FILE" ]] || { log_err "Phase 3 state not found: $STATE_FILE. Run 02-hyperlane.sh first."; exit 1; } + +EVM_KEY="${HYP_KEY:-${EVM_PRIVATE_KEY:-}}" +[[ -n "$EVM_KEY" ]] || { log_err "Set HYP_KEY=0x"; exit 1; } + +DEPLOYER_ADDR=$(cast wallet address --private-key "$EVM_KEY" 2>/dev/null) \ + || { log_err "Cannot derive EVM address from key"; exit 1; } + +require_binary +require_chain_running + +log_ok "Hyperlane CLI: $(hyperlane --version 2>&1 | head -1)" +log_ok "cast: $(cast --version 2>&1 | head -1)" +log_ok "EVM deployer: $DEPLOYER_ADDR" +log_ok "Phase 3 mailbox: $(load_state mailbox_id)" + +if [[ "$CLEAN" == "true" ]]; then + jq 'del(.token_id, .router_enrolled, .evm_hyp_erc20, .evm_hyp_erc20_bytes32, .evm_router_enrolled)' \ + "$STATE_FILE" > "${STATE_FILE}.tmp" && mv "${STATE_FILE}.tmp" "$STATE_FILE" + log_ok "Phase 4 state cleared" +fi + +banner "Phase 4: Deploy Warp Route" "bitsong <-> Base Sepolia" + +register_chain_metadata +deploy_hyp_erc20 +create_cosmos_token +enroll_cosmos_side +enroll_evm_side +verify_deployment +print_summary + +log_ok "Phase 4 complete!" diff --git a/scripts/hyperlane/04-agents.sh b/scripts/hyperlane/04-agents.sh new file mode 100755 index 00000000..5ad9b224 --- /dev/null +++ b/scripts/hyperlane/04-agents.sh @@ -0,0 +1,474 @@ +#!/usr/bin/env bash +# ============================================================================= +# 04-agents.sh — Replace NoopISMs with real MultisigISMs, start validators +# and relayer via Docker +# +# Usage: +# bash 04-agents.sh # Full setup +# bash 04-agents.sh --validator-only # Start validators only +# bash 04-agents.sh --relayer-only # Start relayer only +# bash 04-agents.sh --clean # Stop containers + wipe Phase 5 state +# bash 04-agents.sh --stop # Stop all Phase 5 containers +# +# Required environment: +# VALIDATOR_KEY — EVM hex private key for validator signing +# COSMOS_SIGNER_KEY — hex key for Cosmos announcement txs +# EVM_RELAYER_KEY — hex key for Base Sepolia relayer (HYP_KEY alias) +# ============================================================================= + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" + +HYP_KEY="${HYP_KEY:-${EVM_RELAYER_KEY:-}}" +EVM_RELAYER_KEY="${EVM_RELAYER_KEY:-${HYP_KEY:-}}" + +# ─── Step 0: Prerequisites ────────────────────────────────────────────────── + +check_prerequisites() { + log_step "Step 0: Prerequisites" + local ok=true + + for cmd in docker cast jq; do + command -v "$cmd" >/dev/null 2>&1 && log_ok "$cmd: $(command -v "$cmd")" \ + || { log_err "$cmd not found"; ok=false; } + done + + require_binary + log_ok "bitsongd: $BINARY ($("$BINARY" version 2>&1 || echo 'unknown'))" + + [[ -n "${VALIDATOR_KEY:-}" ]] || { log_err "VALIDATOR_KEY not set"; ok=false; } + [[ -n "${COSMOS_SIGNER_KEY:-}" ]] || { log_err "COSMOS_SIGNER_KEY not set"; ok=false; } + [[ -n "${EVM_RELAYER_KEY:-}" ]] || { log_err "EVM_RELAYER_KEY (or HYP_KEY) not set"; ok=false; } + + [[ -f "$STATE_FILE" ]] || { log_err "State file not found: $STATE_FILE"; ok=false; } + if [[ -f "$STATE_FILE" ]]; then + require_state "mailbox_id" "mailbox_id" > /dev/null + require_state "token_id" "token_id" > /dev/null + log_ok "Phase 3/4 state verified" + fi + + [[ "$ok" == "true" ]] || { log_err "Prerequisites failed"; exit 1; } + log_ok "All prerequisites satisfied" +} + +# ─── Step 1: Derive Validator Address ──────────────────────────────────────── + +derive_validator_addr() { + log_step "Step 1: Derive Validator Address" + VALIDATOR_ADDR=$(load_state "validator_addr") + if [[ -n "$VALIDATOR_ADDR" ]]; then + log_ok "Validator (cached): $VALIDATOR_ADDR" + else + VALIDATOR_ADDR=$(cast wallet address --private-key "$VALIDATOR_KEY" 2>&1) + [[ "$VALIDATOR_ADDR" =~ ^0x[0-9a-fA-F]{40}$ ]] || { log_err "Failed to derive validator address"; return 1; } + save_state "validator_addr" "$VALIDATOR_ADDR" + log_ok "Validator: $VALIDATOR_ADDR" + fi +} + +# ─── Step 1b: Fund Cosmos Signer ──────────────────────────────────────────── + +fund_cosmos_signer() { + log_step "Step 1b: Fund Cosmos Signer" + + local cosmos_signer_addr + cosmos_signer_addr=$(python3 -c " +from ecdsa import SigningKey, SECP256k1 +import hashlib +def to_bech32(hex_key, prefix='bitsong'): + pk = bytes.fromhex(hex_key.replace('0x','')) + sk = SigningKey.from_string(pk, curve=SECP256k1) + vk = sk.get_verifying_key() + x, y = vk.to_string()[:32], vk.to_string()[32:] + compressed = (b'\x02' if y[-1] % 2 == 0 else b'\x03') + x + ripe = hashlib.new('ripemd160', hashlib.sha256(compressed).digest()).digest() + CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' + def polymod(values): + GEN = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3] + chk = 1 + for v in values: + b = (chk >> 25); chk = (chk & 0x1ffffff) << 5 ^ v + for i in range(5): chk ^= GEN[i] if ((b >> i) & 1) else 0 + return chk + hrp_exp = [ord(x) >> 5 for x in prefix] + [0] + [ord(x) & 31 for x in prefix] + def conv(data): + acc, bits, ret = 0, 0, [] + for value in data: + acc = (acc << 8) | value; bits += 8 + while bits >= 5: bits -= 5; ret.append((acc >> bits) & 31) + if bits: ret.append((acc << (5 - bits)) & 31) + return ret + data = conv(list(ripe)) + ck = [(polymod(hrp_exp + data + [0]*6) ^ 1) >> 5*(5-i) & 31 for i in range(6)] + return prefix + '1' + ''.join([CHARSET[d] for d in data + ck]) +print(to_bech32('$COSMOS_SIGNER_KEY')) +" 2>/dev/null) + + if [[ -z "$cosmos_signer_addr" || ! "$cosmos_signer_addr" =~ ^bitsong1 ]]; then + log_err "Failed to derive Cosmos signer address. Ensure: pip3 install ecdsa" + return 1 + fi + + log "Cosmos signer: $cosmos_signer_addr" + + local balance + balance=$("$BINARY" query bank balances "$cosmos_signer_addr" --home "$BITSONG_HOME" --output json 2>/dev/null \ + | jq -r '.balances[] | select(.denom=="ubtsg") | .amount // "0"') || balance="0" + if [[ -n "$balance" && "$balance" != "0" && "$balance" != "null" ]]; then + log_ok "Already funded: ${balance}ubtsg" + return 0 + fi + + log "Funding with 10000000ubtsg..." + submit_tx "Fund cosmos signer" "$BINARY" tx bank send val "$cosmos_signer_addr" 10000000ubtsg + log_ok "Cosmos signer funded" +} + +# ─── Step 2: Update ISM — Cosmos Side ─────────────────────────────────────── + +update_ism_cosmos_side() { + log_step "Step 2: Update ISM — Cosmos Side (EVM->Cosmos)" + + [[ "$(load_state "ism_updated_cosmos_side")" == "true" ]] && { log_ok "Already done"; return 0; } + + local routing_ism_id; routing_ism_id=$(require_state "routing_ism_id" "routing_ism_id") + + # Create MultisigISM with real validator (1-of-1) + local bitsong_multisig_ism_id + bitsong_multisig_ism_id=$(load_state "bitsong_multisig_ism_id") + if [[ -z "$bitsong_multisig_ism_id" ]]; then + submit_tx "Create MultisigISM (validator=$VALIDATOR_ADDR, threshold=1)" \ + "$BINARY" tx hyperlane ism create-message-id-multisig "$VALIDATOR_ADDR" "1" + bitsong_multisig_ism_id=$(extract_id) + [[ -n "$bitsong_multisig_ism_id" ]] || { log_err "Failed to extract ISM ID"; return 1; } + save_state "bitsong_multisig_ism_id" "$bitsong_multisig_ism_id" + log_ok "New MultisigISM: $bitsong_multisig_ism_id" + else + log_ok "MultisigISM exists: $bitsong_multisig_ism_id" + fi + + # Remove-then-add pattern (avoids Go range-copy bug in SetDomain) + submit_tx "Remove domain $REMOTE_DOMAIN from RoutingISM" \ + "$BINARY" tx hyperlane ism remove-routing-ism-domain "$routing_ism_id" "$REMOTE_DOMAIN" + submit_tx "Set domain $REMOTE_DOMAIN to new MultisigISM" \ + "$BINARY" tx hyperlane ism set-routing-ism-domain "$routing_ism_id" "$REMOTE_DOMAIN" "$bitsong_multisig_ism_id" + + save_state "ism_updated_cosmos_side" "true" + log_ok "Cosmos ISM: routing[$REMOTE_DOMAIN] -> $bitsong_multisig_ism_id" +} + +# ─── Step 3: Update ISM — EVM Side ────────────────────────────────────────── + +update_ism_evm_side() { + log_step "Step 3: Update ISM — EVM Side (Cosmos->EVM)" + + [[ "$(load_state "ism_updated_evm_side")" == "true" ]] && { log_ok "Already done"; return 0; } + + local evm_hyp_erc20; evm_hyp_erc20=$(require_state "evm_hyp_erc20" "evm_hyp_erc20") + + # Deploy ISM via factory (CREATE2 — deterministic) + local basesepolia_multisig_ism + basesepolia_multisig_ism=$(load_state "basesepolia_multisig_ism") + if [[ -z "$basesepolia_multisig_ism" ]]; then + log "Deploying staticMessageIdMultisigISM on Base Sepolia..." + + basesepolia_multisig_ism=$(cast call "$BASESEPOLIA_ISM_FACTORY" \ + "deploy(address[],uint8)(address)" "[$VALIDATOR_ADDR]" 1 \ + --rpc-url "$EVM_RPC" 2>/dev/null) || true + [[ "$basesepolia_multisig_ism" =~ ^0x[0-9a-fA-F]{40}$ ]] || { log_err "Failed to predict ISM address"; return 1; } + log " Predicted: $basesepolia_multisig_ism" + + local tx_out; tx_out=$(cast send "$BASESEPOLIA_ISM_FACTORY" \ + "deploy(address[],uint8)" "[$VALIDATOR_ADDR]" 1 \ + --private-key "$HYP_KEY" --rpc-url "$EVM_RPC" --json 2>&1) || true + local tx_hash; tx_hash=$(echo "$tx_out" | jq -r '.transactionHash // empty' 2>/dev/null) || true + [[ -n "$tx_hash" ]] || { log_err "ISM deploy failed"; echo "$tx_out"; return 1; } + + save_state "basesepolia_multisig_ism" "$basesepolia_multisig_ism" + log_ok "ISM deployed: $basesepolia_multisig_ism (tx: $tx_hash)" + else + log_ok "ISM exists: $basesepolia_multisig_ism" + fi + + # Wait for ISM tx confirmation, then update HypERC20 + sleep 5 + log "Setting HypERC20 ISM to $basesepolia_multisig_ism..." + local update_out; update_out=$(cast send "$evm_hyp_erc20" \ + "setInterchainSecurityModule(address)" "$basesepolia_multisig_ism" \ + --private-key "$HYP_KEY" --rpc-url "$EVM_RPC" --json 2>&1) || true + local update_status; update_status=$(echo "$update_out" | jq -r '.status // empty' 2>/dev/null) || true + [[ "$update_status" == "0x1" || "$update_status" == "1" ]] \ + || { log_err "setInterchainSecurityModule failed (status: $update_status)"; echo "$update_out"; return 1; } + + save_state "ism_updated_evm_side" "true" + log_ok "HypERC20 ISM updated to real MultisigISM" +} + +# ─── Agent Config ──────────────────────────────────────────────────────────── + +write_agent_config() { + local mailbox_id merkle_hook_id igp_id + mailbox_id=$(load_state "mailbox_id") + merkle_hook_id=$(load_state "merkle_hook_id") + igp_id=$(load_state "igp_id") + + # CRITICAL: index.from for basesepolia MUST be the mailbox deployment block (~13,850,000). + # The relayer's msg::db_loader scans by mailbox nonce starting from 0 sequentially. + # If index.from is too recent, only high nonces are indexed and db_loader is stuck at 0. + local basesep_index_from=13850000 + + cat > "$BITSONG_HOME/agent-config.json" << EOF +{ + "chains": { + "bitsong": { + "name": "bitsong", + "chainId": "${CHAIN_ID}", + "domainId": $DOMAIN_ID, + "protocol": "cosmosNative", + "bech32Prefix": "bitsong", + "slip44": 639, + "contractAddressBytes": 32, + "canonicalAsset": "ubtsg", + "rpcUrls": [{"http": "http://localhost:26657"}], + "grpcUrls": [{"http": "http://localhost:9090"}], + "nativeToken": { "name": "BitSong", "symbol": "BTSG", "decimals": 6, "denom": "ubtsg" }, + "gasPrice": { "amount": "0.025", "denom": "ubtsg" }, + "gasMultiplier": "2.0", + "blocks": { "confirmations": 1, "estimateBlockTime": 6, "reorgPeriod": 1 }, + "index": { "from": 1, "chunk": 50 }, + "mailbox": "${mailbox_id}", + "validatorAnnounce": "${mailbox_id}", + "merkleTreeHook": "${merkle_hook_id}", + "interchainGasPaymaster": "${igp_id}" + }, + "basesepolia": { + "name": "basesepolia", + "chainId": 84532, + "domainId": 84532, + "protocol": "ethereum", + "rpcUrls": [{"http": "${EVM_RPC}"}], + "nativeToken": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "blocks": { "confirmations": 1, "estimateBlockTime": 2, "reorgPeriod": 1 }, + "index": { "from": ${basesep_index_from}, "chunk": 9999 }, + "mailbox": "0x6966b0E55883d49BFB24539356a2f8A673E02039", + "validatorAnnounce": "${VALIDATOR_ANNOUNCE_CONTRACT}", + "merkleTreeHook": "0x86fb9F1c124fB20ff130C41a79a432F770f67AFD", + "interchainGasPaymaster": "0x28B02B97a850872C4D33C3E024fab6499ad96564", + "interchainSecurityModule": "0xBB276c7419155980558BFf56E22AfF83023a2dB2", + "proxyAdmin": "0x44b764045BfDC68517e10e783E69B376cef196B2" + } + } +} +EOF + log_ok "Agent config: $BITSONG_HOME/agent-config.json (basesepolia index.from=$basesep_index_from)" +} + +# ─── Step 4: Start Validator — BitSong ─────────────────────────────────────── + +start_validator_bitsong() { + log_step "Step 4: Start Validator — BitSong" + + if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^hyperlane-validator-bitsong$"; then + log_ok "Already running"; return 0 + fi + docker rm -f hyperlane-validator-bitsong 2>/dev/null || true + + mkdir -p "$BITSONG_HOME/validator-bitsong-db" "$BITSONG_HOME/checkpoints-bitsong" + write_agent_config + + log "Starting validator-bitsong (domain=$DOMAIN_ID)..." + docker run -d --name hyperlane-validator-bitsong --network host \ + -e CONFIG_FILES=/config/agent-config.json \ + -v "$BITSONG_HOME/agent-config.json:/config/agent-config.json:ro" \ + -v "$BITSONG_HOME/validator-bitsong-db:/hyperlane_db" \ + -v "$BITSONG_HOME/checkpoints-bitsong:/checkpoints-bitsong" \ + "$DOCKER_IMAGE" ./validator \ + --db /hyperlane_db --originChainName bitsong \ + --reorgPeriod 1 --interval 5 \ + --validator.type hexKey --validator.key "$VALIDATOR_KEY" \ + --chains.bitsong.signer.type cosmosKey \ + --chains.bitsong.signer.key "$COSMOS_SIGNER_KEY" \ + --chains.bitsong.signer.prefix bitsong \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path /checkpoints-bitsong + + log_ok "validator-bitsong started" +} + +# ─── Step 5: Start Validator — Base Sepolia ────────────────────────────────── + +start_validator_basesepolia() { + log_step "Step 5: Start Validator — Base Sepolia" + + if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^hyperlane-validator-basesepolia$"; then + log_ok "Already running"; return 0 + fi + docker rm -f hyperlane-validator-basesepolia 2>/dev/null || true + + mkdir -p "$BITSONG_HOME/validator-basesepolia-db" "$BITSONG_HOME/checkpoints-basesepolia" + + log "Starting validator-basesepolia (domain=$REMOTE_DOMAIN)..." + docker run -d --name hyperlane-validator-basesepolia --network host \ + -e CONFIG_FILES=/config/agent-config.json \ + -v "$BITSONG_HOME/agent-config.json:/config/agent-config.json:ro" \ + -v "$BITSONG_HOME/validator-basesepolia-db:/hyperlane_db" \ + -v "$BITSONG_HOME/checkpoints-basesepolia:/checkpoints-basesepolia" \ + "$DOCKER_IMAGE" ./validator \ + --db /hyperlane_db --originChainName basesepolia \ + --reorgPeriod 1 --interval 5 \ + --validator.type hexKey --validator.key "$VALIDATOR_KEY" \ + --chains.basesepolia.signer.type hexKey \ + --chains.basesepolia.signer.key "$EVM_RELAYER_KEY" \ + --checkpointSyncer.type localStorage \ + --checkpointSyncer.path /checkpoints-basesepolia + + log_ok "validator-basesepolia started" +} + +# ─── Step 6: Wait for Announcements ───────────────────────────────────────── + +wait_for_announcements() { + log_step "Step 6: Wait for Validator Announcements" + + local bitsong_ok basesepolia_ok + bitsong_ok=$(load_state "validator_bitsong_announced") + basesepolia_ok=$(load_state "validator_basesepolia_announced") + [[ "$bitsong_ok" == "true" && "$basesepolia_ok" == "true" ]] && { log_ok "Both already announced"; return 0; } + + log "Waiting up to 120s..." + local validator_addr_lower; validator_addr_lower=$(echo "$VALIDATOR_ADDR" | tr '[:upper:]' '[:lower:]') + + for i in $(seq 1 24); do + sleep 5 + + if [[ "$bitsong_ok" != "true" ]]; then + local mailbox_id locations + mailbox_id=$(load_state "mailbox_id") + locations=$("$BINARY" query hyperlane ism announced-storage-locations \ + "$mailbox_id" "$validator_addr_lower" \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r '.storage_locations // [] | length' 2>/dev/null) || locations="0" + if [[ "$locations" -gt 0 ]]; then + save_state "validator_bitsong_announced" "true"; bitsong_ok="true" + log_ok "validator-bitsong announced" + fi + fi + + if [[ "$basesepolia_ok" != "true" ]]; then + local evm_announced + evm_announced=$(cast call "$VALIDATOR_ANNOUNCE_CONTRACT" \ + "getAnnouncedValidators()(address[])" --rpc-url "$EVM_RPC" 2>/dev/null | tr ',' '\n' | \ + grep -i "$(echo "${VALIDATOR_ADDR#0x}" | tr '[:upper:]' '[:lower:]')" || true) + if [[ -n "$evm_announced" ]]; then + save_state "validator_basesepolia_announced" "true"; basesepolia_ok="true" + log_ok "validator-basesepolia announced" + fi + fi + + [[ "$bitsong_ok" == "true" && "$basesepolia_ok" == "true" ]] && return 0 + log " [${i}/24] bitsong=${bitsong_ok:-pending}, basesepolia=${basesepolia_ok:-pending}" + done + + log_warn "Announcement timeout — validators may still be starting. Check: docker logs hyperlane-validator-bitsong" +} + +# ─── Step 7: Start Relayer ────────────────────────────────────────────────── + +start_relayer() { + log_step "Step 7: Start Relayer" + + if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^hyperlane-relayer$"; then + log_ok "Already running"; return 0 + fi + docker rm -f hyperlane-relayer 2>/dev/null || true + + mkdir -p "$BITSONG_HOME/relayer-db" + + # Whitelist: only relay our warp messages (avoids noise from other projects on shared testnet) + local token_id evm_hyp_erc20 evm_padded + token_id=$(load_state "token_id") + evm_hyp_erc20=$(load_state "evm_hyp_erc20") + evm_padded=$(evm_to_bytes32 "$evm_hyp_erc20") + + local whitelist="[{\"senderAddress\":\"${token_id}\",\"destinationDomain\":\"${REMOTE_DOMAIN}\"},{\"senderAddress\":\"${evm_padded}\",\"destinationDomain\":\"${DOMAIN_ID}\"}]" + + log "Starting relayer (bitsong <-> basesepolia)..." + docker run -d --name hyperlane-relayer --network host \ + -e CONFIG_FILES=/config/agent-config.json \ + -v "$BITSONG_HOME/agent-config.json:/config/agent-config.json:ro" \ + -v "$BITSONG_HOME/relayer-db:/hyperlane_db" \ + -v "$BITSONG_HOME/checkpoints-bitsong:/checkpoints-bitsong:ro" \ + -v "$BITSONG_HOME/checkpoints-basesepolia:/checkpoints-basesepolia:ro" \ + "$DOCKER_IMAGE" ./relayer \ + --db /hyperlane_db --relayChains bitsong,basesepolia \ + --allowLocalCheckpointSyncers true \ + --gaspaymentenforcement '[{"type": "none"}]' \ + --whitelist "$whitelist" \ + --chains.bitsong.signer.type cosmosKey \ + --chains.bitsong.signer.key "$COSMOS_SIGNER_KEY" \ + --chains.bitsong.signer.prefix bitsong \ + --chains.basesepolia.signer.type hexKey \ + --chains.basesepolia.signer.key "$EVM_RELAYER_KEY" \ + --metricsPort 9091 + + log_ok "Relayer started" +} + +# ─── Main ──────────────────────────────────────────────────────────────────── + +CLEAN=false +STOP=false +VALIDATOR_ONLY=false +RELAYER_ONLY=false + +while [[ $# -gt 0 ]]; do + case "$1" in + --clean) CLEAN=true; shift ;; + --stop) STOP=true; shift ;; + --validator-only) VALIDATOR_ONLY=true; shift ;; + --relayer-only) RELAYER_ONLY=true; shift ;; + -h|--help) + echo "Usage: $0 [--clean|--stop|--validator-only|--relayer-only]" + echo "" + echo "Required env: VALIDATOR_KEY, COSMOS_SIGNER_KEY, EVM_RELAYER_KEY" + exit 0 ;; + *) log_err "Unknown flag: $1"; exit 1 ;; + esac +done + +if [[ "$STOP" == "true" ]]; then + log "Stopping Phase 5 containers..." + docker stop hyperlane-validator-bitsong hyperlane-validator-basesepolia hyperlane-relayer 2>/dev/null || true + log_ok "Stopped"; exit 0 +fi + +if [[ "$CLEAN" == "true" ]]; then + log "Cleaning Phase 5 state..." + docker rm -f hyperlane-validator-bitsong hyperlane-validator-basesepolia hyperlane-relayer 2>/dev/null || true + for key in validator_addr bitsong_multisig_ism_id basesepolia_multisig_ism \ + validator_bitsong_announced validator_basesepolia_announced \ + ism_updated_cosmos_side ism_updated_evm_side; do + [[ -f "$STATE_FILE" ]] && jq --arg k "$key" 'del(.[$k])' "$STATE_FILE" > "${STATE_FILE}.tmp" \ + && mv "${STATE_FILE}.tmp" "$STATE_FILE" + done + log_ok "Phase 5 state cleaned" +fi + +banner "Phase 5: Agents" "bitsong <-> basesepolia" + +check_prerequisites +derive_validator_addr +fund_cosmos_signer + +if [[ "$RELAYER_ONLY" != "true" ]]; then + update_ism_cosmos_side + update_ism_evm_side + start_validator_bitsong + start_validator_basesepolia + wait_for_announcements +fi + +if [[ "$VALIDATOR_ONLY" != "true" ]]; then + start_relayer +fi + +log_ok "Agents running! Next: bash 05-test.sh" diff --git a/scripts/hyperlane/05-test.sh b/scripts/hyperlane/05-test.sh new file mode 100755 index 00000000..8b73cdcc --- /dev/null +++ b/scripts/hyperlane/05-test.sh @@ -0,0 +1,349 @@ +#!/usr/bin/env bash +# ============================================================================= +# 05-test.sh — End-to-end transfer tests (Cosmos<->EVM) +# +# Usage: +# bash 05-test.sh # Run both tests +# bash 05-test.sh --cosmos-only # Cosmos->EVM only +# bash 05-test.sh --evm-only # EVM->Cosmos only +# +# Required environment: +# EVM_RELAYER_KEY (or HYP_KEY) — for EVM->Cosmos transfer +# ============================================================================= + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" + +EVM_RELAYER_KEY="${EVM_RELAYER_KEY:-${HYP_KEY:-}}" + +# ─── Readiness Check ──────────────────────────────────────────────────────── + +check_agents_ready() { + log_step "Checking Agent Readiness" + + local ok=true + for name in hyperlane-validator-bitsong hyperlane-validator-basesepolia hyperlane-relayer; do + if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^${name}$"; then + log_ok "$name running" + else + log_err "$name NOT running — start with: bash 04-agents.sh" + ok=false + fi + done + [[ "$ok" == "true" ]] || { log_err "Agents not ready. Run 04-agents.sh first."; exit 1; } + + # Wait for bitsong validator to be connected and syncing with the chain. + # NOTE: Checkpoint index will be 0 until a message is dispatched (merkle tree is empty). + # So we check validator logs for signs it's watching the chain, not for checkpoint production. + log "Waiting for bitsong validator to connect to chain..." + + for i in $(seq 1 20); do + local val_logs + val_logs=$(docker logs hyperlane-validator-bitsong --tail 50 2>&1) || val_logs="" + + # Look for signs the validator is connected and watching the chain: + # - "Watching for new messages" / "fetching" / "cursor" = actively scanning + # - "Latest block" / "block_height" = synced with chain + # - Any log output at all after startup = healthy + if echo "$val_logs" | grep -qiE "watching|fetching|cursor|latest.block|block_height|merkle|tree_count|scanning"; then + log_ok "Validator connected and watching chain" + return 0 + fi + + # Also check if the validator has been running for >10s (it connects quickly) + local started_at + started_at=$(docker inspect hyperlane-validator-bitsong --format '{{.State.StartedAt}}' 2>/dev/null) || true + if [[ -n "$started_at" ]]; then + local start_epoch now_epoch + start_epoch=$(date -d "$started_at" +%s 2>/dev/null) || start_epoch=0 + now_epoch=$(date +%s) + local uptime=$(( now_epoch - start_epoch )) + if [[ "$uptime" -gt 15 ]]; then + log_ok "Validator running for ${uptime}s — proceeding" + return 0 + fi + fi + + if [[ $i -eq 1 ]]; then + log " Validator starting up — waiting for it to connect..." + fi + log " [${i}/20] waiting..." + sleep 3 + done + + log_warn "Could not confirm validator is syncing after 60s." + log_warn "Continuing anyway — check: docker logs hyperlane-validator-bitsong" +} + +# ─── Relay Diagnostics ────────────────────────────────────────────────────── + +# Print a snapshot of what the relayer is doing (called during wait loops) +show_relay_progress() { + local logs + logs=$(docker logs hyperlane-relayer --tail 3000 2>&1 \ + | sed 's/\x1b\[[0-9;]*m//g') || return + + # Hyperlane v2 relayer log format: + # "Found log(s) in index range, ...cursor: RateLimitedContractSyncCursor { tip: N, ... + # domain: HyperlaneDomain(bitsong (7171)) }" + # "status: Finalized" for delivered txs + # "pool_size: N" in finality_stage + + local bitsong_tip basesep_tip finalized_count + bitsong_tip=$(echo "$logs" | grep "HyperlaneDomain(bitsong" \ + | grep -oP 'tip: \K[0-9]+' | tail -1) || true + basesep_tip=$(echo "$logs" | grep "HyperlaneDomain(basesepolia" \ + | grep -oP 'tip: \K[0-9]+' | tail -1) || true + finalized_count=$(echo "$logs" | grep -ci "status: Finalized" 2>/dev/null) || finalized_count=0 + + echo -n " relayer: bitsong=${bitsong_tip:-?} basesep=${basesep_tip:-?} finalized=$finalized_count" + + # Check for errors (excluding CCIP noise) + local real_errors + real_errors=$(echo "$logs" | grep -i "error\|failed" \ + | grep -cv "0xa2827cb39\|CCIP\|verification" 2>/dev/null) || real_errors=0 + if [[ "$real_errors" -gt 0 ]]; then + echo -n " ${RED}errors=$real_errors${NC}" + fi + echo +} + +# ─── Cosmos → EVM ─────────────────────────────────────────────────────────── + +test_cosmos_to_evm() { + log_step "Test: Cosmos -> EVM" + + local token_id evm_hyp_erc20 merkle_hook_id + token_id=$(require_state "token_id" "token_id") + evm_hyp_erc20=$(require_state "evm_hyp_erc20" "evm_hyp_erc20") + merkle_hook_id=$(load_state "merkle_hook_id") + + # Send to EVM signer (so they have tokens for the EVM->Cosmos test) + local evm_signer_addr evm_signer_bytes32 + evm_signer_addr=$(cast wallet address --private-key "$EVM_RELAYER_KEY" 2>/dev/null) + [[ -n "$evm_signer_addr" ]] || { log_err "Cannot derive EVM signer address"; return 1; } + local hex="${evm_signer_addr#0x}"; hex=$(echo "$hex" | tr '[:upper:]' '[:lower:]') + evm_signer_bytes32=$(printf "0x%064s" "$hex" | tr ' ' '0') + + log "Sending 1000 ubtsg: BitSong -> Base Sepolia" + log " Token: $token_id" + log " Recipient: $evm_signer_addr" + + local initial_supply + initial_supply=$(cast call "$evm_hyp_erc20" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null) || initial_supply="0" + log " Initial totalSupply: $initial_supply" + + # Use merkle hook to bypass IGP payment (devnet) + local tx_args=("$BINARY" tx warp transfer "$token_id" "$REMOTE_DOMAIN" "$evm_signer_bytes32" "1000" + --max-hyperlane-fee "0ubtsg") + [[ -n "$merkle_hook_id" ]] && tx_args+=(--custom-hook-id "$merkle_hook_id") + + submit_tx "Cosmos->EVM (1000 ubtsg)" "${tx_args[@]}" + + # Check if merkle tree count increased (confirms message was dispatched) + local merkle_count + merkle_count=$("$BINARY" query hyperlane hooks merkle-tree-hooks \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null \ + | jq -r '.merkle_tree_hooks[0].merkle_tree.count // "?"' 2>/dev/null) || merkle_count="?" + log " Merkle tree count after dispatch: $merkle_count" + + # Wait for relayer to deliver — 300s timeout with diagnostics + log "Waiting for relayer to pick up, sign, and deliver (timeout: 300s)..." + for i in $(seq 1 60); do + sleep 5 + local current_supply + current_supply=$(cast call "$evm_hyp_erc20" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null) || current_supply="0" + if [[ "$current_supply" != "$initial_supply" ]]; then + log_ok "Cosmos->EVM SUCCESS! totalSupply: $initial_supply -> $current_supply" + save_state "cosmos_to_evm_test_passed" "true" + return 0 + fi + + # Show diagnostics every 30s + if (( i % 6 == 0 )); then + echo -e " ${CYAN}[${i}/60] totalSupply=$current_supply — checking relayer...${NC}" + show_relay_progress + + # Also check validator checkpoint progress + local cp_file="$BITSONG_HOME/checkpoints-bitsong/index.json" + if [[ -f "$cp_file" ]]; then + local cp_idx + cp_idx=$(cat "$cp_file" 2>/dev/null) || cp_idx="?" + echo " validator-bitsong: checkpoint_index=$cp_idx" + fi + else + log " [${i}/60] totalSupply=$current_supply" + fi + done + + # Timed out — show diagnostics + log_err "Timed out after 300s!" + log_warn "Diagnostic info:" + log_warn " Last 10 relayer log lines (filtered):" + docker logs hyperlane-relayer --tail 20 2>&1 \ + | grep -v "0xa2827cb39\|CCIP Read" | tail -10 || true + echo + log_warn " Validator checkpoint:" + local cp_file="$BITSONG_HOME/checkpoints-bitsong/index.json" + [[ -f "$cp_file" ]] && cat "$cp_file" || echo " (no checkpoint file)" + echo + log_warn "Troubleshooting:" + log_warn " 1. Check validator: docker logs hyperlane-validator-bitsong --tail 50" + log_warn " 2. Check relayer: docker logs hyperlane-relayer --tail 50" + log_warn " 3. Run status: bash status.sh" + log_warn " 4. Retry test: bash 05-test.sh --cosmos-only" + return 1 +} + +# ─── EVM → Cosmos ─────────────────────────────────────────────────────────── + +test_evm_to_cosmos() { + log_step "Test: EVM -> Cosmos" + + local evm_hyp_erc20 token_id + evm_hyp_erc20=$(require_state "evm_hyp_erc20" "evm_hyp_erc20") + token_id=$(require_state "token_id" "token_id") + + local cosmos_recipient_bytes32 + cosmos_recipient_bytes32=$(bech32_to_bytes32 "$VAL_ADDRESS") + [[ -n "$cosmos_recipient_bytes32" ]] || { log_err "Failed to convert $VAL_ADDRESS to bytes32"; return 1; } + + # Check EVM balance first + local evm_balance + evm_balance=$(cast call "$evm_hyp_erc20" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null) || evm_balance="0" + if [[ "$evm_balance" == "0" ]]; then + log_err "HypERC20 totalSupply is 0 — no tokens to send back." + log_err "Run Cosmos->EVM test first to mint tokens on EVM side." + return 1 + fi + + log "Sending 1000 ubtsg: Base Sepolia -> BitSong" + log " HypERC20: $evm_hyp_erc20 (balance: $evm_balance)" + log " Recipient: $VAL_ADDRESS" + + local initial_height + initial_height=$("$BINARY" status --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r '.sync_info.latest_block_height // "0"' 2>/dev/null) || initial_height="0" + + local evm_tx + evm_tx=$(cast send "$evm_hyp_erc20" \ + "transferRemote(uint32,bytes32,uint256)" "$DOMAIN_ID" "$cosmos_recipient_bytes32" "1000" \ + --value 1 --private-key "$EVM_RELAYER_KEY" --rpc-url "$EVM_RPC" --json 2>&1) || true + + local evm_tx_hash + evm_tx_hash=$(echo "$evm_tx" | jq -r '.transactionHash // empty' 2>/dev/null) || true + [[ -n "$evm_tx_hash" ]] || { log_err "EVM tx failed"; echo "$evm_tx"; return 1; } + + log "EVM TX: $evm_tx_hash" + log "Waiting for relayer delivery (timeout: 1500s — first run scans ~24M blocks)..." + + for i in $(seq 1 100); do + sleep 15 + local events + events=$("$BINARY" query txs \ + --query "coin_received.receiver='$VAL_ADDRESS'" \ + --limit 5 --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq --arg h "$initial_height" '[.txs[]? | select((.height | tonumber) > ($h | tonumber))] | length' \ + 2>/dev/null) || events="0" + if [[ "${events:-0}" -gt 0 ]]; then + log_ok "EVM->Cosmos SUCCESS! coin_received by $VAL_ADDRESS" + save_state "evm_to_cosmos_test_passed" "true" + return 0 + fi + + local height + height=$("$BINARY" status --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r '.sync_info.latest_block_height // "?"' 2>/dev/null) || height="?" + + # Show diagnostics every 60s + if (( i % 4 == 0 )); then + echo -e " ${CYAN}[${i}/100] height=$height — checking relayer...${NC}" + show_relay_progress + else + log " [${i}/100] height=$height" + fi + done + + log_err "Timed out after 1500s!" + log_warn "Last 10 relayer logs:" + docker logs hyperlane-relayer --tail 20 2>&1 \ + | grep -v "0xa2827cb39\|CCIP Read" | tail -10 || true + return 1 +} + +# ─── Summary ───────────────────────────────────────────────────────────────── + +print_summary() { + log_step "Full Summary" + + echo -e "${BOLD}Chain${NC}" + echo " ID: $CHAIN_ID" + echo " RPC: $NODE" + echo " Domain: $DOMAIN_ID" + echo + + echo -e "${BOLD}Hyperlane${NC}" + echo " Mailbox: $(load_state mailbox_id)" + echo " RoutingISM: $(load_state routing_ism_id)" + echo " MerkleHook: $(load_state merkle_hook_id)" + echo " IGP: $(load_state igp_id)" + echo " Token: $(load_state token_id)" + echo + + echo -e "${BOLD}EVM (Base Sepolia)${NC}" + echo " HypERC20: $(load_state evm_hyp_erc20)" + echo " MultisigISM: $(load_state basesepolia_multisig_ism)" + echo " Validator: $(load_state validator_addr)" + echo + + echo -e "${BOLD}Transfer Tests${NC}" + echo " Cosmos->EVM: $(load_state cosmos_to_evm_test_passed || echo 'not run')" + echo " EVM->Cosmos: $(load_state evm_to_cosmos_test_passed || echo 'not run')" + echo + + echo -e "${BOLD}Docker${NC}" + echo " docker logs hyperlane-validator-bitsong" + echo " docker logs hyperlane-validator-basesepolia" + echo " docker logs hyperlane-relayer" + echo + + echo -e "${BOLD}State${NC}: $STATE_FILE" +} + +# ─── Main ──────────────────────────────────────────────────────────────────── + +COSMOS_ONLY=false +EVM_ONLY=false + +while [[ $# -gt 0 ]]; do + case "$1" in + --cosmos-only) COSMOS_ONLY=true; shift ;; + --evm-only) EVM_ONLY=true; shift ;; + -h|--help) + echo "Usage: $0 [--cosmos-only|--evm-only]" + echo "Required env: EVM_RELAYER_KEY (or HYP_KEY)" + exit 0 ;; + *) log_err "Unknown flag: $1"; exit 1 ;; + esac +done + +require_binary +require_jq +require_chain_running +command -v cast >/dev/null 2>&1 || { log_err "cast missing: foundryup"; exit 1; } +[[ -n "$EVM_RELAYER_KEY" ]] || { log_err "Set EVM_RELAYER_KEY or HYP_KEY"; exit 1; } + +banner "Transfer Tests" "bitsong <-> basesepolia" + +# Pre-flight: make sure agents are running + validator is caught up +check_agents_ready + +if [[ "$EVM_ONLY" != "true" ]]; then + test_cosmos_to_evm +fi + +if [[ "$COSMOS_ONLY" != "true" ]]; then + test_evm_to_cosmos +fi + +print_summary +log_ok "Tests complete!" diff --git a/scripts/hyperlane/06-fantoken-route.sh b/scripts/hyperlane/06-fantoken-route.sh new file mode 100755 index 00000000..bf73487c --- /dev/null +++ b/scripts/hyperlane/06-fantoken-route.sh @@ -0,0 +1,638 @@ +#!/usr/bin/env bash +# ============================================================================= +# 06-fantoken-route.sh — Issue a fantoken and create its Hyperlane warp route +# +# Supports multiple fantoken warp routes, each stored independently in state +# using per-symbol prefixed keys (ft__*). +# +# Usage: +# bash 06-fantoken-route.sh --symbol clay --name "Clay Token" # Register new +# bash 06-fantoken-route.sh --symbol clay # Resume/show +# bash 06-fantoken-route.sh --list # List all routes +# bash 06-fantoken-route.sh --symbol clay --clean # Wipe & redo +# +# Required environment: +# HYP_KEY (or EVM_PRIVATE_KEY) — EVM deployer private key (0x...) +# EVM_RELAYER_KEY — for relayer restart +# VALIDATOR_KEY, COSMOS_SIGNER_KEY — for relayer restart +# ============================================================================= + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" + +HYP_KEY="${HYP_KEY:-${EVM_PRIVATE_KEY:-}}" +EVM_RELAYER_KEY="${EVM_RELAYER_KEY:-${HYP_KEY:-}}" + +FT_MAX_SUPPLY="${FT_MAX_SUPPLY:-1000000000000}" +FT_MINT_AMOUNT="${FT_MINT_AMOUNT:-1000000000}" + +HYP_CHAINS_DIR="${HYP_CHAINS_DIR:-$HOME/.hyperlane/chains}" + +# ============================================================================= +# EVM nonce helper — wait for pending TX to confirm +# ============================================================================= + +# Wait until EVM pending nonce equals confirmed nonce (no pending TXs). +# Prevents "replacement transaction underpriced" when sending back-to-back. +wait_evm_pending() { + local addr + addr=$(cast wallet address --private-key "$HYP_KEY" 2>/dev/null) || return 0 + log "Waiting for pending EVM TXs to confirm ($addr)..." + for _ in $(seq 1 30); do + local pending confirmed + pending=$(cast nonce "$addr" --rpc-url "$EVM_RPC" --pending 2>/dev/null) || break + confirmed=$(cast nonce "$addr" --rpc-url "$EVM_RPC" 2>/dev/null) || break + if [[ "$pending" == "$confirmed" ]]; then + log_ok "EVM nonce settled (nonce=$confirmed)" + return 0 + fi + sleep 3 + done + log_warn "Timed out waiting for EVM pending TXs (proceeding anyway)" +} + +# ============================================================================= +# Per-symbol state helpers +# ============================================================================= + +FT_KEY="" # lowercased symbol, set by CLI parsing + +ft_save() { save_state "ft_${FT_KEY}_$1" "$2"; } +ft_load() { load_state "ft_${FT_KEY}_$1"; } + +# Write flat aliases so test/status scripts work with the latest route +ft_set_current() { + save_state "ft_denom" "$(ft_load denom)" + save_state "ft_minted" "$(ft_load minted)" + save_state "ft_token_id" "$(ft_load token_id)" + save_state "ft_evm_hyp_erc20" "$(ft_load evm_hyp_erc20)" + save_state "ft_evm_hyp_erc20_bytes32" "$(ft_load evm_hyp_erc20_bytes32)" + save_state "ft_router_enrolled" "$(ft_load router_enrolled)" + save_state "ft_evm_router_enrolled" "$(ft_load evm_router_enrolled)" + save_state "ft_evm_ism_set" "$(ft_load evm_ism_set)" + save_state "ft_relayer_restarted" "$(ft_load relayer_restarted)" +} + +# Add symbol to ft_route_list if not already present +register_route() { + local list + list=$(load_state "ft_route_list") + if [[ -z "$list" ]]; then + save_state "ft_route_list" "$FT_KEY" + elif ! echo ",$list," | grep -q ",$FT_KEY,"; then + save_state "ft_route_list" "${list},${FT_KEY}" + fi +} + +# Remove symbol from ft_route_list +unregister_route() { + local list + list=$(load_state "ft_route_list") + [[ -z "$list" ]] && return 0 + # Remove the symbol and clean up commas + local new_list + new_list=$(echo "$list" | tr ',' '\n' | grep -v "^${FT_KEY}$" | paste -sd ',' -) || true + save_state "ft_route_list" "$new_list" +} + +# ============================================================================= +# Migration: detect old flat ft_* keys with no ft_route_list +# ============================================================================= + +migrate_legacy_state() { + local route_list + route_list=$(load_state "ft_route_list") + [[ -n "$route_list" ]] && return 0 # Already migrated + + local old_denom + old_denom=$(load_state "ft_denom") + [[ -z "$old_denom" ]] && return 0 # No legacy state + + log "Migrating legacy fantoken state..." + + # Try to derive symbol from chain query + local old_symbol="" + if "$BINARY" status --node "$NODE" --home "$BITSONG_HOME" >/dev/null 2>&1; then + old_symbol=$("$BINARY" query fantoken denom "$old_denom" \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r '.fantoken.symbol // empty' 2>/dev/null) || true + fi + if [[ -z "$old_symbol" ]]; then + old_symbol="legacy" + log_warn "Could not query symbol for $old_denom, using 'legacy'" + fi + old_symbol=$(echo "$old_symbol" | tr '[:upper:]' '[:lower:]') + + # Copy flat keys to per-symbol keys + for suffix in denom minted token_id evm_hyp_erc20 evm_hyp_erc20_bytes32 \ + router_enrolled evm_router_enrolled evm_ism_set relayer_restarted; do + local val + val=$(load_state "ft_${suffix}") + [[ -n "$val" ]] && save_state "ft_${old_symbol}_${suffix}" "$val" + done + + save_state "ft_route_list" "$old_symbol" + log_ok "Migrated legacy state to symbol '$old_symbol'" +} + +# ============================================================================= +# --list: show all registered routes +# ============================================================================= + +list_routes() { + local route_list + route_list=$(load_state "ft_route_list") + if [[ -z "$route_list" ]]; then + echo "No fantoken routes registered." + return 0 + fi + + echo -e "${BOLD}Registered Fantoken Routes${NC}" + echo -e " SYMBOL DENOM EVM HYERC20 STATUS" + echo -e " ──────── ────────────────────────────────────────────── ────────────────────────────────────────────── ──────────" + + IFS=',' read -ra routes <<< "$route_list" + for sym in "${routes[@]}"; do + [[ -z "$sym" ]] && continue + local denom evm_hyp status_text + denom=$(load_state "ft_${sym}_denom") + evm_hyp=$(load_state "ft_${sym}_evm_hyp_erc20") + local ism_set + ism_set=$(load_state "ft_${sym}_evm_ism_set") + + if [[ -n "$evm_hyp" && "$ism_set" == "true" ]]; then + status_text="${GREEN}complete${NC}" + elif [[ -n "$evm_hyp" ]]; then + status_text="${YELLOW}partial: no ISM${NC}" + elif [[ -n "$denom" ]]; then + status_text="${YELLOW}partial: no EVM deploy${NC}" + else + status_text="${RED}empty${NC}" + fi + + printf " %-10s %-50s %-44s " "$sym" "${denom:-—}" "${evm_hyp:-—}" + echo -e "$status_text" + done + echo +} + +# ============================================================================= +# Build dynamic relayer whitelist from all routes +# ============================================================================= + +build_whitelist() { + local whitelist="[" + + # Always include ubtsg route + local token_id evm_hyp_erc20 + token_id=$(load_state "token_id") + evm_hyp_erc20=$(load_state "evm_hyp_erc20") + if [[ -n "$token_id" && -n "$evm_hyp_erc20" ]]; then + whitelist+="{\"senderAddress\":\"${token_id}\",\"destinationDomain\":\"${REMOTE_DOMAIN}\"}," + whitelist+="{\"senderAddress\":\"$(evm_to_bytes32 "$evm_hyp_erc20")\",\"destinationDomain\":\"${DOMAIN_ID}\"}," + fi + + # Add each fantoken route + local route_list + route_list=$(load_state "ft_route_list") + if [[ -n "$route_list" ]]; then + IFS=',' read -ra routes <<< "$route_list" + for sym in "${routes[@]}"; do + [[ -z "$sym" ]] && continue + local tid evm + tid=$(load_state "ft_${sym}_token_id") + evm=$(load_state "ft_${sym}_evm_hyp_erc20") + [[ -n "$tid" && -n "$evm" ]] || continue + whitelist+="{\"senderAddress\":\"${tid}\",\"destinationDomain\":\"${REMOTE_DOMAIN}\"}," + whitelist+="{\"senderAddress\":\"$(evm_to_bytes32 "$evm")\",\"destinationDomain\":\"${DOMAIN_ID}\"}," + done + fi + + whitelist="${whitelist%,}]" # Remove trailing comma + echo "$whitelist" +} + +# ============================================================================= +# Step 1: Issue Fantoken +# ============================================================================= + +issue_fantoken() { + log_step "Step 1: Issue Fantoken ($FT_SYMBOL)" + + FT_DENOM=$(ft_load "denom") + if [[ -n "$FT_DENOM" ]]; then + log_ok "Fantoken already issued: $FT_DENOM" + return 0 + fi + + [[ -n "$FT_NAME" ]] || { log_err "--name is required when issuing a new fantoken"; return 1; } + + submit_tx "Issue fantoken ($FT_SYMBOL)" \ + "$BINARY" tx fantoken issue \ + --symbol "$FT_SYMBOL" --name "$FT_NAME" --max-supply "$FT_MAX_SUPPLY" + + # Extract denom from protobuf data field (MsgIssueResponse contains the denom) + local data + data=$(echo "$TX_RESULT" | jq -r '.data // empty' 2>/dev/null) || true + if [[ -n "$data" ]]; then + FT_DENOM=$(echo "$data" | xxd -r -p | grep -aoP 'ft[0-9A-Fa-f]{40}' | head -1) || true + fi + + # Fallback: query fantokens by authority + if [[ -z "$FT_DENOM" ]]; then + log "Extracting denom from data failed, querying by authority..." + FT_DENOM=$("$BINARY" query fantoken authority "$VAL_ADDRESS" \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r --arg sym "$FT_SYMBOL" ' + [.fantokens[]? | select(.symbol == $sym) | .denom] | first // empty + ' 2>/dev/null) || true + fi + + [[ -n "$FT_DENOM" ]] || { log_err "Could not extract fantoken denom"; return 1; } + ft_save "denom" "$FT_DENOM" + log_ok "Fantoken issued: $FT_DENOM" +} + +# ============================================================================= +# Step 2: Mint Fantoken +# ============================================================================= + +mint_fantoken() { + log_step "Step 2: Mint Fantoken to Validator ($FT_SYMBOL)" + + if [[ "$(ft_load "minted")" == "true" ]]; then + log_ok "Already minted" + return 0 + fi + + submit_tx "Mint ${FT_MINT_AMOUNT} ${FT_DENOM}" \ + "$BINARY" tx fantoken mint "${FT_MINT_AMOUNT}${FT_DENOM}" \ + --recipient "$VAL_ADDRESS" + + ft_save "minted" "true" + + local balance + balance=$("$BINARY" query bank balance "$VAL_ADDRESS" "$FT_DENOM" \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r '.balance.amount // "?"' 2>/dev/null) || balance="?" + log_ok "Minted. Validator balance: ${balance} ${FT_DENOM}" +} + +# ============================================================================= +# Step 3: Create Collateral Token +# ============================================================================= + +create_ft_collateral() { + log_step "Step 3: Create Collateral Token ($FT_SYMBOL)" + + FT_TOKEN_ID=$(ft_load "token_id") + if [[ -n "$FT_TOKEN_ID" ]]; then + log_ok "Collateral token exists: $FT_TOKEN_ID" + return 0 + fi + + local mailbox_id; mailbox_id=$(require_state "mailbox_id" "mailbox_id") + + submit_tx "Create collateral token ($FT_DENOM)" \ + "$BINARY" tx warp create-collateral-token "$mailbox_id" "$FT_DENOM" + + FT_TOKEN_ID=$(extract_id) + [[ -n "$FT_TOKEN_ID" ]] || { log_err "Could not extract ft_token_id"; return 1; } + ft_save "token_id" "$FT_TOKEN_ID" + log_ok "Cosmos token: $FT_TOKEN_ID" +} + +# ============================================================================= +# Step 4: Deploy HypERC20 on Base Sepolia +# ============================================================================= + +deploy_ft_hyp_erc20() { + log_step "Step 4: Deploy HypERC20 for $FT_SYMBOL" + + FT_EVM_HYP_ERC20=$(ft_load "evm_hyp_erc20") + if [[ -n "$FT_EVM_HYP_ERC20" && "$FT_EVM_HYP_ERC20" =~ ^0x[0-9a-fA-F]{40}$ ]]; then + log_ok "HypERC20 already deployed: $FT_EVM_HYP_ERC20" + return 0 + fi + + local deployer_addr + deployer_addr=$(cast wallet address --private-key "$HYP_KEY" 2>/dev/null) \ + || { log_err "Cannot derive EVM address from HYP_KEY"; return 1; } + + # Generate single-chain warp config for fantoken + local warp_config="$BITSONG_HOME/warp-route-ft-${FT_KEY}-basesepolia.yaml" + cat > "$warp_config" << EOF +basesepolia: + type: synthetic + name: "$FT_NAME" + symbol: "$FT_SYMBOL" + decimals: 6 + mailbox: "$BASESEPOLIA_MAILBOX" + owner: "$deployer_addr" + interchainSecurityModule: "0x0000000000000000000000000000000000000000" +EOF + + log "Warp config:" + cat "$warp_config"; echo + + export HYP_KEY + log "Running: hyperlane warp deploy ..." + hyperlane warp deploy --config "$warp_config" --yes + + # Extract deployed address from CLI artifacts + log "Looking for deployment artifacts..." + local latest_warp + latest_warp=$(find "$HOME/.hyperlane/deployments/warp_routes" -name "*basesepolia*config.yaml" 2>/dev/null \ + | sort -r | head -1) || true + + if [[ -n "$latest_warp" ]]; then + log "Artifact: $latest_warp" + FT_EVM_HYP_ERC20=$(grep -oP '(?<=addressOrDenom: ")[^"]+' "$latest_warp" 2>/dev/null | head -1) || true + fi + + if [[ -z "$FT_EVM_HYP_ERC20" || ! "$FT_EVM_HYP_ERC20" =~ ^0x[0-9a-fA-F]{40}$ ]]; then + log_err "Could not extract HypERC20 address from CLI artifacts." + log_err "Set manually: jq '.ft_${FT_KEY}_evm_hyp_erc20=\"0xADDR\"' $STATE_FILE > /tmp/s && mv /tmp/s $STATE_FILE" + return 1 + fi + + ft_save "evm_hyp_erc20" "$FT_EVM_HYP_ERC20" + log_ok "FT HypERC20: $FT_EVM_HYP_ERC20" + + local evm_bytes32; evm_bytes32=$(evm_to_bytes32 "$FT_EVM_HYP_ERC20") + ft_save "evm_hyp_erc20_bytes32" "$evm_bytes32" + log " bytes32: $evm_bytes32" +} + +# ============================================================================= +# Step 5: Enroll Remote Routers (bidirectional) +# ============================================================================= + +enroll_ft_routers() { + log_step "Step 5: Enroll Remote Routers ($FT_SYMBOL)" + + # Cosmos side: enroll EVM HypERC20 as remote router + if [[ "$(ft_load "router_enrolled")" != "true" ]]; then + local evm_bytes32 + evm_bytes32=$(ft_load "evm_hyp_erc20_bytes32") + [[ -n "$evm_bytes32" ]] || { log_err "ft_${FT_KEY}_evm_hyp_erc20_bytes32 not in state"; return 1; } + + submit_tx "Enroll FT remote router on Cosmos (domain=$REMOTE_DOMAIN)" \ + "$BINARY" tx warp enroll-remote-router \ + "$FT_TOKEN_ID" "$REMOTE_DOMAIN" "$evm_bytes32" "$ENROLL_GAS" + + ft_save "router_enrolled" "true" + log_ok "Cosmos enrolled: domain $REMOTE_DOMAIN -> $evm_bytes32" + else + log_ok "Cosmos router already enrolled" + fi + + # EVM side: enroll Cosmos token as remote router + if [[ "$(ft_load "evm_router_enrolled")" != "true" ]]; then + log "enrollRemoteRouter($DOMAIN_ID, $FT_TOKEN_ID) on $FT_EVM_HYP_ERC20 ..." + local tx; tx=$(cast send "$FT_EVM_HYP_ERC20" \ + "enrollRemoteRouter(uint32,bytes32)" "$DOMAIN_ID" "$FT_TOKEN_ID" \ + --private-key "$HYP_KEY" --rpc-url "$EVM_RPC" --json 2>&1) || true + + local status; status=$(echo "$tx" | jq -r '.status // empty' 2>/dev/null) || true + local hash; hash=$(echo "$tx" | jq -r '.transactionHash // empty' 2>/dev/null) || true + + if [[ "$status" == "0x1" || "$status" == "1" ]]; then + ft_save "evm_router_enrolled" "true" + log_ok "EVM enrolled: domain $DOMAIN_ID -> $FT_TOKEN_ID (tx: $hash)" + else + log_err "EVM enrollment failed (status: $status)" + echo "$tx" | jq -c '.' 2>/dev/null || echo "$tx" + return 1 + fi + else + log_ok "EVM router already enrolled" + fi +} + +# ============================================================================= +# Step 6: Set ISM on EVM HypERC20 +# ============================================================================= + +set_ft_ism() { + log_step "Step 6: Set ISM on FT HypERC20 ($FT_SYMBOL)" + + if [[ "$(ft_load "evm_ism_set")" == "true" ]]; then + log_ok "ISM already set" + return 0 + fi + + local basesepolia_multisig_ism + basesepolia_multisig_ism=$(require_state "basesepolia_multisig_ism" "basesepolia_multisig_ism (run 04-agents.sh first)") + + log "Setting ISM to $basesepolia_multisig_ism on $FT_EVM_HYP_ERC20..." + local tx; tx=$(cast send "$FT_EVM_HYP_ERC20" \ + "setInterchainSecurityModule(address)" "$basesepolia_multisig_ism" \ + --private-key "$HYP_KEY" --rpc-url "$EVM_RPC" --json 2>&1) || true + + local status; status=$(echo "$tx" | jq -r '.status // empty' 2>/dev/null) || true + if [[ "$status" == "0x1" || "$status" == "1" ]]; then + ft_save "evm_ism_set" "true" + log_ok "ISM set to $basesepolia_multisig_ism" + else + log_err "setInterchainSecurityModule failed (status: $status)" + echo "$tx" | jq -c '.' 2>/dev/null || echo "$tx" + return 1 + fi +} + +# ============================================================================= +# Step 7: Restart Relayer with Dynamic Whitelist +# ============================================================================= + +restart_relayer() { + log_step "Step 7: Restart Relayer (dynamic whitelist)" + + # Always restart when a new route is added — the whitelist changes + local whitelist + whitelist=$(build_whitelist) + + # Count entries + local entry_count + entry_count=$(echo "$whitelist" | jq 'length' 2>/dev/null) || entry_count="?" + + log "Stopping existing relayer..." + docker stop hyperlane-relayer 2>/dev/null || true + docker rm -f hyperlane-relayer 2>/dev/null || true + sleep 2 + + log "Starting relayer with dynamic whitelist ($entry_count entries)..." + log " Whitelist: $whitelist" + docker run -d --name hyperlane-relayer --network host \ + -e CONFIG_FILES=/config/agent-config.json \ + -v "$BITSONG_HOME/agent-config.json:/config/agent-config.json:ro" \ + -v "$BITSONG_HOME/relayer-db:/hyperlane_db" \ + -v "$BITSONG_HOME/checkpoints-bitsong:/checkpoints-bitsong:ro" \ + -v "$BITSONG_HOME/checkpoints-basesepolia:/checkpoints-basesepolia:ro" \ + "$DOCKER_IMAGE" ./relayer \ + --db /hyperlane_db --relayChains bitsong,basesepolia \ + --allowLocalCheckpointSyncers true \ + --gaspaymentenforcement '[{"type": "none"}]' \ + --whitelist "$whitelist" \ + --chains.bitsong.signer.type cosmosKey \ + --chains.bitsong.signer.key "$COSMOS_SIGNER_KEY" \ + --chains.bitsong.signer.prefix bitsong \ + --chains.basesepolia.signer.type hexKey \ + --chains.basesepolia.signer.key "$EVM_RELAYER_KEY" \ + --metricsPort 9091 + + sleep 3 + if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^hyperlane-relayer$"; then + ft_save "relayer_restarted" "true" + log_ok "Relayer restarted with $entry_count whitelist entries" + else + log_err "Relayer failed to start — check: docker logs hyperlane-relayer" + return 1 + fi +} + +# ============================================================================= +# Verify +# ============================================================================= + +verify_ft_deployment() { + log_step "Verify Fantoken Warp Route ($FT_SYMBOL)" + + log "--- Cosmos Warp Token ($FT_TOKEN_ID) ---" + "$BINARY" query warp remote-routers "$FT_TOKEN_ID" \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | jq '.' || true + echo + + log "--- EVM HypERC20 ($FT_EVM_HYP_ERC20) ---" + local decimals symbol mailbox supply ism router_on_evm + symbol=$(cast call "$FT_EVM_HYP_ERC20" "symbol()(string)" --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + decimals=$(cast call "$FT_EVM_HYP_ERC20" "decimals()(uint8)" --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + mailbox=$(cast call "$FT_EVM_HYP_ERC20" "mailbox()(address)" --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + supply=$(cast call "$FT_EVM_HYP_ERC20" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + ism=$(cast call "$FT_EVM_HYP_ERC20" "interchainSecurityModule()(address)" --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + router_on_evm=$(cast call "$FT_EVM_HYP_ERC20" "routers(uint32)(bytes32)" "$DOMAIN_ID" \ + --rpc-url "$EVM_RPC" 2>/dev/null || echo "?") + + echo " symbol: $symbol (expected $FT_SYMBOL)" + echo " decimals: $decimals (expected 6)" + echo " mailbox: $mailbox" + echo " totalSupply: $supply (expected 0)" + echo " ISM: $ism" + echo " router($DOMAIN_ID): $router_on_evm" + echo +} + +# ============================================================================= +# Summary +# ============================================================================= + +print_summary() { + log_step "Summary" + echo -e "${BOLD}Fantoken Warp Route ($FT_SYMBOL)${NC}" + echo " Denom: $(ft_load denom)" + echo " Cosmos token: $(ft_load token_id)" + echo " EVM HypERC20: $(ft_load evm_hyp_erc20)" + echo " EVM (bytes32): $(ft_load evm_hyp_erc20_bytes32)" + echo " State prefix: ft_${FT_KEY}_*" + echo " State file: $STATE_FILE" + echo + echo -e "${BOLD}BaseScan${NC}: https://sepolia.basescan.org/address/$(ft_load evm_hyp_erc20)" + echo + echo -e "${BOLD}Next${NC}: Run 07-fantoken-test.sh --symbol $FT_SYMBOL to test transfers" +} + +# ============================================================================= +# Main +# ============================================================================= + +CLEAN=false +LIST_MODE=false +FT_SYMBOL="" +FT_NAME="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --symbol) + [[ -n "${2:-}" ]] || { log_err "--symbol requires a value"; exit 1; } + FT_SYMBOL="$2"; shift 2 ;; + --name) + [[ -n "${2:-}" ]] || { log_err "--name requires a value"; exit 1; } + FT_NAME="$2"; shift 2 ;; + --list) LIST_MODE=true; shift ;; + --clean) CLEAN=true; shift ;; + -h|--help) + echo "Usage: $0 --symbol [--name \"Name\"] [--clean]" + echo " $0 --list" + echo "" + echo "Options:" + echo " --symbol Fantoken symbol (required unless --list)" + echo " --name \"Name\" Fantoken name (required for new tokens)" + echo " --list List all registered fantoken routes" + echo " --clean Wipe this symbol's state keys and redo" + echo "" + echo "Required env: HYP_KEY, EVM_RELAYER_KEY, VALIDATOR_KEY, COSMOS_SIGNER_KEY" + exit 0 ;; + *) echo "Unknown flag: $1"; exit 1 ;; + esac +done + +# Handle --list early (only needs state file) +if [[ "$LIST_MODE" == "true" ]]; then + [[ -f "$STATE_FILE" ]] || { echo "No state file found."; exit 0; } + migrate_legacy_state + list_routes + exit 0 +fi + +# --symbol is required for everything else +[[ -n "$FT_SYMBOL" ]] || { log_err "--symbol is required (or use --list)"; exit 1; } +FT_KEY=$(echo "$FT_SYMBOL" | tr '[:upper:]' '[:lower:]') + +# Preflight +require_binary +require_jq +require_chain_running +command -v hyperlane >/dev/null 2>&1 || { log_err "Hyperlane CLI missing: npm install -g @hyperlane-xyz/cli"; exit 1; } +command -v cast >/dev/null 2>&1 || { log_err "cast missing: foundryup"; exit 1; } + +[[ -f "$STATE_FILE" ]] || { log_err "State not found: $STATE_FILE. Run earlier phases first."; exit 1; } +[[ -n "$HYP_KEY" ]] || { log_err "Set HYP_KEY=0x"; exit 1; } +[[ -n "${VALIDATOR_KEY:-}" ]] || { log_err "VALIDATOR_KEY not set (needed for relayer restart)"; exit 1; } +[[ -n "${COSMOS_SIGNER_KEY:-}" ]] || { log_err "COSMOS_SIGNER_KEY not set (needed for relayer restart)"; exit 1; } +[[ -n "${EVM_RELAYER_KEY:-}" ]] || { log_err "EVM_RELAYER_KEY not set (needed for relayer restart)"; exit 1; } +[[ -n "$VAL_ADDRESS" ]] || { log_err "VAL_ADDRESS not available. Is chain initialized?"; exit 1; } + +# Migrate legacy flat keys if needed +migrate_legacy_state + +# Handle --clean for this specific symbol +if [[ "$CLEAN" == "true" ]]; then + log "Cleaning state for symbol '$FT_KEY'..." + for suffix in denom minted token_id evm_hyp_erc20 evm_hyp_erc20_bytes32 \ + router_enrolled evm_router_enrolled evm_ism_set relayer_restarted; do + jq --arg k "ft_${FT_KEY}_${suffix}" 'del(.[$k])' "$STATE_FILE" > "${STATE_FILE}.tmp" \ + && mv "${STATE_FILE}.tmp" "$STATE_FILE" + done + unregister_route + log_ok "State cleaned for '$FT_KEY'" +fi + +banner "Phase 6: Fantoken Warp Route" "$FT_SYMBOL on bitsong <-> basesepolia" + +issue_fantoken +mint_fantoken +create_ft_collateral +deploy_ft_hyp_erc20 +wait_evm_pending # ensure HypERC20 deploy TX confirms before enrollment +enroll_ft_routers +wait_evm_pending # ensure EVM enrollment TX confirms before ISM TX +set_ft_ism + +# Register route BEFORE relayer restart so build_whitelist() includes it +register_route +ft_set_current + +restart_relayer +verify_ft_deployment +print_summary + +log_ok "Phase 6 complete for $FT_SYMBOL!" diff --git a/scripts/hyperlane/07-fantoken-test.sh b/scripts/hyperlane/07-fantoken-test.sh new file mode 100755 index 00000000..861da525 --- /dev/null +++ b/scripts/hyperlane/07-fantoken-test.sh @@ -0,0 +1,363 @@ +#!/usr/bin/env bash +# ============================================================================= +# 07-fantoken-test.sh — End-to-end fantoken transfer tests (Cosmos<->EVM) +# +# Supports per-symbol testing. If --symbol is provided, loads state from +# per-symbol keys (ft__*). Otherwise falls back to flat keys (ft_*). +# +# Usage: +# bash 07-fantoken-test.sh --symbol clay # Test clay route +# bash 07-fantoken-test.sh --symbol clay --cosmos-only # Cosmos->EVM only +# bash 07-fantoken-test.sh # Test latest route +# +# Required environment: +# EVM_RELAYER_KEY (or HYP_KEY) — for EVM->Cosmos transfer +# ============================================================================= + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" + +EVM_RELAYER_KEY="${EVM_RELAYER_KEY:-${HYP_KEY:-}}" + +# ============================================================================= +# Per-symbol state helpers (mirrors 06-fantoken-route.sh) +# ============================================================================= + +FT_KEY="" # lowercased symbol, empty = use flat keys + +ft_load_key() { + if [[ -n "$FT_KEY" ]]; then + load_state "ft_${FT_KEY}_$1" + else + load_state "ft_$1" + fi +} + +ft_save_key() { + if [[ -n "$FT_KEY" ]]; then + save_state "ft_${FT_KEY}_$1" "$2" + # Also update flat aliases + save_state "ft_$1" "$2" + else + save_state "ft_$1" "$2" + fi +} + +# ============================================================================= +# Readiness Check +# ============================================================================= + +check_agents_ready() { + log_step "Checking Agent Readiness" + + local ok=true + for name in hyperlane-validator-bitsong hyperlane-validator-basesepolia hyperlane-relayer; do + if docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^${name}$"; then + log_ok "$name running" + else + log_err "$name NOT running — start with: bash 04-agents.sh" + ok=false + fi + done + [[ "$ok" == "true" ]] || { log_err "Agents not ready. Run 04-agents.sh / 06-fantoken-route.sh first."; exit 1; } + + # Verify relayer has fantoken in whitelist + local ft_restarted + ft_restarted=$(ft_load_key "relayer_restarted") + if [[ "$ft_restarted" != "true" ]]; then + log_warn "Relayer may not have fantoken whitelist. Run 06-fantoken-route.sh first." + fi +} + +# ============================================================================= +# Relay Diagnostics +# ============================================================================= + +show_relay_progress() { + local logs + logs=$(docker logs hyperlane-relayer --tail 3000 2>&1 \ + | sed 's/\x1b\[[0-9;]*m//g') || return + + local bitsong_tip basesep_tip finalized_count + bitsong_tip=$(echo "$logs" | grep "HyperlaneDomain(bitsong" \ + | grep -oP 'tip: \K[0-9]+' | tail -1) || true + basesep_tip=$(echo "$logs" | grep "HyperlaneDomain(basesepolia" \ + | grep -oP 'tip: \K[0-9]+' | tail -1) || true + finalized_count=$(echo "$logs" | grep -ci "status: Finalized" 2>/dev/null) || finalized_count=0 + + echo -n " relayer: bitsong=${bitsong_tip:-?} basesep=${basesep_tip:-?} finalized=$finalized_count" + + local real_errors + real_errors=$(echo "$logs" | grep -i "error\|failed" \ + | grep -cv "0xa2827cb39\|CCIP\|verification" 2>/dev/null) || real_errors=0 + if [[ "$real_errors" -gt 0 ]]; then + echo -n " ${RED}errors=$real_errors${NC}" + fi + echo +} + +# ============================================================================= +# Cosmos -> EVM (fantoken) +# ============================================================================= + +test_ft_cosmos_to_evm() { + local symbol_label="${FT_KEY:-latest}" + log_step "Test: Cosmos -> EVM (Fantoken: $symbol_label)" + + local ft_token_id ft_evm_hyp_erc20 ft_denom merkle_hook_id + ft_token_id=$(ft_load_key "token_id") + ft_evm_hyp_erc20=$(ft_load_key "evm_hyp_erc20") + ft_denom=$(ft_load_key "denom") + merkle_hook_id=$(load_state "merkle_hook_id") + + [[ -n "$ft_token_id" ]] || { log_err "ft_token_id not in state"; return 1; } + [[ -n "$ft_evm_hyp_erc20" ]] || { log_err "ft_evm_hyp_erc20 not in state"; return 1; } + [[ -n "$ft_denom" ]] || { log_err "ft_denom not in state"; return 1; } + + # Send to EVM signer (so they have tokens for the EVM->Cosmos test) + local evm_signer_addr evm_signer_bytes32 + evm_signer_addr=$(cast wallet address --private-key "$EVM_RELAYER_KEY" 2>/dev/null) + [[ -n "$evm_signer_addr" ]] || { log_err "Cannot derive EVM signer address"; return 1; } + local hex="${evm_signer_addr#0x}"; hex=$(echo "$hex" | tr '[:upper:]' '[:lower:]') + evm_signer_bytes32=$(printf "0x%064s" "$hex" | tr ' ' '0') + + local transfer_amount=1000 + + log "Sending $transfer_amount $ft_denom: BitSong -> Base Sepolia" + log " Token: $ft_token_id" + log " Denom: $ft_denom" + log " Recipient: $evm_signer_addr" + + local initial_supply + initial_supply=$(cast call "$ft_evm_hyp_erc20" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null) || initial_supply="0" + log " Initial totalSupply: $initial_supply" + + # Use merkle hook to bypass IGP payment (devnet) + local tx_args=("$BINARY" tx warp transfer "$ft_token_id" "$REMOTE_DOMAIN" "$evm_signer_bytes32" "$transfer_amount" + --max-hyperlane-fee "0ubtsg") + [[ -n "$merkle_hook_id" ]] && tx_args+=(--custom-hook-id "$merkle_hook_id") + + submit_tx "Cosmos->EVM ($transfer_amount $ft_denom)" "${tx_args[@]}" + + # Check if merkle tree count increased + local merkle_count + merkle_count=$("$BINARY" query hyperlane hooks merkle-tree-hooks \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null \ + | jq -r '.merkle_tree_hooks[0].merkle_tree.count // "?"' 2>/dev/null) || merkle_count="?" + log " Merkle tree count after dispatch: $merkle_count" + + # Wait for relayer to deliver — 300s timeout with diagnostics + log "Waiting for relayer to pick up, sign, and deliver (timeout: 300s)..." + for i in $(seq 1 60); do + sleep 5 + local current_supply + current_supply=$(cast call "$ft_evm_hyp_erc20" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null) || current_supply="0" + if [[ "$current_supply" != "$initial_supply" ]]; then + log_ok "Cosmos->EVM (FT) SUCCESS! totalSupply: $initial_supply -> $current_supply" + ft_save_key "cosmos_to_evm_test_passed" "true" + return 0 + fi + + if (( i % 6 == 0 )); then + echo -e " ${CYAN}[${i}/60] totalSupply=$current_supply — checking relayer...${NC}" + show_relay_progress + + local cp_file="$BITSONG_HOME/checkpoints-bitsong/index.json" + if [[ -f "$cp_file" ]]; then + local cp_idx + cp_idx=$(cat "$cp_file" 2>/dev/null) || cp_idx="?" + echo " validator-bitsong: checkpoint_index=$cp_idx" + fi + else + log " [${i}/60] totalSupply=$current_supply" + fi + done + + log_err "Timed out after 300s!" + log_warn "Diagnostic info:" + log_warn " Last 10 relayer log lines (filtered):" + docker logs hyperlane-relayer --tail 20 2>&1 \ + | grep -v "0xa2827cb39\|CCIP Read" | tail -10 || true + echo + log_warn " Validator checkpoint:" + local cp_file="$BITSONG_HOME/checkpoints-bitsong/index.json" + [[ -f "$cp_file" ]] && cat "$cp_file" || echo " (no checkpoint file)" + echo + log_warn "Troubleshooting:" + log_warn " 1. Check relayer whitelist includes ft_token_id" + log_warn " 2. docker logs hyperlane-relayer --tail 50" + log_warn " 3. bash status.sh" + log_warn " 4. Retry: bash 07-fantoken-test.sh${FT_KEY:+ --symbol $FT_KEY} --cosmos-only" + return 1 +} + +# ============================================================================= +# EVM -> Cosmos (fantoken) +# ============================================================================= + +test_ft_evm_to_cosmos() { + local symbol_label="${FT_KEY:-latest}" + log_step "Test: EVM -> Cosmos (Fantoken: $symbol_label)" + + local ft_evm_hyp_erc20 ft_token_id ft_denom + ft_evm_hyp_erc20=$(ft_load_key "evm_hyp_erc20") + ft_token_id=$(ft_load_key "token_id") + ft_denom=$(ft_load_key "denom") + + [[ -n "$ft_evm_hyp_erc20" ]] || { log_err "ft_evm_hyp_erc20 not in state"; return 1; } + [[ -n "$ft_token_id" ]] || { log_err "ft_token_id not in state"; return 1; } + [[ -n "$ft_denom" ]] || { log_err "ft_denom not in state"; return 1; } + + local cosmos_recipient_bytes32 + cosmos_recipient_bytes32=$(bech32_to_bytes32 "$VAL_ADDRESS") + [[ -n "$cosmos_recipient_bytes32" ]] || { log_err "Failed to convert $VAL_ADDRESS to bytes32"; return 1; } + + # Check EVM balance first + local evm_balance + evm_balance=$(cast call "$ft_evm_hyp_erc20" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null) || evm_balance="0" + if [[ "$evm_balance" == "0" ]]; then + log_err "FT HypERC20 totalSupply is 0 — no tokens to send back." + log_err "Run Cosmos->EVM fantoken test first." + return 1 + fi + + local transfer_amount=1000 + + # Get initial Cosmos balance for the fantoken + local initial_balance + initial_balance=$("$BINARY" query bank balance "$VAL_ADDRESS" "$ft_denom" \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r '.balance.amount // "0"' 2>/dev/null) || initial_balance="0" + + log "Sending $transfer_amount $ft_denom: Base Sepolia -> BitSong" + log " HypERC20: $ft_evm_hyp_erc20 (supply: $evm_balance)" + log " Recipient: $VAL_ADDRESS" + log " Initial Cosmos balance: $initial_balance $ft_denom" + + local initial_height + initial_height=$("$BINARY" status --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r '.sync_info.latest_block_height // "0"' 2>/dev/null) || initial_height="0" + + local evm_tx + evm_tx=$(cast send "$ft_evm_hyp_erc20" \ + "transferRemote(uint32,bytes32,uint256)" "$DOMAIN_ID" "$cosmos_recipient_bytes32" "$transfer_amount" \ + --value 1 --private-key "$EVM_RELAYER_KEY" --rpc-url "$EVM_RPC" --json 2>&1) || true + + local evm_tx_hash + evm_tx_hash=$(echo "$evm_tx" | jq -r '.transactionHash // empty' 2>/dev/null) || true + [[ -n "$evm_tx_hash" ]] || { log_err "EVM tx failed"; echo "$evm_tx"; return 1; } + + log "EVM TX: $evm_tx_hash" + log "Waiting for relayer delivery (timeout: 1500s — first run scans ~24M blocks)..." + + for i in $(seq 1 100); do + sleep 15 + local current_balance + current_balance=$("$BINARY" query bank balance "$VAL_ADDRESS" "$ft_denom" \ + --output json --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r '.balance.amount // "0"' 2>/dev/null) || current_balance="0" + + if [[ "$current_balance" != "$initial_balance" ]]; then + log_ok "EVM->Cosmos (FT) SUCCESS! Balance: $initial_balance -> $current_balance $ft_denom" + ft_save_key "evm_to_cosmos_test_passed" "true" + return 0 + fi + + local height + height=$("$BINARY" status --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null | \ + jq -r '.sync_info.latest_block_height // "?"' 2>/dev/null) || height="?" + + if (( i % 4 == 0 )); then + echo -e " ${CYAN}[${i}/100] height=$height balance=$current_balance — checking relayer...${NC}" + show_relay_progress + else + log " [${i}/100] height=$height balance=$current_balance" + fi + done + + log_err "Timed out after 1500s!" + log_warn "Last 10 relayer logs:" + docker logs hyperlane-relayer --tail 20 2>&1 \ + | grep -v "0xa2827cb39\|CCIP Read" | tail -10 || true + return 1 +} + +# ============================================================================= +# Summary +# ============================================================================= + +print_summary() { + local symbol_label="${FT_KEY:-latest}" + log_step "Fantoken Test Summary ($symbol_label)" + + echo -e "${BOLD}Fantoken${NC}" + echo " Denom: $(ft_load_key denom)" + echo " Token ID: $(ft_load_key token_id)" + echo " HypERC20: $(ft_load_key evm_hyp_erc20)" + echo + + echo -e "${BOLD}Transfer Tests${NC}" + local c2e e2c + c2e=$(ft_load_key "cosmos_to_evm_test_passed") + e2c=$(ft_load_key "evm_to_cosmos_test_passed") + echo " Cosmos->EVM (FT): ${c2e:-not run}" + echo " EVM->Cosmos (FT): ${e2c:-not run}" + echo +} + +# ============================================================================= +# Main +# ============================================================================= + +COSMOS_ONLY=false +EVM_ONLY=false +FT_SYMBOL="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --symbol) + [[ -n "${2:-}" ]] || { log_err "--symbol requires a value"; exit 1; } + FT_SYMBOL="$2"; shift 2 ;; + --cosmos-only) COSMOS_ONLY=true; shift ;; + --evm-only) EVM_ONLY=true; shift ;; + -h|--help) + echo "Usage: $0 [--symbol ] [--cosmos-only|--evm-only]" + echo "" + echo "Options:" + echo " --symbol Test a specific fantoken route (default: latest)" + echo " --cosmos-only Cosmos->EVM only" + echo " --evm-only EVM->Cosmos only" + echo "" + echo "Required env: EVM_RELAYER_KEY (or HYP_KEY)" + exit 0 ;; + *) log_err "Unknown flag: $1"; exit 1 ;; + esac +done + +if [[ -n "$FT_SYMBOL" ]]; then + FT_KEY=$(echo "$FT_SYMBOL" | tr '[:upper:]' '[:lower:]') +fi + +require_binary +require_jq +require_chain_running +command -v cast >/dev/null 2>&1 || { log_err "cast missing: foundryup"; exit 1; } +[[ -n "$EVM_RELAYER_KEY" ]] || { log_err "Set EVM_RELAYER_KEY or HYP_KEY"; exit 1; } + +if [[ -n "$FT_KEY" ]]; then + banner "Fantoken Transfer Tests" "$FT_SYMBOL — bitsong <-> basesepolia" +else + banner "Fantoken Transfer Tests" "latest route — bitsong <-> basesepolia" +fi + +check_agents_ready + +if [[ "$EVM_ONLY" != "true" ]]; then + test_ft_cosmos_to_evm +fi + +if [[ "$COSMOS_ONLY" != "true" ]]; then + test_ft_evm_to_cosmos +fi + +print_summary +log_ok "Fantoken tests complete!" diff --git a/scripts/hyperlane/lib.sh b/scripts/hyperlane/lib.sh new file mode 100755 index 00000000..0ecf5d19 --- /dev/null +++ b/scripts/hyperlane/lib.sh @@ -0,0 +1,279 @@ +#!/usr/bin/env bash +# ============================================================================= +# lib.sh — Shared library for BitSong Hyperlane scripts +# +# Source this file from any script: +# source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" +# ============================================================================= + +[[ -n "${_HYPERLANE_LIB_LOADED:-}" ]] && return 0 +_HYPERLANE_LIB_LOADED=1 + +set -euo pipefail + +# ============================================================================= +# Paths +# ============================================================================= + +_LIB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Walk up to project root (contains go.mod) +_PROJECT_DIR="$_LIB_DIR" +while [[ "$_PROJECT_DIR" != "/" && ! -f "$_PROJECT_DIR/go.mod" ]]; do + _PROJECT_DIR="$(dirname "$_PROJECT_DIR")" +done +if [[ ! -f "$_PROJECT_DIR/go.mod" ]]; then + echo "ERROR: Could not find project root (go.mod)." >&2 + exit 1 +fi + +# Auto-load .env if present (private keys, etc. — gitignored) +if [[ -f "$_LIB_DIR/.env" ]]; then + set -a; source "$_LIB_DIR/.env"; set +a +fi + +# ============================================================================= +# Colors & Logging +# ============================================================================= + +RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' +CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m' + +log() { echo -e "${CYAN}[$(date '+%H:%M:%S')]${NC} $*"; } +log_ok() { echo -e "${GREEN}[$(date '+%H:%M:%S')] ✓${NC} $*"; } +log_warn() { echo -e "${YELLOW}[$(date '+%H:%M:%S')] !${NC} $*"; } +log_err() { echo -e "${RED}[$(date '+%H:%M:%S')] ✗${NC} $*"; } +log_step() { echo -e "\n${BOLD}${CYAN}═══ $* ═══${NC}\n"; } + +banner() { + echo -e "${BOLD}${CYAN}" + echo " ╔══════════════════════════════════════════════╗" + printf " ║ %-43s║\n" "$1" + printf " ║ %-43s║\n" "$2" + echo " ╚══════════════════════════════════════════════╝" + echo -e "${NC}" +} + +# ============================================================================= +# Chain Configuration (all overridable via environment) +# ============================================================================= + +CHAIN_ID="${CHAIN_ID:-localbitsong-hyperlane}" +BITSONG_HOME="${BITSONG_HOME:-$HOME/.localbitsong-hyperlane}" +MONIKER="${MONIKER:-val}" +KEY_NAME="${KEY_NAME:-val}" +KEYRING_BACKEND="${KEYRING_BACKEND:-test}" +DENOM="${DENOM:-ubtsg}" +NODE="${NODE:-tcp://localhost:26657}" + +# Auto-detect bitsongd +if [[ -z "${BINARY:-}" ]]; then + if [[ -x "$_PROJECT_DIR/build/bitsongd" ]]; then + BINARY="$_PROJECT_DIR/build/bitsongd" + elif [[ -x "./build/bitsongd" ]]; then + BINARY="./build/bitsongd" + else + BINARY="bitsongd" + fi +fi + +# Validator mnemonic — loaded from .env (never hardcoded) +# Required by 01-chain.sh; optional for other scripts. +VAL_MNEMONIC="${VAL_MNEMONIC:-}" + +# Derive VAL_ADDRESS from keyring (coin type 639, set by bitsongd) +VAL_ADDRESS="${VAL_ADDRESS:-}" +if [[ -z "$VAL_ADDRESS" && -d "$BITSONG_HOME/keyring-$KEYRING_BACKEND" ]]; then + VAL_ADDRESS=$("$BINARY" keys show "$KEY_NAME" \ + --keyring-backend "$KEYRING_BACKEND" --home "$BITSONG_HOME" -a 2>/dev/null) || true +fi + +# ============================================================================= +# Hyperlane / EVM Configuration +# ============================================================================= + +DOMAIN_ID="${DOMAIN_ID:-7171}" +REMOTE_DOMAIN="${REMOTE_DOMAIN:-84532}" +BASESEPOLIA_MAILBOX="${BASESEPOLIA_MAILBOX:-0x6966b0E55883d49BFB24539356a2f8A673E02039}" +EVM_RPC="${EVM_RPC:-https://sepolia.base.org}" + +VALIDATOR_ADDRESSES="${VALIDATOR_ADDRESSES:-0x1111111111111111111111111111111111111111,0x2222222222222222222222222222222222222222,0x3333333333333333333333333333333333333333}" +VALIDATOR_THRESHOLD="${VALIDATOR_THRESHOLD:-2}" +TOKEN_EXCHANGE_RATE="${TOKEN_EXCHANGE_RATE:-10000000000}" +GAS_PRICE="${GAS_PRICE:-1000000000}" +GAS_OVERHEAD="${GAS_OVERHEAD:-75000}" +ENROLL_GAS="${ENROLL_GAS:-300000}" + +# Docker agents +DOCKER_IMAGE="${DOCKER_IMAGE:-gcr.io/abacus-labs-dev/hyperlane-agent:agents-v2.0.0}" +BASESEPOLIA_ISM_FACTORY="${BASESEPOLIA_ISM_FACTORY:-0xfc6e546510dC9d76057F1f76633FCFfC188CB213}" +VALIDATOR_ANNOUNCE_CONTRACT="${VALIDATOR_ANNOUNCE_CONTRACT:-0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9}" + +# State file (shared across all phases) +STATE_FILE="$BITSONG_HOME/hyperlane-state.json" + +# ============================================================================= +# State Management +# ============================================================================= + +save_state() { + local key="$1" value="$2" + [[ ! -f "$STATE_FILE" ]] && echo '{}' > "$STATE_FILE" + local tmp="${STATE_FILE}.tmp" + jq --arg k "$key" --arg v "$value" '.[$k] = $v' "$STATE_FILE" > "$tmp" && mv "$tmp" "$STATE_FILE" +} + +load_state() { + local key="$1" + [[ -f "$STATE_FILE" ]] && jq -r --arg k "$key" '.[$k] // empty' "$STATE_FILE" 2>/dev/null || true +} + +# ============================================================================= +# Chain Helpers +# ============================================================================= + +wait_for_block() { + log "Waiting for chain to produce blocks..." + for _ in $(seq 1 60); do + local height + height=$("$BINARY" status --node "$NODE" --home "$BITSONG_HOME" 2>&1 \ + | jq -r '.sync_info.latest_block_height // .SyncInfo.latest_block_height // "0"' 2>/dev/null) || height="0" + if [[ "$height" =~ ^[0-9]+$ && "$height" -gt 0 ]]; then + log_ok "Chain producing blocks (height=$height)" + return 0 + fi + sleep 2 + done + log_err "Chain not producing blocks after 120s — check: $BITSONG_HOME/chain.log" + return 1 +} + +# ============================================================================= +# Transaction Helpers +# ============================================================================= + +TX_RESULT="" + +# Submit a bitsongd TX and wait for inclusion (up to 60s). +# Usage: submit_tx "description" $BINARY tx hyperlane ... +submit_tx() { + local desc="$1"; shift + TX_RESULT="" + log "Submitting: $desc" + + local result + result=$("$@" \ + --from "$KEY_NAME" --keyring-backend "$KEYRING_BACKEND" \ + --chain-id "$CHAIN_ID" --node "$NODE" \ + --gas auto --gas-adjustment 1.5 --fees "10000${DENOM}" \ + --output json -y --home "$BITSONG_HOME" 2>&1) || true + + # --gas auto prints "gas estimate: N" before JSON + local json_result + json_result=$(echo "$result" | grep '^\{' | tail -1) || true + + local txhash + txhash=$(echo "$json_result" | jq -r '.txhash // empty' 2>/dev/null) || true + if [[ -z "$txhash" ]]; then + log_err "Failed to submit tx. Output:"; echo "$result"; return 1 + fi + + log " TX: $txhash — waiting for inclusion..." + for _ in $(seq 1 30); do + sleep 2 + TX_RESULT=$("$BINARY" query tx "$txhash" --output json --node "$NODE" --home "$BITSONG_HOME" 2>&1) || true + if echo "$TX_RESULT" | jq -e '.code != null' >/dev/null 2>&1; then break; fi + TX_RESULT="" + done + + [[ -n "$TX_RESULT" ]] || { log_err "TX not found after 60s"; return 1; } + + local code + code=$(echo "$TX_RESULT" | jq -r '.code') + if [[ "$code" != "0" ]]; then + log_err "TX failed (code=$code)" + echo "$TX_RESULT" | jq -r '.raw_log // "unknown"' 2>/dev/null || true + return 1 + fi + log_ok "TX succeeded (code=0)" +} + +# Extract hex ID (0x...) from the last TX_RESULT. +extract_id() { + local id="" + + # Strategy 1: msg_responses + id=$(echo "$TX_RESULT" | jq -r '.msg_responses[0].id // empty' 2>/dev/null) || true + [[ -n "$id" && "$id" != "null" ]] && { echo "$id"; return; } + + # Strategy 2: decode hex data field (protobuf response) + local data + data=$(echo "$TX_RESULT" | jq -r '.data // empty' 2>/dev/null) || true + if [[ -n "$data" ]]; then + id=$(echo "$data" | xxd -r -p | grep -aoP '0x[0-9a-f]{64}' | tail -1) || true + [[ -n "$id" ]] && { echo "$id"; return; } + fi + + # Strategy 3: Hyperlane/Warp events + id=$(echo "$TX_RESULT" | jq -r ' + [.events[]? | select(.type | test("hyperlane|warp")) | + select(.type | test("[Cc]reate")) | + .attributes[]? | select(.key | test("_id$|^id$")) | + select(.key != "msg_index") | .value + ] | first // empty' 2>/dev/null) || true + [[ -n "$id" && "$id" != "null" ]] && { echo "$id" | sed 's/^"//;s/"$//'; return; } + + echo "" +} + +# ============================================================================= +# Address Conversion +# ============================================================================= + +# 20-byte EVM address → 32-byte Hyperlane hex (left-padded) +evm_to_bytes32() { + local addr="${1#0x}" + addr=$(echo "$addr" | tr '[:upper:]' '[:lower:]') + printf "0x%064s" "$addr" | tr ' ' '0' +} + +# bech32 Cosmos address → 32-byte hex +bech32_to_bytes32() { + local bech32_addr="$1" hex="" + + hex=$("$BINARY" keys parse "$bech32_addr" --output json 2>/dev/null \ + | jq -r '.bytes // empty' 2>/dev/null) || true + + if [[ -z "$hex" ]] && command -v python3 >/dev/null 2>&1; then + hex=$(python3 -c " +CHARSET='qpzry9x8gf2tvdw0s3jn54khce6mua7l' +def decode(addr): + _, dp = addr.rsplit('1', 1) + v = [CHARSET.index(c) for c in dp][:-6] + acc, bits, out = 0, 0, [] + for d in v: + acc = (acc << 5) | d; bits += 5 + while bits >= 8: bits -= 8; out.append((acc >> bits) & 0xff) + return bytes(out).hex() +print(decode('$bech32_addr')) +" 2>/dev/null) || true + fi + + [[ -z "$hex" ]] && { log_err "Failed to decode bech32: $bech32_addr"; return 1; } + printf "0x%064s" "$hex" | tr ' ' '0' +} + +# ============================================================================= +# Preflight Helpers +# ============================================================================= + +require_binary() { [[ -x "$BINARY" ]] || command -v "$BINARY" >/dev/null 2>&1 || { log_err "bitsongd not found. Build: LEDGER_ENABLED=false make build"; exit 1; }; } +require_jq() { command -v jq >/dev/null 2>&1 || { log_err "jq missing: sudo apt install jq"; exit 1; }; } +require_chain_running() { "$BINARY" status --node "$NODE" --home "$BITSONG_HOME" >/dev/null 2>&1 || { log_err "Chain not running at $NODE"; exit 1; }; } + +require_state() { + local key="$1" label="${2:-$1}" val + val=$(load_state "$key") + [[ -n "$val" ]] || { log_err "$label not in state file. Run previous phase first."; exit 1; } + echo "$val" +} diff --git a/scripts/hyperlane/run-all.sh b/scripts/hyperlane/run-all.sh new file mode 100755 index 00000000..1183b0bd --- /dev/null +++ b/scripts/hyperlane/run-all.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# ============================================================================= +# run-all.sh — Run all Hyperlane phases in sequence +# +# Usage: +# bash run-all.sh # Run phases 1-5 +# bash run-all.sh --from 3 # Start from phase 3 +# bash run-all.sh --skip-test # Skip transfer tests +# bash run-all.sh --clean # Clean everything first +# ============================================================================= + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +FROM_PHASE=1 +SKIP_TEST=false +CLEAN=false + +while [[ $# -gt 0 ]]; do + case "$1" in + --from) FROM_PHASE="$2"; shift 2 ;; + --skip-test) SKIP_TEST=true; shift ;; + --clean) CLEAN=true; shift ;; + -h|--help) + echo "Usage: $0 [--from N] [--skip-test] [--clean]" + echo "" + echo "Phases:" + echo " 1 Init + start local chain (01-chain.sh)" + echo " 2 Configure Hyperlane bridge (02-hyperlane.sh)" + echo " 3 Deploy HypERC20 + enrollment (03-evm-deploy.sh)" + echo " 4 ISM upgrade + validators/relayer (04-agents.sh)" + echo " 5 Transfer tests (05-test.sh)" + echo " 6 Fantoken warp route (06-fantoken-route.sh)" + echo " 7 Fantoken transfer tests (07-fantoken-test.sh)" + echo "" + echo "Environment (Phase 6/7):" + echo " FT_SYMBOL Fantoken symbol (default: clay)" + echo " FT_NAME Fantoken name (default: Clay Token)" + exit 0 ;; + *) echo "Unknown flag: $1"; exit 1 ;; + esac +done + +run_phase() { + local num="$1" script="$2" + shift 2 + if [[ "$FROM_PHASE" -le "$num" ]]; then + echo "" + echo "================================================================" + echo " Phase $num: $script" + echo "================================================================" + echo "" + bash "$SCRIPT_DIR/$script" "$@" + fi +} + +CLEAN_FLAG="" +[[ "$CLEAN" == "true" ]] && CLEAN_FLAG="--clean" + +run_phase 1 "01-chain.sh" $CLEAN_FLAG +run_phase 2 "02-hyperlane.sh" +run_phase 3 "03-evm-deploy.sh" $CLEAN_FLAG +run_phase 4 "04-agents.sh" $CLEAN_FLAG + +if [[ "$SKIP_TEST" != "true" ]]; then + run_phase 5 "05-test.sh" +fi + +FT_SYMBOL="${FT_SYMBOL:-clay}" +FT_NAME="${FT_NAME:-Clay Token}" + +run_phase 6 "06-fantoken-route.sh" --symbol "$FT_SYMBOL" --name "$FT_NAME" $CLEAN_FLAG + +if [[ "$SKIP_TEST" != "true" ]]; then + run_phase 7 "07-fantoken-test.sh" --symbol "$FT_SYMBOL" +fi + +echo "" +echo "All phases complete!" diff --git a/scripts/hyperlane/status.sh b/scripts/hyperlane/status.sh new file mode 100755 index 00000000..f2b1b248 --- /dev/null +++ b/scripts/hyperlane/status.sh @@ -0,0 +1,441 @@ +#!/usr/bin/env bash +# ============================================================================= +# status.sh — Dashboard for Hyperlane agent sync status +# +# Shows: container health, validator checkpoints, relayer block indexing, +# message processing, and warp token state. +# +# Usage: +# bash status.sh # One-shot status +# bash status.sh --watch # Refresh every 10s +# bash status.sh --watch 5 # Refresh every 5s +# bash status.sh --logs # Show recent relayer logs +# bash status.sh --logs 50 # Show last 50 lines +# ============================================================================= + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" + +# ─── Docker Status ─────────────────────────────────────────────────────────── + +print_containers() { + echo -e "${BOLD}Docker Containers${NC}" + echo -e " NAME STATUS UPTIME HEALTH" + echo -e " ─────────────────────────────────── ────────── ─────────────── ──────" + + for name in hyperlane-validator-bitsong hyperlane-validator-basesepolia hyperlane-relayer; do + local info + info=$(docker inspect "$name" --format '{{.State.Status}}|{{.State.StartedAt}}|{{if .State.Health}}{{.State.Health.Status}}{{else}}n/a{{end}}' 2>/dev/null) || info="" + if [[ -z "$info" ]]; then + echo -e " ${name}$(printf '%*s' $((35 - ${#name})) '') ${RED}absent${NC} - -" + else + local status started health + IFS='|' read -r status started health <<< "$info" + local uptime="-" + if [[ "$status" == "running" && -n "$started" ]]; then + local start_epoch now_epoch + start_epoch=$(date -d "$started" +%s 2>/dev/null) || start_epoch=0 + now_epoch=$(date +%s) + local diff=$(( now_epoch - start_epoch )) + if [[ $diff -lt 60 ]]; then uptime="${diff}s" + elif [[ $diff -lt 3600 ]]; then uptime="$(( diff / 60 ))m$(( diff % 60 ))s" + else uptime="$(( diff / 3600 ))h$(( (diff % 3600) / 60 ))m" + fi + fi + local color="$GREEN" + [[ "$status" != "running" ]] && color="$RED" + echo -e " ${name}$(printf '%*s' $((35 - ${#name})) '') ${color}${status}${NC}$(printf '%*s' $((10 - ${#status})) '') ${uptime}$(printf '%*s' $((15 - ${#uptime})) '') ${health:-n/a}" + fi + done + echo +} + +# ─── Chain Heights ─────────────────────────────────────────────────────────── + +print_chain_heights() { + echo -e "${BOLD}Chain Heights${NC}" + + local bitsong_height="-" + if "$BINARY" status --node "$NODE" --home "$BITSONG_HOME" >/dev/null 2>&1; then + bitsong_height=$("$BINARY" status --node "$NODE" --home "$BITSONG_HOME" 2>/dev/null \ + | jq -r '.sync_info.latest_block_height // "?"' 2>/dev/null) || bitsong_height="?" + fi + echo -e " BitSong (local): $bitsong_height" + + if command -v cast >/dev/null 2>&1; then + local basesep_height + basesep_height=$(cast block-number --rpc-url "$EVM_RPC" 2>/dev/null) || basesep_height="?" + echo -e " Base Sepolia: $basesep_height" + fi + echo +} + +# ─── Validator Checkpoints ─────────────────────────────────────────────────── + +print_checkpoints() { + echo -e "${BOLD}Validator Checkpoints${NC}" + + for chain in bitsong basesepolia; do + local cp_dir="$BITSONG_HOME/checkpoints-${chain}" + if [[ ! -d "$cp_dir" ]]; then + echo -e " $chain: ${YELLOW}no checkpoint dir${NC}" + continue + fi + + local latest_idx="-" + local checkpoint_file="$cp_dir/index.json" + if [[ -f "$checkpoint_file" ]]; then + # index.json contains either a plain number or JSON with .latest_index/.index + local raw + raw=$(cat "$checkpoint_file" 2>/dev/null) || raw="" + if [[ "$raw" =~ ^[0-9]+$ ]]; then + latest_idx="$raw" + else + latest_idx=$(echo "$raw" | jq -r '.latest_index // .index // "?"' 2>/dev/null) || latest_idx="?" + fi + fi + + local sig_count + sig_count=$(find "$cp_dir" -name "*.json" -not -name "checkpoint_*" -not -name "announcement*" 2>/dev/null | wc -l) || sig_count=0 + + echo -e " $chain: latest_index=$latest_idx signatures=$sig_count" + done + echo +} + +# ─── Relayer Sync Progress ────────────────────────────────────────────────── + +print_relayer_sync() { + echo -e "${BOLD}Relayer Sync Progress${NC}" + + if ! docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^hyperlane-relayer$"; then + echo -e " ${YELLOW}Relayer not running${NC}" + echo + return + fi + + # Strip ANSI helper — Rust tracing embeds color codes around field names + local strip_ansi='s/\x1b\[[0-9;]*m//g' + + # Per-chain block indexing — single docker call, then split locally. + # Use --since 5m (not --tail) because basesepolia tx_id lookups are extremely + # verbose (thousands of lines between each ~30s cursor entry). + # + # Two cursor types exist: + # RateLimitedContractSyncCursor — has tip/next_block/start_block (gas_payments) + # ForwardBackwardSequenceAwareSyncCursor — has at_block/sequence (dispatched_messages) + # We prefer RateLimited (more useful block progress data), fall back to any. + local all_sync_logs + all_sync_logs=$(docker logs hyperlane-relayer --since 5m 2>&1 \ + | sed "$strip_ansi" \ + | grep "HyperlaneDomain(") || all_sync_logs="" + + for chain in bitsong basesepolia; do + # Prefer RateLimited cursor (has tip/next_block — best for block progress) + local chain_log + chain_log=$(echo "$all_sync_logs" \ + | grep "HyperlaneDomain(${chain}" \ + | grep "RateLimitedContractSyncCursor" \ + | tail -1) || true + # Fallback: any cursor type + if [[ -z "$chain_log" ]]; then + chain_log=$(echo "$all_sync_logs" \ + | grep "HyperlaneDomain(${chain}" \ + | tail -1) || true + fi + + if [[ -n "$chain_log" ]]; then + local sync_status + sync_status=$(echo "$chain_log" | grep -oP 'estimated_time_to_sync: "\K[^"]+') || sync_status="" + + # Try RateLimited fields: tip, next_block, start_block, chunk_size + local tip next_block start_block chunk_size + tip=$(echo "$chain_log" | grep -oP 'tip: \K[0-9]+' | head -1) || tip="" + next_block=$(echo "$chain_log" | grep -oP 'next_block: \K[0-9]+' | head -1) || next_block="" + start_block=$(echo "$chain_log" | grep -oP 'start_block: \K[0-9]+' | head -1) || start_block="" + chunk_size=$(echo "$chain_log" | grep -oP 'chunk_size: \K[0-9]+' | head -1) || chunk_size="" + + # Fallback for ForwardBackward cursor: use at_block from last_indexed_snapshot + if [[ -z "$tip" ]]; then + tip=$(echo "$chain_log" | grep -oP 'at_block: \K[0-9]+' | tail -1) || tip="" + # Use range field: "range: A..=B" + next_block=$(echo "$chain_log" | grep -oP 'range: \K[0-9]+') || next_block="" + fi + + if [[ -n "$tip" ]]; then + # Calculate progress percentage + local pct="-" + if [[ -n "$start_block" && -n "$next_block" ]]; then + local scanned=$(( next_block - start_block )) + local total=$(( tip - start_block + 1 )) + if [[ "$total" -gt 0 ]]; then + pct=$(( scanned * 100 / total )) + fi + fi + + if [[ "$sync_status" == "synced" ]]; then + echo -e " $chain: block ${tip} ${GREEN}synced${NC}" + else + # Not synced — show block progress, percentage, chunk size, ETA + local status_text="" + if [[ -n "$sync_status" ]]; then + status_text="ETA: $sync_status" + else + status_text="scanning" + fi + + local progress_detail="${next_block:-?}/${tip}" + if [[ "$pct" != "-" ]]; then + progress_detail="${progress_detail} (${pct}%)" + fi + echo -e " $chain: ${progress_detail} chunk=${chunk_size:-?} ${YELLOW}${status_text}${NC}" + fi + else + echo -e " $chain: ${YELLOW}syncing...${NC}" + fi + else + echo -e " $chain: ${YELLOW}no progress data yet${NC}" + fi + done + echo + + # Grab recent logs for stats (submitted/finalized/errors) + local stats_logs + stats_logs=$(docker logs hyperlane-relayer --since 10m 2>&1 \ + | sed "$strip_ansi") || stats_logs="" + + # Pending tx_id lookups (basesepolia generates many — shows indexer backlog) + local pending_ids + pending_ids=$(echo "$stats_logs" | grep -oP 'pending_ids: \K[0-9]+' | tail -1) || true + if [[ -n "$pending_ids" && "$pending_ids" != "0" ]]; then + echo -e " Pending tx_id lookups: $pending_ids" + fi + + # Finality pool size + local pool_size + pool_size=$(echo "$stats_logs" | grep -oP 'pool_size: \K[0-9]+' | tail -1) || true + if [[ -n "$pool_size" ]]; then + echo -e " Finality pool: $pool_size txs" + fi + + # Relay stats — match actual v2 log patterns + # Transaction lifecycle: submitting → PendingInclusion → Mempool → Included → Finalized + # "Message successfully processed" = confirmed delivery + local submitted_count finalized_count processed_count error_count real_errors + submitted_count=$(echo "$stats_logs" | grep -ci "submitting transaction" 2>/dev/null) || submitted_count=0 + finalized_count=$(echo "$stats_logs" | grep -ci "new_status: Finalized" 2>/dev/null) || finalized_count=0 + processed_count=$(echo "$stats_logs" | grep -ci "Message successfully processed" 2>/dev/null) || processed_count=0 + error_count=$(echo "$stats_logs" | grep -ci "error\|failed" 2>/dev/null) || error_count=0 + real_errors=$(echo "$stats_logs" | grep -i "error\|failed" | grep -cv "0xa2827cb39\|CCIP\|verification" 2>/dev/null) || real_errors=0 + + echo -e " Messages: ${GREEN}${processed_count} delivered${NC} ${submitted_count} submitted ${finalized_count} finalized" + if [[ "$real_errors" -gt 0 ]]; then + echo -e " Errors: ${RED}${real_errors} real${NC} (${error_count} total incl. CCIP noise)" + else + echo -e " Errors: 0 (${error_count} total incl. CCIP noise)" + fi + + # Show latest relay transaction status (most useful when waiting for a transfer) + local last_tx_status + last_tx_status=$(echo "$stats_logs" \ + | grep -oP 'Updating tx status.*?new_status: \K\w+' \ + | tail -1) || true + if [[ -n "$last_tx_status" ]]; then + local last_tx_fn + last_tx_fn=$(echo "$stats_logs" \ + | grep "Updating tx status" \ + | tail -1 \ + | grep -oP 'function\.name: "\K[^"]+') || last_tx_fn="" + local last_tx_to + last_tx_to=$(echo "$stats_logs" \ + | grep "Updating tx status" \ + | tail -1 \ + | grep -oP 'tx\.to: Some\(\K0x[0-9a-fA-F]+') || last_tx_to="" + local tx_color="$YELLOW" + [[ "$last_tx_status" == "Finalized" ]] && tx_color="$GREEN" + echo -e " Last tx: ${tx_color}${last_tx_status}${NC} ${last_tx_fn:+fn=$last_tx_fn} ${last_tx_to:+to=${last_tx_to:0:14}...}" + fi + echo +} + +# ─── Warp Token State ─────────────────────────────────────────────────────── + +print_warp_state() { + echo -e "${BOLD}Warp Token State${NC}" + + local evm_hyp_erc20 token_id + evm_hyp_erc20=$(load_state "evm_hyp_erc20") + token_id=$(load_state "token_id") + + if [[ -n "$evm_hyp_erc20" ]] && command -v cast >/dev/null 2>&1; then + local supply ism + supply=$(cast call "$evm_hyp_erc20" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null) || supply="?" + ism=$(cast call "$evm_hyp_erc20" "interchainSecurityModule()(address)" --rpc-url "$EVM_RPC" 2>/dev/null) || ism="?" + echo -e " EVM HypERC20: $evm_hyp_erc20" + echo -e " EVM totalSupply: $supply" + echo -e " EVM ISM: $ism" + else + echo -e " EVM HypERC20: ${YELLOW}not deployed${NC}" + fi + + if [[ -n "$token_id" ]] && "$BINARY" status --node "$NODE" --home "$BITSONG_HOME" >/dev/null 2>&1; then + echo -e " Cosmos token: $token_id" + fi + echo + + # Fantoken warp routes (iterate over ft_route_list) + local route_list + route_list=$(load_state "ft_route_list") + if [[ -n "$route_list" ]]; then + echo -e " ${BOLD}Fantoken Warp Routes${NC}" + IFS=',' read -ra routes <<< "$route_list" + for sym in "${routes[@]}"; do + [[ -z "$sym" ]] && continue + local ft_evm ft_tid ft_denom_val + ft_evm=$(load_state "ft_${sym}_evm_hyp_erc20") + ft_tid=$(load_state "ft_${sym}_token_id") + ft_denom_val=$(load_state "ft_${sym}_denom") + + echo -e " ── ${BOLD}${sym}${NC} ──" + echo -e " denom: ${ft_denom_val:-?}" + + if [[ -n "$ft_evm" ]] && command -v cast >/dev/null 2>&1; then + local ft_supply ft_symbol ft_ism + ft_supply=$(cast call "$ft_evm" "totalSupply()(uint256)" --rpc-url "$EVM_RPC" 2>/dev/null) || ft_supply="?" + ft_symbol=$(cast call "$ft_evm" "symbol()(string)" --rpc-url "$EVM_RPC" 2>/dev/null) || ft_symbol="?" + ft_ism=$(cast call "$ft_evm" "interchainSecurityModule()(address)" --rpc-url "$EVM_RPC" 2>/dev/null) || ft_ism="?" + echo -e " HypERC20: $ft_evm ($ft_symbol)" + echo -e " totalSupply: $ft_supply" + echo -e " ISM: $ft_ism" + else + echo -e " HypERC20: ${YELLOW}not deployed${NC}" + fi + + if [[ -n "$ft_tid" ]]; then + echo -e " Cosmos token: $ft_tid" + fi + done + echo + fi +} + +# ─── Test Results ──────────────────────────────────────────────────────────── + +print_test_results() { + echo -e "${BOLD}Transfer Tests${NC}" + local c2e e2c + c2e=$(load_state "cosmos_to_evm_test_passed") + e2c=$(load_state "evm_to_cosmos_test_passed") + if [[ -n "$c2e" ]]; then + echo -e " Cosmos -> EVM (ubtsg): ${GREEN}$c2e${NC}" + else + echo -e " Cosmos -> EVM (ubtsg): ${YELLOW}not run${NC}" + fi + if [[ -n "$e2c" ]]; then + echo -e " EVM -> Cosmos (ubtsg): ${GREEN}$e2c${NC}" + else + echo -e " EVM -> Cosmos (ubtsg): ${YELLOW}not run${NC}" + fi + + # Per-symbol fantoken test results + local route_list + route_list=$(load_state "ft_route_list") + if [[ -n "$route_list" ]]; then + IFS=',' read -ra routes <<< "$route_list" + for sym in "${routes[@]}"; do + [[ -z "$sym" ]] && continue + local ft_c2e ft_e2c + ft_c2e=$(load_state "ft_${sym}_cosmos_to_evm_test_passed") + ft_e2c=$(load_state "ft_${sym}_evm_to_cosmos_test_passed") + if [[ -n "$ft_c2e" ]]; then + echo -e " Cosmos->EVM ($sym): ${GREEN}$ft_c2e${NC}" + else + echo -e " Cosmos->EVM ($sym): ${YELLOW}not run${NC}" + fi + if [[ -n "$ft_e2c" ]]; then + echo -e " EVM->Cosmos ($sym): ${GREEN}$ft_e2c${NC}" + else + echo -e " EVM->Cosmos ($sym): ${YELLOW}not run${NC}" + fi + done + fi + echo +} + +# ─── Show Logs ─────────────────────────────────────────────────────────────── + +show_logs() { + local lines="${1:-30}" + log_step "Relayer Logs (last $lines lines)" + + if ! docker ps --format '{{.Names}}' 2>/dev/null | grep -q "^hyperlane-relayer$"; then + log_warn "Relayer not running" + return + fi + + docker logs hyperlane-relayer --tail "$lines" 2>&1 \ + | grep -v "0xa2827cb39\|CCIP Read" || true +} + +# ─── Full Dashboard ───────────────────────────────────────────────────────── + +print_dashboard() { + clear 2>/dev/null || true + echo -e "${BOLD}${CYAN}═══════════════════════════════════════════════${NC}" + echo -e "${BOLD}${CYAN} Hyperlane Status — $(date '+%H:%M:%S')${NC}" + echo -e "${BOLD}${CYAN}═══════════════════════════════════════════════${NC}" + echo + + print_containers + print_chain_heights + print_checkpoints + print_relayer_sync + print_warp_state + print_test_results +} + +# ─── Main ──────────────────────────────────────────────────────────────────── + +WATCH=false +WATCH_INTERVAL=10 +SHOW_LOGS=false +LOG_LINES=30 + +while [[ $# -gt 0 ]]; do + case "$1" in + --watch) + WATCH=true + if [[ -n "${2:-}" && "$2" =~ ^[0-9]+$ ]]; then + WATCH_INTERVAL="$2"; shift + fi + shift ;; + --logs) + SHOW_LOGS=true + if [[ -n "${2:-}" && "$2" =~ ^[0-9]+$ ]]; then + LOG_LINES="$2"; shift + fi + shift ;; + -h|--help) + echo "Usage: $0 [--watch [interval]] [--logs [lines]]" + echo "" + echo " --watch [N] Refresh every N seconds (default: 10)" + echo " --logs [N] Show last N lines of relayer logs (default: 30)" + exit 0 ;; + *) echo "Unknown flag: $1"; exit 1 ;; + esac +done + +if [[ "$SHOW_LOGS" == "true" ]]; then + show_logs "$LOG_LINES" + exit 0 +fi + +if [[ "$WATCH" == "true" ]]; then + trap 'echo; echo "Stopped."; exit 0' INT + while true; do + print_dashboard + echo -e "${CYAN}Refreshing in ${WATCH_INTERVAL}s... (Ctrl+C to stop)${NC}" + sleep "$WATCH_INTERVAL" + done +else + print_dashboard +fi diff --git a/scripts/hyperlane/stop.sh b/scripts/hyperlane/stop.sh new file mode 100755 index 00000000..b6c5f2ab --- /dev/null +++ b/scripts/hyperlane/stop.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# ============================================================================= +# stop.sh — Stop BitSong chain and/or Hyperlane Docker agents +# +# Usage: +# bash stop.sh # Stop everything +# bash stop.sh --chain-only # Stop chain only +# bash stop.sh --agents-only # Stop Docker agents only +# bash stop.sh --clean # Stop everything + wipe all data +# ============================================================================= + +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh" + +CLEAN=false +CHAIN_ONLY=false +AGENTS_ONLY=false + +while [[ $# -gt 0 ]]; do + case "$1" in + --clean) CLEAN=true; shift ;; + --chain-only) CHAIN_ONLY=true; shift ;; + --agents-only) AGENTS_ONLY=true; shift ;; + -h|--help) + echo "Usage: $0 [--clean] [--chain-only] [--agents-only]" + exit 0 ;; + *) echo "Unknown flag: $1"; exit 1 ;; + esac +done + +# ─── Stop Docker Agents ────────────────────────────────────────────────────── + +if [[ "$CHAIN_ONLY" == "false" ]]; then + log "Stopping Hyperlane Docker agents..." + for name in hyperlane-validator-bitsong hyperlane-validator-basesepolia hyperlane-relayer; do + if docker ps -a --format '{{.Names}}' 2>/dev/null | grep -q "^${name}$"; then + docker stop "$name" 2>/dev/null || true + docker rm -f "$name" 2>/dev/null || true + log_ok "Stopped $name" + fi + done +fi + +# ─── Stop Chain ────────────────────────────────────────────────────────────── + +if [[ "$AGENTS_ONLY" == "false" ]]; then + local_pid_file="$BITSONG_HOME/chain.pid" + if [[ -f "$local_pid_file" ]]; then + PID=$(cat "$local_pid_file") + if kill -0 "$PID" 2>/dev/null; then + log "Stopping chain (PID=$PID)..." + kill "$PID" 2>/dev/null || true + for _ in $(seq 1 20); do + kill -0 "$PID" 2>/dev/null || break + sleep 0.5 + done + if kill -0 "$PID" 2>/dev/null; then + log_warn "Force killing chain..." + kill -9 "$PID" 2>/dev/null || true + fi + log_ok "Chain stopped" + else + log "Chain not running (stale PID=$PID)" + fi + rm -f "$local_pid_file" + else + log "No chain PID file found" + fi +fi + +# ─── Clean ─────────────────────────────────────────────────────────────────── + +if [[ "$CLEAN" == "true" ]]; then + log "Removing all data at $BITSONG_HOME..." + rm -rf "$BITSONG_HOME" + log_ok "Clean complete" +fi diff --git a/tests/ict/go.mod b/tests/ict/go.mod index ee26c6fe..705378a0 100644 --- a/tests/ict/go.mod +++ b/tests/ict/go.mod @@ -12,30 +12,30 @@ require ( cosmossdk.io/errors v1.0.2 cosmossdk.io/math v1.5.3 cosmossdk.io/x/upgrade v0.1.4 - github.com/CosmWasm/wasmd v0.53.3 + github.com/CosmWasm/wasmd v0.53.4 github.com/bitsongofficial/go-bitsong v0.0.0-00010101000000-000000000000 - github.com/cosmos/cosmos-sdk v0.53.0 + github.com/cosmos/cosmos-sdk v0.53.7 github.com/cosmos/ibc-go/v8 v8.7.0 github.com/docker/docker v24.0.9+incompatible github.com/strangelove-ventures/interchaintest/v8 v8.4.0 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 go.uber.org/zap v1.27.0 ) require ( - cel.dev/expr v0.20.0 // indirect - cloud.google.com/go v0.118.2 // indirect - cloud.google.com/go/auth v0.14.1 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect - cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.4.0 // indirect - cloud.google.com/go/monitoring v1.23.0 // indirect + cel.dev/expr v0.24.0 // indirect + cloud.google.com/go v0.120.0 // indirect + cloud.google.com/go/auth v0.16.4 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.8.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect cloud.google.com/go/storage v1.50.0 // indirect cosmossdk.io/api v0.9.2 // indirect - cosmossdk.io/collections v1.2.0 // indirect + cosmossdk.io/collections v1.3.1 // indirect cosmossdk.io/core v0.11.3 // indirect - cosmossdk.io/depinject v1.2.0 // indirect - cosmossdk.io/log v1.5.1 // indirect + cosmossdk.io/depinject v1.2.1 // indirect + cosmossdk.io/log v1.6.1 // indirect cosmossdk.io/schema v1.1.0 // indirect cosmossdk.io/store v1.1.2 // indirect cosmossdk.io/x/evidence v0.1.1 // indirect @@ -53,9 +53,9 @@ require ( github.com/DataDog/zstd v1.5.7 // indirect github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/StirlingMarketingGroup/go-namecase v1.0.0 // indirect github.com/avast/retry-go/v4 v4.6.0 // indirect @@ -63,33 +63,34 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.2.0 // indirect - github.com/bits-and-blooms/bitset v1.22.0 // indirect - github.com/bytedance/sonic v1.13.2 // indirect - github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/bits-and-blooms/bitset v1.24.3 // indirect + github.com/bytedance/gopkg v0.1.3 // indirect + github.com/bytedance/sonic v1.14.2 // indirect + github.com/bytedance/sonic/loader v0.4.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect - github.com/cloudwego/base64x v0.1.5 // indirect - github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 // indirect - github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect + github.com/cockroachdb/errors v1.12.0 // indirect github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 // indirect github.com/cockroachdb/pebble v1.1.5 // indirect github.com/cockroachdb/redact v1.1.6 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/cometbft/cometbft v0.38.21 // indirect + github.com/cometbft/cometbft v0.38.23 // indirect github.com/cometbft/cometbft-db v0.14.1 // indirect github.com/cosmos/btcutil v1.0.5 // indirect - github.com/cosmos/cosmos-db v1.1.1 // indirect + github.com/cosmos/cosmos-db v1.1.3 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gogogateway v1.2.0 // indirect - github.com/cosmos/gogoproto v1.7.0 // indirect + github.com/cosmos/gogoproto v1.7.2 // indirect github.com/cosmos/iavl v1.2.2 // indirect github.com/cosmos/ibc-go/modules/capability v1.0.1 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect github.com/cosmos/interchain-security/v5 v5.2.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect + github.com/cosmos/ledger-cosmos-go v1.0.0 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set v1.8.0 // indirect @@ -113,14 +114,14 @@ require ( github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/getsentry/sentry-go v0.31.1 // indirect - github.com/go-jose/go-jose/v4 v4.0.4 // indirect + github.com/getsentry/sentry-go v0.35.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-kit/kit v0.13.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -133,8 +134,8 @@ require ( github.com/google/orderedcode v0.0.1 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.14.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.15.0 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.3 // indirect @@ -168,7 +169,7 @@ require ( github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lib/pq v1.10.9 // indirect + github.com/lib/pq v1.12.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-libp2p v0.39.1 // indirect github.com/linxGnu/grocksdb v1.9.8 // indirect @@ -176,7 +177,7 @@ require ( github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect - github.com/minio/highwayhash v1.0.3 // indirect + github.com/minio/highwayhash v1.0.4 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20240603204351-26b456ae3afe // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -200,30 +201,30 @@ require ( github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect - github.com/petermattis/goid v0.0.0-20250211185408-f2b9d978cd7a // indirect + github.com/petermattis/goid v0.0.0-20250813065127-a731cc31b4fe // indirect github.com/pierrec/xxHash v0.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/client_golang v1.23.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.65.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/rs/cors v1.11.1 // indirect github.com/rs/zerolog v1.34.0 // indirect - github.com/sagikazarmark/locafero v0.7.0 // indirect - github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect + github.com/sasha-s/go-deadlock v0.3.9 // indirect github.com/shamaton/msgpack/v2 v2.2.2 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.12.0 // indirect - github.com/spf13/cast v1.7.1 // indirect - github.com/spf13/cobra v1.9.1 // indirect - github.com/spf13/pflag v1.0.6 // indirect - github.com/spf13/viper v1.20.1 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/cobra v1.10.1 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/spf13/viper v1.21.0 // indirect github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect @@ -234,39 +235,42 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/ulikunitz/xz v0.5.12 // indirect github.com/zeebo/errs v1.4.0 // indirect + github.com/zondax/golem v0.27.0 // indirect github.com/zondax/hid v0.9.2 // indirect - github.com/zondax/ledger-go v1.0.0 // indirect + github.com/zondax/ledger-go v1.0.1 // indirect go.etcd.io/bbolt v1.4.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect - go.opentelemetry.io/otel v1.34.0 // indirect - go.opentelemetry.io/otel/metric v1.34.0 // indirect - go.opentelemetry.io/otel/sdk v1.34.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect - go.opentelemetry.io/otel/trace v1.34.0 // indirect - go.uber.org/mock v0.5.2 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/mock v0.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/arch v0.15.0 // indirect - golang.org/x/crypto v0.37.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/arch v0.17.0 // indirect + golang.org/x/crypto v0.41.0 // indirect golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect - golang.org/x/mod v0.24.0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/oauth2 v0.26.0 // indirect - golang.org/x/sync v0.13.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/term v0.31.0 // indirect - golang.org/x/text v0.24.0 // indirect - golang.org/x/time v0.10.0 // indirect - golang.org/x/tools v0.31.0 // indirect - google.golang.org/api v0.221.0 // indirect - google.golang.org/genproto v0.0.0-20250212204824-5a70512c5d8b // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f // indirect - google.golang.org/grpc v1.72.0 // indirect - google.golang.org/protobuf v1.36.6 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/net v0.43.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/tools v0.36.0 // indirect + google.golang.org/api v0.247.0 // indirect + google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -278,7 +282,7 @@ require ( modernc.org/sqlite v1.34.5 // indirect nhooyr.io/websocket v1.8.17 // indirect pgregory.net/rapid v1.2.0 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) exclude github.com/gogo/protobuf v1.3.3 diff --git a/tests/ict/go.sum b/tests/ict/go.sum index 071016be..8ae2ac33 100644 --- a/tests/ict/go.sum +++ b/tests/ict/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= -cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -38,8 +38,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.118.2 h1:bKXO7RXMFDkniAAvvuMrAPtQ/VHrs9e7J5UT3yrGdTY= -cloud.google.com/go v0.118.2/go.mod h1:CFO4UPEPi8oV21xoezZCrd3d81K4fFkDTEJu4R8K+9M= +cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= +cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -101,10 +101,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0= -cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= -cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= -cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= +cloud.google.com/go/auth v0.16.4 h1:fXOAIQmkApVvcIn7Pc2+5J8QTMVbUGLscnSVNl11su8= +cloud.google.com/go/auth v0.16.4/go.mod h1:j10ncYwjX/g3cdX7GpEzsdM+d+ZNsXAbb6qXA7p1Y5M= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= @@ -184,8 +184,8 @@ cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZ cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA= +cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= @@ -319,8 +319,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.4.0 h1:ZNfy/TYfn2uh/ukvhp783WhnbVluqf/tzOaqVUPlIPA= -cloud.google.com/go/iam v1.4.0/go.mod h1:gMBgqPaERlriaOV0CUl//XUzDhSfXevn4OEUbg6VRs4= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= @@ -355,8 +355,8 @@ cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhX cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.6.4 h1:3tyw9rO3E2XVXzSApn1gyEEnH2K9SynNQjMlBi3uHLg= -cloud.google.com/go/longrunning v0.6.4/go.mod h1:ttZpLCe6e7EXvn9OxpBRx7kZEB0efv8yBO6YnVMfhJs= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= @@ -380,8 +380,8 @@ cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhI cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.23.0 h1:M3nXww2gn9oZ/qWN2bZ35CjolnVHM3qnSbu6srCPgjk= -cloud.google.com/go/monitoring v1.23.0/go.mod h1:034NnlQPDzrQ64G2Gavhl0LUHZs9H3rRmhtnp7jiJgg= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= @@ -566,8 +566,8 @@ cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.11.3 h1:c+I4YFjxRQjvAhRmSsmjpASUKq88chOX854ied0K/pE= -cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= @@ -616,18 +616,18 @@ cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= cosmossdk.io/api v0.9.2 h1:9i9ptOBdmoIEVEVWLtYYHjxZonlF/aOVODLFaxpmNtg= cosmossdk.io/api v0.9.2/go.mod h1:CWt31nVohvoPMTlPv+mMNCtC0a7BqRdESjCsstHcTkU= -cosmossdk.io/client/v2 v2.0.0-beta.3 h1:+TTuH0DwQYsUq2JFAl3fDZzKq5gQG7nt3dAattkjFDU= -cosmossdk.io/client/v2 v2.0.0-beta.3/go.mod h1:CZcL41HpJPOOayTCO28j8weNBQprG+SRiKX39votypo= -cosmossdk.io/collections v1.2.0 h1:IesfVG8G/+FYCMVMP01frS/Cw99Omk5vBh3cHbO01Gg= -cosmossdk.io/collections v1.2.0/go.mod h1:4NkMoYw6qRA8fnSH/yn1D/MOutr8qyQnwsO50Mz9ItU= +cosmossdk.io/client/v2 v2.0.0-beta.8 h1:RXMJdA4V9H1H3/3BfMD6dAW3lF8W9DpNPPYnKD+ArxY= +cosmossdk.io/client/v2 v2.0.0-beta.8/go.mod h1:x+E2eji+ToMtUIqKzoJ5mJIhat+Zak47xZ8jOYjJQBA= +cosmossdk.io/collections v1.3.1 h1:09e+DUId2brWsNOQ4nrk+bprVmMUaDH9xvtZkeqIjVw= +cosmossdk.io/collections v1.3.1/go.mod h1:ynvkP0r5ruAjbmedE+vQ07MT6OtJ0ZIDKrtJHK7Q/4c= cosmossdk.io/core v0.11.3 h1:mei+MVDJOwIjIniaKelE3jPDqShCc/F4LkNNHh+4yfo= cosmossdk.io/core v0.11.3/go.mod h1:9rL4RE1uDt5AJ4Tg55sYyHWXA16VmpHgbe0PbJc6N2Y= -cosmossdk.io/depinject v1.2.0 h1:6NW/FSK1IkWTrX7XxUpBmX1QMBozpEI9SsWkKTBc5zw= -cosmossdk.io/depinject v1.2.0/go.mod h1:pvitjtUxZZZTQESKNS9KhGjWVslJZxtO9VooRJYyPjk= +cosmossdk.io/depinject v1.2.1 h1:eD6FxkIjlVaNZT+dXTQuwQTKZrFZ4UrfCq1RKgzyhMw= +cosmossdk.io/depinject v1.2.1/go.mod h1:lqQEycz0H2JXqvOgVwTsjEdMI0plswI7p6KX+MVqFOM= cosmossdk.io/errors v1.0.2 h1:wcYiJz08HThbWxd/L4jObeLaLySopyyuUFB5w4AGpCo= cosmossdk.io/errors v1.0.2/go.mod h1:0rjgiHkftRYPj//3DrD6y8hcm40HcPv/dR4R/4efr0k= -cosmossdk.io/log v1.5.1 h1:wLwiYXmfrort/O+j6EkjF+HvbdrRQd+4cYCPKFSm+zM= -cosmossdk.io/log v1.5.1/go.mod h1:5cXXBvfBkR2/BcXmosdCSLXllvgSjphrrDVdfVRmBGM= +cosmossdk.io/log v1.6.1 h1:YXNwAgbDwMEKwDlCdH8vPcoggma48MgZrTQXCfmMBeI= +cosmossdk.io/log v1.6.1/go.mod h1:gMwsWyyDBjpdG9u2avCFdysXqxq28WJapJvu+vF1y+E= cosmossdk.io/math v1.5.3 h1:WH6tu6Z3AUCeHbeOSHg2mt9rnoiUWVWaQ2t6Gkll96U= cosmossdk.io/math v1.5.3/go.mod h1:uqcZv7vexnhMFJF+6zh9EWdm/+Ylyln34IvPnBauPCQ= cosmossdk.io/schema v1.1.0 h1:mmpuz3dzouCoyjjcMcA/xHBEmMChN+EHh8EHxHRHhzE= @@ -665,8 +665,8 @@ github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRr github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420 h1:oknQF/iIhf5lVjbwjsVDzDByupRhga8nhA3NAmwyHDA= github.com/ComposableFi/go-subkey/v2 v2.0.0-tm03420/go.mod h1:KYkiMX5AbOlXXYfxkrYPrRPV6EbVUALTQh5ptUOJzu8= -github.com/CosmWasm/wasmd v0.53.3 h1:kZkkSM2hf0Le7iJPLLNm0QTi2j+wiuLMMn7SyOqBiYw= -github.com/CosmWasm/wasmd v0.53.3/go.mod h1:gP10E56tuToU5rsZR7vZLBL5ssW2mie6KN/WrQLG7/I= +github.com/CosmWasm/wasmd v0.53.4 h1:yZq7xuWMxY9q5niD0HxOSyYSfHvATXgV3KI1IqkALKg= +github.com/CosmWasm/wasmd v0.53.4/go.mod h1:zk6V7X9VPYAosyD6VMC+VaVsG33aTnmqDoIIFNkD31E= github.com/CosmWasm/wasmvm/v2 v2.1.6 h1:TBJovKsc2PdLngXJx9Cozo4SnxaC/z6SJLZrxw9wv+M= github.com/CosmWasm/wasmvm/v2 v2.1.6/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZbT4ztOl6bg= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -678,14 +678,14 @@ github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25Yn github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 h1:f2Qw/Ehhimh5uO1fayV0QIW7DShEQqhtUfhYc+cBPlw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0 h1:o90wcURuxekmXrtxmYWTyNla0+ZEHhud6DI1ZTxd1vI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0/go.mod h1:6fTWu4m3jocfUZLYF5KsZC1TUfRvEjs7lM4crme/irw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0 h1:jJKWl98inONJAr/IZrdFQUWcwUO95DLY1XMD1ZIut+g= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0/go.mod h1:l2fIqmwB+FKSfvn3bAD/0i+AXAxhIZjTK2svT/mgUXs= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 h1:GYUJLfvd++4DMuMhCFLgLXvFwofIxh/qOwoGuS/LTew= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0 h1:UQUsRi8WTzhZntp5313l+CHIAT95ojUI2lpP/ExlZa4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.29.0/go.mod h1:Cz6ft6Dkn3Et6l2v2a9/RpN7epQ1GtDlO6lj8bEcOvw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0 h1:5IT7xOdq17MtcdtL/vtl6mGfzhaq4m4vpollPRmlsBQ= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0 h1:nNMpRpnkWDAaqcpxMJvxa/Ud98gjbYwayJY4/9bdjiU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.50.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0 h1:ig/FpDD2JofP/NExKQUbn7uOSZzJAQqogfqluZK4ed4= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= @@ -695,8 +695,6 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/StirlingMarketingGroup/go-namecase v1.0.0 h1:2CzaNtCzc4iNHirR+5ru9OzGg8rQp860gqLBFqRI02Y= github.com/StirlingMarketingGroup/go-namecase v1.0.0/go.mod h1:ZsoSKcafcAzuBx+sndbxHu/RjDcDTrEdT4UvhniHfio= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= @@ -743,23 +741,24 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.2.0 h1:tgObeVOf8WAvtuAX6DhJ4xks4CFNwPDZiqzGqIHE51E= github.com/bgentry/speakeasy v0.2.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= -github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.24.3 h1:Bte86SlO3lwPQqww+7BE9ZuUCKIjfqnG5jtEyqA9y9Y= +github.com/bits-and-blooms/bitset v1.24.3/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcec/v2 v2.3.5 h1:dpAlnAwmT1yIBm3exhT1/8iUSD98RDJM5vqJVQDQLiU= +github.com/btcsuite/btcd/btcec/v2 v2.3.5/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ= github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= -github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= -github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= -github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= -github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= +github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/sonic v1.14.2 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE= +github.com/bytedance/sonic v1.14.2/go.mod h1:T80iDELeHiHKSc0C9tubFygiuXoGzrkjKzX2quAx980= +github.com/bytedance/sonic/loader v0.4.0 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2NYzevs+o= +github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -788,9 +787,8 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= -github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= -github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -806,15 +804,15 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk= -github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= -github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/errors v1.12.0 h1:d7oCs6vuIMUQRVbi6jWWWEJZahLCfJpnJSVobd1/sUo= +github.com/cockroachdb/errors v1.12.0/go.mod h1:SvzfYNNBshAVbZ8wzNc/UPK3w1vf0dKDUP41ucAIf7g= github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 h1:pU88SPhIFid6/k0egdR5V6eALQYq2qbSmukrkgIh/0A= github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20241215232642-bb51bb14a506 h1:ASDL+UJcILMqgNeV5jiqR4j+sTuvQNHdf2chuKj1M5k= @@ -826,8 +824,8 @@ github.com/cockroachdb/redact v1.1.6/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/cometbft/cometbft v0.38.21 h1:qcIJSH9LiwU5s6ZgKR5eRbsLNucbubfraDs5bzgjtOI= -github.com/cometbft/cometbft v0.38.21/go.mod h1:UCu8dlHqvkAsmAFmWDRWNZJPlu6ya2fTWZlDrWsivwo= +github.com/cometbft/cometbft v0.38.23 h1:jtCe5Do4EcHVf/FCyZMvkBm+AmsRGGyvswImXYAabdM= +github.com/cometbft/cometbft v0.38.23/go.mod h1:jtH//cs5e2U5dNiaYIPMBwWXZsedXJfIie77gVhuRaA= github.com/cometbft/cometbft-db v0.14.1 h1:SxoamPghqICBAIcGpleHbmoPqy+crij/++eZz3DlerQ= github.com/cometbft/cometbft-db v0.14.1/go.mod h1:KHP1YghilyGV/xjD5DP3+2hyigWx0WTp9X+0Gnx0RxQ= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= @@ -838,20 +836,20 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= -github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= +github.com/cosmos/cosmos-db v1.1.3 h1:7QNT77+vkefostcKkhrzDK9uoIEryzFrU9eoMeaQOPY= +github.com/cosmos/cosmos-db v1.1.3/go.mod h1:kN+wGsnwUJZYn8Sy5Q2O0vCYA99MJllkKASbs6Unb9U= github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= -github.com/cosmos/cosmos-sdk v0.53.0 h1:ZsB2tnBVudumV059oPuElcr0K1lLOutaI6WJ+osNTbI= -github.com/cosmos/cosmos-sdk v0.53.0/go.mod h1:UPcRyFwOUy2PfSFBWxBceO/HTjZOuBVqY583WyazIGs= +github.com/cosmos/cosmos-sdk v0.53.7 h1:CqY48EB118WuR2EcTobiFACOQbfP8Dyyb5C5nAOq3XM= +github.com/cosmos/cosmos-sdk v0.53.7/go.mod h1:N6YuprhAabInbT3YGumGDKONbvPX5dNro7RjHvkQoKE= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= -github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= +github.com/cosmos/gogoproto v1.7.2 h1:5G25McIraOC0mRFv9TVO139Uh3OklV2hczr13KKVHCA= +github.com/cosmos/gogoproto v1.7.2/go.mod h1:8S7w53P1Y1cHwND64o0BnArT6RmdgIvsBuco6uTllsk= github.com/cosmos/iavl v1.2.2 h1:qHhKW3I70w+04g5KdsdVSHRbFLgt3yY3qTMd4Xa4rC8= github.com/cosmos/iavl v1.2.2/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= @@ -862,8 +860,8 @@ github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5Rtn github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/interchain-security/v5 v5.2.0 h1:ZB4sMH5kG4Fmuk+WLKykXv8qSSoafo1eVlSo0G5scKE= github.com/cosmos/interchain-security/v5 v5.2.0/go.mod h1:vmeTcTxFCl1eV0o6xpl/IRT7Basz0szVVGzbppnInMg= -github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= -github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cosmos/ledger-cosmos-go v1.0.0 h1:jNKW89nPf0vR0EkjHG8Zz16h6p3zqwYEOxlHArwgYtw= +github.com/cosmos/ledger-cosmos-go v1.0.0/go.mod h1:mGaw2wDOf+Z6SfRJsMGxU9DIrBa4du0MAiPlpPhLAOE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -967,8 +965,8 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/getsentry/sentry-go v0.31.1 h1:ELVc0h7gwyhnXHDouXkhqTFSO5oslsRDk0++eyE0KJ4= -github.com/getsentry/sentry-go v0.31.1/go.mod h1:CYNcMMz73YigoHljQRG+qPF+eMq8gG72XcGN/p71BAY= +github.com/getsentry/sentry-go v0.35.0 h1:+FJNlnjJsZMG3g0/rmmP7GiKjQoUF5EXfEtBwtPtkzY= +github.com/getsentry/sentry-go v0.35.0/go.mod h1:C55omcY9ChRQIUcVcGcs+Zdy4ZpQGvNJ7JYHIoSWOtE= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= @@ -982,8 +980,8 @@ github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmn github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E= -github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -1000,8 +998,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= @@ -1015,8 +1013,8 @@ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GO github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= @@ -1151,8 +1149,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -1164,8 +1162,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= -github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= +github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -1308,7 +1306,6 @@ github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYW github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -1325,8 +1322,8 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= -github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.12.0 h1:mC1zeiNamwKBecjHarAr26c/+d8V5w/u4J0I/yASbJo= +github.com/lib/pq v1.12.0/go.mod h1:/p+8NSbOcwzAEI7wiMXFlgydTwcgTr3OSKMsD2BitpA= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-libp2p v0.39.1 h1:1Ur6rPCf3GR+g8jkrnaQaM0ha2IGespsnNlCqJLLALE= @@ -1367,8 +1364,8 @@ github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b h1:QrHweqAtyJ9EwCaG github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b/go.mod h1:xxLb2ip6sSUts3g1irPVHyk/DGslwQsNOo9I7smJfNU= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= -github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/minio/highwayhash v1.0.4 h1:asJizugGgchQod2ja9NJlGOWq4s7KsAWr5XUc9Clgl4= +github.com/minio/highwayhash v1.0.4/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20240603204351-26b456ae3afe h1:0fcCSfvBgbagEsEMkZuxgA3Ex7IN9i1Hon0fwgMLpQw= @@ -1480,9 +1477,8 @@ github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/petermattis/goid v0.0.0-20250211185408-f2b9d978cd7a h1:ckxP/kGzsxvxXo8jO6E/0QJ8MMmwI7IRj4Fys9QbAZA= -github.com/petermattis/goid v0.0.0-20250211185408-f2b9d978cd7a/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/petermattis/goid v0.0.0-20250813065127-a731cc31b4fe h1:vHpqOnPlnkba8iSxU4j/CvDSS9J4+F4473esQsYLGoE= +github.com/petermattis/goid v0.0.0-20250813065127-a731cc31b4fe/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= @@ -1514,8 +1510,8 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1523,8 +1519,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= @@ -1532,8 +1528,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= -github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1541,8 +1537,8 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -1567,16 +1563,16 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= -github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= -github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sasha-s/go-deadlock v0.3.9 h1:fiaT9rB7g5sr5ddNZvlwheclN9IP86eFW9WgqlEQV+w= +github.com/sasha-s/go-deadlock v0.3.9/go.mod h1:KuZj51ZFmx42q/mPaYbRk0P1xcwe697zsJKE03vD4/Y= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shamaton/msgpack/v2 v2.2.2 h1:GOIg0c9LV04VwzOOqZSrmsv/JzjNOOMxnS/HvOHGdgs= github.com/shamaton/msgpack/v2 v2.2.2/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -1588,27 +1584,28 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= -github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= -github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/strangelove-ventures/interchaintest/v8 v8.4.0 h1:UHLmJfmkFXuJHfSE8qmOuEy4FWZWuRw4G6XZHm9hC6w= @@ -1634,8 +1631,10 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= @@ -1644,10 +1643,10 @@ github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2l github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -1671,14 +1670,18 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zondax/golem v0.27.0 h1:IbBjGIXF3SoGOZHsILJvIM/F/ylwJzMcHAcggiqniPw= +github.com/zondax/golem v0.27.0/go.mod h1:AmorCgJPt00L8xN1VrMBe13PSifoZksnQ1Ge906bu4A= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v1.0.0 h1:BvNoksIyRqyQTW78rIZP9A44WwAminKiomQa7jXp9EI= -github.com/zondax/ledger-go v1.0.0/go.mod h1:HpgkgFh3Jkwi9iYLDATdyRxc8CxqxcywsFj6QerWzvo= +github.com/zondax/ledger-go v1.0.1 h1:Ks/2tz/dOF+dbRynfZ0dEhcdL1lqw43Sa0zMXHpQ3aQ= +github.com/zondax/ledger-go v1.0.1/go.mod h1:j7IgMY39f30apthJYMd1YsHZRqdyu4KbVmUp0nU78X0= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= @@ -1696,24 +1699,24 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= -go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= -go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= -go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= -go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= -go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= @@ -1724,8 +1727,8 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= -go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1737,8 +1740,12 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= -golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.17.0 h1:4O3dfLzd+lQewptAHqjewQZQDyEdejz3VwgeYwkZneU= +golang.org/x/arch v0.17.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1758,8 +1765,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1823,8 +1830,8 @@ golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= -golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1899,8 +1906,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1930,8 +1937,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= -golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1952,8 +1959,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2063,8 +2070,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2079,8 +2086,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2101,8 +2108,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2110,8 +2117,8 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= -golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2186,8 +2193,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= -golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2200,6 +2207,8 @@ gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJ gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= @@ -2262,8 +2271,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.221.0 h1:qzaJfLhDsbMeFee8zBRdt/Nc+xmOuafD/dbdgGfutOU= -google.golang.org/api v0.221.0/go.mod h1:7sOU2+TL4TxUTdbi0gWgAIg7tH5qBXxoyhtL+9x3biQ= +google.golang.org/api v0.247.0 h1:tSd/e0QrUlLsrwMKmkbQhYVa109qIintOls2Wh6bngc= +google.golang.org/api v0.247.0/go.mod h1:r1qZOPmxXffXg6xS5uhx16Fa/UFY8QU/K4bfKrnvovM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2409,12 +2418,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20250212204824-5a70512c5d8b h1:TdBaFxGAABTI8sz9jYHPtjje677pS4XXup9vJMlj8hQ= -google.golang.org/genproto v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:0TrvLFkilZy+XULmuoWfiTbTRXLWXJ1S44jQTW3lWwE= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM= -google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f h1:N/PrbTw4kdkqNRzVfWPrBekzLuarFREcbFOiOLkXon4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c h1:qXWI/sQtv5UKboZ/zUk7h+mrf/lXORyI+n9DKDAusdg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -2462,8 +2471,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= -google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2483,8 +2492,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2593,7 +2602,6 @@ modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= -nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= @@ -2601,6 +2609,6 @@ rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=