diff --git a/.env b/.env index c7443c899d..cc1da9fc55 100644 --- a/.env +++ b/.env @@ -31,4 +31,4 @@ EXPO_PUBLIC_PUBLIC_TENOR_KEY=AIzaSyA8TpVfoyoBaDdLww6wJ1Xe0OVN-Hi8qPE #map token EXPO_PUBLIC_LEAFLET_MAP_TOKEN=QkwJFLzzxPan25YCgnDExGpMFPxA3x4lnyKiUf8zmaqXLP5XyOR8n3yEM8jlKV3W -# MULTISIG_BACKEND_URL=http://localhost:9091 # you can use this for local testing +# EXPO_PUBLIC_MULTISIG_BACKEND_URL=http://localhost:9091 # you can use this for local testing diff --git a/.yarn/patches/@bufbuild-protobuf-npm-2.7.0-79729124a9.patch b/.yarn/patches/@bufbuild-protobuf-npm-2.7.0-79729124a9.patch new file mode 100644 index 0000000000..c44fecf483 --- /dev/null +++ b/.yarn/patches/@bufbuild-protobuf-npm-2.7.0-79729124a9.patch @@ -0,0 +1,8 @@ +diff --git a/wire/index.js b/wire/index.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f3675c96d787204d17fde2d55bd2505932aa33d6 +--- /dev/null ++++ b/wire/index.js +@@ -0,0 +1 @@ ++export * from "../dist/cjs/wire/index.js"; +\ No newline at end of file diff --git a/api/multisig/v1/multisig.proto b/api/multisig/v1/multisig.proto index 4042e91eec..603f6307fb 100644 --- a/api/multisig/v1/multisig.proto +++ b/api/multisig/v1/multisig.proto @@ -35,6 +35,7 @@ message Multisig { string pubkey_json = 7; repeated string users_addresses = 8; uint32 threshold = 9; + string chain_type = 10; } message Signature { @@ -59,6 +60,7 @@ message Transaction { repeated Signature signatures = 13; string multisig_pubkey_json = 14; uint32 id = 15; + string chain_type = 16; } // we use string here because browser storage poorly supports bytes @@ -87,6 +89,7 @@ message MultisigsRequest { string start_after = 3; string chain_id = 4; JoinState join_state = 5; + string chain_type = 6; } message MultisigsResponse { @@ -97,6 +100,7 @@ message MultisigInfoRequest { Token auth_token = 1; string multisig_address = 2; string chain_id = 3; + string chain_type = 4; } message MultisigInfoResponse { @@ -117,6 +121,7 @@ message TransactionsRequest { string chain_id = 5; repeated string types = 6; ExecutionState execution_state = 7; + string chain_type = 8; } message TransactionsResponse { @@ -129,6 +134,7 @@ message CreateOrJoinMultisigRequest { Token auth_token = 3; string name = 4; string bech32_prefix = 5; + string chain_type = 6; } message CreateOrJoinMultisigResponse { @@ -141,6 +147,7 @@ message LeaveMultisigRequest { string multisig_address = 1; Token auth_token = 2; string chain_id = 3; + string chain_type = 4; } message LeaveMultisigResponse { @@ -155,6 +162,7 @@ message CreateTransactionRequest { repeated google.protobuf.Any msgs = 6; string fee_json = 7; string chain_id = 8; + string chain_type = 9; } message CreateTransactionResponse { @@ -187,6 +195,7 @@ message ClearSignaturesRequest { string multisig_chain_id = 2; string multisig_address = 3; uint32 sequence = 4; + string chain_type = 5; } message ClearSignaturesResponse { @@ -221,6 +230,7 @@ message TransactionsCountsRequest { Token auth_token = 1; string multisig_address = 2; // if unspecified, return transactions for all multisigs of this user string chain_id = 3; + string chain_type = 4; } message TransactionsCount { diff --git a/go.mod b/go.mod index 29c74a0ac7..d0514d110c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/TERITORI/teritori-dapp -go 1.18 +go 1.23.0 + +toolchain go1.24.0 require ( cosmossdk.io/math v1.2.0 @@ -15,16 +17,16 @@ require ( github.com/dgraph-io/ristretto v0.1.1 github.com/ethereum/go-ethereum v1.11.6 github.com/friendsofgo/errors v0.9.2 + github.com/gnolang/gno v0.0.0-20250903104743-a56a225e7cee github.com/go-co-op/gocron v1.18.0 - github.com/gorilla/websocket v1.5.0 + github.com/gorilla/websocket v1.5.3 github.com/improbable-eng/grpc-web v0.15.0 github.com/jackc/pgx/v5 v5.3.0 github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.7 github.com/mehanizm/airtable v0.2.8 - github.com/miguelmota/go-ethereum-hdwallet v0.1.2 github.com/mitchellh/mapstructure v1.5.0 - github.com/peterbourgon/ff/v3 v3.3.0 + github.com/peterbourgon/ff/v3 v3.4.0 github.com/pkg/errors v0.9.1 github.com/rubenv/sql-migrate v1.2.0 github.com/spf13/cobra v1.7.0 @@ -36,15 +38,15 @@ require ( github.com/streamingfast/shutter v1.5.0 github.com/streamingfast/substreams v1.1.8-0.20230705171054-90758978ac9c github.com/streamingfast/substreams-sink v0.2.7-0.20230712142916-a92b1a65a261 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.10.0 github.com/volatiletech/null/v8 v8.1.2 github.com/volatiletech/sqlboiler/v4 v4.13.0 github.com/volatiletech/strmangle v0.0.4 - go.uber.org/zap v1.24.0 - golang.org/x/crypto v0.14.0 + go.uber.org/zap v1.27.0 + golang.org/x/crypto v0.40.0 golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb - google.golang.org/grpc v1.58.3 - google.golang.org/protobuf v1.31.0 + google.golang.org/grpc v1.69.4 + google.golang.org/protobuf v1.36.3 gorm.io/datatypes v1.2.0 gorm.io/driver/postgres v1.5.0 gorm.io/driver/sqlite v1.4.3 @@ -52,9 +54,9 @@ require ( ) require ( + cel.dev/expr v0.16.2 // indirect cloud.google.com/go v0.110.8 // indirect - cloud.google.com/go/compute v1.23.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect cloud.google.com/go/iam v1.1.2 // indirect cloud.google.com/go/storage v1.30.1 // indirect cosmossdk.io/api v0.3.1 // indirect @@ -79,19 +81,16 @@ require ( github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/blendle/zapdriver v1.3.1 // indirect github.com/bobg/go-generics/v2 v2.1.1 // indirect - github.com/btcsuite/btcd v0.22.1 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 // indirect - github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/btcsuite/btcd/btcutil v1.1.6 // indirect github.com/bufbuild/protocompile v0.4.0 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect - github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect - github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect - github.com/cockroachdb/errors v1.10.0 // indirect + github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/coinbase/rosetta-sdk-go/types v1.0.0 // indirect @@ -104,30 +103,30 @@ require ( github.com/cosmos/iavl v0.20.1 // indirect github.com/cosmos/ibc-go/v7 v7.2.0 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.12.4 // indirect + github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 // indirect github.com/creachadair/taskgroup v0.4.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.5.0 // indirect - github.com/envoyproxy/go-control-plane v0.11.1 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect + github.com/envoyproxy/go-control-plane v0.13.1 // indirect + github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/ericlagergren/decimal v0.0.0-20181231230500-73749d4874d5 // indirect github.com/felixge/httpsnoop v1.0.3 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/getsentry/sentry-go v0.23.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-gorp/gorp/v3 v3.0.2 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.1 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect @@ -136,17 +135,17 @@ require ( github.com/gofrs/uuid v4.3.1+incompatible // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.1.2 // indirect + github.com/golang/glog v1.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/mock v1.6.0 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect @@ -215,23 +214,24 @@ require ( github.com/paulbellamy/ratecounter v0.2.0 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.16.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.11.0 // indirect github.com/rakyll/statik v0.1.7 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/cors v1.8.3 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/rs/zerolog v1.30.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/schollz/closestmatch v2.1.0+incompatible // indirect github.com/sethvargo/go-retry v0.2.3 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/afero v1.10.0 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/streamingfast/atm v0.0.0-20220131151839-18c87005e680 // indirect @@ -249,8 +249,8 @@ require ( github.com/tidwall/btree v1.6.0 // indirect github.com/tklauser/go-sysconf v0.3.5 // indirect github.com/tklauser/numcpus v0.2.2 // indirect - github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/ulikunitz/xz v0.5.11 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/vektah/gqlparser/v2 v2.4.5 // indirect github.com/volatiletech/inflect v0.0.1 // indirect github.com/volatiletech/randomize v0.0.1 // indirect @@ -258,28 +258,28 @@ require ( github.com/yourbasic/graph v0.0.0-20210606180040-8ecfec1c2869 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect - go.etcd.io/bbolt v1.3.7 // indirect + go.etcd.io/bbolt v1.3.11 // indirect go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect go.uber.org/atomic v1.10.0 // indirect - go.uber.org/goleak v1.2.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/term v0.33.0 // indirect + golang.org/x/text v0.28.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.128.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect @@ -290,3 +290,7 @@ require ( pgregory.net/rapid v0.5.5 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) + +replace github.com/cometbft/cometbft => github.com/samouraiworld/cometbft v0.0.0-20250903152050-4bcfdb17ec79 + +replace github.com/cosmos/cosmos-sdk => github.com/samouraiworld/cosmos-sdk v0.0.0-20250904074130-b62c52c148f7 diff --git a/go.sum b/go.sum index 48f769225e..96c1e88a24 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +cel.dev/expr v0.16.2 h1:RwRhoH17VhAu9U5CMvMhH1PDVgf0tuz9FT+24AfMLfU= +cel.dev/expr v0.16.2/go.mod h1:gXngZQMkWJoSbE8mOzehJlXQyubn/Vg0vR9/F3W7iw8= 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= @@ -71,10 +73,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= @@ -223,6 +223,7 @@ github.com/Azure/azure-sdk-for-go/sdk/internal v0.9.1/go.mod h1:KLF4gFr6DcKFZwSu github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= @@ -247,6 +248,7 @@ github.com/DATA-DOG/go-sqlmock v1.4.1 h1:ThlnYciV1iM/V0OSF/dtkqWb6xo5qITT1TJBG1M github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Khan/genqlient v0.5.0 h1:TMZJ+tl/BpbmGyIBiXzKzUftDhw4ZWxQZ+1ydn0gyII= github.com/Khan/genqlient v0.5.0/go.mod h1:EpIvDVXYm01GP6AXzjA7dKriPTH6GmtpmvTAwUUqIX8= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -256,7 +258,9 @@ github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0 github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -264,9 +268,11 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= @@ -323,20 +329,30 @@ github.com/bobg/go-generics/v2 v2.1.1 h1:4rN9upY6Xm4TASSMeH+NzUghgO4h/SbNrQphIjR github.com/bobg/go-generics/v2 v2.1.1/go.mod h1:iPMSRVFlzkJSYOCXQ0n92RA3Vxw0RBv2E8j9ZODXgHk= github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= -github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +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/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/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/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= @@ -347,18 +363,20 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= +github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= @@ -377,36 +395,39 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= 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/errors v1.10.0 h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU= -github.com/cockroachdb/errors v1.10.0/go.mod h1:lknhIsEVQ9Ss/qKDBQS/UqFSvPQjOwNq2qyKAxtHRqE= +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/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= -github.com/cometbft/cometbft v0.37.2 h1:XB0yyHGT0lwmJlFmM4+rsRnczPlHoAKFX6K8Zgc2/Jc= -github.com/cometbft/cometbft v0.37.2/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -419,8 +440,6 @@ 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-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= -github.com/cosmos/cosmos-sdk v0.47.6 h1:uyo/eg9NMB66aQZIZUv/LeOPTdSnsU23wZkgFYpjikQ= -github.com/cosmos/cosmos-sdk v0.47.6/go.mod h1:xTc1chW8HyUWCfrgGbjS5jNu9RzlPVrBNfbL9RmZUio= 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= @@ -435,16 +454,14 @@ github.com/cosmos/ibc-go/v7 v7.2.0 h1:dx0DLUl7rxdyZ8NiT6UsrbzKOJx/w7s+BOaewFRH6c github.com/cosmos/ibc-go/v7 v7.2.0/go.mod h1:OOcjKIRku/j1Xs1RgKK0yvKRrJ5iFuZYMetR1n3yMlc= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= -github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= -github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7wiiY35fv3ctT+k4M= +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/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3 h1:HVTnpeuvF6Owjd5mniCL8DEXo7uYXdQEmOP4FJbV5tg= github.com/crackcomm/go-gitignore v0.0.0-20170627025303-887ab5e44cc3/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= @@ -460,9 +477,13 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= @@ -481,7 +502,9 @@ github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5O github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -503,11 +526,11 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/go-control-plane v0.13.1 h1:vPfJZCkob6yTMEgS+0TwfTUfbHjfy/6vOJ8hUWX/uXE= +github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/ericlagergren/decimal v0.0.0-20181231230500-73749d4874d5 h1:HQGCJNlqt1dUs/BhtEKmqWd6LWS+DWYVxi9+Jo4r0jE= github.com/ericlagergren/decimal v0.0.0-20181231230500-73749d4874d5/go.mod h1:1yj25TwtUlJ+pfOu9apAVaM1RWfZGg+aFpd4hPQZekQ= github.com/ethereum/go-ethereum v1.11.6 h1:2VF8Mf7XiSUfmoNOy3D+ocfl9Qu8baQBrCNbo2CXQ8E= @@ -517,13 +540,14 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/friendsofgo/errors v0.9.2 h1:X6NYxef4efCBdwI7BgS820zFaN7Cphrmb+Pljdzjtgk= github.com/friendsofgo/errors v0.9.2/go.mod h1:yCvFW5AkDIL9qn7suHVLiI/gH228n7PC4Pn44IGoTOI= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -533,16 +557,21 @@ github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmV github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= -github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gnolang/gno v0.0.0-20250903104743-a56a225e7cee h1:Yxb+u3eyP3pcF/EVQ8zPz1wjoz5sqWqr9FuYqjrr8YU= +github.com/gnolang/gno v0.0.0-20250903104743-a56a225e7cee/go.mod h1:j9wKq29meqwktEj2ReqPbSkeYUwoisfxHHVeV20lhtw= github.com/go-co-op/gocron v1.18.0 h1:SxTyJ5xnSN4byCq7b10LmmszFdxQlSQJod8s3gbnXxA= github.com/go-co-op/gocron v1.18.0/go.mod h1:sD/a0Aadtw5CpflUJ/lpP9Vfdk979Wl1Sg33HPHg0FY= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -561,8 +590,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.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/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.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= @@ -570,10 +599,13 @@ github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dT github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -596,11 +628,13 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -615,17 +649,16 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -661,8 +694,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/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/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -686,8 +719,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -698,6 +732,7 @@ github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIG github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -724,8 +759,9 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= @@ -756,8 +792,9 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= @@ -780,7 +817,6 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -826,6 +862,7 @@ github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKEN github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -837,6 +874,7 @@ github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.1.0 h1:gEe0Dp/lZmPZiDFzJJaOfUpOvv2MKUkoBX8lDrn9vKU= +github.com/huin/goupnp v1.1.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -860,7 +898,9 @@ github.com/jackc/pgx/v5 v5.3.0 h1:/NQi8KHMpKWHInxXesC8yD4DhkXPrVhmnwYkjp9AmBA= github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= @@ -887,6 +927,7 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -931,6 +972,7 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.1-0.20191011153232-f91d3411e481/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -991,6 +1033,7 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= @@ -1004,10 +1047,9 @@ github.com/mehanizm/airtable v0.2.8 h1:tqNm0UIsnoBvZ7od4UT7X/yXpjxiTDHf+BMbX8DY+ github.com/mehanizm/airtable v0.2.8/go.mod h1:IdW+trlxx5hlfHkyl6jFdHlk4H4zwV7bpY+JqqQEFrU= github.com/microsoft/go-mssqldb v0.15.0/go.mod h1:Wr+jfynAR4lYmHA093AL8njUw2T6ovxe2jjBQKxBIco= github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE= +github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miguelmota/go-ethereum-hdwallet v0.1.2 h1:mz9LO6V7QCRkLYb0AH17t5R8KeqCe3E+hx9YXpmZeXA= -github.com/miguelmota/go-ethereum-hdwallet v0.1.2/go.mod h1:fdNwFSoBFVBPnU0xpOd6l2ueqsPSH/Gch5kIvSvTGk8= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= @@ -1034,7 +1076,6 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= @@ -1042,6 +1083,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= @@ -1077,8 +1119,9 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -1087,10 +1130,12 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -1102,7 +1147,9 @@ github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWEr github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= +github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= +github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -1112,6 +1159,7 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= @@ -1125,14 +1173,15 @@ github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCko github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/peterbourgon/ff/v3 v3.3.0 h1:PaKe7GW8orVFh8Unb5jNHS+JZBwWUMa2se0HM6/BI24= -github.com/peterbourgon/ff/v3 v3.3.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= +github.com/peterbourgon/ff/v3 v3.4.0 h1:QBvM/rizZM1cB0p0lGMdmR7HxZeI/ZrBWB4DqLkMUBc= +github.com/peterbourgon/ff/v3 v3.4.0/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU= github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -1143,6 +1192,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -1163,8 +1214,8 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= 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= @@ -1188,6 +1239,7 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1196,23 +1248,25 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= github.com/rubenv/sql-migrate v1.2.0 h1:fOXMPLMd41sK7Tg75SXDec15k3zg5WNV6SjuDRiNfcU= github.com/rubenv/sql-migrate v1.2.0/go.mod h1:Z5uVnq7vrIrPmHbVFfR4YLHRZquxeHpckCnRq0P/K9Y= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= +github.com/samouraiworld/cometbft v0.0.0-20250903152050-4bcfdb17ec79 h1:fKDgVY2lEfwTJO/A9RtowD486rHUd9o2zjxj8OdBO0s= +github.com/samouraiworld/cometbft v0.0.0-20250903152050-4bcfdb17ec79/go.mod h1:djqrQikVLzKEjNCq6Y77oBVfBHT1Fsx3wGIjW+YpDoc= +github.com/samouraiworld/cosmos-sdk v0.0.0-20250904074130-b62c52c148f7 h1:HiGv0Hnr2AyvgK9BaUrQaVXcZl96hWRTvLJrPXE9pG8= +github.com/samouraiworld/cosmos-sdk v0.0.0-20250904074130-b62c52c148f7/go.mod h1:6FIO7Zu33S2tDQc6didCvxNjAVML9oa/xf1fy27ouJs= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= @@ -1234,6 +1288,7 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1243,8 +1298,8 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1268,6 +1323,7 @@ github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhU github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -1305,8 +1361,9 @@ github.com/streamingfast/substreams-sink v0.2.7-0.20230712142916-a92b1a65a261/go github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -1318,11 +1375,13 @@ 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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= @@ -1347,14 +1406,15 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa h1:5SqCsI/2Qya2bCzK15ozrqo2sZxkh0FHynJZOTVoV6Q= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/vektah/gqlparser/v2 v2.4.0/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0= github.com/vektah/gqlparser/v2 v2.4.5 h1:C02NsyEsL4TXJB7ndonqTfuQOL4XPIu0aAWugdmTgmc= github.com/vektah/gqlparser/v2 v2.4.5/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0= @@ -1373,7 +1433,6 @@ github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c h1:GGsyl0d github.com/whyrusleeping/tar-utils v0.0.0-20180509141711-8c6c8ba81d5c/go.mod h1:xxcJeBb7SIUl/Wzkz1eVKJE/CB34YNrqX2TQI6jY9zs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/yourbasic/graph v0.0.0-20210606180040-8ecfec1c2869 h1:7v7L5lsfw4w8iqBBXETukHo4IPltmD+mWoLRYUmeGN8= github.com/yourbasic/graph v0.0.0-20210606180040-8ecfec1c2869/go.mod h1:Rfzr+sqaDreiCaoQbFCu3sTXxeFq/9kXRuyOoSlGQHE= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1391,8 +1450,8 @@ github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWp github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= +go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= @@ -1409,14 +1468,20 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4 h1:PRXhsszxTt5bbPriTjmaweWUsAnJYeWBhUMLRetUgBU= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.4/go.mod h1:05eWWy6ZWzmpeImD3UowLTB3VjDMU1yxQ+ENuVWDM3c= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +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/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/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1426,8 +1491,8 @@ go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +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/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= @@ -1440,8 +1505,8 @@ go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +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/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1455,7 +1520,6 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1469,8 +1533,8 @@ golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1512,8 +1576,9 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1551,6 +1616,7 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1581,8 +1647,8 @@ golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= 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= @@ -1609,8 +1675,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -1626,8 +1692,8 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/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= @@ -1678,10 +1744,12 @@ golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1745,14 +1813,14 @@ golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= +golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= 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= @@ -1765,13 +1833,12 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/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= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1843,7 +1910,8 @@ golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= 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= @@ -2025,10 +2093,10 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8= google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= +google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= 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= @@ -2070,8 +2138,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= +google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= 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= @@ -2088,8 +2156,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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= @@ -2107,7 +2175,6 @@ gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -2137,12 +2204,14 @@ gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1 gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU= gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0= +gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig= gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11 h1:9qNbmu21nNThCNnF5i2R3kw2aL27U8ZwbzccNjOmW0g= gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/go/cmd/p2e-update-leaderboard/Dockerfile b/go/cmd/p2e-update-leaderboard/Dockerfile deleted file mode 100644 index e543a83721..0000000000 --- a/go/cmd/p2e-update-leaderboard/Dockerfile +++ /dev/null @@ -1,61 +0,0 @@ -# syntax=docker/dockerfile:1 - -ARG GO_VERSION="1.19" -ARG RUNNER_IMAGE="gcr.io/distroless/static" - -# -------------------------------------------------------- -# Builder -# -------------------------------------------------------- - -FROM golang:${GO_VERSION}-alpine as builder - -RUN set -eux; apk add --no-cache ca-certificates build-base; apk add git linux-headers - -# Download go dependencies -WORKDIR /app -COPY go.* ./ -RUN --mount=type=cache,target=/root/.cache/go-build \ - --mount=type=cache,target=/root/go/pkg/mod \ - go mod download - -# Cosmwasm - download correct libwasmvm version -RUN WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2) && \ - wget https://github.com/CosmWasm/wasmvm/releases/download/$WASMVM_VERSION/libwasmvm_muslc.$(uname -m).a \ - -O /lib/libwasmvm_muslc.a - -# Copy the remaining files -COPY go ./go -COPY .git ./.git - -# Build teritorid binary -RUN --mount=type=cache,target=/root/.cache/go-build \ - --mount=type=cache,target=/root/go/pkg/mod \ - VERSION=$(echo $(git describe --tags) | sed 's/^v//') && \ - COMMIT=$(git log -1 --format='%H') && \ - go build \ - -mod=readonly \ - -tags "netgo,ledger,muslc" \ - -ldflags "-X github.com/cosmos/cosmos-sdk/version.Name="teritori" \ - -X github.com/cosmos/cosmos-sdk/version.AppName="teritorid" \ - -X github.com/cosmos/cosmos-sdk/version.Version=$VERSION \ - -X github.com/cosmos/cosmos-sdk/version.Commit=$COMMIT \ - -X github.com/cosmos/cosmos-sdk/version.BuildTags='netgo,ledger,muslc' \ - -w -s -linkmode=external -extldflags '-Wl,-z,muldefs -static'" \ - -trimpath \ - -o /app/build/ \ - ./go/cmd/p2e-update-leaderboard - -# -------------------------------------------------------- -# Runner -# -------------------------------------------------------- - -FROM ${RUNNER_IMAGE} - -COPY --from=builder /app/build/p2e-update-leaderboard /bin/p2e-update-leaderboard - -ENV HOME /app -WORKDIR $HOME - -COPY networks.json $HOME/networks.json - -ENTRYPOINT ["p2e-update-leaderboard"] diff --git a/go/cmd/p2e-update-leaderboard/main.go b/go/cmd/p2e-update-leaderboard/main.go deleted file mode 100644 index 2ff607aa0f..0000000000 --- a/go/cmd/p2e-update-leaderboard/main.go +++ /dev/null @@ -1,99 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - - "golang.org/x/exp/slices" - - "github.com/TERITORI/teritori-dapp/go/internal/indexerdb" - "github.com/TERITORI/teritori-dapp/go/pkg/networks" - "github.com/peterbourgon/ff/v3" - "github.com/pkg/errors" - "go.uber.org/zap" -) - -func main() { - fs := flag.NewFlagSet("p2e-update-leaderboard", flag.ContinueOnError) - var ( - networksFile = fs.String("networks-file", "networks.json", "path to networks config file") - - dbHost = fs.String("db-indexer-host", "", "host postgreSQL database") - dbPort = fs.String("db-indexer-port", "", "port for postgreSQL database") - dbPass = fs.String("postgres-password", "", "password for postgreSQL database") - dbName = fs.String("database-name", "", "database name for postgreSQL") - dbUser = fs.String("postgres-user", "", "username for postgreSQL") - targetNetworkID = fs.String("target-network-id", "", "target network to index") - mnemonic = fs.String("mnemonic", "", "mnemonic of reporter account") - ) - - if err := ff.Parse(fs, os.Args[1:], - ff.WithEnvVars(), - ff.WithIgnoreUndefined(true), - ff.WithConfigFile(".env"), - ff.WithConfigFileParser(ff.EnvParser), - ff.WithAllowMissingConfigFile(true), - ); err != nil { - panic(errors.Wrap(err, "failed to parse flags")) - } - - // Check target network id - networkID := *targetNetworkID - if networkID == "" { - panic("You must provide the ") - } - - // load networks - networksBytes, err := os.ReadFile(*networksFile) - if err != nil { - panic(errors.Wrap(err, "failed to read networks config file")) - } - netstore, err := networks.UnmarshalNetworkStore(networksBytes) - if err != nil { - panic(errors.Wrap(err, "failed to unmarshal networks config")) - } - - // get and validate selected network - network := netstore.MustGetNetwork(networkID) - - if !slices.Contains(network.GetBase().Features, networks.FeatureTypeRiotP2E) { - panic("The provided network does not support P2E") - } - - if *mnemonic == "" { - panic(errors.New("you must provide the ")) - } - - // get logger - logger, err := zap.NewDevelopment() - if err != nil { - panic(errors.Wrap(err, "failed to init logger")) - } - - // TODO: check if mnemonic is correct, matched with distributor account ============================= - - // get db - if dbHost == nil || dbUser == nil || dbPass == nil || dbName == nil || dbPort == nil { - panic(errors.New("missing Database configuration")) - } - dataConnexion := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s", - *dbHost, *dbUser, *dbPass, *dbName, *dbPort) - db, err := indexerdb.NewPostgresDB(dataConnexion) - if err != nil { - panic(errors.Wrap(err, "failed to access db")) - } - - service, err := NewLeaderboardService( - network.GetBase().ID, - &netstore, - db, - *mnemonic, - logger, - ) - if err != nil { - panic(errors.Wrap(err, "failed to run service update leaderboard")) - } - - service.startScheduler() -} diff --git a/go/cmd/p2e-update-leaderboard/service.go b/go/cmd/p2e-update-leaderboard/service.go deleted file mode 100644 index d13b9f2d13..0000000000 --- a/go/cmd/p2e-update-leaderboard/service.go +++ /dev/null @@ -1,595 +0,0 @@ -package main - -import ( - "context" - "crypto/ecdsa" - "encoding/json" - "fmt" - "math/big" - "strings" - "time" - - abiGo "github.com/TERITORI/teritori-dapp/go/internal/substreams/ethereum/abi_go" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/ethclient" - hdwallet "github.com/miguelmota/go-ethereum-hdwallet" - "github.com/mitchellh/mapstructure" - - "github.com/TERITORI/teritori-dapp/go/internal/indexerdb" - "github.com/TERITORI/teritori-dapp/go/pkg/contractutil" - "github.com/TERITORI/teritori-dapp/go/pkg/merkletree" - "github.com/TERITORI/teritori-dapp/go/pkg/networks" - "github.com/TERITORI/teritori-dapp/go/pkg/p2e" - "github.com/go-co-op/gocron" - "github.com/pkg/errors" - "go.uber.org/zap" - "gorm.io/gorm" -) - -type LeaderboardService struct { - networkId string - netstore *networks.NetworkStore - db *gorm.DB - mnemonic string - logger *zap.Logger -} - -func NewLeaderboardService( - networkId string, - netstore *networks.NetworkStore, - db *gorm.DB, - mnemonic string, - logger *zap.Logger, -) (*LeaderboardService, error) { - return &LeaderboardService{ - networkId: networkId, - netstore: netstore, - db: db, - mnemonic: mnemonic, - logger: logger, - }, nil -} - -func (s *LeaderboardService) startScheduler() { - network := s.netstore.MustGetNetwork(s.networkId) - - // TODO: Test if teritori works with rpcEndpoint from network config - var rpcEndpoint string - switch n := network.(type) { - case *networks.CosmosNetwork: - rpcEndpoint = n.RpcEndpoint - case *networks.EthereumNetwork: - rpcEndpoint = n.RpcEndpoint - default: - panic("unknown network") - } - - schedule := gocron.NewScheduler(time.UTC) - - schedule.Every(1).Minutes().Do(func() { - s.execUpdateLeaderboard(network, rpcEndpoint) - }) - - schedule.Every(1).Day().At("00:00").Do(func() { - // schedule.Every(15).Minutes().Do(func() { - s.execReportRewards(network, rpcEndpoint) - }) - - schedule.StartBlocking() -} - -func (s *LeaderboardService) execReportRewards(network networks.Network, rpcEndpoint string) { - // Run a bit earlier than midnight to be sure that we snapshot on current season (if case of the season transition moment) - // Subtract 2s to be sure we are in the expected day - currentTime := time.Now().UTC().Add(-time.Second * 2) // 23h59m58s - season, _, err := p2e.GetSeasonByTime(currentTime, network) - if err != nil { - s.logger.Error("failed to get current season", zap.Error(err)) - return - } - - if season.IsPre { - s.logger.Info("do not need to send rewards", zap.String("season", season.ID)) - return - } - - var leaderboard []indexerdb.P2eLeaderboard - - if err := s.db.Transaction(func(tx *gorm.DB) error { - // Update just before snapshot to have the latest info - if err := s.updateLeaderboard(season.ID, currentTime, tx); err != nil { - return errors.Wrap(err, "failed to update leaderboard") - } - - if err := s.snapshotLeaderboard(season.ID, tx); err != nil { - return errors.Wrap(err, "failed to snapshot leaderboard") - } - - if err := tx. - Where("season_id = ? AND in_progress_score != 0", season.ID). - Order("snapshot_rank asc"). - Limit(int(season.TopN)). - Find(&leaderboard). - Error; err != nil { - return errors.Wrap(err, "failed to get current leaderboard") - } - - return nil - }); err != nil { - s.logger.Error("failed to snapshot leaderboard", zap.Error(err)) - return - } - s.logger.Info(fmt.Sprintf("snapshot leaderboard successfully for season: %s", season.ID)) - - txHash, err := s.sendRewardsList(network, season.ID, leaderboard, rpcEndpoint) - if err != nil { - s.logger.Error("failed to send rewards list", zap.Error(err)) - return - } - - s.logger.Info(fmt.Sprintf("send daily rewards successfully for season: %s", season.ID), zap.String("TxHash", txHash)) - - // Season 3: Reset leaderboard after rewards distribution - if err := s.resetLeaderboard(season.ID); err != nil { - s.logger.Error("failed to reset leaderboard", zap.Error(err)) - return - } -} - -func (s *LeaderboardService) execUpdateLeaderboard(network networks.Network, rpcEndpoint string) { - currentTime := time.Now().UTC() - season, _, err := p2e.GetSeasonByTime(currentTime, network) - if err != nil { - s.logger.Error("failed to get current season", zap.Error(err)) - return - } - - if season.IsPre { - s.logger.Info("do not need to update leaderboard", zap.String("season", season.ID)) - return - } - - if err := s.db.Transaction(func(tx *gorm.DB) error { - if err := s.updateLeaderboard(season.ID, currentTime, tx); err != nil { - return err - } - return nil - }); err != nil { - s.logger.Error(fmt.Sprintf("failed to update leaderboard for season: %s", season.ID), zap.Error(err)) - } - - s.logger.Info(fmt.Sprintf("update leaderboard successfully for season: %s", season.ID)) -} - -func (s *LeaderboardService) sendRewardsList( - network networks.Network, - seasonId string, - leaderboard []indexerdb.P2eLeaderboard, - rpcEndpoint string, -) (string, error) { - switch n := network.(type) { - case *networks.CosmosNetwork: - return s.teritoriSendRewardsList(n, seasonId, leaderboard, rpcEndpoint) - case *networks.EthereumNetwork: - return s.ethereumSendRewardsList(n, seasonId, leaderboard, rpcEndpoint) - default: - panic("unknown network") - } -} - -func (s *LeaderboardService) ethereumSendRewardsList( - network *networks.EthereumNetwork, - seasonId string, - leaderboard []indexerdb.P2eLeaderboard, - rpcEndpoint string, -) (string, error) { - TOKEN_ADDRESS := network.ToriBridgedTokenAddress - - dailyRewards, err := p2e.GetDailyRewardsConfigBySeason(seasonId, network) - if err != nil { - return "", errors.Wrap(err, "failed to get rewards") - } - - // This data is compatible with DB - todayDailyRewards := indexerdb.ObjectJSONB{} // addr => {token, amount} - - // Save rewards list - todayRewards := p2e.UserRewardMap{} - for _, userScore := range leaderboard { - _, addr, err := s.netstore.ParseUserID(string(userScore.UserID)) - - if err != nil { - return "", errors.Wrap(err, "failed to parse user id") - } - - rank := userScore.Rank - - if rank < 1 { - return "", errors.Wrap(err, "rank should not be < 1") - } - - // Get daily reward by rank - dailyReward := dailyRewards[rank-1] - amount := strings.Split(dailyReward.String(), ".")[0] - todayRewards[addr] = p2e.UserReward{ - Token: TOKEN_ADDRESS, - Amount: amount, - } - - todayDailyRewards[addr] = map[string]interface{}{ - "token": TOKEN_ADDRESS, - "amount": amount, - } - } - - now := time.Now().UTC() - todayID := now.Format("2006-01-02") - - mostRecentDayData := indexerdb.P2eDailyReward{} - if err := s.db.Where("network_id = ? AND day_id < ?", s.networkId, todayID).Order("day_id DESC").First(&mostRecentDayData).Error; err != nil { - if !errors.Is(err, gorm.ErrRecordNotFound) { - return "", errors.Wrap(err, "failed to save daily rewards") - } - } - - mostRecentDayTotalRewards := p2e.UserRewardMap{} - - // If most recent day data is not empty then try to decode it to map - if mostRecentDayData.MerkleRoot != "" { - if err := mapstructure.Decode(mostRecentDayData.TotalRewards, &mostRecentDayTotalRewards); err != nil { - return "", errors.Wrap(err, "failed to decode yesterday reward to struct") - } - } - - // Calculate aggregated rewards = last aggregated rewards + today rewards - for addr, reward := range todayRewards { - mostRecentDayAmountStr := "0" - if mostRecentDayTotalRewards[addr].Amount != "" { - mostRecentDayAmountStr = mostRecentDayTotalRewards[addr].Amount - } - - mostRecentDayAmount, err := sdk.NewDecFromStr(mostRecentDayAmountStr) - if err != nil { - return "", errors.Wrap(err, "failed to create dec from current reward amount") - } - - todayAmount, err := sdk.NewDecFromStr(reward.Amount) - if err != nil { - return "", errors.Wrap(err, "failed to create dec from daily reward amount") - } - - newAmount := mostRecentDayAmount.Add(todayAmount) - reward.Amount = strings.Split(newAmount.String(), ".")[0] - - mostRecentDayTotalRewards[addr] = p2e.UserReward{ - Token: reward.Token, - Amount: reward.Amount, - } - } - - todayTotalRewards := indexerdb.ObjectJSONB{} // addr => {token, amount} - if err := mapstructure.Decode(mostRecentDayTotalRewards, &todayTotalRewards); err != nil { - return "", errors.Wrap(err, "failed to decode most recent day reward") - } - - // Create merkle root - leaves := make([]merkletree.Content, len(todayTotalRewards)) - i := 0 - for addr, data := range todayTotalRewards { - var userReward p2e.UserReward - if err := mapstructure.Decode(data, &userReward); err != nil { - return "", errors.Wrap(err, "failed to decode user reward") - } - - amount := new(big.Int) - // userReward.Amount is already BigInt string so base here is 0 - amount, ok := amount.SetString(userReward.Amount, 0) - if !ok { - return "", errors.New("failed to create BigInt from user reward amount") - } - - leaves[i] = p2e.RewardData{ - To: common.HexToAddress(addr), - Token: common.HexToAddress(userReward.Token), - Amount: amount, - } - i++ - } - - tree, err := merkletree.New(leaves) - if err != nil { - return "", errors.Wrap(err, "failed to created merkle tree") - } - - // Save to DB to reuse the tree data to ensure that they are the same when verifying proof - rewards := indexerdb.P2eDailyReward{ - DayID: todayID, - NetworkID: s.networkId, - DailyRewards: todayDailyRewards, - TotalRewards: todayTotalRewards, - MerkleRoot: tree.GetHexRoot(), - } - if err := s.db.Create(&rewards).Error; err != nil { - return "", errors.Wrap(err, "failed to save daily rewards") - } - s.logger.Info("saved daily rewards", zap.String("dayID", todayID), zap.String("networkID", s.networkId)) - - s.logger.Info("sending update merkle tree tx...") - tx, err := s.ethUpdateMerkleRoot(tree.GetRoot()) - if err != nil { - return "", errors.Wrap(err, "failed to ethUpdateMerkleRoot") - } - - return tx, nil -} - -func (s *LeaderboardService) ethUpdateMerkleRoot(merkleRoot []byte) (string, error) { - mnemonic := s.mnemonic - wallet, err := hdwallet.NewFromMnemonic(mnemonic) - if err != nil { - return "", errors.Wrap(err, "failed to get wallet from given mnemonic") - } - - path := hdwallet.MustParseDerivationPath("m/44'/60'/0'/0/0") - account, err := wallet.Derive(path, false) - if err != nil { - return "", errors.Wrap(err, "failed to get account from wallet") - } - - privateKey, err := wallet.PrivateKey(account) - if err != nil { - return "", errors.Wrap(err, "failed to get privateKey from account") - } - - // =================================================================================== - network := s.netstore.MustGetEthereumNetwork(s.networkId) - client, err := ethclient.Dial(network.Endpoint) - if err != nil { - return "", errors.Wrap(err, "failed to connect to blockchain endpoint") - } - - publicKey := privateKey.Public() - publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) - if !ok { - return "", errors.Wrap(err, "failed to cast public key to ECDSA") - } - - fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA) - nonce, err := client.PendingNonceAt(context.Background(), fromAddress) - if err != nil { - return "", errors.Wrap(err, "failed to get nonce") - } - - gasPrice, err := client.SuggestGasPrice(context.Background()) - if err != nil { - return "", errors.Wrap(err, "failed to get suggest price") - } - - chainID := big.NewInt(int64(network.ChainID)) - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, chainID) - if err != nil { - return "", errors.Wrap(err, "failed to get chain") - } - - auth.Nonce = big.NewInt(int64(nonce)) - auth.Value = big.NewInt(0) // in wei - auth.GasLimit = uint64(500_000) // in units - auth.GasPrice = gasPrice - - address := common.HexToAddress(network.DistributorContractAddress) - instance, err := abiGo.NewDistributor(address, client) - if err != nil { - return "", errors.Wrap(err, "failed to get nonce") - } - - merkleRootBytes := [32]byte{} - copy(merkleRootBytes[:], merkleRoot) - - s.logger.Info("sending with reporter", zap.String("reporter", fromAddress.String())) - - tx, err := instance.UpdateMerkleRoot(auth, merkleRootBytes) - if err != nil { - return "", errors.Wrap(err, "failed to update merkle root") - } - - txHash := tx.Hash().Hex() - - receipt, err := bind.WaitMined(context.Background(), client, tx) - if err != nil { - return "", errors.Wrap(err, "failed to mint tx on blockchain") - } - - if receipt.Status == 0 { - return "", errors.New("tx failed") - } - - return txHash, nil -} - -func (s *LeaderboardService) teritoriSendRewardsList( - network *networks.CosmosNetwork, - seasonId string, - leaderboard []indexerdb.P2eLeaderboard, - rpcEndpoint string, -) (string, error) { - netstore := s.netstore - distributorMnemonic := s.mnemonic - - dailyRewards, err := p2e.GetDailyRewardsConfigBySeason(seasonId, network) - - if err != nil { - return "", errors.Wrap(err, "failed to get rewards") - } - - contractQueryClient := contractutil.NewContractQueryClient(network.ChainID, rpcEndpoint) - configData, err := contractQueryClient.QueryWasm(network.DistributorContractAddress, `{"config": {}}`) - if err != nil { - return "", errors.Wrap(err, "failed to query contract") - } - - mnemonic := distributorMnemonic - funds := sdk.NewCoins() - prefix := "tori" - gasPrices := "0.025utori" - gasAdjustment := 1.3 - - distributorOwnerAddress := configData["owner"].(string) - - contractClient, err := contractutil.NewContractClient( - network.ChainID, - rpcEndpoint, - prefix, - distributorOwnerAddress, - mnemonic, - gasPrices, - gasAdjustment, - ) - - if err != nil { - return "", errors.Wrap(err, "failed to get contract client") - } - - rewardCoef := sdk.NewDec(1) - // Adjust rewards in testnet - if network.Testnet { - rewardCoef = sdk.NewDecWithPrec(1, 6) - } - - // Generate rewards list - rewardsList := []map[string]interface{}{} - - for _, userScore := range leaderboard { - _, addr, err := netstore.ParseUserID(string(userScore.UserID)) - if err != nil { - return "", errors.Wrap(err, "failed to parse user id") - } - - rank := userScore.Rank - - if rank < 1 { - return "", errors.Wrap(err, "rank should not be < 1") - } - - // Get daily reward by rank - dailyReward := dailyRewards[rank-1] - finalDailyAmount := dailyReward.Amount.Mul(rewardCoef) - - rewardsList = append(rewardsList, map[string]interface{}{"addr": addr, "amount": finalDailyAmount.RoundInt()}) - } - - execMsgRaw := map[string]interface{}{ - "add_daily_report": map[string]interface{}{ - "report_id": int32(configData["last_report_id"].(float64)) + 1, - "rewards": rewardsList, - }, - } - - execMsg, err := json.Marshal(execMsgRaw) - if err != nil { - return "", errors.Wrap(err, "fail to generate execMsg") - } - execMsgStr := string(execMsg) - - txRes, err := contractClient.ExecuteWasm(network.DistributorContractAddress, execMsgStr, funds, "Send rewards list to top players") - return txRes.TxHash, err -} - -func (s *LeaderboardService) resetLeaderboard(seasonId string) error { - err := s.db.Exec(` - UPDATE p2e_leaderboards as lb - SET - score = 0, - rank = 0, - in_progress_score = 0, - snapshot_rank = 0, - snapshot_score = 0 - WHERE lb.season_id = ? AND network_id = ? - `, - seasonId, s.networkId, - ).Error - if err != nil { - return errors.Wrap(err, "failed to execute reset leaderboard query") - } - return nil -} - -func (s *LeaderboardService) updateLeaderboard(seasonId string, currentTime time.Time, tx *gorm.DB) error { - now := currentTime - currentTimestamp := now.Unix() - dayBeginningTimestamp := time.Date(now.UTC().Year(), now.UTC().Month(), now.UTC().Day(), 0, 0, 0, 0, time.UTC).Unix() - - // S3 Rules: - // - duration = (current/end - start/dayBegin) - // - start is always < end and < current - // - current is always >= dayBegin - // All possibles cases: - // - start -> dayBegin -> current -> end Duration: current - dayBegin > 0 Tested - // - start -> dayBegin -> end -> current Duration: end - dayBegin > 0 Tested - // - start -> end -> dayBegin -> current Duration: end - dayBegin < 0 => duration = 0 Tested - // - dayBegin -> start -> current -> end Duration: current - start > 0 Tested - // - dayBegin -> start -> end -> current Duration: end - start > 0 Tested - // Result: GREATEST (duration, 0) - - updateScoreErr := tx.Exec(` - UPDATE p2e_leaderboards as lb - SET - in_progress_score = score + aggregated_ss.in_progress - FROM ( - SELECT - owner_id, - season_id, - SUM( GREATEST ( LEAST( ?, ss.end_time ) - GREATEST( ?, ss.start_time ) , 0 ) ) as in_progress - FROM p2e_squad_stakings as ss - WHERE network_id = ? - GROUP BY owner_id, season_id - ) as aggregated_ss - WHERE lb.user_id = aggregated_ss.owner_id - AND lb.season_id = aggregated_ss.season_id - AND lb.season_id = ? - AND lb.network_id = ? - `, - currentTimestamp, - dayBeginningTimestamp, - s.networkId, - seasonId, - s.networkId, - ).Error - if updateScoreErr != nil { - return errors.Wrap(updateScoreErr, "failed to update in progress score") - } - - updateRankErr := tx.Exec(` - UPDATE p2e_leaderboards as lb - SET rank = orderedLb.rank - FROM ( - SELECT - user_id, - ROW_NUMBER() OVER (ORDER BY in_progress_score DESC) AS rank - FROM p2e_leaderboards - WHERE season_id = ? AND network_id = ? - ) orderedLb - WHERE lb.user_id = orderedLb.user_id - AND lb.season_id = ? AND lb.network_id = ? - `, seasonId, s.networkId, seasonId, s.networkId).Error - if updateRankErr != nil { - return errors.Wrap(updateRankErr, "failed to update rank") - } - return nil -} - -func (s *LeaderboardService) snapshotLeaderboard(seasonId string, tx *gorm.DB) error { - snapshotErr := tx.Exec(` - UPDATE p2e_leaderboards as lb - SET snapshot_score = in_progress_score, snapshot_rank = rank - WHERE lb.season_id = ? AND lb.network_id = ? - `, seasonId, s.networkId).Error - - if snapshotErr != nil { - return errors.Wrap(snapshotErr, "failed to snapshot") - } - return nil -} diff --git a/go/pkg/multisig/multisig_db.go b/go/pkg/multisig/multisig_db.go index 505d19812a..72ae20f27a 100644 --- a/go/pkg/multisig/multisig_db.go +++ b/go/pkg/multisig/multisig_db.go @@ -9,17 +9,19 @@ import ( ) type UserMultisig struct { - MultisigChainID string `gorm:"primaryKey"` - UserAddress string `gorm:"primaryKey"` - MultisigAddress string `gorm:"primaryKey"` - Multisig Multisig - CreatedAt time.Time `gorm:"index"` - UpdatedAt time.Time - Joined bool `gorm:"index"` - Name string + MultisigChainType string `gorm:"primaryKey,default:cosmos"` + MultisigChainID string `gorm:"primaryKey"` + UserAddress string `gorm:"primaryKey"` + MultisigAddress string `gorm:"primaryKey"` + Multisig Multisig + CreatedAt time.Time `gorm:"index"` + UpdatedAt time.Time + Joined bool `gorm:"index"` + Name string } type Multisig struct { + ChainType string `gorm:"primaryKey,default:cosmos"` ChainID string `gorm:"primaryKey"` Address string `gorm:"primaryKey"` CreatedAt time.Time @@ -30,20 +32,21 @@ type Multisig struct { } type Transaction struct { - ID uint `gorm:"primaryKey"` // TODO: replace with proto-hash - MsgsJSON datatypes.JSON - FeeJSON string - MultisigChainID string - MultisigAddress string - Multisig Multisig - AccountNumber uint32 // TODO: check if need ensure unique, can we have two multisig with same address but different account number, maybe it needs to have a combined unique index with sequence - Sequence uint32 // TODO: ensure unique for multisig - FinalHash *string `gorm:"uniqueIndex"` - CreatedAt time.Time `gorm:"index"` - UpdatedAt time.Time - CreatorAddress string - Signatures []Signature - Type string `gorm:"index"` + ID uint `gorm:"primaryKey"` // TODO: replace with proto-hash + MsgsJSON datatypes.JSON + FeeJSON string + MultisigChainType string `gorm:"default:cosmos"` + MultisigChainID string + MultisigAddress string + Multisig Multisig + AccountNumber uint32 // TODO: check if need ensure unique, can we have two multisig with same address but different account number, maybe it needs to have a combined unique index with sequence + Sequence uint32 // TODO: ensure unique for multisig + FinalHash *string `gorm:"uniqueIndex"` + CreatedAt time.Time `gorm:"index"` + UpdatedAt time.Time + CreatorAddress string + Signatures []Signature + Type string `gorm:"index"` } type Signature struct { @@ -55,7 +58,7 @@ type Signature struct { UserAddress string `gorm:"primaryKey"` } -func transactionsQuery(db *gorm.DB, userAddress string, chainId string, multisigAddress string, executionState multisigpb.ExecutionState, types []string) *gorm.DB { +func transactionsQuery(db *gorm.DB, userAddress string, chainType string, chainId string, multisigAddress string, executionState multisigpb.ExecutionState, types []string) *gorm.DB { // we can't use .Joins(...) on signatures because it does not expect a slice query := db.Model(&Transaction{}). Joins("Multisig"). @@ -68,6 +71,10 @@ func transactionsQuery(db *gorm.DB, userAddress string, chainId string, multisig query = query.Where("transactions.multisig_chain_id = ?", chainId) } + if chainType != "" { + query = query.Where("transactions.multisig_chain_type = ?", chainType) + } + if multisigAddress == "" { query = query.Where("user_multisigs.joined = ?", true) } else { diff --git a/go/pkg/multisig/multisig_service.go b/go/pkg/multisig/multisig_service.go index 3310e03353..20c8998415 100644 --- a/go/pkg/multisig/multisig_service.go +++ b/go/pkg/multisig/multisig_service.go @@ -6,12 +6,18 @@ import ( "crypto/ed25519" srand "crypto/rand" "encoding/json" + "fmt" "time" "github.com/TERITORI/teritori-dapp/go/pkg/multisigpb" "github.com/cosmos/cosmos-sdk/codec/legacy" "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" "github.com/cosmos/cosmos-sdk/types/bech32" + gnoamino "github.com/gnolang/gno/tm2/pkg/amino" + gnocrypto "github.com/gnolang/gno/tm2/pkg/crypto" + _ "github.com/gnolang/gno/tm2/pkg/crypto/ed25519" + gnomultisig "github.com/gnolang/gno/tm2/pkg/crypto/multisig" + _ "github.com/gnolang/gno/tm2/pkg/crypto/secp256k1" "github.com/pkg/errors" "go.uber.org/zap" "google.golang.org/protobuf/types/known/anypb" @@ -99,6 +105,9 @@ func (s *multisigService) Multisigs(_ context.Context, req *multisigpb.Multisigs if req.ChainId != "" { query = query.Where("multisig_chain_id = ?", req.ChainId) } + if req.ChainType != "" { + query = query.Where("multisig_chain_type = ?", req.ChainType) + } if req.GetJoinState() != multisigpb.JoinState_JOIN_STATE_UNSPECIFIED { query = query.Where("joined = ?", req.GetJoinState() == multisigpb.JoinState_JOIN_STATE_IN) } @@ -121,6 +130,7 @@ func (s *multisigService) Multisigs(_ context.Context, req *multisigpb.Multisigs for _, ms := range userMultisigs { multisigs = append(multisigs, &multisigpb.Multisig{ + ChainType: ms.MultisigChainType, ChainId: ms.MultisigChainID, Address: ms.MultisigAddress, CreatedAt: encodeTime(ms.CreatedAt), @@ -143,8 +153,10 @@ func (s *multisigService) MultisigInfo(_ context.Context, req *multisigpb.Multis return nil, errors.Wrap(err, "failed to authenticate") } + chainType := req.GetChainType() + var userMultisig UserMultisig - if err := s.db.First(&userMultisig, "multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", req.GetChainId(), userAddress, req.GetMultisigAddress()).Error; err != nil { + if err := s.db.First(&userMultisig, "multisig_chain_type = ? AND multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainType, req.GetChainId(), userAddress, req.GetMultisigAddress()).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, errors.New("not found") } @@ -152,7 +164,7 @@ func (s *multisigService) MultisigInfo(_ context.Context, req *multisigpb.Multis } var multisig Multisig - if err := s.db.Preload("Users").First(&multisig, "chain_id = ? AND address = ?", req.GetChainId(), req.GetMultisigAddress()).Error; err != nil { + if err := s.db.Preload("Users").First(&multisig, "chain_type = ? AND chain_id = ? AND address = ?", chainType, req.GetChainId(), req.GetMultisigAddress()).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, errors.New("multisig not found, this should never happen") } @@ -178,6 +190,7 @@ func (s *multisigService) MultisigInfo(_ context.Context, req *multisigpb.Multis return &multisigpb.MultisigInfoResponse{ Multisig: &multisigpb.Multisig{ + ChainType: multisig.ChainType, ChainId: multisig.ChainID, Address: multisig.Address, CreatedAt: encodeTime(multisig.CreatedAt), @@ -197,7 +210,7 @@ func (s *multisigService) Transactions(_ context.Context, req *multisigpb.Transa } // we can't use .Joins( on signature because it does not expect a slice - query := transactionsQuery(s.db, userAddress, req.ChainId, req.MultisigAddress, req.ExecutionState, req.Types) + query := transactionsQuery(s.db, userAddress, req.ChainType, req.ChainId, req.MultisigAddress, req.ExecutionState, req.Types) // handle cursor startAfterString := req.GetStartAfter() @@ -251,6 +264,7 @@ func (s *multisigService) Transactions(_ context.Context, req *multisigpb.Transa } transactions[i] = &multisigpb.Transaction{ + ChainType: tx.MultisigChainType, ChainId: tx.MultisigChainID, MultisigAddress: tx.MultisigAddress, AccountNumber: tx.AccountNumber, @@ -297,7 +311,7 @@ func (s *multisigService) TransactionsCounts(_ context.Context, req *multisigpb. } var countsByType []TransactionsCount - query := transactionsQuery(s.db, userAddress, req.ChainId, req.MultisigAddress, multisigpb.ExecutionState_EXECUTION_STATE_UNSPECIFIED, nil) + query := transactionsQuery(s.db, userAddress, req.ChainType, req.ChainId, req.MultisigAddress, multisigpb.ExecutionState_EXECUTION_STATE_UNSPECIFIED, nil) if err := query. Select("count(type) as Count, type as Type, final_hash IS NOT NULL as Executed"). Group("Type, Executed"). @@ -340,6 +354,11 @@ func (s *multisigService) CreateOrJoinMultisig(_ context.Context, req *multisigp var created, joined bool multisigAddress := "" + chainType := req.GetChainType() + if chainType == "" { + return nil, fmt.Errorf("missing chain type") + } + if err := s.db.Transaction(func(tx *gorm.DB) error { userAddress, err := s.authenticate(tx, req.GetAuthToken()) if err != nil { @@ -350,69 +369,110 @@ func (s *multisigService) CreateOrJoinMultisig(_ context.Context, req *multisigp chainID := req.GetChainId() pubkeyJSON := req.GetMultisigPubkeyJson() - var ms multisig.LegacyAminoPubKey - if err := legacy.Cdc.UnmarshalJSON([]byte(pubkeyJSON), &ms); err != nil { - return errors.Wrap(err, "failed to unmarshal multisig pubkey json") - } - multisigAddress, err = bech32.ConvertAndEncode(req.GetBech32Prefix(), ms.Address()) - if err != nil { - return errors.Wrap(err, "failed to encode multisig address") - } - - multisigPubKeys := ms.GetPubKeys() - if int(ms.Threshold) > len(multisigPubKeys) || ms.Threshold == 0 { - return errors.New("invalid threshold") - } + var ( + threshold uint32 + addresses [][]byte + ) _, userAddressBytes, err := bech32.DecodeAndConvert(userAddress) if err != nil { return errors.Wrap(err, "failed to decode user address, this should never happen") } - found := false - for _, pk := range multisigPubKeys { - pkType := pk.Type() - if pkType != "secp256k1" { - return errors.New("invalid member pubkey type '" + pkType + "'") + + // cosmos + switch chainType { + case "cosmos": + var ms multisig.LegacyAminoPubKey + if err := legacy.Cdc.UnmarshalJSON([]byte(pubkeyJSON), &ms); err != nil { + return errors.Wrap(err, "failed to unmarshal multisig pubkey json") } - memberAddressBytes := pk.Address().Bytes() - if bytes.Equal(memberAddressBytes, userAddressBytes) { - found = true + multisigAddress, err = bech32.ConvertAndEncode(req.GetBech32Prefix(), ms.Address()) + if err != nil { + return errors.Wrap(err, "failed to encode multisig address") + } + + multisigPubKeys := ms.GetPubKeys() + if int(ms.Threshold) > len(multisigPubKeys) || ms.Threshold == 0 { + return errors.New("invalid threshold") + } + + found := false + for _, pk := range multisigPubKeys { + pkType := pk.Type() + if pkType != "secp256k1" { + return errors.New("invalid member pubkey type '" + pkType + "'") + } + memberAddressBytes := pk.Address().Bytes() + if bytes.Equal(memberAddressBytes, userAddressBytes) { + found = true + } + } + if !found { + return errors.New("user address is not a member of the multisig") + } + + threshold = ms.Threshold + for _, pk := range multisigPubKeys { + addresses = append(addresses, pk.Address().Bytes()) + } + + case "gno": + var pk gnocrypto.PubKey + err := gnoamino.UnmarshalJSON([]byte(pubkeyJSON), &pk) + if err != nil { + return fmt.Errorf("unmarshal pubkey: %w", err) + } + mspk, ok := pk.(gnomultisig.PubKeyMultisigThreshold) + if !ok { + return fmt.Errorf("invalid pubkey type: %T", mspk) + } + + multisigAddress = pk.Address().String() + threshold = uint32(mspk.K) + found := false + for _, pk := range mspk.PubKeys { + memberAddressBytes := pk.Address().Bytes() + if bytes.Equal(memberAddressBytes, userAddressBytes) { + found = true + } + addresses = append(addresses, memberAddressBytes) + } + if !found { + return errors.New("user address is not a member of the multisig") } - } - if !found { - return errors.New("user address is not a member of the multisig") } now := timeNow().UTC() var multisig Multisig - if err := tx.First(&multisig, "chain_id = ? AND address = ?", chainID, multisigAddress).Error; err != nil { + if err := tx.First(&multisig, "chain_type = ? AND chain_id = ? AND address = ?", chainType, chainID, multisigAddress).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { multisig = Multisig{ + ChainType: chainType, ChainID: chainID, Address: multisigAddress, PubKeyJSON: pubkeyJSON, CreatedAt: now, - Threshold: ms.Threshold, - MembersCount: uint32(len(multisigPubKeys)), + Threshold: threshold, + MembersCount: uint32(len(addresses)), } if err := tx.Save(&multisig).Error; err != nil { return errors.Wrap(err, "failed to save multisig") } - for _, pk := range multisigPubKeys { - addrBytes := pk.Address().Bytes() + for _, addrBytes := range addresses { userAddress, err := bech32.ConvertAndEncode(universalBech32Prefix, addrBytes) if err != nil { return errors.Wrap(err, "failed to encode user address") } var userMultisig UserMultisig - if err := tx.First(&userMultisig, "multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainID, userAddress, multisigAddress).Error; err != nil { + if err := tx.First(&userMultisig, "multisig_chain_type = ? AND multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainType, chainID, userAddress, multisigAddress).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { userMultisig = UserMultisig{ - MultisigChainID: chainID, - UserAddress: userAddress, - MultisigAddress: multisigAddress, - CreatedAt: now, - Joined: false, + MultisigChainType: chainType, + MultisigChainID: chainID, + UserAddress: userAddress, + MultisigAddress: multisigAddress, + CreatedAt: now, + Joined: false, } if err := tx.Save(&userMultisig).Error; err != nil { return errors.Wrap(err, "failed to save user multisig") @@ -429,15 +489,16 @@ func (s *multisigService) CreateOrJoinMultisig(_ context.Context, req *multisigp } var userMultisig UserMultisig - if err := tx.First(&userMultisig, "multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainID, userAddress, multisigAddress).Error; err != nil { + if err := tx.First(&userMultisig, "multisig_chain_type = ? AND multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainType, chainID, userAddress, multisigAddress).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { userMultisig = UserMultisig{ - MultisigChainID: chainID, - UserAddress: userAddress, - MultisigAddress: multisigAddress, - CreatedAt: now, - Joined: true, - Name: name, + MultisigChainType: chainType, + MultisigChainID: chainID, + UserAddress: userAddress, + MultisigAddress: multisigAddress, + CreatedAt: now, + Joined: true, + Name: name, } if err := tx.Save(&userMultisig).Error; err != nil { return errors.Wrap(err, "failed to save user multisig") @@ -479,9 +540,10 @@ func (s *multisigService) LeaveMultisig(_ context.Context, req *multisigpb.Leave if err := s.db.Transaction(func(tx *gorm.DB) error { chainID := req.GetChainId() multisigAddress := req.GetMultisigAddress() + chainType := req.GetChainType() var userMultisig UserMultisig - if err := tx.First(userMultisig, "multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainID, userAddress, multisigAddress).Error; err != nil { + if err := tx.First(userMultisig, "multisig_chain_type = ? AND multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainType, chainID, userAddress, multisigAddress).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("user is not a member of the multisig") } @@ -490,7 +552,7 @@ func (s *multisigService) LeaveMultisig(_ context.Context, req *multisigpb.Leave if userMultisig.Joined { if err := tx.Model(&UserMultisig{}). - Where("multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainID, userAddress, multisigAddress). + Where("multisig_chain_type = ? AND multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainType, chainID, userAddress, multisigAddress). UpdateColumn("joined", false). Error; err != nil { return errors.Wrap(err, "failed to update user multisig") @@ -521,7 +583,7 @@ func (s *multisigService) CreateTransaction(_ context.Context, req *multisigpb.C } if err := s.db.Transaction(func(tx *gorm.DB) error { - if err := tx.First(&UserMultisig{}, "multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", req.ChainId, userAddress, req.MultisigAddress).Error; err != nil { + if err := tx.First(&UserMultisig{}, "multisig_chain_type = ? AND multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", req.ChainType, req.ChainId, userAddress, req.MultisigAddress).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("user is not a member of the multisig") } @@ -542,14 +604,15 @@ func (s *multisigService) CreateTransaction(_ context.Context, req *multisigpb.C } if err := tx.Create(&Transaction{ - MultisigChainID: req.GetChainId(), - MultisigAddress: req.GetMultisigAddress(), - AccountNumber: req.GetAccountNumber(), - Sequence: req.GetSequence(), - MsgsJSON: datatypes.JSON(j), - FeeJSON: req.GetFeeJson(), - CreatorAddress: userAddress, - Type: kind, + MultisigChainID: req.GetChainId(), + MultisigAddress: req.GetMultisigAddress(), + MultisigChainType: req.GetChainType(), + AccountNumber: req.GetAccountNumber(), + Sequence: req.GetSequence(), + MsgsJSON: datatypes.JSON(j), + FeeJSON: req.GetFeeJson(), + CreatorAddress: userAddress, + Type: kind, }).Error; err != nil { return errors.Wrap(err, "failed to create transaction") } @@ -576,7 +639,7 @@ func (s *multisigService) SignTransaction(_ context.Context, req *multisigpb.Sig return errors.Wrap(err, "failed to find transaction") } - if err := tx.First(&UserMultisig{}, "multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", transaction.MultisigChainID, userAddress, transaction.MultisigAddress).Error; err != nil { + if err := tx.First(&UserMultisig{}, "multisig_chain_type = ? AND multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", transaction.MultisigChainType, transaction.MultisigChainID, userAddress, transaction.MultisigAddress).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("user is not a member of the multisig") } @@ -616,7 +679,7 @@ func (s *multisigService) CompleteTransaction(_ context.Context, req *multisigpb } var userMultisig UserMultisig - if err := tx.First(&userMultisig, "multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", transaction.MultisigChainID, userAddress, transaction.MultisigAddress).Error; err != nil { + if err := tx.First(&userMultisig, "multisig_chain_type = ? AND multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", transaction.MultisigChainType, transaction.MultisigChainID, userAddress, transaction.MultisigAddress).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("user is not a member of the multisig") } @@ -636,12 +699,13 @@ func (s *multisigService) CompleteTransaction(_ context.Context, req *multisigpb AND t.final_hash IS NULL AND t.multisig_address = ? AND t.multisig_chain_id = ? + AND t.multisig_chain_type = ? ) - `, userMultisig.MultisigAddress, userMultisig.MultisigChainID).Error; err != nil { + `, userMultisig.MultisigAddress, userMultisig.MultisigChainID, userMultisig.MultisigChainType).Error; err != nil { return errors.Wrap(err, "failed to delete signatures") } - if err := tx.Model(&Transaction{}).Where("final_hash IS NULL AND multisig_address = ? AND multisig_chain_id = ?", userMultisig.MultisigAddress, userMultisig.MultisigChainID).UpdateColumn("sequence", transaction.Sequence+1).Error; err != nil { + if err := tx.Model(&Transaction{}).Where("final_hash IS NULL AND multisig_address = ? AND multisig_chain_id = ? AND multisig_chain_type = ?", userMultisig.MultisigAddress, userMultisig.MultisigChainID, userMultisig.MultisigChainType).UpdateColumn("sequence", transaction.Sequence+1).Error; err != nil { return errors.Wrap(err, "failed to update sequence") } @@ -659,6 +723,10 @@ func (s *multisigService) ClearSignatures(_ context.Context, req *multisigpb.Cle return nil, errors.Wrap(err, "failed to authenticate") } + chainType := req.GetChainType() + if chainType == "" { + return nil, errors.New("multisig chain type is required") + } multisigChainID := req.GetMultisigChainId() if multisigChainID == "" { return nil, errors.New("multisig chain id is required") @@ -671,7 +739,7 @@ func (s *multisigService) ClearSignatures(_ context.Context, req *multisigpb.Cle if err := s.db.Transaction(func(tx *gorm.DB) error { var userMultisig UserMultisig - if err := tx.First(&userMultisig, "multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", multisigChainID, userAddress, multisigAddress).Error; err != nil { + if err := tx.First(&userMultisig, "multisig_chain_type = ? AND multisig_chain_id = ? AND user_address = ? AND multisig_address = ?", chainType, multisigChainID, userAddress, multisigAddress).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("user is not a member of the multisig") } @@ -687,8 +755,9 @@ func (s *multisigService) ClearSignatures(_ context.Context, req *multisigpb.Cle AND t.final_hash IS NULL AND t.multisig_address = ? AND t.multisig_chain_id = ? + AND t.multisig_chain_type = ? ) - `, userMultisig.MultisigAddress, userMultisig.MultisigChainID).Error; err != nil { + `, userMultisig.MultisigAddress, userMultisig.MultisigChainID, userMultisig.MultisigChainType).Error; err != nil { return errors.Wrap(err, "failed to delete signatures") } diff --git a/go/pkg/multisig/multisig_test.go b/go/pkg/multisig/multisig_test.go index 3353728b71..9c41343b9c 100644 --- a/go/pkg/multisig/multisig_test.go +++ b/go/pkg/multisig/multisig_test.go @@ -8,6 +8,9 @@ import ( "time" "github.com/TERITORI/teritori-dapp/go/pkg/multisigpb" + "github.com/gnolang/gno/tm2/pkg/amino" + "github.com/gnolang/gno/tm2/pkg/crypto" + "github.com/gnolang/gno/tm2/pkg/crypto/multisig" "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" ) @@ -132,3 +135,33 @@ func TestToken(t *testing.T) { err = validateToken(publicKey, token) require.ErrorContains(t, err, "expired") } + +func TestMarshalGnoPubkey(t *testing.T) { + // sanity test + pksStrs := []string{ + "gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pqg9pgsxmp93u54zk5pd6wmnyt7g6v52vxyctav9hwqm8u02cndl3586qeu6", + "gpub1pgfj7ard9eg82cjtv4u4xetrwqer2dntxyfzxz3pq0wmasqx932pdhlkzx7vn40qay2jxscv5n38ypyfalrsyr4acxq4u0t9u65", + } + pks := []crypto.PubKey{} + for _, pkStr := range pksStrs { + pk, err := crypto.PubKeyFromBech32(pkStr) + require.NoError(t, err) + pks = append(pks, pk) + } + mspk := multisig.NewPubKeyMultisigThreshold(1, pks) + bz, err := amino.MarshalJSONAny(mspk) + require.NoError(t, err) + + require.Equal(t, "{\"@type\":\"/tm.PubKeyMultisig\",\"threshold\":\"1\",\"pubkeys\":[{\"@type\":\"/tm.PubKeySecp256k1\",\"value\":\"AgoUQNsJY8pUVqBbp25kX5GmUUwxML6wt3A2fj1Ym38a\"},{\"@type\":\"/tm.PubKeySecp256k1\",\"value\":\"A92+wAYsVBbf9hG8ydXg6RUjQwyk4nIEie/HAg69wYFe\"}]}", string(bz)) + + var pk crypto.PubKey + err = amino.UnmarshalJSON(bz, &pk) + require.NoError(t, err) + switch tpk := pk.(type) { + case multisig.PubKeyMultisigThreshold: + require.Equal(t, uint(1), tpk.K) + require.Equal(t, pks, tpk.PubKeys) + default: + t.Fatalf("invalid pk type after unmarshal: %T", tpk) + } +} diff --git a/go/pkg/multisigpb/multisig.pb.go b/go/pkg/multisigpb/multisig.pb.go index fd11b5796d..a38fc57993 100644 --- a/go/pkg/multisigpb/multisig.pb.go +++ b/go/pkg/multisigpb/multisig.pb.go @@ -132,6 +132,7 @@ type Multisig struct { PubkeyJson string `protobuf:"bytes,7,opt,name=pubkey_json,json=pubkeyJson,proto3" json:"pubkey_json,omitempty"` UsersAddresses []string `protobuf:"bytes,8,rep,name=users_addresses,json=usersAddresses,proto3" json:"users_addresses,omitempty"` Threshold uint32 `protobuf:"varint,9,opt,name=threshold,proto3" json:"threshold,omitempty"` + ChainType string `protobuf:"bytes,10,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *Multisig) Reset() { @@ -222,6 +223,13 @@ func (x *Multisig) GetThreshold() uint32 { return 0 } +func (x *Multisig) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + type Signature struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -305,6 +313,7 @@ type Transaction struct { Signatures []*Signature `protobuf:"bytes,13,rep,name=signatures,proto3" json:"signatures,omitempty"` MultisigPubkeyJson string `protobuf:"bytes,14,opt,name=multisig_pubkey_json,json=multisigPubkeyJson,proto3" json:"multisig_pubkey_json,omitempty"` Id uint32 `protobuf:"varint,15,opt,name=id,proto3" json:"id,omitempty"` + ChainType string `protobuf:"bytes,16,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *Transaction) Reset() { @@ -444,6 +453,13 @@ func (x *Transaction) GetId() uint32 { return 0 } +func (x *Transaction) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + // we use string here because browser storage poorly supports bytes type Token struct { state protoimpl.MessageState @@ -589,6 +605,7 @@ type MultisigsRequest struct { StartAfter string `protobuf:"bytes,3,opt,name=start_after,json=startAfter,proto3" json:"start_after,omitempty"` ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` JoinState JoinState `protobuf:"varint,5,opt,name=join_state,json=joinState,proto3,enum=multisig.v1.JoinState" json:"join_state,omitempty"` + ChainType string `protobuf:"bytes,6,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *MultisigsRequest) Reset() { @@ -658,6 +675,13 @@ func (x *MultisigsRequest) GetJoinState() JoinState { return JoinState_JOIN_STATE_UNSPECIFIED } +func (x *MultisigsRequest) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + type MultisigsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -713,6 +737,7 @@ type MultisigInfoRequest struct { AuthToken *Token `protobuf:"bytes,1,opt,name=auth_token,json=authToken,proto3" json:"auth_token,omitempty"` MultisigAddress string `protobuf:"bytes,2,opt,name=multisig_address,json=multisigAddress,proto3" json:"multisig_address,omitempty"` ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ChainType string `protobuf:"bytes,4,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *MultisigInfoRequest) Reset() { @@ -768,6 +793,13 @@ func (x *MultisigInfoRequest) GetChainId() string { return "" } +func (x *MultisigInfoRequest) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + type MultisigInfoResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -827,6 +859,7 @@ type TransactionsRequest struct { ChainId string `protobuf:"bytes,5,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` Types []string `protobuf:"bytes,6,rep,name=types,proto3" json:"types,omitempty"` ExecutionState ExecutionState `protobuf:"varint,7,opt,name=execution_state,json=executionState,proto3,enum=multisig.v1.ExecutionState" json:"execution_state,omitempty"` + ChainType string `protobuf:"bytes,8,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *TransactionsRequest) Reset() { @@ -910,6 +943,13 @@ func (x *TransactionsRequest) GetExecutionState() ExecutionState { return ExecutionState_EXECUTION_STATE_UNSPECIFIED } +func (x *TransactionsRequest) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + type TransactionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -967,6 +1007,7 @@ type CreateOrJoinMultisigRequest struct { AuthToken *Token `protobuf:"bytes,3,opt,name=auth_token,json=authToken,proto3" json:"auth_token,omitempty"` Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` Bech32Prefix string `protobuf:"bytes,5,opt,name=bech32_prefix,json=bech32Prefix,proto3" json:"bech32_prefix,omitempty"` + ChainType string `protobuf:"bytes,6,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *CreateOrJoinMultisigRequest) Reset() { @@ -1036,6 +1077,13 @@ func (x *CreateOrJoinMultisigRequest) GetBech32Prefix() string { return "" } +func (x *CreateOrJoinMultisigRequest) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + type CreateOrJoinMultisigResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1107,6 +1155,7 @@ type LeaveMultisigRequest struct { MultisigAddress string `protobuf:"bytes,1,opt,name=multisig_address,json=multisigAddress,proto3" json:"multisig_address,omitempty"` AuthToken *Token `protobuf:"bytes,2,opt,name=auth_token,json=authToken,proto3" json:"auth_token,omitempty"` ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ChainType string `protobuf:"bytes,4,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *LeaveMultisigRequest) Reset() { @@ -1162,6 +1211,13 @@ func (x *LeaveMultisigRequest) GetChainId() string { return "" } +func (x *LeaveMultisigRequest) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + type LeaveMultisigResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1221,6 +1277,7 @@ type CreateTransactionRequest struct { Msgs []*anypb.Any `protobuf:"bytes,6,rep,name=msgs,proto3" json:"msgs,omitempty"` FeeJson string `protobuf:"bytes,7,opt,name=fee_json,json=feeJson,proto3" json:"fee_json,omitempty"` ChainId string `protobuf:"bytes,8,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ChainType string `protobuf:"bytes,9,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *CreateTransactionRequest) Reset() { @@ -1304,6 +1361,13 @@ func (x *CreateTransactionRequest) GetChainId() string { return "" } +func (x *CreateTransactionRequest) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + type CreateTransactionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1561,6 +1625,7 @@ type ClearSignaturesRequest struct { MultisigChainId string `protobuf:"bytes,2,opt,name=multisig_chain_id,json=multisigChainId,proto3" json:"multisig_chain_id,omitempty"` MultisigAddress string `protobuf:"bytes,3,opt,name=multisig_address,json=multisigAddress,proto3" json:"multisig_address,omitempty"` Sequence uint32 `protobuf:"varint,4,opt,name=sequence,proto3" json:"sequence,omitempty"` + ChainType string `protobuf:"bytes,5,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *ClearSignaturesRequest) Reset() { @@ -1623,6 +1688,13 @@ func (x *ClearSignaturesRequest) GetSequence() uint32 { return 0 } +func (x *ClearSignaturesRequest) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + type ClearSignaturesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1927,6 +1999,7 @@ type TransactionsCountsRequest struct { AuthToken *Token `protobuf:"bytes,1,opt,name=auth_token,json=authToken,proto3" json:"auth_token,omitempty"` MultisigAddress string `protobuf:"bytes,2,opt,name=multisig_address,json=multisigAddress,proto3" json:"multisig_address,omitempty"` // if unspecified, return transactions for all multisigs of this user ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ChainType string `protobuf:"bytes,4,opt,name=chain_type,json=chainType,proto3" json:"chain_type,omitempty"` } func (x *TransactionsCountsRequest) Reset() { @@ -1982,6 +2055,13 @@ func (x *TransactionsCountsRequest) GetChainId() string { return "" } +func (x *TransactionsCountsRequest) GetChainType() string { + if x != nil { + return x.ChainType + } + return "" +} + type TransactionsCount struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2200,7 +2280,7 @@ var file_multisig_v1_multisig_proto_rawDesc = []byte{ 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf2, 0x01, 0x0a, 0x08, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x91, 0x02, 0x0a, 0x08, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, @@ -2215,357 +2295,376 @@ var file_multisig_v1_multisig_proto_rawDesc = []byte{ 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x63, 0x0a, 0x09, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x93, - 0x04, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x12, 0x29, 0x0a, 0x10, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x49, 0x64, 0x12, 0x28, 0x0a, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, - 0x66, 0x65, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x66, 0x65, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, - 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x36, 0x0a, 0x0a, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x70, - 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, - 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, - 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, - 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x22, 0x6c, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, - 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x63, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xb2, 0x04, + 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x12, 0x29, 0x0a, 0x10, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, + 0x64, 0x12, 0x28, 0x0a, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, + 0x65, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, + 0x65, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x12, 0x36, 0x0a, 0x0a, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x70, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x4a, + 0x73, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, + 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x22, 0xce, 0x01, 0x0a, 0x10, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, - 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, - 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x0a, 0x6a, 0x6f, - 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, - 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x22, 0x48, 0x0a, 0x11, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, - 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x52, 0x09, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x13, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x22, 0x6c, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0xed, + 0x01, 0x0a, 0x10, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, - 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x49, 0x0a, 0x14, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x08, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x22, 0xa1, 0x02, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, - 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x54, 0x0a, 0x14, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xd6, 0x01, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x4a, 0x6f, - 0x69, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, - 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x73, 0x69, 0x67, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x31, - 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x65, 0x63, 0x68, 0x33, 0x32, 0x5f, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x65, - 0x63, 0x68, 0x33, 0x32, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x7b, 0x0a, 0x1c, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, - 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x10, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x14, 0x4c, 0x65, 0x61, 0x76, - 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x31, 0x0a, 0x0a, 0x61, - 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, + 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, + 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x48, + 0x0a, 0x11, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x09, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x2b, 0x0a, 0x15, 0x4c, 0x65, 0x61, - 0x76, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x9b, 0x02, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, - 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x49, 0x0a, 0x14, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x08, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x22, 0xc0, 0x02, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, + 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x12, 0x44, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x54, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, + 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf5, 0x01, 0x0a, + 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x50, + 0x75, 0x62, 0x6b, 0x65, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x65, 0x63, 0x68, 0x33, 0x32, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x65, 0x63, 0x68, 0x33, 0x32, 0x50, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x22, 0x7b, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, + 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x12, 0x19, - 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x66, 0x65, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x49, 0x64, 0x22, 0x1b, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xaf, 0x01, 0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x73, 0x22, 0xae, 0x01, 0x0a, 0x14, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, + 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x65, 0x66, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x65, 0x66, 0x74, 0x22, + 0xba, 0x02, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x53, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x95, - 0x01, 0x0a, 0x1a, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, - 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x6e, - 0x61, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x22, 0x1d, 0x0a, 0x1b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x16, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, - 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x34, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x63, 0x68, 0x61, - 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x10, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, - 0x34, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6c, - 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x62, 0x65, - 0x63, 0x68, 0x33, 0x32, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x42, 0x65, 0x63, 0x68, 0x33, 0x32, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, - 0x65, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, - 0x73, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x55, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x66, 0x6f, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x25, 0x0a, - 0x0e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x22, 0x45, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, + 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0d, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, + 0x04, 0x6d, 0x73, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x04, 0x6d, 0x73, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x66, 0x65, 0x65, 0x5f, 0x6a, + 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x65, 0x65, 0x4a, 0x73, + 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x1b, 0x0a, 0x19, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xaf, 0x01, 0x0a, 0x16, 0x53, 0x69, + 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, + 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x53, + 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x95, 0x01, 0x0a, 0x1a, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, + 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x22, 0x1d, + 0x0a, 0x1b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdd, 0x01, + 0x0a, 0x16, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x19, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x29, 0x0a, 0x10, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x49, 0x64, 0x22, 0x73, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x37, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x75, 0x6c, 0x74, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x19, 0x0a, + 0x17, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, + 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x4c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, + 0x65, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, + 0x67, 0x65, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x22, 0xb4, 0x01, + 0x0a, 0x10, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, + 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, + 0x65, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x12, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x62, 0x65, 0x63, 0x68, 0x33, 0x32, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x42, 0x65, + 0x63, 0x68, 0x33, 0x32, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, + 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x6f, 0x5f, + 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x66, 0x6f, + 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x75, 0x73, + 0x65, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x45, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, + 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x22, 0x73, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, + 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x87, 0x01, + 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x03, + 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x62, 0x79, 0x54, 0x79, 0x70, - 0x65, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x17, 0x0a, 0x15, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x4e, 0x0a, 0x09, 0x4a, 0x6f, 0x69, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, - 0x0a, 0x0d, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x10, - 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x4f, 0x55, 0x54, 0x10, 0x02, 0x2a, 0x6c, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x58, 0x45, 0x43, 0x55, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x45, 0x58, 0x45, 0x43, - 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, - 0x44, 0x10, 0x02, 0x32, 0xb3, 0x09, 0x0a, 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x09, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x73, 0x69, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0c, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, - 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, - 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x12, 0x28, 0x2e, 0x6d, + 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x37, + 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x06, 0x62, 0x79, 0x54, 0x79, 0x70, 0x65, 0x22, 0x49, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x31, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x17, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x4e, 0x0a, 0x09, 0x4a, + 0x6f, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4a, 0x4f, 0x49, 0x4e, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4a, 0x4f, 0x49, 0x4e, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x02, 0x2a, 0x6c, 0x0a, 0x0e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, + 0x1b, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, + 0x0a, 0x17, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x45, + 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, + 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x44, 0x10, 0x02, 0x32, 0xb3, 0x09, 0x0a, 0x0f, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, + 0x09, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0c, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x20, 0x2e, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, + 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, + 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, + 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, + 0x69, 0x67, 0x12, 0x28, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x4a, 0x6f, 0x69, - 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, - 0x69, 0x67, 0x12, 0x21, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, - 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, - 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x23, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x13, 0x43, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0f, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x53, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x65, 0x61, - 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, - 0x6e, 0x67, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x4c, 0x65, 0x61, 0x76, 0x65, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x12, 0x21, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x62, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x68, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x0f, 0x43, + 0x6c, 0x65, 0x61, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x23, + 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x65, + 0x61, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0c, 0x47, 0x65, 0x74, + 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6c, 0x6c, + 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, + 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x2e, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x0e, 0x5a, 0x0c, 0x2e, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/networks.json b/networks.json index 989c9210c9..678759f67d 100644 --- a/networks.json +++ b/networks.json @@ -17,7 +17,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "8ball", "addressPrefix": "8ball", @@ -76,7 +78,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "acrechain", "addressPrefix": "acre", @@ -125,7 +129,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "agoric", "addressPrefix": "agoric", @@ -164,7 +170,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "aioz", "addressPrefix": "aioz", @@ -203,7 +211,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "akash", "addressPrefix": "akash", @@ -242,7 +252,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "andromeda", "addressPrefix": "andr", @@ -281,7 +293,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "celestiatestnet2", "addressPrefix": "celestia", @@ -329,7 +343,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "archway", "addressPrefix": "archway", @@ -368,7 +384,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "archwaytestnet", "addressPrefix": "archway", @@ -407,7 +425,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "arkeonetworktestnet", "addressPrefix": "tarkeo", @@ -445,7 +465,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "arkh", "addressPrefix": "arkh", @@ -484,7 +506,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "artelatestnet", "addressPrefix": "art", @@ -522,7 +546,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "assetmantle", "addressPrefix": "mantle", @@ -561,7 +587,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "auratestnet", "addressPrefix": "aura", @@ -600,7 +628,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "aura", "addressPrefix": "aura", @@ -969,7 +999,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "axelar", "addressPrefix": "axelar", @@ -1078,7 +1110,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "axelartestnet", "addressPrefix": "axelar", @@ -1116,7 +1150,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "babylontestnet", "addressPrefix": "bbn", @@ -1155,7 +1191,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "bandchain", "addressPrefix": "band", @@ -1194,7 +1232,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "beezee", "addressPrefix": "bze", @@ -1233,7 +1273,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "bitcanna", "addressPrefix": "bcna", @@ -1272,7 +1314,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "bitcannadevnet", "addressPrefix": "bcna", @@ -1310,7 +1354,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "bitcannadevnet2", "addressPrefix": "bcna", @@ -1498,7 +1544,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "bitsong", "addressPrefix": "bitsong", @@ -1537,7 +1585,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "celestiatestnet", "addressPrefix": "celestia", @@ -1595,7 +1645,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "bluzelle", "addressPrefix": "bluzelle", @@ -1674,7 +1726,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "bostrom", "addressPrefix": "bostrom", @@ -1713,7 +1767,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "canto", "addressPrefix": "canto", @@ -1862,7 +1918,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "carbon", "addressPrefix": "swth", @@ -1901,7 +1959,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cascadiatestnet", "addressPrefix": "cascadia", @@ -1940,7 +2000,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "celestia", "addressPrefix": "celestia", @@ -1979,7 +2041,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cerberus", "addressPrefix": "cerberus", @@ -2018,7 +2082,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "chain4energy", "addressPrefix": "c4e", @@ -2057,7 +2123,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "chain4energytestnet", "addressPrefix": "c4e", @@ -2096,7 +2164,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cheqd", "addressPrefix": "cheqd", @@ -2135,7 +2205,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cheqdtestnet", "addressPrefix": "cheqd", @@ -2244,7 +2316,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "chihuahua", "addressPrefix": "chihuahua", @@ -2283,7 +2357,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "chimba", "addressPrefix": "chimba", @@ -2322,7 +2398,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "chimbatestnet", "addressPrefix": "chimba", @@ -2370,7 +2448,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "chronicnetwork", "addressPrefix": "chronic", @@ -2428,7 +2508,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "comdex", "addressPrefix": "comdex", @@ -2477,7 +2559,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "commercionetwork", "addressPrefix": "did:com:", @@ -2516,7 +2600,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "composable", "addressPrefix": "centauri", @@ -2555,7 +2641,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "composabletestnet", "addressPrefix": "centauri", @@ -2593,7 +2681,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "conscious", "addressPrefix": "cvn", @@ -2632,7 +2722,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "coolcattestnet", "addressPrefix": "ccat", @@ -2670,7 +2762,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "coreumtestnet", "addressPrefix": "testcore", @@ -2697,7 +2791,9 @@ "chainId": "cosmoshub-4", "displayName": "Cosmos Hub", "icon": "cosmos-hub.svg", - "features": [], + "features": [ + "NativeStaking" + ], "currencies": [ { "denom": "uatom", @@ -2741,7 +2837,9 @@ "chainId": "theta-testnet-001", "displayName": "Cosmos Hub Theta Testnet", "icon": "cosmos-hub.svg", - "features": [], + "features": [ + "NativeStaking" + ], "overrides": "cosmos-registry:cosmoshubtestnet", "registryName": "cosmoshubtestnet", "currencies": [ @@ -2807,7 +2905,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cosmwasmtestnet", "addressPrefix": "wasm", @@ -2855,7 +2955,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "coss", "addressPrefix": "coss", @@ -2894,7 +2996,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cosstestnet", "addressPrefix": "coss", @@ -2942,7 +3046,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "crescent", "addressPrefix": "cre", @@ -2981,7 +3087,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cronos", "addressPrefix": "crc", @@ -3020,7 +3128,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cryptoorgchain", "addressPrefix": "cro", @@ -3059,7 +3169,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cudos", "addressPrefix": "cudos", @@ -3098,7 +3210,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "cudostestnet", "addressPrefix": "cudos", @@ -3136,7 +3250,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "deardogetestnet", "addressPrefix": "deardoge", @@ -3174,7 +3290,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "decentr", "addressPrefix": "decentr", @@ -3213,7 +3331,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "desmos", "addressPrefix": "desmos", @@ -3252,7 +3372,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "desmostestnet", "addressPrefix": "desmos", @@ -3291,7 +3413,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "selfchaindevnet", "addressPrefix": "self", @@ -3329,7 +3453,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "dig", "addressPrefix": "dig", @@ -3368,7 +3494,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "doravota", "addressPrefix": "dora", @@ -3406,7 +3534,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "doravotatestnet2", "addressPrefix": "dora", @@ -3444,7 +3574,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "doravotatestnet", "addressPrefix": "dora", @@ -3482,7 +3614,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "dydx", "addressPrefix": "dydx", @@ -3521,7 +3655,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "dydxtestnet", "addressPrefix": "dydx", @@ -3560,7 +3696,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "dyson", "addressPrefix": "dys", @@ -3649,7 +3787,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "emoney", "addressPrefix": "emoney", @@ -3688,7 +3828,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "echelon", "addressPrefix": "echelon", @@ -3737,7 +3879,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "elystestnet", "addressPrefix": "elys", @@ -3775,7 +3919,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "empowertestnet", "addressPrefix": "empower", @@ -3813,7 +3959,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "empowerchain", "addressPrefix": "empower", @@ -3851,7 +3999,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "entrypointtestnet", "addressPrefix": "entrypoint", @@ -3982,7 +4132,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "ethos", "addressPrefix": "ethos", @@ -4031,7 +4183,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "evmos", "addressPrefix": "evmos", @@ -4070,7 +4224,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "evmostestnet", "addressPrefix": "evmos", @@ -4118,7 +4274,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "fxcore", "addressPrefix": "fx", @@ -4166,7 +4324,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "fetchhub", "addressPrefix": "fetch", @@ -4205,7 +4365,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "fetchhubtestnet", "addressPrefix": "fetch", @@ -4243,7 +4405,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "firmachain", "addressPrefix": "firma", @@ -4282,7 +4446,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "furya", "addressPrefix": "furya", @@ -4321,7 +4487,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "galaxy", "addressPrefix": "galaxy", @@ -4360,7 +4528,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "genesisl1", "addressPrefix": "genesis", @@ -4399,7 +4569,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "gitopia", "addressPrefix": "gitopia", @@ -4438,7 +4610,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "gitopiatestnet", "addressPrefix": "gitopia", @@ -4533,7 +4707,8 @@ "toriPkgPath": "gno.land/r/teritori/tori", "nameServiceDefaultImage": "ipfs://bafkreigqm3i4urywxohvpkbz5sgxosiogwn433ufmzz7eqldjxoi6xmwma", "gnowebURL": "http://127.0.0.1:8888", - "txIndexerURL": "http://127.0.0.1:8546" + "txIndexerURL": "http://127.0.0.1:8546", + "addressPrefix": "g" }, { "id": "gno-portal", @@ -4584,7 +4759,8 @@ "daoUtilsPkgPath": "gno.land/p/teritori/dao_utils", "toriPkgPath": "gno.land/r/teritori/tori", "profilePkgPath": "gno.land/r/demo/profile", - "txIndexerURL": "https://indexer.portal-loop.gno.testnet.teritori.com" + "txIndexerURL": "https://indexer.portal-loop.gno.testnet.teritori.com", + "addressPrefix": "g" }, { "id": "gno-zenao", @@ -4627,7 +4803,8 @@ "cockpitNamespace": "zenao", "txExplorer": "https://gnoscan.io/transactions/details?txhash=$hash&type=custom&chainId=zenao-dev&rpcUrl=https://gnorpc.prod.zenao.io/&indexerUrl=https://indexer.zenao.gno.testnet.teritori.com", "accountExplorer": "https://gnoscan.io/accounts/$address?type=custom&chainId=zenao-dev&rpcUrl=https://gnorpc.prod.zenao.io/&indexerUrl=https://indexer.zenao.gno.testnet.teritori.com", - "contractExplorer": "https://gnoscan.io/realms/details?path=$address&type=custom&chainId=zenao-dev&rpcUrl=https://gnorpc.prod.zenao.io/&indexerUrl=https://indexer.zenao.gno.testnet.teritori.com" + "contractExplorer": "https://gnoscan.io/realms/details?path=$address&type=custom&chainId=zenao-dev&rpcUrl=https://gnorpc.prod.zenao.io/&indexerUrl=https://indexer.zenao.gno.testnet.teritori.com", + "addressPrefix": "g" }, { "id": "gno-zenao-staging", @@ -4670,7 +4847,8 @@ "cockpitNamespace": "zenao", "txExplorer": "https://gnoscan.io/transactions/details?txhash=$hash&type=custom&chainId=zenao-dev-staging&rpcUrl=https://gnorpc.staging.zenao.io/&indexerUrl=https://indexer.zenao.gno.testnet.teritori.com", "accountExplorer": "https://gnoscan.io/accounts/$address?type=custom&chainId=zenao-dev-staging&rpcUrl=https://gnorpc.staging.zenao.io/&indexerUrl=https://indexer.zenao.gno.testnet.teritori.com", - "contractExplorer": "https://gnoscan.io/realms/details?path=$address&type=custom&chainId=zenao-dev-staging&rpcUrl=https://gnorpc.staging.zenao.io/&indexerUrl=https://indexer.zenao.gno.testnet.teritori.com" + "contractExplorer": "https://gnoscan.io/realms/details?path=$address&type=custom&chainId=zenao-dev-staging&rpcUrl=https://gnorpc.staging.zenao.io/&indexerUrl=https://indexer.zenao.gno.testnet.teritori.com", + "addressPrefix": "g" }, { "id": "cosmos-registry:gravitybridge", @@ -4780,7 +4958,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "gravitybridge", "addressPrefix": "gravity", @@ -4819,7 +4999,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "haqq", "addressPrefix": "haqq", @@ -4878,7 +5060,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "highbury", "addressPrefix": "fury", @@ -4917,7 +5101,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "humanstestnet", "addressPrefix": "humans", @@ -4955,7 +5141,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "humans", "addressPrefix": "human", @@ -4994,7 +5182,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "hypersigntestnet", "addressPrefix": "hid", @@ -5032,7 +5222,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "idep", "addressPrefix": "idep", @@ -5071,7 +5263,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "imversed", "addressPrefix": "imv", @@ -5110,7 +5304,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "imversedtestnet", "addressPrefix": "imv", @@ -5188,7 +5384,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "injective", "addressPrefix": "inj", @@ -5227,7 +5425,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "injectivetestnet", "addressPrefix": "inj", @@ -5265,7 +5465,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "overrides": "cosmos-registry:irisnet", "registryName": "irisnet", @@ -5305,7 +5507,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "impacthub", "addressPrefix": "ixo", @@ -5344,7 +5548,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "impacthubdevnet", "addressPrefix": "ixo", @@ -5382,7 +5588,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "impacthubtestnet", "addressPrefix": "ixo", @@ -5421,7 +5629,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "jackal", "addressPrefix": "jkl", @@ -5460,7 +5670,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "jackaltestnet", "addressPrefix": "jkl", @@ -6168,7 +6380,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "juno", "addressPrefix": "juno", @@ -6217,7 +6431,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "junotestnet", "addressPrefix": "juno", @@ -6295,7 +6511,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "kava", "addressPrefix": "kava", @@ -6344,7 +6562,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "kichain", "addressPrefix": "ki", @@ -6383,7 +6603,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "kichaintestnet", "addressPrefix": "tki", @@ -6421,7 +6643,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "konstellation", "addressPrefix": "darc", @@ -6610,7 +6834,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "kujira", "addressPrefix": "kujira", @@ -6659,7 +6885,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "kujiratestnet", "addressPrefix": "kujira", @@ -6697,7 +6925,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "kyve", "addressPrefix": "kyve", @@ -6736,7 +6966,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "kyvetestnet", "addressPrefix": "kyve", @@ -6774,7 +7006,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "kyvedevnet", "addressPrefix": "kyve", @@ -6812,7 +7046,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "lambda", "addressPrefix": "lamb", @@ -6851,7 +7087,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "lavatestnet", "addressPrefix": "lava@", @@ -6890,7 +7128,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "likecoin", "addressPrefix": "like", @@ -6929,7 +7169,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "likecointestnet", "addressPrefix": "like", @@ -6968,7 +7210,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "logos", "addressPrefix": "logos", @@ -7007,7 +7251,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "loyal", "addressPrefix": "loyal", @@ -7046,7 +7292,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "lumnetwork", "addressPrefix": "lum", @@ -7085,7 +7333,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "lumenx", "addressPrefix": "lumen", @@ -7124,7 +7374,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "lumenxtestnet", "addressPrefix": "lumen", @@ -7162,7 +7414,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "mars", "addressPrefix": "mars", @@ -7201,7 +7455,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "marstestnet", "addressPrefix": "mars", @@ -7250,7 +7506,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "mayachain", "addressPrefix": "maya", @@ -7288,7 +7546,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "medasdigital", "addressPrefix": "medas", @@ -7327,7 +7587,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "panacea", "addressPrefix": "panacea", @@ -7366,7 +7628,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "meme", "addressPrefix": "meme", @@ -7405,7 +7669,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "microtick", "addressPrefix": "micro", @@ -7524,7 +7790,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "migaloo", "addressPrefix": "migaloo", @@ -7563,7 +7831,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "migalootestnet", "addressPrefix": "migaloo", @@ -7602,7 +7872,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "mises", "addressPrefix": "mises", @@ -7641,7 +7913,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "celestiatestnet3", "addressPrefix": "celestia", @@ -7679,7 +7953,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "mun", "addressPrefix": "mun", @@ -7718,7 +7994,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "mythos", "addressPrefix": "mythos", @@ -7887,7 +8165,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "neutron", "addressPrefix": "neutron", @@ -7926,7 +8206,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "neutrontestnet", "addressPrefix": "neutron", @@ -7965,7 +8247,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "nibiru", "addressPrefix": "nibi", @@ -8024,7 +8308,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "noble", "addressPrefix": "noble", @@ -8093,7 +8379,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "nobletestnet", "addressPrefix": "noble", @@ -8131,7 +8419,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "nois", "addressPrefix": "nois", @@ -8170,7 +8460,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "noistestnet", "addressPrefix": "nois", @@ -8209,7 +8501,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "nolus", "addressPrefix": "nolus", @@ -8248,7 +8542,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "nolustestnet", "addressPrefix": "nolus", @@ -8297,7 +8593,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "nomic", "addressPrefix": "nomic", @@ -8346,7 +8644,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "nyx", "addressPrefix": "n", @@ -8385,7 +8685,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "octa", "addressPrefix": "octa", @@ -8444,7 +8746,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "odin", "addressPrefix": "odin", @@ -8483,7 +8787,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "okexchain", "addressPrefix": "ex", @@ -8522,7 +8828,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "okp4testnet", "addressPrefix": "okp4", @@ -8561,7 +8869,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "omniflixhub", "addressPrefix": "omniflix", @@ -8600,7 +8910,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "onomy", "addressPrefix": "onomy", @@ -8639,7 +8951,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "oraichain", "addressPrefix": "orai", @@ -8668,7 +8982,8 @@ "displayName": "Osmosis", "icon": "osmosis.svg", "features": [ - "Swap" + "Swap", + "NativeStaking" ], "overrides": "cosmos-registry:osmosis", "currencies": [ @@ -8746,7 +9061,8 @@ "displayName": "Osmosis Latest Testnet", "icon": "osmosis.svg", "features": [ - "Swap" + "Swap", + "NativeStaking" ], "currencies": [ { @@ -8831,7 +9147,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "osmosistestnet4", "addressPrefix": "osmo", @@ -8870,7 +9188,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "passage", "addressPrefix": "pasg", @@ -8909,7 +9229,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "passage1", "addressPrefix": "pasg", @@ -8968,7 +9290,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "persistence", "addressPrefix": "persistence", @@ -9017,7 +9341,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "persistencetestnet", "addressPrefix": "persistence", @@ -9085,7 +9411,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "persistencetestnet2", "addressPrefix": "persistence", @@ -9123,7 +9451,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "planq", "addressPrefix": "plq", @@ -9162,7 +9492,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "point", "addressPrefix": "point", @@ -9189,7 +9521,8 @@ "displayName": "Polygon Mainnet", "icon": "polygon.svg", "features": [ - "RiotP2E" + "RiotP2E", + "NativeStaking" ], "currencies": [ { @@ -9285,7 +9618,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "provenance", "addressPrefix": "pb", @@ -9324,7 +9659,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "pryzmtestnet", "addressPrefix": "pryzm", @@ -9363,7 +9700,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "pundix", "addressPrefix": "px", @@ -9402,7 +9741,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "quasar", "addressPrefix": "quasar", @@ -9461,7 +9802,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "quasartestnet", "addressPrefix": "quasar", @@ -9550,7 +9893,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "quicksilver", "addressPrefix": "quick", @@ -9589,7 +9934,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "quicksilvertestnet", "addressPrefix": "quick", @@ -9628,7 +9975,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "qwoyn", "addressPrefix": "qwoyn", @@ -9667,7 +10016,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "qwoyntestnet", "addressPrefix": "qwoyn", @@ -9716,7 +10067,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "realio", "addressPrefix": "realio", @@ -9755,7 +10108,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "rebus", "addressPrefix": "rebus", @@ -9804,7 +10159,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "regen", "addressPrefix": "regen", @@ -9843,7 +10200,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "rsprovidertestnet", "addressPrefix": "cosmos", @@ -9881,7 +10240,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "rizon", "addressPrefix": "rizon", @@ -9921,7 +10282,9 @@ "variant": "cosmos" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "saga", "addressPrefix": "saga", @@ -9960,7 +10323,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sagatestnet", "addressPrefix": "saga", @@ -9999,7 +10364,9 @@ "variant": "cosmos" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sagatestnet2", "addressPrefix": "saga", @@ -10038,7 +10405,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "akashtestnet", "addressPrefix": "akash", @@ -10167,7 +10536,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "secretnetwork", "addressPrefix": "secret", @@ -10206,7 +10577,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "secretnetworktestnet", "addressPrefix": "secret", @@ -10244,7 +10617,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "secretnetworktestnet2", "addressPrefix": "secret", @@ -10322,7 +10697,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sei", "addressPrefix": "sei", @@ -10361,7 +10738,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "seitestnet", "addressPrefix": "sei", @@ -10400,7 +10779,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "seidevnet3", "addressPrefix": "sei", @@ -10438,7 +10819,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sentinel", "addressPrefix": "sent", @@ -10477,7 +10860,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sge", "addressPrefix": "sge", @@ -10516,7 +10901,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sgetestnet", "addressPrefix": "sge", @@ -10555,7 +10942,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "shareledger", "addressPrefix": "shareledger", @@ -10594,7 +10983,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "shentu", "addressPrefix": "shentu", @@ -10633,7 +11024,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sifchain", "addressPrefix": "sif", @@ -10672,7 +11065,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sixtestnet", "addressPrefix": "6x", @@ -10710,7 +11105,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "six", "addressPrefix": "6x", @@ -10748,7 +11145,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sommelier", "addressPrefix": "somm", @@ -10787,7 +11186,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "source", "addressPrefix": "source", @@ -10826,7 +11227,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "sourcetestnet", "addressPrefix": "source", @@ -10904,7 +11307,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "stafihub", "addressPrefix": "stafi", @@ -10993,7 +11398,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "stargaze", "addressPrefix": "stars", @@ -11032,7 +11439,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "stargazetestnet", "addressPrefix": "stars", @@ -11129,7 +11538,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "starname", "addressPrefix": "star", @@ -11168,7 +11579,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "statesettestnet", "addressPrefix": "stateset", @@ -11206,7 +11619,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "stratos", "addressPrefix": "st", @@ -11345,7 +11760,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "stride", "addressPrefix": "stride", @@ -11384,7 +11801,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "stridetestnet", "addressPrefix": "stride", @@ -11422,7 +11841,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "temporaltestnet", "addressPrefix": "temporal", @@ -11460,7 +11881,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "tenet", "addressPrefix": "tenet", @@ -11498,7 +11921,8 @@ "CosmWasmNFTLaunchpad", "NFTMarketplaceLeaderboard", "CosmWasmNFTsBurner", - "CosmWasmRakki" + "CosmWasmRakki", + "NativeStaking" ], "featureObjects": [ { @@ -11610,7 +12034,8 @@ "BurnTokens", "CosmWasmNFTLaunchpad", "RiotP2E", - "NFTMarketplaceLeaderboard" + "NFTMarketplaceLeaderboard", + "NativeStaking" ], "featureObjects": [ { @@ -11701,7 +12126,8 @@ "CosmWasmPremiumFeed", "NFTMarketplaceLeaderboard", "CosmWasmNFTsBurner", - "CosmWasmRakki" + "CosmWasmRakki", + "NativeStaking" ], "featureObjects": [ { @@ -11832,7 +12258,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "terpnettestnet", "addressPrefix": "terp", @@ -12120,7 +12548,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "terra2", "addressPrefix": "terra", @@ -12159,7 +12589,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "terra2testnet", "addressPrefix": "terra", @@ -14287,7 +14719,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "terra", "addressPrefix": "terra", @@ -14326,7 +14760,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "tgrade", "addressPrefix": "tgrade", @@ -14354,7 +14790,9 @@ "registryName": "thorchain", "kind": "Cosmos", "currencies": [], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "thorchain", "addressPrefix": "thor", @@ -14392,7 +14830,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "ulastestnet", "addressPrefix": "ulas", @@ -14430,7 +14870,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "umee", "addressPrefix": "umee", @@ -14469,7 +14911,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "unification", "addressPrefix": "und", @@ -14508,7 +14952,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "uniontestnet", "addressPrefix": "union", @@ -14547,7 +14993,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "ununifi", "addressPrefix": "ununifi", @@ -14586,7 +15034,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "uptick", "addressPrefix": "uptick", @@ -14625,7 +15075,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "upticktestnet", "addressPrefix": "uptick", @@ -14663,7 +15115,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "vidulum", "addressPrefix": "vdl", @@ -14702,7 +15156,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "vincechaintestnet", "addressPrefix": "vce", @@ -14881,7 +15337,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "gateway", "addressPrefix": "wormhole", @@ -14920,7 +15378,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "xiontestnet", "addressPrefix": "xion", @@ -14959,7 +15419,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "xpla", "addressPrefix": "xpla", @@ -14998,7 +15460,9 @@ "color": "TODO" } ], - "features": [], + "features": [ + "NativeStaking" + ], "featureObjects": [], "idPrefix": "zetachaintestnet", "addressPrefix": "zeta", diff --git a/package.json b/package.json index 5f58ea212e..0988de84c6 100644 --- a/package.json +++ b/package.json @@ -23,17 +23,17 @@ "engineStrict": true, "dependencies": { "@axelar-network/axelarjs-sdk": "^0.13.6", - "@bufbuild/protobuf": "^2.6.0", + "@bufbuild/protobuf": "^2.7.0", "@chain-registry/types": "^0.17.1", "@chain-registry/utils": "1.18.0", - "@cosmjs/amino": "0.32.2", - "@cosmjs/cosmwasm-stargate": "0.32.2", - "@cosmjs/crypto": "0.32.2", - "@cosmjs/encoding": "0.32.2", - "@cosmjs/math": "0.32.2", - "@cosmjs/proto-signing": "0.32.2", - "@cosmjs/stargate": "0.32.2", - "@cosmjs/tendermint-rpc": "0.32.2", + "@cosmjs/amino": "^0.36.0", + "@cosmjs/cosmwasm-stargate": "^0.36.0", + "@cosmjs/crypto": "^0.36.0", + "@cosmjs/encoding": "^0.36.0", + "@cosmjs/math": "^0.36.0", + "@cosmjs/proto-signing": "^0.36.0", + "@cosmjs/stargate": "^0.36.0", + "@cosmjs/tendermint-rpc": "^0.36.0", "@cosmology/core": "2.0.1", "@dotlottie/react-player": "^1.6.5", "@draft-js-plugins/anchor": "^4.2.0", @@ -48,8 +48,8 @@ "@expo-google-fonts/exo": "^0.2.2", "@expo/metro-runtime": "~3.1.3", "@faker-js/faker": "^8.4.1", - "@gnolang/gno-js-client": "^1.3.0", - "@gnolang/tm2-js-client": "^1.2.1", + "@gnolang/gno-js-client": "^1.4.4", + "@gnolang/tm2-js-client": "^1.3.3", "@hookform/resolvers": "^3.6.0", "@improbable-eng/grpc-web": "^0.15.0", "@improbable-eng/grpc-web-node-http-transport": "^0.15.0", @@ -124,7 +124,7 @@ "leaflet.markercluster": "^1.5.3", "listr2": "^8.0.1", "lodash": "^4.17.21", - "long": "^5.2.1", + "long": "^5.3.2", "lottie-react-native": "6.5.1", "markdown-it": "^14.1.0", "markdown-it-emoji": "^3.0.0", @@ -241,7 +241,8 @@ "chain-registry@^1.20.0": "patch:chain-registry@npm%3A1.20.0#./.yarn/patches/chain-registry-npm-1.20.0-e290300d1b.patch", "multiformats@^12.1.3": "patch:multiformats@npm%3A12.1.3#./.yarn/patches/multiformats-npm-12.1.3-dbaa26037a.patch", "@axelar-network/axelarjs-types@^0.33.0": "patch:@axelar-network/axelarjs-types@npm%3A0.33.0#./.yarn/patches/@axelar-network-axelarjs-types-npm-0.33.0-5d36465d11.patch", - "graphql-request@^5": "patch:graphql-request@npm%3A5.2.0#./.yarn/patches/graphql-request-npm-5.2.0-31dd65ab47.patch" + "graphql-request@^5": "patch:graphql-request@npm%3A5.2.0#./.yarn/patches/graphql-request-npm-5.2.0-31dd65ab47.patch", + "@bufbuild/protobuf@^2.7.0": "patch:@bufbuild/protobuf@npm%3A2.7.0#./.yarn/patches/@bufbuild-protobuf-npm-2.7.0-79729124a9.patch" }, "private": true, "packageManager": "yarn@3.5.0", diff --git a/packages/api/multisig/v1/multisig.ts b/packages/api/multisig/v1/multisig.ts index 68c80fc104..787774b442 100644 --- a/packages/api/multisig/v1/multisig.ts +++ b/packages/api/multisig/v1/multisig.ts @@ -93,6 +93,7 @@ export interface Multisig { pubkeyJson: string; usersAddresses: string[]; threshold: number; + chainType: string; } export interface Signature { @@ -117,6 +118,7 @@ export interface Transaction { signatures: Signature[]; multisigPubkeyJson: string; id: number; + chainType: string; } /** we use string here because browser storage poorly supports bytes */ @@ -142,6 +144,7 @@ export interface MultisigsRequest { startAfter: string; chainId: string; joinState: JoinState; + chainType: string; } export interface MultisigsResponse { @@ -152,6 +155,7 @@ export interface MultisigInfoRequest { authToken: Token | undefined; multisigAddress: string; chainId: string; + chainType: string; } export interface MultisigInfoResponse { @@ -167,6 +171,7 @@ export interface TransactionsRequest { chainId: string; types: string[]; executionState: ExecutionState; + chainType: string; } export interface TransactionsResponse { @@ -179,6 +184,7 @@ export interface CreateOrJoinMultisigRequest { authToken: Token | undefined; name: string; bech32Prefix: string; + chainType: string; } export interface CreateOrJoinMultisigResponse { @@ -191,6 +197,7 @@ export interface LeaveMultisigRequest { multisigAddress: string; authToken: Token | undefined; chainId: string; + chainType: string; } export interface LeaveMultisigResponse { @@ -205,6 +212,7 @@ export interface CreateTransactionRequest { msgs: Any[]; feeJson: string; chainId: string; + chainType: string; } export interface CreateTransactionResponse { @@ -234,6 +242,7 @@ export interface ClearSignaturesRequest { multisigChainId: string; multisigAddress: string; sequence: number; + chainType: string; } export interface ClearSignaturesResponse { @@ -271,6 +280,7 @@ export interface TransactionsCountsRequest { /** if unspecified, return transactions for all multisigs of this user */ multisigAddress: string; chainId: string; + chainType: string; } export interface TransactionsCount { @@ -302,6 +312,7 @@ function createBaseMultisig(): Multisig { pubkeyJson: "", usersAddresses: [], threshold: 0, + chainType: "", }; } @@ -331,6 +342,9 @@ export const Multisig = { if (message.threshold !== 0) { writer.uint32(72).uint32(message.threshold); } + if (message.chainType !== "") { + writer.uint32(82).string(message.chainType); + } return writer; }, @@ -397,6 +411,13 @@ export const Multisig = { message.threshold = reader.uint32(); continue; + case 10: + if (tag !== 82) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -418,6 +439,7 @@ export const Multisig = { ? object.usersAddresses.map((e: any) => globalThis.String(e)) : [], threshold: isSet(object.threshold) ? globalThis.Number(object.threshold) : 0, + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -447,6 +469,9 @@ export const Multisig = { if (message.threshold !== 0) { obj.threshold = Math.round(message.threshold); } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -463,6 +488,7 @@ export const Multisig = { message.pubkeyJson = object.pubkeyJson ?? ""; message.usersAddresses = object.usersAddresses?.map((e) => e) || []; message.threshold = object.threshold ?? 0; + message.chainType = object.chainType ?? ""; return message; }, }; @@ -573,6 +599,7 @@ function createBaseTransaction(): Transaction { signatures: [], multisigPubkeyJson: "", id: 0, + chainType: "", }; } @@ -623,6 +650,9 @@ export const Transaction = { if (message.id !== 0) { writer.uint32(120).uint32(message.id); } + if (message.chainType !== "") { + writer.uint32(130).string(message.chainType); + } return writer; }, @@ -738,6 +768,13 @@ export const Transaction = { message.id = reader.uint32(); continue; + case 16: + if (tag !== 130) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -766,6 +803,7 @@ export const Transaction = { : [], multisigPubkeyJson: isSet(object.multisigPubkeyJson) ? globalThis.String(object.multisigPubkeyJson) : "", id: isSet(object.id) ? globalThis.Number(object.id) : 0, + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -816,6 +854,9 @@ export const Transaction = { if (message.id !== 0) { obj.id = Math.round(message.id); } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -839,6 +880,7 @@ export const Transaction = { message.signatures = object.signatures?.map((e) => Signature.fromPartial(e)) || []; message.multisigPubkeyJson = object.multisigPubkeyJson ?? ""; message.id = object.id ?? 0; + message.chainType = object.chainType ?? ""; return message; }, }; @@ -1037,7 +1079,7 @@ export const Challenge = { }; function createBaseMultisigsRequest(): MultisigsRequest { - return { authToken: undefined, limit: 0, startAfter: "", chainId: "", joinState: 0 }; + return { authToken: undefined, limit: 0, startAfter: "", chainId: "", joinState: 0, chainType: "" }; } export const MultisigsRequest = { @@ -1057,6 +1099,9 @@ export const MultisigsRequest = { if (message.joinState !== 0) { writer.uint32(40).int32(message.joinState); } + if (message.chainType !== "") { + writer.uint32(50).string(message.chainType); + } return writer; }, @@ -1102,6 +1147,13 @@ export const MultisigsRequest = { message.joinState = reader.int32() as any; continue; + case 6: + if (tag !== 50) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -1118,6 +1170,7 @@ export const MultisigsRequest = { startAfter: isSet(object.startAfter) ? globalThis.String(object.startAfter) : "", chainId: isSet(object.chainId) ? globalThis.String(object.chainId) : "", joinState: isSet(object.joinState) ? joinStateFromJSON(object.joinState) : 0, + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -1138,6 +1191,9 @@ export const MultisigsRequest = { if (message.joinState !== 0) { obj.joinState = joinStateToJSON(message.joinState); } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -1153,6 +1209,7 @@ export const MultisigsRequest = { message.startAfter = object.startAfter ?? ""; message.chainId = object.chainId ?? ""; message.joinState = object.joinState ?? 0; + message.chainType = object.chainType ?? ""; return message; }, }; @@ -1219,7 +1276,7 @@ export const MultisigsResponse = { }; function createBaseMultisigInfoRequest(): MultisigInfoRequest { - return { authToken: undefined, multisigAddress: "", chainId: "" }; + return { authToken: undefined, multisigAddress: "", chainId: "", chainType: "" }; } export const MultisigInfoRequest = { @@ -1233,6 +1290,9 @@ export const MultisigInfoRequest = { if (message.chainId !== "") { writer.uint32(26).string(message.chainId); } + if (message.chainType !== "") { + writer.uint32(34).string(message.chainType); + } return writer; }, @@ -1264,6 +1324,13 @@ export const MultisigInfoRequest = { message.chainId = reader.string(); continue; + case 4: + if (tag !== 34) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -1278,6 +1345,7 @@ export const MultisigInfoRequest = { authToken: isSet(object.authToken) ? Token.fromJSON(object.authToken) : undefined, multisigAddress: isSet(object.multisigAddress) ? globalThis.String(object.multisigAddress) : "", chainId: isSet(object.chainId) ? globalThis.String(object.chainId) : "", + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -1292,6 +1360,9 @@ export const MultisigInfoRequest = { if (message.chainId !== "") { obj.chainId = message.chainId; } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -1305,6 +1376,7 @@ export const MultisigInfoRequest = { : undefined; message.multisigAddress = object.multisigAddress ?? ""; message.chainId = object.chainId ?? ""; + message.chainType = object.chainType ?? ""; return message; }, }; @@ -1377,6 +1449,7 @@ function createBaseTransactionsRequest(): TransactionsRequest { chainId: "", types: [], executionState: 0, + chainType: "", }; } @@ -1403,6 +1476,9 @@ export const TransactionsRequest = { if (message.executionState !== 0) { writer.uint32(56).int32(message.executionState); } + if (message.chainType !== "") { + writer.uint32(66).string(message.chainType); + } return writer; }, @@ -1462,6 +1538,13 @@ export const TransactionsRequest = { message.executionState = reader.int32() as any; continue; + case 8: + if (tag !== 66) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -1480,6 +1563,7 @@ export const TransactionsRequest = { chainId: isSet(object.chainId) ? globalThis.String(object.chainId) : "", types: globalThis.Array.isArray(object?.types) ? object.types.map((e: any) => globalThis.String(e)) : [], executionState: isSet(object.executionState) ? executionStateFromJSON(object.executionState) : 0, + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -1506,6 +1590,9 @@ export const TransactionsRequest = { if (message.executionState !== 0) { obj.executionState = executionStateToJSON(message.executionState); } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -1523,6 +1610,7 @@ export const TransactionsRequest = { message.chainId = object.chainId ?? ""; message.types = object.types?.map((e) => e) || []; message.executionState = object.executionState ?? 0; + message.chainType = object.chainType ?? ""; return message; }, }; @@ -1589,7 +1677,7 @@ export const TransactionsResponse = { }; function createBaseCreateOrJoinMultisigRequest(): CreateOrJoinMultisigRequest { - return { chainId: "", multisigPubkeyJson: "", authToken: undefined, name: "", bech32Prefix: "" }; + return { chainId: "", multisigPubkeyJson: "", authToken: undefined, name: "", bech32Prefix: "", chainType: "" }; } export const CreateOrJoinMultisigRequest = { @@ -1609,6 +1697,9 @@ export const CreateOrJoinMultisigRequest = { if (message.bech32Prefix !== "") { writer.uint32(42).string(message.bech32Prefix); } + if (message.chainType !== "") { + writer.uint32(50).string(message.chainType); + } return writer; }, @@ -1654,6 +1745,13 @@ export const CreateOrJoinMultisigRequest = { message.bech32Prefix = reader.string(); continue; + case 6: + if (tag !== 50) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -1670,6 +1768,7 @@ export const CreateOrJoinMultisigRequest = { authToken: isSet(object.authToken) ? Token.fromJSON(object.authToken) : undefined, name: isSet(object.name) ? globalThis.String(object.name) : "", bech32Prefix: isSet(object.bech32Prefix) ? globalThis.String(object.bech32Prefix) : "", + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -1690,6 +1789,9 @@ export const CreateOrJoinMultisigRequest = { if (message.bech32Prefix !== "") { obj.bech32Prefix = message.bech32Prefix; } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -1705,6 +1807,7 @@ export const CreateOrJoinMultisigRequest = { : undefined; message.name = object.name ?? ""; message.bech32Prefix = object.bech32Prefix ?? ""; + message.chainType = object.chainType ?? ""; return message; }, }; @@ -1799,7 +1902,7 @@ export const CreateOrJoinMultisigResponse = { }; function createBaseLeaveMultisigRequest(): LeaveMultisigRequest { - return { multisigAddress: "", authToken: undefined, chainId: "" }; + return { multisigAddress: "", authToken: undefined, chainId: "", chainType: "" }; } export const LeaveMultisigRequest = { @@ -1813,6 +1916,9 @@ export const LeaveMultisigRequest = { if (message.chainId !== "") { writer.uint32(26).string(message.chainId); } + if (message.chainType !== "") { + writer.uint32(34).string(message.chainType); + } return writer; }, @@ -1844,6 +1950,13 @@ export const LeaveMultisigRequest = { message.chainId = reader.string(); continue; + case 4: + if (tag !== 34) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -1858,6 +1971,7 @@ export const LeaveMultisigRequest = { multisigAddress: isSet(object.multisigAddress) ? globalThis.String(object.multisigAddress) : "", authToken: isSet(object.authToken) ? Token.fromJSON(object.authToken) : undefined, chainId: isSet(object.chainId) ? globalThis.String(object.chainId) : "", + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -1872,6 +1986,9 @@ export const LeaveMultisigRequest = { if (message.chainId !== "") { obj.chainId = message.chainId; } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -1885,6 +2002,7 @@ export const LeaveMultisigRequest = { ? Token.fromPartial(object.authToken) : undefined; message.chainId = object.chainId ?? ""; + message.chainType = object.chainType ?? ""; return message; }, }; @@ -1955,6 +2073,7 @@ function createBaseCreateTransactionRequest(): CreateTransactionRequest { msgs: [], feeJson: "", chainId: "", + chainType: "", }; } @@ -1981,6 +2100,9 @@ export const CreateTransactionRequest = { if (message.chainId !== "") { writer.uint32(66).string(message.chainId); } + if (message.chainType !== "") { + writer.uint32(74).string(message.chainType); + } return writer; }, @@ -2040,6 +2162,13 @@ export const CreateTransactionRequest = { message.chainId = reader.string(); continue; + case 9: + if (tag !== 74) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -2058,6 +2187,7 @@ export const CreateTransactionRequest = { msgs: globalThis.Array.isArray(object?.msgs) ? object.msgs.map((e: any) => Any.fromJSON(e)) : [], feeJson: isSet(object.feeJson) ? globalThis.String(object.feeJson) : "", chainId: isSet(object.chainId) ? globalThis.String(object.chainId) : "", + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -2084,6 +2214,9 @@ export const CreateTransactionRequest = { if (message.chainId !== "") { obj.chainId = message.chainId; } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -2101,6 +2234,7 @@ export const CreateTransactionRequest = { message.msgs = object.msgs?.map((e) => Any.fromPartial(e)) || []; message.feeJson = object.feeJson ?? ""; message.chainId = object.chainId ?? ""; + message.chainType = object.chainType ?? ""; return message; }, }; @@ -2432,7 +2566,7 @@ export const CompleteTransactionResponse = { }; function createBaseClearSignaturesRequest(): ClearSignaturesRequest { - return { authToken: undefined, multisigChainId: "", multisigAddress: "", sequence: 0 }; + return { authToken: undefined, multisigChainId: "", multisigAddress: "", sequence: 0, chainType: "" }; } export const ClearSignaturesRequest = { @@ -2449,6 +2583,9 @@ export const ClearSignaturesRequest = { if (message.sequence !== 0) { writer.uint32(32).uint32(message.sequence); } + if (message.chainType !== "") { + writer.uint32(42).string(message.chainType); + } return writer; }, @@ -2487,6 +2624,13 @@ export const ClearSignaturesRequest = { message.sequence = reader.uint32(); continue; + case 5: + if (tag !== 42) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -2502,6 +2646,7 @@ export const ClearSignaturesRequest = { multisigChainId: isSet(object.multisigChainId) ? globalThis.String(object.multisigChainId) : "", multisigAddress: isSet(object.multisigAddress) ? globalThis.String(object.multisigAddress) : "", sequence: isSet(object.sequence) ? globalThis.Number(object.sequence) : 0, + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -2519,6 +2664,9 @@ export const ClearSignaturesRequest = { if (message.sequence !== 0) { obj.sequence = Math.round(message.sequence); } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -2533,6 +2681,7 @@ export const ClearSignaturesRequest = { message.multisigChainId = object.multisigChainId ?? ""; message.multisigAddress = object.multisigAddress ?? ""; message.sequence = object.sequence ?? 0; + message.chainType = object.chainType ?? ""; return message; }, }; @@ -2922,7 +3071,7 @@ export const GetTokenResponse = { }; function createBaseTransactionsCountsRequest(): TransactionsCountsRequest { - return { authToken: undefined, multisigAddress: "", chainId: "" }; + return { authToken: undefined, multisigAddress: "", chainId: "", chainType: "" }; } export const TransactionsCountsRequest = { @@ -2936,6 +3085,9 @@ export const TransactionsCountsRequest = { if (message.chainId !== "") { writer.uint32(26).string(message.chainId); } + if (message.chainType !== "") { + writer.uint32(34).string(message.chainType); + } return writer; }, @@ -2967,6 +3119,13 @@ export const TransactionsCountsRequest = { message.chainId = reader.string(); continue; + case 4: + if (tag !== 34) { + break; + } + + message.chainType = reader.string(); + continue; } if ((tag & 7) === 4 || tag === 0) { break; @@ -2981,6 +3140,7 @@ export const TransactionsCountsRequest = { authToken: isSet(object.authToken) ? Token.fromJSON(object.authToken) : undefined, multisigAddress: isSet(object.multisigAddress) ? globalThis.String(object.multisigAddress) : "", chainId: isSet(object.chainId) ? globalThis.String(object.chainId) : "", + chainType: isSet(object.chainType) ? globalThis.String(object.chainType) : "", }; }, @@ -2995,6 +3155,9 @@ export const TransactionsCountsRequest = { if (message.chainId !== "") { obj.chainId = message.chainId; } + if (message.chainType !== "") { + obj.chainType = message.chainType; + } return obj; }, @@ -3008,6 +3171,7 @@ export const TransactionsCountsRequest = { : undefined; message.multisigAddress = object.multisigAddress ?? ""; message.chainId = object.chainId ?? ""; + message.chainType = object.chainType ?? ""; return message; }, }; diff --git a/packages/components/connectWallet/ConnectAdenaButton.tsx b/packages/components/connectWallet/ConnectAdenaButton.tsx index e31c974653..76bdaa23e1 100644 --- a/packages/components/connectWallet/ConnectAdenaButton.tsx +++ b/packages/components/connectWallet/ConnectAdenaButton.tsx @@ -31,12 +31,23 @@ export const ConnectAdenaButton: React.FC<{ } dispatch(setIsAdenaConnected(false)); - const establishResult = await adena.AddEstablish("Teritori dApp"); - if (establishResult.status === "failure") { - throw Error(establishResult.message); + try { + const establishResult = await adena.AddEstablish("Teritori dApp"); + if (establishResult.status === "failure") { + throw Error(establishResult.message); + } + console.log("established", establishResult); + } catch (err) { + if ( + !(err instanceof Error) || + !err.message.includes( + "The account is already connected to this website", + ) + ) { + throw err; + } } - console.log("established", establishResult); dispatch(setIsAdenaConnected(true)); const account = await adena.GetAccount(); diff --git a/packages/components/modals/SendModal.tsx b/packages/components/modals/SendModal.tsx index 44a75bb146..b3dfcabf4d 100644 --- a/packages/components/modals/SendModal.tsx +++ b/packages/components/modals/SendModal.tsx @@ -1,5 +1,9 @@ import { Decimal } from "@cosmjs/math"; import { MsgSendEncodeObject } from "@cosmjs/stargate"; +import { GnoJSONRPCProvider, MsgSend } from "@gnolang/gno-js-client"; +import { TxFee } from "@gnolang/tm2-js-client"; +import { useQueryClient } from "@tanstack/react-query"; +import Long from "long"; import React, { useCallback, useState } from "react"; import { useForm } from "react-hook-form"; @@ -30,6 +34,10 @@ import { SearchNSInputContainer } from "../inputs/SearchNSInputContainer"; import { TextInputCustom } from "../inputs/TextInputCustom"; import { SpacerColumn, SpacerRow } from "../spacer"; +import { useMultisigAuthToken } from "@/hooks/multisig/useMultisigAuthToken"; +import { useMultisigClient } from "@/hooks/multisig/useMultisigClient"; +import { multisigTransactionsQueryKey } from "@/hooks/multisig/useMultisigTransactions"; +import { multisigTransactionsCountsQueryKey } from "@/hooks/multisig/useMultisigTransactionsCounts"; import { TransactionForm } from "@/utils/types/wallet"; type SendModalProps = { @@ -65,6 +73,9 @@ export const SendModal: React.FC = ({ const [userNetwork, userAddress] = parseUserId(selectedUserId); const networkId = userNetwork?.id; const { balances } = useBalances(userNetwork?.id, userAddress); + const multisigAuthToken = useMultisigAuthToken(selectedWallet?.userId); + const multisigClient = useMultisigClient(networkId); + const queryClient = useQueryClient(); const ModalHeader = useCallback( () => ( @@ -86,11 +97,7 @@ export const SendModal: React.FC = ({ const onPressSend = async (formData: TransactionForm) => { try { - const sender = selectedWallet?.address; const receiver = formData.toAddress; - if (!sender) { - throw new Error("no sender"); - } //TODO: handle contacts if (!receiver) { throw new Error("no receiver"); @@ -105,23 +112,84 @@ export const SendModal: React.FC = ({ ).atomics; if (userNetwork?.kind === NetworkKind.Gno) { - const adena = (window as any).adena; - const res = await adena.DoContract({ - messages: [ - { - type: "/bank.MsgSend", - value: { - from_address: sender, - to_address: receiver, - amount: `${amount}ugnot`, - }, - }, - ], - gasFee: 1, - gasWanted: 50000, - }); - if (res.status !== "success") { - throw new Error(res.message); + const sender = selectedWallet?.address; + switch (userKind) { + case UserKind.Single: { + if (!sender) { + throw new Error("no sender"); + } + const adena = (window as any).adena; + const res = await adena.DoContract({ + messages: [ + { + type: "/bank.MsgSend", + value: { + from_address: sender, + to_address: receiver, + amount: `${amount}ugnot`, + }, + }, + ], + gasFee: 1, + gasWanted: 50000, + }); + if (res.status !== "success") { + throw new Error(res.message); + } + break; + } + + case UserKind.Multisig: { + const sender = userAddress; + if (!sender) { + throw new Error("no sender"); + } + const client = new GnoJSONRPCProvider(userNetwork.endpoint); + + const account = await client.getAccount(userAddress); + + // XXX: find good values + const fee = TxFee.create({ + gas_wanted: Long.fromString("500000"), + gas_fee: "500ugnot", + }); + + const encodedMsg = MsgSend.encode({ + from_address: sender, + to_address: receiver, + amount: `${amount}ugnot`, + }).finish(); + + await multisigClient.CreateTransaction({ + chainType: userNetwork.kind.toLowerCase(), + authToken: multisigAuthToken, + multisigAddress: userAddress, + chainId: userNetwork.chainId, + feeJson: JSON.stringify(TxFee.toJSON(fee)), + msgs: [ + { + typeUrl: "/bank.MsgSend", + value: encodedMsg, + }, + ], + sequence: parseInt(account.BaseAccount.sequence, 10), + accountNumber: parseInt(account.BaseAccount.account_number, 10), + }); + await queryClient.invalidateQueries([ + ...multisigTransactionsQueryKey(networkId, userId), + ]); + await queryClient.invalidateQueries([ + ...multisigTransactionsQueryKey(networkId, undefined), + ]); + await queryClient.invalidateQueries([ + ...multisigTransactionsCountsQueryKey(networkId), + ]); + break; + } + + default: { + throw new Error(`unexpected user kind ${userKind}`); + } } } else { const cosmosMsg: MsgSendEncodeObject = { diff --git a/packages/components/multisig/MultisigTransactionActions.tsx b/packages/components/multisig/MultisigTransactionActions.tsx index 19fe90aa3f..b9d364424e 100644 --- a/packages/components/multisig/MultisigTransactionActions.tsx +++ b/packages/components/multisig/MultisigTransactionActions.tsx @@ -27,6 +27,7 @@ export const MultisigTransactionActions: React.FC< btnSquaresBackgroundColor, signatures, chainId, + chainType, multisigPubkeyJson, id, finalHash: txHash, @@ -64,6 +65,7 @@ export const MultisigTransactionActions: React.FC< const onApprove = () => approve({ tx: { + chainType, chainId, multisigAddress, fee, @@ -83,6 +85,8 @@ export const MultisigTransactionActions: React.FC< sequence, chainId, multisigAddress, + multisigPubkeyJson, + chainType, }, currentSignatures: signatures, // FIXME: sanitize diff --git a/packages/components/multisig/MultisigTransactionItem.tsx b/packages/components/multisig/MultisigTransactionItem.tsx index dce9aa3940..4d72393224 100644 --- a/packages/components/multisig/MultisigTransactionItem.tsx +++ b/packages/components/multisig/MultisigTransactionItem.tsx @@ -5,7 +5,7 @@ import { StyleSheet, View, ViewStyle } from "react-native"; import { MultisigTransactionActions } from "./MultisigTransactionActions"; import { MultisigTransactionModal } from "./MultisigTransactionModal"; import { ParsedTransaction } from "../../hooks/multisig/useMultisigTransactions"; -import { getCosmosNetworkByChainId, getUserId } from "../../networks"; +import { getNetworkByChainId, getUserId } from "../../networks"; import { prettyPrice } from "../../utils/coins"; import { neutral17, @@ -17,6 +17,7 @@ import { import { fontSemibold13, fontSemibold14 } from "../../utils/style/fonts"; import { layout } from "../../utils/style/layout"; import { BrandText } from "../BrandText"; +import { OmniLink } from "../OmniLink"; import { SVG } from "../SVG"; import { CustomPressable } from "../buttons/CustomPressable"; import { Separator } from "../separators/Separator"; @@ -29,12 +30,14 @@ import { useAppNavigation } from "@/hooks/navigation/useAppNavigation"; export interface MultisigTransactionItemProps extends ParsedTransaction { btnSquaresBackgroundColor?: string; shouldRetch?: () => void; + multisigName?: string; } export const MultisigTransactionItem: React.FC = ( props, ) => { const { + chainType, chainId, msgs, createdAt, @@ -42,9 +45,11 @@ export const MultisigTransactionItem: React.FC = ( creatorAddress, threshold, signatures, + multisigName, + multisigAddress, } = props; const navigation = useAppNavigation(); - const network = getCosmosNetworkByChainId(chainId); + const network = getNetworkByChainId(chainType, chainId); const creatorId = getUserId(network?.id, creatorAddress); const [isHovered, setHovered] = useState(false); const [isProposalModalVisible, setProposalModalVisible] = useState(false); @@ -103,12 +108,38 @@ export const MultisigTransactionItem: React.FC = ( {txInfo} - Created by: - - + {multisigName ? ( + <> + Multisig: + + + + {multisigName} + + + + ) : ( + <> + Created by: + + + + )} diff --git a/packages/components/multisig/MultisigTransactionModal.tsx b/packages/components/multisig/MultisigTransactionModal.tsx index c3ab8ef42f..2d7082be45 100644 --- a/packages/components/multisig/MultisigTransactionModal.tsx +++ b/packages/components/multisig/MultisigTransactionModal.tsx @@ -2,7 +2,7 @@ import React, { FC } from "react"; import { View, ViewStyle } from "react-native"; import { MultisigTransactionItemProps } from "./MultisigTransactionItem"; -import { getCosmosNetworkByChainId, getUserId } from "../../networks"; +import { getNetworkByChainId, getUserId } from "../../networks"; import { fontSemibold14 } from "../../utils/style/fonts"; import { modalMarginPadding } from "../../utils/style/modals"; import { BrandText } from "../BrandText"; @@ -16,7 +16,10 @@ export const MultisigTransactionModal: FC<{ onClose: () => void; transaction: MultisigTransactionItemProps; }> = ({ visible, onClose, transaction }) => { - const network = getCosmosNetworkByChainId(transaction.chainId); + const network = getNetworkByChainId( + transaction.chainType, + transaction.chainId, + ); const creatorId = getUserId(network?.id, transaction.creatorAddress); return ( = ({ title, userId, multisigUserId }) => { + networkId?: string; + Header?: FlatListProps["ListHeaderComponent"]; + showCreator?: boolean; +}> = ({ title, userId, multisigUserId, networkId, Header, showCreator }) => { + const network = getNetwork(networkId); const { height: windowHeight } = useWindowDimensions(); const [selectedTab, setSelectedTab] = useState("all"); @@ -36,8 +51,10 @@ export const MultisigTransactions: FC<{ multisigUserId, ); - const tabs = useMemo( - () => ({ + const { multisigs } = useUserMultisigs(userId, JoinState.JOIN_STATE_IN); + + const tabs = useMemo(() => { + const infos: Record = { currentProposals: { name: "Current proposals", badgeCount: counts?.all?.pending || 0, @@ -55,10 +72,15 @@ export const MultisigTransactions: FC<{ ...filteredTabValues( counts?.byType || [], ExecutionState.EXECUTION_STATE_UNSPECIFIED, - ["/cosmos.bank.v1beta1.MsgSend"], + ["/cosmos.bank.v1beta1.MsgSend", "/bank.MsgSend"], ), }, - stake: { + }; + + console.log("netififi", network); + + if (network?.features.includes(NetworkFeature.NativeStaking)) { + infos.stake = { name: "Staking", ...filteredTabValues( counts?.byType || [], @@ -70,21 +92,24 @@ export const MultisigTransactions: FC<{ "/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward", ], ), - }, - contracts: { - name: "Contracts", - ...filteredTabValues( - counts?.byType || [], - ExecutionState.EXECUTION_STATE_UNSPECIFIED, - [ - "/cosmwasm.wasm.v1.MsgInstantiateContract", - "/cosmwasm.wasm.v1.MsgExecuteContract", - ], - ), - }, - }), - [counts], - ); + }; + } + + infos.contracts = { + name: "Contracts", + ...filteredTabValues( + counts?.byType || [], + ExecutionState.EXECUTION_STATE_UNSPECIFIED, + [ + "/cosmwasm.wasm.v1.MsgInstantiateContract", + "/cosmwasm.wasm.v1.MsgExecuteContract", + "/vm.m_call", + ], + ), + }; + + return infos; + }, [counts, network]); const { data, @@ -106,42 +131,55 @@ export const MultisigTransactions: FC<{ return []; }, [data]); + const ListHeaderComponent: React.FC = useMemo(() => { + const Res = () => ( + <> + {typeof Header === "function" ?
: undefined} + + {title && ( + <> + {title} + + + )} + + + + + ); + return Res; + }, [Header, selectedTab, tabs, title]); + return ( - <> - - {title && ( - <> - {title} - - - )} - - - - - } - initialNumToRender={MIN_ITEMS_PER_PAGE} - keyExtractor={(item) => item.id.toString()} - onEndReached={() => fetchNextTransactionsPage()} - showsVerticalScrollIndicator={false} - contentContainerStyle={{ - paddingBottom: layout.contentSpacing, - flex: 1, - }} - ListEmptyComponent={ - txLoading ? null : + { + let name; + if (!showCreator) { + name = multisigs.find( + (msig) => msig.address === item.multisigAddress, + )?.name; } - ListFooterComponent={} - style={{ height: windowHeight - headerHeight - 70 }} - /> - + return ; + }} + initialNumToRender={MIN_ITEMS_PER_PAGE} + keyExtractor={(item) => item.id.toString()} + onEndReached={() => fetchNextTransactionsPage()} + showsVerticalScrollIndicator={false} + contentContainerStyle={{ + paddingBottom: layout.contentSpacing, + flex: 1, + }} + ListEmptyComponent={txLoading ? null : } + ListFooterComponent={} + style={{ height: windowHeight - headerHeight - 70 }} + /> ); }; diff --git a/packages/components/tx/getTxInfo.tsx b/packages/components/tx/getTxInfo.tsx index 2a2bc83333..557e71f2cd 100644 --- a/packages/components/tx/getTxInfo.tsx +++ b/packages/components/tx/getTxInfo.tsx @@ -17,18 +17,25 @@ import stakingWhiteSVG from "../../../assets/icons/staking_white.svg"; import tnsWhiteSVG from "../../../assets/icons/tns-service_white.svg"; import walletWhiteSVG from "../../../assets/icons/wallet_white.svg"; import { Coin } from "../../api/teritori-chain/cosmos/base/v1beta1/coin"; -import { NetworkInfo, getUserId, NetworkKind } from "../../networks"; +import { + NetworkInfo, + getUserId, + NetworkKind, + contractExplorerLink, +} from "../../networks"; import { prettyPrice } from "../../utils/coins"; import { AppNavigationProp } from "../../utils/navigation"; import { neutral77 } from "../../utils/style/colors"; import { fontSemibold14 } from "../../utils/style/fonts"; -import { tinyAddress } from "../../utils/text"; +import { capitalize, tinyAddress } from "../../utils/text"; import { BrandText } from "../BrandText"; +import { Link } from "../Link"; import { SocialMessageContent } from "../socialFeed/SocialCard/SocialMessageContent"; import { SpacerColumn } from "../spacer"; import { MediaPreview } from "../teritoriNameService/MediaPreview"; import { Username } from "../user/Username"; +import { useGnoFunctionsSignatures } from "@/hooks/gno/useGnoFunctionsSignatures"; import { cosmosTypesRegistry } from "@/networks/cosmos-types"; // once we gather enough different messages here, we should try to establish meaningful abstractions and split this func @@ -83,7 +90,7 @@ export const getTxInfo = ( if (msg.stargate) { const obj = cosmosTypesRegistry.decode({ typeUrl: msg.stargate.type_url, - value: Buffer.from(msg.stargate.value, "base64"), + value: new Uint8Array(Buffer.from(msg.stargate.value, "base64")), }); msg = { typeUrl: msg.stargate.type_url, value: obj }; } else if (msg.bank) { @@ -98,7 +105,7 @@ export const getTxInfo = ( contract: msg.wasm.execute.contract_addr, funds: msg.wasm.execute.funds, sender: "TODO", - msg: Buffer.from(msg.wasm.execute.msg, "base64"), + msg: new Uint8Array(Buffer.from(msg.wasm.execute.msg, "base64")), }, }; msg = execMsg; @@ -541,7 +548,9 @@ export const getTxInfo = ( } case "/teritori.mint.v1beta1.MsgBurnTokens": { const burnerAddress = msg.value.sender; - const amount = Coin.decode(Buffer.from(msg.value.amount[0], "utf-8")); + const amount = Coin.decode( + new Uint8Array(Buffer.from(msg.value.amount[0], "utf-8")), + ); return { name: "Burn tokens", small1: ( @@ -581,6 +590,134 @@ export const getTxInfo = ( }, }; } + case "/bank.MsgSend": { + const recipientAddress = msg.value.to_address as string; + const amountMatch = (msg.value.amount as string).match(/(\d+)\s*(.+)/); + const amount = amountMatch?.[1]; + const denom = amountMatch?.[2]; + return { + name: "Send", + small1: ( + + Sending to: + + + ), + small2: ( + + Will receive: + + {prettyPrice(network?.id, amount, denom)} + + + ), + icon: walletWhiteSVG, + MessagePreview: () => { + return ( + + + Send{" "} + + {prettyPrice(network?.id, amount, denom)} + {" "} + to{" "} + + + + + Recipient address:{" "} + {recipientAddress} + + + ); + }, + }; + } + case "/vm.m_call": { + const contractAddress = msg.value.pkg_path; + const method = msg.value.func; + const amountMatch = (msg.value.send as string).match(/(\d+)\s*(.+)/); + const amount = amountMatch?.[1]; + const denom = amountMatch?.[2]; + return { + name: "Call", + small1: ( + + Contract: + { + // TODO: show tns info using reusable component + const id = getUserId(network?.id, contractAddress); + navigation.navigate("UserPublicProfile", { id }); + }} + > + + {tinyAddress(contractAddress, 10)} + + + + ), + small2: ( + + Method: + {method} + + ), + icon: multisigWhiteSVG, + MessagePreview: () => { + const { data: fnSigs } = useGnoFunctionsSignatures( + network?.id, + msg.value.pkg_path, + ); + const fnSig = fnSigs?.find((sig) => sig.FuncName === method); + return ( + + Call + + + Contract address:{" "} + + {contractAddress} + + + + + Method: {method} + + {msg.value.send && ( + <> + + + Send:{" "} + + {prettyPrice(network?.id, amount, denom)} + + + + )} + + {(msg.value.args as string[]).map((arg, idx) => { + const argSig = fnSig?.Params[idx + 1]; + const argName = capitalize(argSig?.Name || "arg" + idx); + return ( + + {argName}: {arg} + + ); + })} + + ); + }, + }; + } } } catch (err) { console.error(err); diff --git a/packages/hooks/gno/useGnoFunctionsSignatures.ts b/packages/hooks/gno/useGnoFunctionsSignatures.ts new file mode 100644 index 0000000000..8ba01f8ad7 --- /dev/null +++ b/packages/hooks/gno/useGnoFunctionsSignatures.ts @@ -0,0 +1,32 @@ +import { GnoJSONRPCProvider } from "@gnolang/gno-js-client"; +import { queryOptions, useQuery } from "@tanstack/react-query"; + +import { getGnoNetwork } from "@/networks"; + +export const gnoFunctionsSignaturesOpts = ( + networkId: string | undefined, + pkgPath: string | undefined, +) => + queryOptions({ + queryKey: [networkId, pkgPath], + queryFn: async () => { + if (!networkId || !pkgPath) { + return []; + } + const network = getGnoNetwork(networkId); + if (!network) { + return []; + } + const client = new GnoJSONRPCProvider(network.endpoint); + const sigs = await client.getFunctionSignatures(pkgPath); + return sigs; + }, + staleTime: Infinity, + }); + +export const useGnoFunctionsSignatures = ( + networkId: string | undefined, + pkgPath: string | undefined, +) => { + return useQuery(gnoFunctionsSignaturesOpts(networkId, pkgPath)); +}; diff --git a/packages/hooks/multisig/useApproveTransaction.ts b/packages/hooks/multisig/useApproveTransaction.ts index 1ca02f5c9a..db2e188c9f 100644 --- a/packages/hooks/multisig/useApproveTransaction.ts +++ b/packages/hooks/multisig/useApproveTransaction.ts @@ -1,4 +1,6 @@ import { StdSignDoc } from "@cosmjs/amino"; +import { decodeTxMessages } from "@gnolang/gno-js-client"; +import { PubKeySecp256k1, Tx } from "@gnolang/tm2-js-client"; import { Window as KeplrWindow } from "@keplr-wallet/types"; import { useQueryClient } from "@tanstack/react-query"; import { isEqual } from "lodash"; @@ -17,6 +19,7 @@ import { useFeedbacks } from "@/context/FeedbacksProvider"; import { getUserId } from "@/networks"; import { cosmosAminoTypes, cosmosTypesRegistry } from "@/networks/cosmos-types"; import { getKeplrOnlyAminoSigner } from "@/networks/signer"; +import { gnoEncodeAny } from "@/utils/gno"; export const useApproveTransaction = () => { const { setToastError } = useFeedbacks(); @@ -33,6 +36,7 @@ export const useApproveTransaction = () => { }: { tx: Pick< ParsedTransaction, + | "chainType" | "chainId" | "multisigAddress" | "accountNumber" @@ -44,78 +48,209 @@ export const useApproveTransaction = () => { currentSignatures: Signature[]; transactionId: number; }) => { - try { - const prevSigMatch = currentSignatures.findIndex( - (signature) => signature.userAddress === walletAccount?.address, - ); - if (prevSigMatch > -1) { - setToastError({ - title: "Transaction signature failed!", - message: "This account has already signed.", - }); - return; - } + switch (tx.chainType) { + case "cosmos": { + try { + const prevSigMatch = currentSignatures.findIndex( + (signature) => signature.userAddress === walletAccount?.address, + ); + if (prevSigMatch > -1) { + setToastError({ + title: "Transaction signature failed!", + message: "This account has already signed.", + }); + return; + } - const selectedNetworkId = walletAccount?.networkId; + const selectedNetworkId = walletAccount?.networkId; - const keplr = (window as KeplrWindow)?.keplr; - if (!selectedNetworkId || !keplr || !walletAccount?.address) { - return; - } + const keplr = (window as KeplrWindow)?.keplr; + if (!selectedNetworkId || !keplr || !walletAccount?.address) { + return; + } + + const signer = await getKeplrOnlyAminoSigner(selectedNetworkId, { + disableBalanceCheck: true, + preferNoSetFee: true, + preferNoSetMemo: true, + }); + const signerAddress = walletAccount.address; + + const sd: StdSignDoc = { + chain_id: tx.chainId, + account_number: tx.accountNumber.toString(), + sequence: tx.sequence.toString(), + fee: tx.fee, + msgs: tx.msgs.map((m) => { + return cosmosAminoTypes.toAmino(m); + }), + memo: "", + }; + + const { + signed, + signature: { signature }, + } = await signer.signAmino(signerAddress, sd); + + if (!isEqual(sd, signed)) { + throw new Error( + "Tx modified by signer, you can't change the fee or memo in a multisig transaction!", + ); + } + + await multisigClient.SignTransaction({ + authToken, + signature, + transactionId, + bodyBytes: cosmosTypesRegistry.encodeTxBody({ + messages: tx.msgs, + }), + }); - const signer = await getKeplrOnlyAminoSigner(selectedNetworkId, { - disableBalanceCheck: true, - preferNoSetFee: true, - preferNoSetMemo: true, - }); - const signerAddress = walletAccount.address; - - const sd: StdSignDoc = { - chain_id: tx.chainId, - account_number: tx.accountNumber.toString(), - sequence: tx.sequence.toString(), - fee: tx.fee, - msgs: tx.msgs.map((m) => { - return cosmosAminoTypes.toAmino(m); - }), - memo: "", - }; - - const { - signed, - signature: { signature }, - } = await signer.signAmino(signerAddress, sd); - - if (!isEqual(sd, signed)) { - throw new Error( - "Tx modified by signer, you can't change the fee or memo in a multisig transaction!", - ); + await queryClient.invalidateQueries( + multisigTransactionsQueryKey( + selectedNetworkId, + getUserId(selectedNetworkId, tx.multisigAddress), + ), + ); + await queryClient.invalidateQueries( + multisigTransactionsQueryKey(selectedNetworkId, undefined), + ); + } catch (err: any) { + console.error(err); + setToastError({ + title: "Transaction signature failed!", + message: err.message, + }); + } + break; } + case "gno": { + try { + const prevSigMatch = currentSignatures.findIndex( + (signature) => signature.userAddress === walletAccount?.address, + ); + if (prevSigMatch > -1) { + setToastError({ + title: "Transaction signature failed!", + message: "This account has already signed.", + }); + return; + } + + const selectedNetworkId = walletAccount?.networkId; + + const adena = window.adena as any; + if (!selectedNetworkId || !adena || !walletAccount?.address) { + setToastError({ + title: "Transaction signature failed!", + message: "Invalid context.", + }); + return; + } + + console.log("tx", tx); + + const doc = { + messages: tx.msgs.map((msg) => ({ + type: msg.typeUrl, + value: msg.value, + })), + gasFee: parseInt(tx.fee.amount[0].amount, 10), + gasWanted: parseInt(tx.fee.gas, 10), + memo: tx.memo || undefined, + multisig: true, + accountNumber: tx.accountNumber, + sequence: tx.sequence, + }; + + const canonTx = Tx.create({ + messages: tx.msgs.map((msg) => ({ + type_url: msg.typeUrl, + value: gnoEncodeAny(msg.typeUrl, msg.value).value, + })), + fee: { + gas_fee: tx.fee.amount[0].amount + tx.fee.amount[0].denom, + gas_wanted: tx.fee.gas, + }, + memo: tx.memo, + }); + + console.log("doc", doc); - await multisigClient.SignTransaction({ - authToken, - signature, - transactionId, - bodyBytes: cosmosTypesRegistry.encodeTxBody({ - messages: tx.msgs, - }), - }); - - await queryClient.invalidateQueries( - multisigTransactionsQueryKey( - selectedNetworkId, - getUserId(selectedNetworkId, tx.multisigAddress), - ), - ); - await queryClient.invalidateQueries( - multisigTransactionsQueryKey(selectedNetworkId, undefined), - ); - } catch (err: any) { - console.error(err); - setToastError({ - title: "Transaction signature failed!", - message: err.message, - }); + const res = await adena.SignTx(doc); + + console.log("res", res); + + if (res.status === "failure") { + throw new Error(res.message); + } + + const signedTxBz = new Uint8Array( + Buffer.from(res.data.encodedTransaction, "base64"), + ); + const signedTx = Tx.decode(signedTxBz); + + console.log("signedTx", signedTx); + + const pkRaw = Buffer.from( + signedTx.signatures[0].pub_key?.value || "", + ); + console.log("pkraw", pkRaw.toString("base64")); + + const pk = PubKeySecp256k1.decode(new Uint8Array(pkRaw)); + console.log("pk", Buffer.from(pk.key).toString("base64")); + + const sigB64 = Buffer.from( + signedTx.signatures[0].signature || "", + ).toString("base64"); + console.log("sig", sigB64); + + signedTx.signatures = []; + + if (!isEqual(canonTx, signedTx)) { + console.error( + "canonTx", + canonTx, + decodeTxMessages(canonTx.messages), + ); + console.error( + "signedTx", + signedTx, + decodeTxMessages(signedTx.messages), + ); + throw new Error( + "Tx modified by signer, you can't change the fee or memo in a multisig transaction!", + ); + } + + // WARNING: only send supported for now + + await multisigClient.SignTransaction({ + authToken, + signature: sigB64, + transactionId, + bodyBytes: Tx.encode(signedTx).finish(), + }); + + await queryClient.invalidateQueries( + multisigTransactionsQueryKey( + selectedNetworkId, + getUserId(selectedNetworkId, tx.multisigAddress), + ), + ); + await queryClient.invalidateQueries( + multisigTransactionsQueryKey(selectedNetworkId, undefined), + ); + } catch (err: any) { + console.error(err); + setToastError({ + title: "Transaction signature failed!", + message: err.message, + }); + } + break; + } } }, [authToken, multisigClient, queryClient, setToastError, walletAccount], diff --git a/packages/hooks/multisig/useBroadcastTransaction.ts b/packages/hooks/multisig/useBroadcastTransaction.ts index 88877b4bcd..b1caf143ef 100644 --- a/packages/hooks/multisig/useBroadcastTransaction.ts +++ b/packages/hooks/multisig/useBroadcastTransaction.ts @@ -1,7 +1,22 @@ import { MultisigThresholdPubkey } from "@cosmjs/amino"; import { makeMultisignedTxBytes } from "@cosmjs/stargate"; +import { GnoJSONRPCProvider } from "@gnolang/gno-js-client"; +import { + Any, + PubKeySecp256k1, + TransactionEndpoint, + Tx, + TxSignature, +} from "@gnolang/tm2-js-client"; +import { + createCompactBitArray, + PubKeyMultisig, + compactBitArraySetIndex, + Multisignature, +} from "@gnolang/tm2-js-client/bin/proto/tm2/multisig"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { Buffer } from "buffer"; +import Long from "long"; import { useMultisigAuthToken } from "./useMultisigAuthToken"; import { useMultisigClient } from "./useMultisigClient"; @@ -15,10 +30,12 @@ import useSelectedWallet from "../useSelectedWallet"; import { Signature } from "@/api/multisig/v1/multisig"; import { useFeedbacks } from "@/context/FeedbacksProvider"; import { - getCosmosNetworkByChainId, + getNetworkByChainId, getNonSigningStargateClient, getUserId, + NetworkKind, } from "@/networks"; +import { addrFromPubkey } from "@/utils/gno"; export const useBroadcastTransaction = () => { const { setToastError, setToastSuccess } = useFeedbacks(); @@ -36,49 +53,143 @@ export const useBroadcastTransaction = () => { }: { tx: Pick< ParsedTransaction, - "fee" | "sequence" | "chainId" | "multisigAddress" + | "fee" + | "sequence" + | "chainId" + | "multisigAddress" + | "chainType" + | "multisigPubkeyJson" >; currentSignatures: Signature[]; transactionId: number; pubkey?: MultisigThresholdPubkey; }) => { try { - if (!pubkey) { - throw new Error("Pubkey not found"); - } - - const signedTx = makeMultisignedTxBytes( - pubkey, - tx.sequence, - tx.fee, - currentSignatures[0].bodyBytes, - new Map( - currentSignatures.map((s) => [ - s.userAddress, - Buffer.from(s.value, "base64"), - ]), - ), - ); - - const network = getCosmosNetworkByChainId(tx.chainId); + let finalHash; + const network = getNetworkByChainId(tx.chainType, tx.chainId); if (!network) { throw new Error("Network not found"); } - const broadcaster = await getNonSigningStargateClient(network?.id); - const result = await broadcaster.broadcastTx(signedTx); - - if (result.code !== 0) { - console.error("err", result.rawLog); - setToastError({ - title: "The tx is emitted, but something went wrong!", - message: result.rawLog || "", - }); + switch (network.kind) { + case NetworkKind.Cosmos: { + if (!pubkey) { + throw new Error("Pubkey not found"); + } + + const signedTx = makeMultisignedTxBytes( + pubkey, + tx.sequence, + tx.fee, + currentSignatures[0].bodyBytes, + new Map( + currentSignatures.map((s) => [ + s.userAddress, + new Uint8Array(Buffer.from(s.value, "base64")), + ]), + ), + ); + + const broadcaster = await getNonSigningStargateClient(network?.id); + const result = await broadcaster.broadcastTx(signedTx); + + if (result.code !== 0) { + console.error("err", result.rawLog); + setToastError({ + title: "The tx is emitted, but something went wrong!", + message: result.rawLog || "", + }); + } + finalHash = result.transactionHash; + break; + } + case NetworkKind.Gno: { + // eslint-disable-next-line no-restricted-syntax + const mspk = JSON.parse(tx.multisigPubkeyJson); + + const aminoMspk = PubKeyMultisig.create({ + k: 0, + pub_keys: [], + }); + + const k = mspk.threshold as string; + aminoMspk.k = Long.fromString(k); + + const sigs: Uint8Array[] = []; + const bArr = createCompactBitArray(mspk.pubkeys.length); + for (let i = 0; i < mspk.pubkeys.length; i++) { + const pk = mspk.pubkeys[i]; + + if (pk["@type"] !== "/tm.PubKeySecp256k1") { + throw new Error(`unpexpected pk type ${pk["@type"]}`); + } + + const pkval = pk.value as string; + aminoMspk.pub_keys.push( + Any.create({ + type_url: pk["@type"], + value: PubKeySecp256k1.encode({ + key: new Uint8Array(Buffer.from(pkval, "base64")), + }).finish(), + }), + ); + + const addr = addrFromPubkey( + new Uint8Array(Buffer.from(pk.value, "base64")), + ); + + let sig; + for (const csig of currentSignatures) { + if (csig.userAddress === addr) { + sig = csig; + } + } + + if (sig === undefined) { + continue; + } + + compactBitArraySetIndex(bArr, i, true); + sigs.push(new Uint8Array(Buffer.from(sig.value, "base64"))); + } + + const ms = Multisignature.create({ + bit_array: bArr, + sigs, + }); + + const msigBz = Multisignature.encode(ms).finish(); + const msSig: TxSignature = { + pub_key: { + type_url: mspk["@type"], + value: PubKeyMultisig.encode(aminoMspk).finish(), + }, + signature: msigBz, + }; + + const client = new GnoJSONRPCProvider(network.endpoint); + const txBody = Tx.decode(currentSignatures[0].bodyBytes); + + txBody.signatures = [msSig]; + const txBz = Tx.encode(txBody).finish(); + const txB64 = Buffer.from(txBz).toString("base64"); + + const res = await client.sendTransaction( + txB64, + TransactionEndpoint.BROADCAST_TX_COMMIT, + ); + + finalHash = res.hash; + break; + } + default: { + throw new Error(`unknown chain type ${tx.chainType}`); + } } await multisigClient.CompleteTransaction({ authToken, transactionId, - finalHash: result.transactionHash, + finalHash, }); setToastSuccess({ @@ -101,7 +212,7 @@ export const useBroadcastTransaction = () => { multisigTransactionsCountsQueryKey(network.id), ); - return result.transactionHash; + return finalHash; } catch (e: unknown) { console.error("err", e); if (e instanceof Error) { diff --git a/packages/hooks/multisig/useMultisigClient.ts b/packages/hooks/multisig/useMultisigClient.ts index cdf0ece03e..3e0269ca04 100644 --- a/packages/hooks/multisig/useMultisigClient.ts +++ b/packages/hooks/multisig/useMultisigClient.ts @@ -10,7 +10,7 @@ export const useMultisigClient = (networkId: string | undefined) => { const network = getNetwork(networkId); if (network?.testnet) { const rpc = new GrpcWebImpl( - process.env.MULTISIG_BACKEND_URL || + process.env.EXPO_PUBLIC_MULTISIG_BACKEND_URL || "https://multisig.testnet.teritori.com", { debug: false, @@ -19,7 +19,7 @@ export const useMultisigClient = (networkId: string | undefined) => { return new MultisigServiceClientImpl(rpc); } else { const rpc = new GrpcWebImpl( - process.env.MULTISIG_BACKEND_URL || + process.env.EXPO_PUBLIC_MULTISIG_BACKEND_URL || "https://multisig.mainnet.teritori.com", { debug: false, diff --git a/packages/hooks/multisig/useMultisigInfo.ts b/packages/hooks/multisig/useMultisigInfo.ts index 570b579238..45859faa77 100644 --- a/packages/hooks/multisig/useMultisigInfo.ts +++ b/packages/hooks/multisig/useMultisigInfo.ts @@ -22,11 +22,15 @@ export const useMultisigInfo = (id: string | undefined) => { return null; } const [network, multisigAddress] = parseUserId(id); - if (network?.kind !== NetworkKind.Cosmos) { + if ( + network?.kind !== NetworkKind.Cosmos && + network?.kind !== NetworkKind.Gno + ) { return null; } try { const { multisig } = await client.MultisigInfo({ + chainType: network.kind.toLowerCase(), authToken, multisigAddress, chainId: network.chainId, diff --git a/packages/hooks/multisig/useMultisigTransactions.ts b/packages/hooks/multisig/useMultisigTransactions.ts index eb0ab899b5..d3af692661 100644 --- a/packages/hooks/multisig/useMultisigTransactions.ts +++ b/packages/hooks/multisig/useMultisigTransactions.ts @@ -1,12 +1,14 @@ import { EncodeObject } from "@cosmjs/proto-signing"; import { StdFee } from "@cosmjs/stargate"; +import { decodeTxMessages } from "@gnolang/gno-js-client"; +import { TxFee } from "@gnolang/tm2-js-client"; import { useInfiniteQuery } from "@tanstack/react-query"; import { useMultisigAuthToken } from "./useMultisigAuthToken"; import { useMultisigClient } from "./useMultisigClient"; import { ExecutionState, Transaction } from "@/api/multisig/v1/multisig"; -import { getCosmosNetwork, parseUserId } from "@/networks"; +import { NetworkKind, parseUserId } from "@/networks"; import { cosmosTypesRegistry } from "@/networks/cosmos-types"; const batchSize = 16; @@ -43,15 +45,19 @@ export const useMultisigTransactions = ( authToken, ], async ({ pageParam }) => { - const chainId = getCosmosNetwork(network?.id)?.chainId; - - if (!chainId || !authToken) { + if ( + network?.kind !== NetworkKind.Gno && + network?.kind !== NetworkKind.Cosmos + ) { return { data: [], next: null }; } + const chainId = network?.chainId; + const [, multisigAddress] = parseUserId(multisigUserId); const req = { + chainType: network?.kind.toLowerCase(), authToken, chainId, multisigAddress: multisigAddress || undefined, @@ -66,19 +72,65 @@ export const useMultisigTransactions = ( const parsedTxs: ParsedTransaction[] = []; for (const tx of txs) { try { - const msgs: EncodeObject[] = tx.msgs.map((m) => ({ - typeUrl: m.typeUrl, - value: cosmosTypesRegistry.decode(m), - })); - const t: ParsedTransaction = { - ...tx, - msgs, - // FIXME: sanitize - // eslint-disable-next-line no-restricted-syntax - fee: JSON.parse(tx.feeJson), - createdAt: new Date(tx.createdAt), - }; - parsedTxs.push(t); + switch (tx.chainType) { + case "gno": { + console.log("og msgs", tx.msgs); + const msgs = decodeTxMessages( + tx.msgs.map((msg) => { + return { + type_url: msg.typeUrl, + value: msg.value, + }; + }), + ); + console.log("decoded msgs", msgs); + // eslint-disable-next-line no-restricted-syntax + const tf = TxFee.fromJSON(JSON.parse(tx.feeJson)); + const t: ParsedTransaction = { + ...tx, + msgs: msgs.map((msg) => { + const val = { ...msg }; + delete val["@type"]; + return { + typeUrl: msg["@type"], + value: val, + }; + }), + fee: { + // XXX: using cosmos's StdFee for now but could be improved + amount: [ + { + amount: tf.gas_fee.split("ugnot")[0].toString(), // TODO: properly parse coin + denom: "ugnot", + }, + ], + gas: tf.gas_wanted.toString(), + }, + createdAt: new Date(tx.createdAt), + }; + parsedTxs.push(t); + break; + } + case "cosmos": { + const msgs: EncodeObject[] = tx.msgs.map((m) => ({ + typeUrl: m.typeUrl, + value: cosmosTypesRegistry.decode(m), + })); + const t: ParsedTransaction = { + ...tx, + msgs, + // FIXME: sanitize + // eslint-disable-next-line no-restricted-syntax + fee: JSON.parse(tx.feeJson), + createdAt: new Date(tx.createdAt), + }; + parsedTxs.push(t); + break; + } + default: { + throw new Error(`unknown chain type ${tx.chainType}`); + } + } } catch { continue; } diff --git a/packages/hooks/multisig/useMultisigTransactionsCounts.ts b/packages/hooks/multisig/useMultisigTransactionsCounts.ts index 0f31dcc1d2..173aeebb93 100644 --- a/packages/hooks/multisig/useMultisigTransactionsCounts.ts +++ b/packages/hooks/multisig/useMultisigTransactionsCounts.ts @@ -4,7 +4,7 @@ import { useMultisigAuthToken } from "./useMultisigAuthToken"; import { useMultisigClient } from "./useMultisigClient"; import useSelectedWallet from "../useSelectedWallet"; -import { getCosmosNetwork, parseUserId } from "@/networks"; +import { NetworkKind, parseUserId } from "@/networks"; export const multisigTransactionsCountsQueryKey = ( networkId: string | undefined, @@ -27,14 +27,17 @@ export const useMultisigTransactionsCounts = ( multisigClient, ], async () => { - const cosmosNetwork = getCosmosNetwork(network?.id); - if (!cosmosNetwork) { + if ( + network?.kind !== NetworkKind.Cosmos && + network?.kind !== NetworkKind.Gno + ) { return null; } const [, multisigAddress] = parseUserId(multisigUserId); const counts = await multisigClient?.TransactionsCounts({ + chainType: network?.kind.toLowerCase(), authToken, - chainId: cosmosNetwork.chainId, + chainId: network.chainId, multisigAddress, }); return counts; diff --git a/packages/hooks/multisig/useUserMultisigs.ts b/packages/hooks/multisig/useUserMultisigs.ts index 35605e30a6..fb7850c04d 100644 --- a/packages/hooks/multisig/useUserMultisigs.ts +++ b/packages/hooks/multisig/useUserMultisigs.ts @@ -22,18 +22,24 @@ export const useUserMultisigs = ( const { data, ...other } = useQuery( [...userMultisigsQueryKey(userId), joinState, authToken, multisigClient], async () => { - if (network?.kind !== NetworkKind.Cosmos) { + if ( + network?.kind !== NetworkKind.Cosmos && + network?.kind !== NetworkKind.Gno + ) { return []; } if (!authToken) { return []; } - const { multisigs } = await multisigClient.Multisigs({ + const req = { + chainType: network.kind.toLowerCase(), limit: batchSize, authToken, joinState, chainId: network.chainId, - }); + }; + console.log("req", req); + const { multisigs } = await multisigClient.Multisigs(req); return multisigs; }, { staleTime: Infinity }, diff --git a/packages/hooks/useBalances.ts b/packages/hooks/useBalances.ts index 74affbaecc..2ed235cb81 100644 --- a/packages/hooks/useBalances.ts +++ b/packages/hooks/useBalances.ts @@ -1,4 +1,5 @@ import { Decimal } from "@cosmjs/math"; +import { GnoJSONRPCProvider } from "@gnolang/gno-js-client"; import { useQuery } from "@tanstack/react-query"; import { useMemo } from "react"; @@ -99,11 +100,11 @@ const getNetworkBalances = async ( } case NetworkKind.Gno: { - const res = await (window as any).adena.GetAccount(); + const client = new GnoJSONRPCProvider(network.endpoint); + const res = await client.getBalance(address); return [ { - amount: - res?.data?.coins?.substring(0, res?.data?.coins?.length - 5) || "0", + amount: res.toString(), denom: "ugnot", }, ]; diff --git a/packages/hooks/useRunOrProposeTransaction.ts b/packages/hooks/useRunOrProposeTransaction.ts index e944b31b59..0766d80f71 100644 --- a/packages/hooks/useRunOrProposeTransaction.ts +++ b/packages/hooks/useRunOrProposeTransaction.ts @@ -1,7 +1,10 @@ import { EncodeObject } from "@cosmjs/proto-signing"; import { isDeliverTxFailure, StdFee } from "@cosmjs/stargate"; +import { GnoJSONRPCProvider } from "@gnolang/gno-js-client"; +import { TxFee } from "@gnolang/tm2-js-client"; import { QueryClient, useQueryClient } from "@tanstack/react-query"; import { Buffer } from "buffer"; +import Long from "long"; import { useCallback } from "react"; import { useDAOMakeProposal } from "./dao/useDAOMakeProposal"; @@ -14,13 +17,14 @@ import useSelectedWallet from "./useSelectedWallet"; import { MultisigService, Token } from "@/api/multisig/v1/multisig"; import { CosmosMsgForEmpty } from "@/contracts-clients/dao-core/DaoCore.types"; import { - getCosmosNetwork, getStakingCurrency, + NetworkKind, parseUserId, UserKind, } from "@/networks"; import { cosmosTypesRegistry } from "@/networks/cosmos-types"; import { getKeplrSigningStargateClient } from "@/networks/signer"; +import { gnoEncodeAny } from "@/utils/gno"; import { AppNavigationProp, useAppNavigation } from "@/utils/navigation"; export const useRunOrProposeTransaction = ( @@ -107,10 +111,6 @@ const runOrProposeTransaction = async ({ if (!network) { throw new Error("User's network not found"); } - const cosmosNetwork = getCosmosNetwork(network.id); - if (!cosmosNetwork) { - throw new Error("User's network is not a Cosmos network"); - } const stakingCurrency = getStakingCurrency(network.id); if (!stakingCurrency) { throw new Error("Staking currency not found"); @@ -136,43 +136,83 @@ const runOrProposeTransaction = async ({ if (!senderAddress) { throw new Error("Sender address not found"); } - const client = await getKeplrSigningStargateClient(network.id); - const gasEstimate = 1000000; // TODO: simulate if possible - const fee: StdFee = { - gas: gasEstimate.toFixed(0), - amount: [ - { - amount: (gasEstimate * cosmosNetwork.gasPriceStep.average).toFixed( - 0, - ), - denom: stakingCurrency.denom, - }, - ], - }; - const account = await client.getAccount(userAddress); - if (!account) { - throw new Error("Multisig account not found on chain"); - } - const encodedMsgs = msgs.map((m) => cosmosTypesRegistry.encodeAsAny(m)); + switch (network.kind) { + case NetworkKind.Cosmos: { + const client = await getKeplrSigningStargateClient(network.id); + const gasEstimate = 1000000; // TODO: simulate if possible + const fee: StdFee = { + gas: gasEstimate.toFixed(0), + amount: [ + { + amount: (gasEstimate * network.gasPriceStep.average).toFixed(0), + denom: stakingCurrency.denom, + }, + ], + }; + const account = await client.getAccount(userAddress); + if (!account) { + throw new Error("Multisig account not found on chain"); + } - await multisigClient.CreateTransaction({ - authToken: multisigAuthToken, - multisigAddress: userAddress, - chainId: cosmosNetwork.chainId, - feeJson: JSON.stringify(fee), - msgs: encodedMsgs, - sequence: account.sequence, - accountNumber: account.accountNumber, - }); + const encodedMsgs = msgs.map((m) => + cosmosTypesRegistry.encodeAsAny(m), + ); + + await multisigClient.CreateTransaction({ + chainType: "cosmos", + authToken: multisigAuthToken, + multisigAddress: userAddress, + chainId: network.chainId, + feeJson: JSON.stringify(fee), + msgs: encodedMsgs, + sequence: account.sequence, + accountNumber: account.accountNumber, + }); + break; + } + case NetworkKind.Gno: { + const client = new GnoJSONRPCProvider(network.endpoint); + const gasEstimate = 10000000; // TODO: simulate if possible + + const fee: TxFee = { + gas_wanted: Long.fromNumber(gasEstimate), + gas_fee: `${((gasEstimate / 1000) * 1.05).toFixed(0)}ugnot`, // XXX: fetch gas price from chain + }; + + const account = await client.getAccount(userAddress); + if (!account) { + throw new Error("Multisig account not found on chain"); + } + + const encodedMsgs = msgs.map((msg) => + gnoEncodeAny(msg.typeUrl, msg.value), + ); + + await multisigClient.CreateTransaction({ + chainType: "gno", + authToken: multisigAuthToken, + multisigAddress: userAddress, + chainId: network.chainId, + feeJson: JSON.stringify(TxFee.toJSON(fee)), + msgs: encodedMsgs, + sequence: parseInt(account.BaseAccount.sequence, 10), + accountNumber: parseInt(account.BaseAccount.account_number, 10), + }); + break; + } + default: { + throw new Error(`Network kind ${network.kind} not supported`); + } + } await queryClient.invalidateQueries([ - ...multisigTransactionsQueryKey(cosmosNetwork.id, userId), + ...multisigTransactionsQueryKey(network.id, userId), ]); await queryClient.invalidateQueries([ - ...multisigTransactionsQueryKey(cosmosNetwork.id, undefined), + ...multisigTransactionsQueryKey(network.id, undefined), ]); await queryClient.invalidateQueries([ - ...multisigTransactionsCountsQueryKey(cosmosNetwork.id), + ...multisigTransactionsCountsQueryKey(network.id), ]); if (navigateToProposals && userId) { navigation.navigate("MultisigWalletDashboard", { id: userId }); diff --git a/packages/networks/IRISnet/index.ts b/packages/networks/IRISnet/index.ts index 9f21cb15b0..74541b0d54 100644 --- a/packages/networks/IRISnet/index.ts +++ b/packages/networks/IRISnet/index.ts @@ -1,4 +1,4 @@ -import { NetworkKind, NetworkInfo } from "../types"; +import { NetworkKind, NetworkInfo, NetworkFeature } from "../types"; export const irisNetwork: NetworkInfo = { id: "cosmos-registry:irisnet", @@ -18,7 +18,7 @@ export const irisNetwork: NetworkInfo = { color: "TODO", }, ], - features: [], + features: [NetworkFeature.NativeStaking], featureObjects: [], overrides: "cosmos-registry:irisnet", registryName: "irisnet", diff --git a/packages/networks/cosmos-hub-theta/index.ts b/packages/networks/cosmos-hub-theta/index.ts index e7630729db..73a19f3227 100644 --- a/packages/networks/cosmos-hub-theta/index.ts +++ b/packages/networks/cosmos-hub-theta/index.ts @@ -1,5 +1,5 @@ import { cosmosHubThetaCurrencies } from "./currencies"; -import { NetworkInfo, NetworkKind } from "../types"; +import { NetworkFeature, NetworkInfo, NetworkKind } from "../types"; export const cosmosThetaNetwork: NetworkInfo = { id: "cosmos-hub-theta", @@ -7,7 +7,7 @@ export const cosmosThetaNetwork: NetworkInfo = { chainId: "theta-testnet-001", displayName: "Cosmos Hub Theta Testnet", icon: "cosmos-hub.svg", - features: [], + features: [NetworkFeature.NativeStaking], overrides: "cosmos-registry:cosmoshubtestnet", registryName: "cosmoshubtestnet", currencies: cosmosHubThetaCurrencies, diff --git a/packages/networks/cosmos-hub/index.ts b/packages/networks/cosmos-hub/index.ts index e00b14fad3..bd90f68601 100644 --- a/packages/networks/cosmos-hub/index.ts +++ b/packages/networks/cosmos-hub/index.ts @@ -1,5 +1,5 @@ import { cosmosHubCurrencies } from "./currencies"; -import { NetworkKind, NetworkInfo } from "../types"; +import { NetworkKind, NetworkInfo, NetworkFeature } from "../types"; export const cosmosNetwork: NetworkInfo = { id: "cosmos-hub", @@ -7,7 +7,7 @@ export const cosmosNetwork: NetworkInfo = { chainId: "cosmoshub-4", displayName: "Cosmos Hub", icon: "cosmos-hub.svg", - features: [], + features: [NetworkFeature.NativeStaking], currencies: cosmosHubCurrencies, overrides: "cosmos-registry:cosmoshub", registryName: "cosmoshub", diff --git a/packages/networks/cosmos-registry.ts b/packages/networks/cosmos-registry.ts index 63180bdf09..e461245f44 100644 --- a/packages/networks/cosmos-registry.ts +++ b/packages/networks/cosmos-registry.ts @@ -1,7 +1,12 @@ import { chains, assets } from "chain-registry"; import { IBCCurrencyInfo } from "./ibc"; -import { CosmosNetworkInfo, NativeCurrencyInfo, NetworkKind } from "./types"; +import { + CosmosNetworkInfo, + NativeCurrencyInfo, + NetworkFeature, + NetworkKind, +} from "./types"; const banList = [ "permtestnet", @@ -66,7 +71,7 @@ export const networksFromCosmosRegistry = (): CosmosNetworkInfo[] => { }; return nativeCurrency; }), - features: [], + features: [NetworkFeature.NativeStaking], featureObjects: [], idPrefix: chain.chain_name, addressPrefix: chain.bech32_prefix, diff --git a/packages/networks/features.ts b/packages/networks/features.ts index 537abdfcd2..c20d81712e 100644 --- a/packages/networks/features.ts +++ b/packages/networks/features.ts @@ -18,6 +18,7 @@ export enum NetworkFeature { NFTMarketplaceLeaderboard = "NFTMarketplaceLeaderboard", CosmWasmNFTsBurner = "CosmWasmNFTsBurner", CosmWasmRakki = "CosmWasmRakki", + NativeStaking = "NativeStaking", } // Marketplace diff --git a/packages/networks/gno-dev/index.ts b/packages/networks/gno-dev/index.ts index afa3c018c8..c7a2c797cf 100644 --- a/packages/networks/gno-dev/index.ts +++ b/packages/networks/gno-dev/index.ts @@ -61,4 +61,5 @@ export const gnoDevNetwork: GnoNetworkInfo = { "ipfs://bafkreigqm3i4urywxohvpkbz5sgxosiogwn433ufmzz7eqldjxoi6xmwma", gnowebURL: "http://127.0.0.1:8888", txIndexerURL: "http://127.0.0.1:8546", + addressPrefix: "g", }; diff --git a/packages/networks/gno-portal/index.ts b/packages/networks/gno-portal/index.ts index e7eac1dcdb..d42d8108fb 100644 --- a/packages/networks/gno-portal/index.ts +++ b/packages/networks/gno-portal/index.ts @@ -44,4 +44,5 @@ export const gnoPortalNetwork: GnoNetworkInfo = { toriPkgPath: "gno.land/r/teritori/tori", profilePkgPath: "gno.land/r/demo/profile", txIndexerURL: "https://indexer.portal-loop.gno.testnet.teritori.com", + addressPrefix: "g", }; diff --git a/packages/networks/gno-zenao-staging/index.ts b/packages/networks/gno-zenao-staging/index.ts index 1ab1f41146..4fd1942c85 100644 --- a/packages/networks/gno-zenao-staging/index.ts +++ b/packages/networks/gno-zenao-staging/index.ts @@ -40,6 +40,7 @@ export const gnoZenaoStagingNetwork: GnoNetworkInfo = { txExplorer: "", accountExplorer: "", contractExplorer: "", + addressPrefix: "g", }; const customGnoscanParams = (network: GnoNetworkInfo) => { diff --git a/packages/networks/gno-zenao/index.ts b/packages/networks/gno-zenao/index.ts index 190c4c39d3..dbd8453513 100644 --- a/packages/networks/gno-zenao/index.ts +++ b/packages/networks/gno-zenao/index.ts @@ -40,6 +40,7 @@ export const gnoZenaoNetwork: GnoNetworkInfo = { txExplorer: "", accountExplorer: "", contractExplorer: "", + addressPrefix: "g", }; const customGnoscanParams = (network: GnoNetworkInfo) => { diff --git a/packages/networks/index.ts b/packages/networks/index.ts index a805742a39..07150915fd 100644 --- a/packages/networks/index.ts +++ b/packages/networks/index.ts @@ -291,6 +291,28 @@ export const getCosmosNetworkByChainId = (chainId: string | undefined) => { }); }; +export const getGnoNetworkByChainId = (chainId: string | undefined) => { + return allNetworks.find((n): n is GnoNetworkInfo => { + if (n.kind === NetworkKind.Gno && n.chainId === chainId) { + return true; + } + return false; + }); +}; + +export const getNetworkByChainId = ( + chainType: string | undefined, + chainId: string | undefined, +) => { + switch (chainType) { + case "cosmos": + return getCosmosNetworkByChainId(chainId); + case "gno": + return getGnoNetworkByChainId(chainId); + } + return undefined; +}; + export const mustGetCosmosNetwork = ( networkId: string | undefined, ): CosmosNetworkInfo => { @@ -527,5 +549,8 @@ export const contractExplorerLink = ( if (!network?.contractExplorer) { return "/"; } - return network.contractExplorer.replace("$address", address); + return network.contractExplorer.replace( + "$address", + encodeURIComponent(address), + ); }; diff --git a/packages/networks/osmosis-testnet/index.ts b/packages/networks/osmosis-testnet/index.ts index 6556d79df3..6f7b48070c 100644 --- a/packages/networks/osmosis-testnet/index.ts +++ b/packages/networks/osmosis-testnet/index.ts @@ -9,7 +9,7 @@ export const osmosisTestnetNetwork: NetworkInfo = { overrides: "cosmos-registry:osmosistestnet", displayName: "Osmosis Latest Testnet", icon: "osmosis.svg", - features: [NetworkFeature.Swap], + features: [NetworkFeature.Swap, NetworkFeature.NativeStaking], currencies: osmosisTestnetCurrencies, txExplorer: "https://testnet.mintscan.io/osmosis-testnet/txs/$hash", accountExplorer: diff --git a/packages/networks/osmosis/index.ts b/packages/networks/osmosis/index.ts index e5ea78b5e3..10e636ec44 100644 --- a/packages/networks/osmosis/index.ts +++ b/packages/networks/osmosis/index.ts @@ -8,7 +8,7 @@ export const osmosisNetwork: NetworkInfo = { chainId: "osmosis-1", displayName: "Osmosis", icon: "osmosis.svg", - features: [NetworkFeature.Swap], + features: [NetworkFeature.Swap, NetworkFeature.NativeStaking], overrides: "cosmos-registry:osmosis", currencies: osmosisCurrencies, txExplorer: "https://www.mintscan.io/osmosis/txs/$hash", diff --git a/packages/networks/polygon/index.ts b/packages/networks/polygon/index.ts index 8979937dc1..adcdac7f77 100644 --- a/packages/networks/polygon/index.ts +++ b/packages/networks/polygon/index.ts @@ -6,7 +6,7 @@ export const polygonNetwork: EthereumNetworkInfo = { kind: NetworkKind.Ethereum, displayName: "Polygon Mainnet", icon: "polygon.svg", - features: [NetworkFeature.RiotP2E], + features: [NetworkFeature.RiotP2E, NetworkFeature.NativeStaking], currencies: polygonCurrencies, idPrefix: "polygon", endpoint: "https://polygon-rpc.com", diff --git a/packages/networks/saga-test2/index.ts b/packages/networks/saga-test2/index.ts index 3b25595f0a..f7e6ae2735 100644 --- a/packages/networks/saga-test2/index.ts +++ b/packages/networks/saga-test2/index.ts @@ -1,4 +1,4 @@ -import { CosmosNetworkInfo, NetworkKind } from "../types"; +import { CosmosNetworkInfo, NetworkFeature, NetworkKind } from "../types"; export const sagaTest2: CosmosNetworkInfo = { id: "sagatestnet2", @@ -18,7 +18,7 @@ export const sagaTest2: CosmosNetworkInfo = { variant: "cosmos", }, ], - features: [], + features: [NetworkFeature.NativeStaking], featureObjects: [], idPrefix: "sagatestnet2", addressPrefix: "saga", diff --git a/packages/networks/saga/index.ts b/packages/networks/saga/index.ts index d17d226655..37b2eb6aa4 100644 --- a/packages/networks/saga/index.ts +++ b/packages/networks/saga/index.ts @@ -1,4 +1,4 @@ -import { CosmosNetworkInfo, NetworkKind } from "../types"; +import { CosmosNetworkInfo, NetworkFeature, NetworkKind } from "../types"; export const sagaNetwork: CosmosNetworkInfo = { id: "saga", @@ -19,7 +19,7 @@ export const sagaNetwork: CosmosNetworkInfo = { variant: "cosmos", }, ], - features: [], + features: [NetworkFeature.NativeStaking], featureObjects: [], idPrefix: "saga", addressPrefix: "saga", diff --git a/packages/networks/teritori-localnet/index.ts b/packages/networks/teritori-localnet/index.ts index 7d043fa6f1..eaa5c29163 100644 --- a/packages/networks/teritori-localnet/index.ts +++ b/packages/networks/teritori-localnet/index.ts @@ -35,6 +35,7 @@ export const teritoriLocalnetNetwork: NetworkInfo = { NetworkFeature.CosmWasmNFTLaunchpad, NetworkFeature.RiotP2E, NetworkFeature.NFTMarketplaceLeaderboard, + NetworkFeature.NativeStaking, ], featureObjects: [cosmwasmNftLaunchpadFeature], currencies: teritoriLocalnetCurrencies, diff --git a/packages/networks/teritori-testnet/index.ts b/packages/networks/teritori-testnet/index.ts index 59e272361e..004ee08cc3 100644 --- a/packages/networks/teritori-testnet/index.ts +++ b/packages/networks/teritori-testnet/index.ts @@ -74,6 +74,7 @@ export const teritoriTestnetNetwork: CosmosNetworkInfo = { NetworkFeature.NFTMarketplaceLeaderboard, NetworkFeature.CosmWasmNFTsBurner, NetworkFeature.CosmWasmRakki, + NetworkFeature.NativeStaking, ], featureObjects: [ premiumFeedFeature, diff --git a/packages/networks/teritori/index.ts b/packages/networks/teritori/index.ts index c644818368..970578f7d9 100644 --- a/packages/networks/teritori/index.ts +++ b/packages/networks/teritori/index.ts @@ -38,6 +38,7 @@ export const teritoriNetwork: CosmosNetworkInfo = { NetworkFeature.NFTMarketplaceLeaderboard, NetworkFeature.CosmWasmNFTsBurner, NetworkFeature.CosmWasmRakki, + NetworkFeature.NativeStaking, ], featureObjects: [burnCapitalFeature, rakkiFeature], registryName: "teritori", diff --git a/packages/networks/types.ts b/packages/networks/types.ts index bbb9fdb372..7c6bf45804 100644 --- a/packages/networks/types.ts +++ b/packages/networks/types.ts @@ -12,7 +12,7 @@ export enum NetworkKind { Starknet = "Starknet", } -interface NetworkInfoBase { +export interface NetworkInfoBase { id: string; displayName: string; kind: NetworkKind; @@ -139,6 +139,7 @@ export type GnoNetworkInfo = NetworkInfoBase & { faucetURL?: string; txIndexerURL?: string; cockpitNamespace?: string; + addressPrefix: string; }; export type NetworkInfo = diff --git a/packages/screens/Multisig/MultisigCreateScreen.tsx b/packages/screens/Multisig/MultisigCreateScreen.tsx index e24e569b2b..a1120b5b0b 100644 --- a/packages/screens/Multisig/MultisigCreateScreen.tsx +++ b/packages/screens/Multisig/MultisigCreateScreen.tsx @@ -1,4 +1,11 @@ -import { createMultisigThresholdPubkey } from "@cosmjs/amino"; +import { + createMultisigThresholdPubkey, + pubkeyToAddress, + Secp256k1Pubkey, +} from "@cosmjs/amino"; +import { GnoJSONRPCProvider } from "@gnolang/gno-js-client"; +import { Any, PubKeySecp256k1 } from "@gnolang/tm2-js-client"; +import { bech32 } from "bech32"; import React, { useEffect, useMemo, useState } from "react"; import { useForm } from "react-hook-form"; import { Pressable, ScrollView, View } from "react-native"; @@ -50,7 +57,11 @@ type CreateMultisigWalletFormType = { name: string; }; -const emptyPubKeyGroup = () => ({ address: "", compressedPubkey: "" }); +const emptyPubKeyGroup = () => ({ + address: "", + compressedPubkey: "", + kind: "", +}); export const MultisigCreateScreen = () => { const selectedWallet = useSelectedWallet(); @@ -101,30 +112,66 @@ export const MultisigCreateScreen = () => { throw new Error("No network selected"); } - if (selectedNetwork.kind !== NetworkKind.Cosmos) { - throw new Error("Only Cosmos networks are supported"); + if ( + selectedNetwork.kind !== NetworkKind.Cosmos && + selectedNetwork.kind !== NetworkKind.Gno + ) { + throw new Error("Only Cosmos or Gno networks are supported"); } - const compressedPubkeys = addressIndexes.map( - (item) => item.compressedPubkey, - ); - const pubkeys = compressedPubkeys.map((compressedPubkey) => { - return { - type: "tendermint/PubKeySecp256k1", - value: compressedPubkey, - }; - }); - const multisigPubkey = createMultisigThresholdPubkey( - pubkeys, - parseInt(signatureRequired, 10), - ); + let multisigPubkeyJson: string; + let addrPrefix: string; + switch (selectedNetwork.kind) { + case NetworkKind.Cosmos: { + const compressedPubkeys = addressIndexes.map( + (item) => item.compressedPubkey, + ); + const pubkeys = compressedPubkeys.map((compressedPubkey) => { + return { + type: "tendermint/PubKeySecp256k1", + value: compressedPubkey, + }; + }); + const multisigPubkey = createMultisigThresholdPubkey( + pubkeys, + parseInt(signatureRequired, 10), + ); + addrPrefix = selectedNetwork.addressPrefix; + multisigPubkeyJson = JSON.stringify(multisigPubkey); + break; + } + + case NetworkKind.Gno: { + const compressedPubkeys = addressIndexes.map( + (item) => item.compressedPubkey, + ); + const mspk = { + "@type": "/tm.PubKeyMultisig", + threshold: signatureRequired, + pubkeys: compressedPubkeys.map((compressedPubkey) => { + return { + "@type": "/tm.PubKeySecp256k1", + value: compressedPubkey, + }; + }), + }; + multisigPubkeyJson = JSON.stringify(mspk); + addrPrefix = "g"; + break; + } + + default: { + throw new Error("should not happen"); + } + } try { const res = await multisigClient.CreateOrJoinMultisig({ - authToken: { ...authToken, userAddress: "aeae" }, + chainType: selectedNetwork.kind.toLowerCase(), + authToken, chainId: selectedNetwork.chainId, - bech32Prefix: selectedNetwork.addressPrefix, - multisigPubkeyJson: JSON.stringify(multisigPubkey), + bech32Prefix: addrPrefix, + multisigPubkeyJson, name, }); @@ -138,40 +185,114 @@ export const MultisigCreateScreen = () => { } }; - const handleAddressChange = async (index: number, value: string) => { + const handleAddressChange = async (index: number, address: string) => { if (!selectedNetwork) { throw new Error("No network selected"); } - if (selectedNetwork.kind !== NetworkKind.Cosmos) { - throw new Error("Only Cosmos networks are supported"); + if ( + selectedNetwork.kind !== NetworkKind.Cosmos && + selectedNetwork.kind !== NetworkKind.Gno + ) { + throw new Error("Only Cosmos or Gno networks are supported"); } - const resValAddress = validateAddress(value); - - if (resValAddress !== true) return "Invalid address"; - - if (!value.includes(selectedNetwork.addressPrefix)) { - return `Only ${selectedNetwork.displayName} address is allowed`; + const valRes = validateAddress(address); + if (valRes !== true) { + return valRes; } - const address = value; - - if (addressIndexes.find((a, i) => a.address === address && i !== index)) - return "This address is already used in this form."; + const dcd = bech32.decode(address, 200); + const prefix = dcd.prefix; + const addrBz = bech32.fromWords(dcd.words); const tempPubkeys = [...addressIndexes]; try { setLoading(true); - const account = await getCosmosAccount( - getUserId(selectedNetwork?.id, address), - ); + let compressedPubkey: string; + let kind: string; + switch (selectedNetwork.kind) { + case NetworkKind.Cosmos: { + if ( + addressIndexes.find((a, i) => a.address === address && i !== index) + ) { + return "This address is already used in this form."; + } + + const account = await getCosmosAccount( + getUserId(selectedNetwork?.id, address), + ); - if (!account?.pubkey) { - return "Account has no public key on chain, this address will need to send a transaction before it can be added to a multisig."; + if (!account?.pubkey) { + return "Account has no public key on chain, this address will need to send a transaction before it can be added to a multisig."; + } + compressedPubkey = account.pubkey.value; + kind = "address"; + break; + } + case NetworkKind.Gno: { + switch (prefix) { + case "g": { + const client = new GnoJSONRPCProvider(selectedNetwork.endpoint); + try { + const account = await client.getAccount(address); + const pkval = account.BaseAccount.public_key?.value; + if (!pkval) { + return "Account has no public key on chain, this address will need to send a transaction before it can be added to a multisig."; + } + compressedPubkey = pkval; + } catch (err) { + if ( + err instanceof Error && + err.message.includes("account is not initialized") + ) { + return "Account has no public key on chain, this address will need to send a transaction before it can be added to a multisig."; + } + throw err; + } + kind = "address"; + break; + } + case "gpub": { + try { + const pkany = Any.decode(new Uint8Array(addrBz)); + if (pkany.type_url !== "/tm.PubKeySecp256k1") { + return `Invalid pubkey type ${JSON.stringify(pkany.type_url)}`; + } + const pk = PubKeySecp256k1.decode(pkany.value); + compressedPubkey = Buffer.from(pk.key).toString("base64"); + const cosmosPk: Secp256k1Pubkey = { + type: "tendermint/PubKeySecp256k1", + value: compressedPubkey, + }; + address = pubkeyToAddress(cosmosPk, "g"); + if ( + addressIndexes.find( + (a, i) => a.address === address && i !== index, + ) + ) { + return "This address is already used in this form."; + } + kind = "pubkey"; + } catch (err) { + return `Failed to decode pubkey: ${err}`; + } + break; + } + default: { + return `Unexpected Bech32 prefix ${JSON.stringify(prefix)}`; + } + } + break; + } + default: { + throw new Error(`should not happen`); + } } + tempPubkeys[index].address = address; - tempPubkeys[index].compressedPubkey = account.pubkey.value; + tempPubkeys[index].kind = kind; + tempPubkeys[index].compressedPubkey = compressedPubkey; setAddressIndexes(tempPubkeys); } catch { return "Failed to get Cosmos account"; @@ -189,7 +310,6 @@ export const MultisigCreateScreen = () => { : navigation.navigate("Multisig") } isLarge - forceNetworkKind={NetworkKind.Cosmos} > { }} > - Create a Legacy Multisig + Create a Multisig - This wallet adress is owned managed by at least 2 different - addresses and require signatures from co-owners to execute a - transaction. + This wallet adress is managed by at least 2 different addresses + and require signatures from co-owners to execute a transaction. @@ -222,56 +341,63 @@ export const MultisigCreateScreen = () => { /> - {addressIndexes.map((_, index) => ( - <> - - { - const [, address] = parseUserId(userId); - if (!address) { - return; - } - setValue(`addresses.${index}.address`, address); - }} - > - - defaultValue={index === 0 ? selectedWallet?.address : ""} - control={control} - name={`addresses.${index}.address`} - variant="labelOutside" - noBrokenCorners - label={"Address #" + (index + 1)} - rules={{ - required: true, - validate: (value) => handleAddressChange(index, value), + {addressIndexes.map((val, index) => { + let label = "Address #" + (index + 1); + if (val.kind === "pubkey") { + label += ": " + val.address; + } + return ( + <> + + { + const [, address] = parseUserId(userId); + if (!address) { + return; + } + setValue(`addresses.${index}.address`, address); }} - placeHolder="Account address" - iconSVG={walletInputSVG} > - {addressIndexes.length > 2 && ( - removeAddressField(index)} - > - - - )} - - - - - - ))} + + defaultValue={index === 0 ? selectedWallet?.address : ""} + control={control} + name={`addresses.${index}.address`} + variant="labelOutside" + noBrokenCorners + label={label} + rules={{ + required: true, + validate: (value) => handleAddressChange(index, value), + }} + disabled={index === 0} + placeHolder="Account address" + iconSVG={walletInputSVG} + > + {addressIndexes.length > 2 && ( + removeAddressField(index)} + > + + + )} + + + + + + ); + })} = () => { JoinState.JOIN_STATE_OUT, ); + const Header: React.FC = useMemo(() => { + return () => ( + <> + + + My Multisigs + + + + + Overview of your Multisignatures Wallets + + + item.address} + contentContainerStyle={{ + gap: layout.spacing_x2, + flexWrap: "wrap", + width: "100%", + }} + renderItem={({ item, index }) => ( + + navigation.navigate("MultisigWalletDashboard", { + id: getUserId(selectedWallet?.networkId, item.address), + }) + } + subtitle={tinyAddress(item.address, 21)} + titleStyle={{ color: secondaryColor }} + /> + )} + ListHeaderComponent={() => ( + navigation.navigate("MultisigCreate")} + /> + )} + ListFooterComponent={() => + isMultisigLoading && isMultisigFetching ? ( + + + + ) : null + } + /> + + {!!invitations?.length && ( + <> + + + Invitations + + + Multisignatures Wallets you did not join yet + + + item.address} + renderItem={({ item, index }) => ( + + + navigation.navigate("MultisigWalletDashboard", { + id: getUserId( + selectedWallet?.networkId, + item.address, + ), + }) + } + subtitle={tinyAddress(item.address, 21)} + titleStyle={{ color: secondaryColor }} + /> + + )} + ListFooterComponent={() => + isMultisigLoading && isMultisigFetching ? ( + + + + ) : null + } + /> + + + )} + + + ); + }, [ + authToken, + data, + invitations, + isMultisigFetching, + isMultisigLoading, + navigation, + selectedWallet?.networkId, + selectedWallet?.userId, + ]); + return ( Multisig Wallets} isLarge - onBackPress={() => navigation.navigate("Multisig")} - forceNetworkKind={NetworkKind.Cosmos} + noScroll + footerChildren={<>} > - - - - - My Multisigs - - - - - Overview of your Multisignatures Wallets - - - item.address} - renderItem={({ item, index }) => ( - - - navigation.navigate("MultisigWalletDashboard", { - id: getUserId(selectedWallet?.networkId, item.address), - }) - } - subtitle={tinyAddress(item.address, 21)} - titleStyle={{ color: secondaryColor }} - /> - - )} - ListHeaderComponent={() => ( - navigation.navigate("MultisigCreate")} - /> - )} - ListFooterComponent={() => - isMultisigLoading && isMultisigFetching ? ( - - - - ) : null - } - /> - - - {!!invitations?.length && ( - <> - - Invitations - - - Multisignatures Wallets you did not join yet - - - item.address} - renderItem={({ item, index }) => ( - - - navigation.navigate("MultisigWalletDashboard", { - id: getUserId( - selectedWallet?.networkId, - item.address, - ), - }) - } - subtitle={tinyAddress(item.address, 21)} - titleStyle={{ color: secondaryColor }} - /> - - )} - ListFooterComponent={() => - isMultisigLoading && isMultisigFetching ? ( - - - - ) : null - } - /> - - - - )} - {!!authToken && ( - - - - - - )} - - + + + ); }; diff --git a/packages/screens/Multisig/MultisigWalletDashboardScreen.tsx b/packages/screens/Multisig/MultisigWalletDashboardScreen.tsx index a78a4c153a..5d04a54ef1 100644 --- a/packages/screens/Multisig/MultisigWalletDashboardScreen.tsx +++ b/packages/screens/Multisig/MultisigWalletDashboardScreen.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useMemo, useState } from "react"; import { useForm } from "react-hook-form"; import { StyleProp, View, ViewStyle } from "react-native"; @@ -18,7 +18,6 @@ import { useMultisigInfo } from "@/hooks/multisig/useMultisigInfo"; import { getUserId, parseUserId } from "@/networks"; import { validateAddress } from "@/utils/formRules"; import { ScreenFC, useAppNavigation } from "@/utils/navigation"; -import { neutral33 } from "@/utils/style/colors"; import { fontRegular28 } from "@/utils/style/fonts"; import { layout } from "@/utils/style/layout"; @@ -40,73 +39,82 @@ export const MultisigWalletDashboardScreen: ScreenFC< const walletName = multisig?.name; const membersAddress = multisig?.usersAddresses; + const Header: React.FC = useMemo(() => { + return () => ( + <> + + + General information + + + + control={control} + label="" + hideLabel + name="multisigAddress" + rules={{ required: true, validate: validateAddress }} + isCopiable + isDisabled + isOverrideDisabledBorder + defaultValue={multisigAddress} + /> + + + + + + + + + + + + + + + ); + }, [ + control, + isLoading, + membersAddress, + multisig, + multisigAddress, + multisigUserId, + ]); + return ( Dashboard {walletName}} isLarge onBackPress={() => navigation.navigate("Multisig")} forceNetworkId={network?.id} + noScroll + footerChildren={<>} > - - - General information - - - - control={control} - label="" - hideLabel - name="multisigAddress" - rules={{ required: true, validate: validateAddress }} - isCopiable - isDisabled - isOverrideDisabledBorder - defaultValue={multisigAddress} - /> - - - - - - - - - - - - - - - - + ); }; diff --git a/packages/screens/Multisig/components/GetStartedOption.tsx b/packages/screens/Multisig/components/GetStartedOption.tsx index 4548ec68bd..603b80f3fe 100644 --- a/packages/screens/Multisig/components/GetStartedOption.tsx +++ b/packages/screens/Multisig/components/GetStartedOption.tsx @@ -97,8 +97,6 @@ const containerCStyle: ViewStyle = { borderColor: neutral33, position: "relative", borderRadius: 12, - marginHorizontal: layout.spacing_x2, - marginVertical: layout.spacing_x2, }; const smallContainerCStyle: ViewStyle = { diff --git a/packages/screens/Multisig/components/GnoCallModal.tsx b/packages/screens/Multisig/components/GnoCallModal.tsx new file mode 100644 index 0000000000..71780fa7e5 --- /dev/null +++ b/packages/screens/Multisig/components/GnoCallModal.tsx @@ -0,0 +1,261 @@ +import { parseCoins } from "@cosmjs/amino"; +import { Decimal } from "@cosmjs/math"; +import { EncodeObject } from "@cosmjs/proto-signing"; +import { MsgCall } from "@gnolang/gno-js-client"; +import { Fragment, useCallback, useState } from "react"; +import { View, ViewStyle } from "react-native"; + +import { BrandText } from "@/components/BrandText"; +import { PrimaryButton } from "@/components/buttons/PrimaryButton"; +import { TextInputCustom } from "@/components/inputs/TextInputCustom"; +import ModalBase from "@/components/modals/ModalBase"; +import { SpacerColumn } from "@/components/spacer"; +import { useGnoFunctionsSignatures } from "@/hooks/gno/useGnoFunctionsSignatures"; +import { useRunOrProposeTransaction } from "@/hooks/useRunOrProposeTransaction"; +import { getStakingCurrency, parseUserId, UserKind } from "@/networks"; +import { fontMedium15 } from "@/utils/style/fonts"; +import { modalMarginPadding } from "@/utils/style/modals"; +import { capitalize } from "@/utils/text"; + +interface GnoCallModalButtonProps { + userId: string | undefined; + userKind: UserKind; +} + +export const GnoCallModalButton: React.FC = ({ + userId, + userKind, +}) => { + const [isVisible, setVisible] = useState(false); + return ( + <> + setVisible(true)} + /> + {!!userId && !!isVisible && ( + setVisible(false)} + /> + )} + + ); +}; + +interface GnoCallModalProps { + userId: string; + userKind: UserKind; + isVisible: boolean; + onClose: () => void; +} + +const GnoCallModal = ({ + userId, + userKind, + isVisible, + onClose, +}: GnoCallModalProps) => { + const [txLinkText, setTxLinkText] = useState(""); + const [fn, setFn] = useState(""); + const [pkgPath, setPkgPath] = useState(""); + const [memo, setMemo] = useState(""); + const [args, setArgs] = useState>({}); + const [send, setSend] = useState(""); + + const [network, userAddress] = parseUserId(userId); + const networkId = network?.id; + + const currency = getStakingCurrency(networkId); + + const runOrProposeTransation = useRunOrProposeTransaction(userId, userKind); + + const { data: fnSigs } = useGnoFunctionsSignatures(networkId, pkgPath); + + const fnSig = fnSigs?.find((sig) => sig.FuncName === fn); + + const ModalHeader = useCallback( + () => ( + + Call Realm + + ), + [], + ); + return ( + + { + setTxLinkText(text); + + const u = URL.parse(text); + const [pkgSubPath, ...restArr] = u?.pathname.split("$") || ""; + + if (pkgSubPath) { + setPkgPath("gno.land" + pkgSubPath); + } + + const rest = restArr.join("$"); + const u2 = URL.parse("https://example.com/?" + rest.substring(5)); + if (!u2) { + return; + } + + const fnParam = u2.searchParams.get("func"); + if (fnParam !== null) { + setFn(fnParam); + } + + const sendParam = u2.searchParams.get(".send"); + if (sendParam !== null && currency) { + const coin = parseCoins(sendParam); + // XXX: handle 0 or more than 1 coins + const userAmount = Decimal.fromAtomics( + coin[0].amount, + currency?.decimals, + ); + setSend(userAmount.toString()); + } + + // XXX: can import memo? + + const keys = [ + ...u2.searchParams + .keys() + .filter((k) => k !== "func" && k !== ".send"), + ]; + + const newArgs: Record = {}; + for (const k of keys) { + const val = u2.searchParams.get(k); + if (val === null) { + continue; + } + newArgs[k] = val; + } + + setArgs((args) => ({ ...args, ...newArgs })); + }} + value={txLinkText} + /> + + + + + + + + + + {currency?.displayName} + + + {fnSig?.Params.map((arg, idx) => { + if (idx === 0) { + // skip `cur realm` + return null; + } + + return ( + + + + setArgs((args) => ({ ...args, [arg.Name]: value })) + } + /> + + ); + })} + + + + + + + + { + if (!currency || !fnSig) { + return; + } + const sendCoin = + Decimal.fromUserInput(send, currency?.decimals).atomics + + currency.denom; + const msgCall: MsgCall = { + caller: userAddress, + send: sendCoin, + pkg_path: pkgPath, + func: fn, + args: fnSig.Params.slice(1).map((param) => args[param.Name]), + max_deposit: "", + }; + console.log("msgCall", msgCall); + const msg: EncodeObject = { + typeUrl: "/vm.m_call", + value: msgCall, + }; + await runOrProposeTransation({ + msgs: [msg], + memo, + }); + onClose(); + }} + /> + + + ); +}; + +const headerStyle: ViewStyle = { + display: "flex", + alignItems: "center", + width: "auto", +}; diff --git a/packages/screens/Multisig/components/MultisigRightSection.tsx b/packages/screens/Multisig/components/MultisigRightSection.tsx index 0c1d198db6..4b2a21dc82 100644 --- a/packages/screens/Multisig/components/MultisigRightSection.tsx +++ b/packages/screens/Multisig/components/MultisigRightSection.tsx @@ -1,10 +1,12 @@ import { Decimal } from "@cosmjs/math"; +import { GnoJSONRPCProvider } from "@gnolang/gno-js-client"; import { useRoute } from "@react-navigation/native"; import { useQueryClient } from "@tanstack/react-query"; import { Buffer } from "buffer"; import React, { useState } from "react"; import { View, ViewStyle } from "react-native"; +import { GnoCallModalButton } from "./GnoCallModal"; import ModalBase from "../../../components/modals/ModalBase"; import useSelectedWallet from "../../../hooks/useSelectedWallet"; import { TNSMintNameModal } from "../../TeritoriNameService/TNSMintNameScreen"; @@ -32,23 +34,19 @@ import { userMultisigsQueryKey } from "@/hooks/multisig/useUserMultisigs"; import { useBalances } from "@/hooks/useBalances"; import { useRunOrProposeTransaction } from "@/hooks/useRunOrProposeTransaction"; import { - getCosmosNetworkByChainId, getNativeCurrency, + getNetworkByChainId, getNonSigningStargateClient, getStakingCurrency, getUserId, keplrCurrencyFromNativeCurrencyInfo, NetworkFeature, + NetworkKind, parseUserId, UserKind, } from "@/networks"; import { AppRouteType, useAppNavigation } from "@/utils/navigation"; -import { - neutral33, - neutral55, - neutral77, - primaryColor, -} from "@/utils/style/colors"; +import { neutral55, neutral77, primaryColor } from "@/utils/style/colors"; import { fontRegular12, fontRegular13 } from "@/utils/style/fonts"; import { layout } from "@/utils/style/layout"; @@ -139,16 +137,27 @@ export const MultisigRightSection: React.FC = () => { , ); - actions.push( - navigation.navigate("Staking", { multisigId: id })} - />, - ); + if (network?.kind === NetworkKind.Gno) { + actions.push( + , + ); + } + + if (network?.features.includes(NetworkFeature.NativeStaking)) { + actions.push( + navigation.navigate("Staking", { multisigId: id })} + />, + ); + } - if (network?.features.includes(NetworkFeature.NameService)) { + if ( + network?.kind !== NetworkKind.Gno && + network?.features.includes(NetworkFeature.NameService) + ) { actions.push( <> { fullWidth loader onPress={wrapWithFeedback(async () => { - const network = getCosmosNetworkByChainId(multisig.chainId); + const network = getNetworkByChainId( + multisig.chainType, + multisig.chainId, + ); if (!network) { throw new Error("Invalid multisig network"); } - const stargateClient = await getNonSigningStargateClient( - network.id, - ); - if (!stargateClient) { - throw new Error("Invalid multisig network"); + let sequence: number; + switch (network?.kind) { + case NetworkKind.Cosmos: { + const stargateClient = await getNonSigningStargateClient( + network.id, + ); + if (!stargateClient) { + throw new Error("Invalid multisig network"); + } + const account = await stargateClient.getAccount( + multisig.address, + ); + sequence = account?.sequence || 0; + break; + } + case NetworkKind.Gno: { + const client = new GnoJSONRPCProvider(network.endpoint); + const account = await client.getAccount(multisig.address); + sequence = parseInt(account.BaseAccount.sequence, 10); + break; + } + default: { + throw new Error( + `Unknown network ${multisig.chainType}/${multisig.chainId}`, + ); + } } - const account = await stargateClient.getAccount(multisig.address); await multisigClient.ClearSignatures({ authToken, multisigChainId: multisig.chainId, + chainType: multisig.chainType, multisigAddress: multisig.address, - sequence: account?.sequence || 0, + sequence, }); await queryClient.invalidateQueries( multisigTransactionsQueryKey( @@ -263,8 +296,6 @@ export const MultisigRightSection: React.FC = () => { const containerCStyle: ViewStyle = { width: 300, height: "100%", - borderLeftWidth: 1, - borderColor: neutral33, padding: layout.spacing_x2_5, }; @@ -408,22 +439,26 @@ const JoinMultisigModal: React.FC<{ if (!authToken) { throw new Error("Need an auth token"); } - const cosmosNetwork = getCosmosNetworkByChainId(multisig.chainId); - if (!cosmosNetwork) { + const network = getNetworkByChainId( + multisig.chainType, + multisig.chainId, + ); + if (!network) { throw new Error("Invalid multisig network"); } await multisigClient.CreateOrJoinMultisig({ + chainType: network?.kind.toLowerCase(), chainId: multisig.chainId, multisigPubkeyJson: multisig.pubkeyJson, authToken, name, - bech32Prefix: cosmosNetwork.addressPrefix, + bech32Prefix: network?.addressPrefix, }); await queryClient.invalidateQueries( multisigInfoQueryKey(multisigId), ); await queryClient.invalidateQueries( - multisigTransactionsQueryKey(cosmosNetwork.id, undefined), + multisigTransactionsQueryKey(network?.id, undefined), ); await queryClient.invalidateQueries(userMultisigsQueryKey(userId)); onClose?.(); diff --git a/packages/screens/WalletManager/Assets.tsx b/packages/screens/WalletManager/Assets.tsx index b38c18536a..fbd85e79bd 100644 --- a/packages/screens/WalletManager/Assets.tsx +++ b/packages/screens/WalletManager/Assets.tsx @@ -35,6 +35,8 @@ export const Assets: React.FC<{ const [network, userAddress] = parseUserId(userId); const { balances } = useBalances(network?.id, userAddress); + console.log("balances", balances); + if (!network) { return null; } diff --git a/packages/scripts/lib.ts b/packages/scripts/lib.ts index 2bfa4c8b3e..04a370f673 100644 --- a/packages/scripts/lib.ts +++ b/packages/scripts/lib.ts @@ -17,7 +17,7 @@ import { getNetwork } from "@/networks"; export const mustGetNodeMultisigClient = (networkId: string | undefined) => { const network = getNetwork(networkId); - let endpoint = process.env.MULTISIG_BACKEND_URL; + let endpoint = process.env.EXPO_PUBLIC_MULTISIG_BACKEND_URL; if (!endpoint) { if (network?.testnet) { endpoint = "https://multisig.testnet.teritori.com"; diff --git a/packages/utils/formRules.ts b/packages/utils/formRules.ts index 230b544230..1b83569478 100644 --- a/packages/utils/formRules.ts +++ b/packages/utils/formRules.ts @@ -8,10 +8,9 @@ import { DEFAULT_FORM_ERRORS } from "@/utils/errors"; // validator should return false or string to trigger error export const validateAddress = (value: string) => { try { - bech32.decode(value); + bech32.decode(value, 200); return true; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (err) { + } catch { return "The address is invalid"; } }; diff --git a/packages/utils/gno.ts b/packages/utils/gno.ts index c408d3903b..cc271c8490 100644 --- a/packages/utils/gno.ts +++ b/packages/utils/gno.ts @@ -1,4 +1,6 @@ -import { GnoJSONRPCProvider } from "@gnolang/gno-js-client"; +import { encodeSecp256k1Pubkey, pubkeyToAddress } from "@cosmjs/amino"; +import { Secp256k1 } from "@cosmjs/crypto"; +import { GnoJSONRPCProvider, MsgCall, MsgSend } from "@gnolang/gno-js-client"; import { bech32 } from "bech32"; import shajs from "sha.js"; @@ -151,6 +153,13 @@ export const derivePkgAddr = (pkgPath: string): string => { return bech32.encode("g", bech32.toWords(h)); }; +export const addrFromPubkey = (pubkey: Uint8Array): string => { + return pubkeyToAddress( + encodeSecp256k1Pubkey(Secp256k1.compressPubkey(pubkey)), + "g", + ); +}; + const extractGnoStringResponse = (res: string): string => { const jsonString = res.substring("(".length, res.length - " string)".length); // eslint-disable-next-line no-restricted-syntax @@ -168,3 +177,28 @@ export const extractGnoJSONResponse = (res: string): unknown => { // eslint-disable-next-line no-restricted-syntax return JSON.parse(str) as unknown; }; + +// XXX: support all messages +export const gnoEncodeAny = ( + typeUrl: string, + value: unknown, +): { typeUrl: string; value: Uint8Array } => { + let encValue: Uint8Array; + switch (typeUrl) { + case "/vm.m_call": { + encValue = MsgCall.encode(MsgCall.fromJSON(value)).finish(); + break; + } + case "/bank.MsgSend": { + encValue = MsgSend.encode(MsgSend.fromJSON(value)).finish(); + break; + } + default: { + throw new Error(`unknown msg type ${typeUrl}`); + } + } + return { + typeUrl, + value: encValue, + }; +}; diff --git a/yarn.lock b/yarn.lock index ac6f93b69d..2c52847e2a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2126,10 +2126,17 @@ __metadata: languageName: node linkType: hard -"@bufbuild/protobuf@npm:^2.6.0": - version: 2.6.0 - resolution: "@bufbuild/protobuf@npm:2.6.0" - checksum: 9337e89052a0e4b6a1ca099f09801243055c7027a9ecb2e2d22ae25926f8730d32f5e2e8222214155de2847324b0f07fee0318621147f229da8f2fb595ff6802 +"@bufbuild/protobuf@npm:2.7.0": + version: 2.7.0 + resolution: "@bufbuild/protobuf@npm:2.7.0" + checksum: 7456c9d7d3b1bda3153f7c92ea95c637e90d7d04a171e25eb8321762bbc70883b88408c4eb7077c3763ab705c59f63885a2301a9f8c9f419981534fec214d682 + languageName: node + linkType: hard + +"@bufbuild/protobuf@patch:@bufbuild/protobuf@npm%3A2.7.0#./.yarn/patches/@bufbuild-protobuf-npm-2.7.0-79729124a9.patch::locator=teritori-dapp%40workspace%3A.": + version: 2.7.0 + resolution: "@bufbuild/protobuf@patch:@bufbuild/protobuf@npm%3A2.7.0#./.yarn/patches/@bufbuild-protobuf-npm-2.7.0-79729124a9.patch::version=2.7.0&hash=c2df69&locator=teritori-dapp%40workspace%3A." + checksum: 0e42afbacca11731d57288318014ffce5309cba561cbf5be2d7613e1346b95ad882413de11f5845c2a43e1f6de874ad17e60b9ddc4c0fb1f7fb4e32bd9ed54ad languageName: node linkType: hard @@ -2261,33 +2268,33 @@ __metadata: languageName: node linkType: hard -"@cosmjs/amino@npm:^0.32.4": - version: 0.32.4 - resolution: "@cosmjs/amino@npm:0.32.4" +"@cosmjs/amino@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/amino@npm:0.36.0" dependencies: - "@cosmjs/crypto": ^0.32.4 - "@cosmjs/encoding": ^0.32.4 - "@cosmjs/math": ^0.32.4 - "@cosmjs/utils": ^0.32.4 - checksum: 7e37da1c04020a5382812881afd8dc65cf87b4643d8b7761869fd22bec6a057d97a8c8d158f0a2bb061843fa725a9511dbd8bc7762c783e7daf2563ac285167e + "@cosmjs/crypto": ^0.36.0 + "@cosmjs/encoding": ^0.36.0 + "@cosmjs/math": ^0.36.0 + "@cosmjs/utils": ^0.36.0 + checksum: f7083d794861288871f8225b382cead08629790273b79fa60dc8c35104a97093dddf3802d460279d7825d0df9dbf3ae4595dbf090e1a914af6308b1263964f12 languageName: node linkType: hard -"@cosmjs/cosmwasm-stargate@npm:0.32.2": - version: 0.32.2 - resolution: "@cosmjs/cosmwasm-stargate@npm:0.32.2" +"@cosmjs/cosmwasm-stargate@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/cosmwasm-stargate@npm:0.36.0" dependencies: - "@cosmjs/amino": ^0.32.2 - "@cosmjs/crypto": ^0.32.2 - "@cosmjs/encoding": ^0.32.2 - "@cosmjs/math": ^0.32.2 - "@cosmjs/proto-signing": ^0.32.2 - "@cosmjs/stargate": ^0.32.2 - "@cosmjs/tendermint-rpc": ^0.32.2 - "@cosmjs/utils": ^0.32.2 - cosmjs-types: ^0.9.0 - pako: ^2.0.2 - checksum: 6f10131be59b3104a8e6c9399152054f912de399671a2c1c07567c7a2a6c92ef458a68333867a11398bc2239666f6bbf0d91d0c95d983584c6fbd4b4f9e816e6 + "@cosmjs/amino": ^0.36.0 + "@cosmjs/crypto": ^0.36.0 + "@cosmjs/encoding": ^0.36.0 + "@cosmjs/math": ^0.36.0 + "@cosmjs/proto-signing": ^0.36.0 + "@cosmjs/stargate": ^0.36.0 + "@cosmjs/tendermint-rpc": ^0.36.0 + "@cosmjs/utils": ^0.36.0 + cosmjs-types: ^0.10.1 + pako: ^2.1.0 + checksum: 35699068393de78ac45c3d375959cb53b643909c777eeb4a6fd524401540db05d8ccd0023120e871cb61c4cb716a9e0652f098cf7490d6d3ed7ef77cc95e3685 languageName: node linkType: hard @@ -2309,21 +2316,6 @@ __metadata: languageName: node linkType: hard -"@cosmjs/crypto@npm:0.32.2, @cosmjs/crypto@npm:^0.32.2": - version: 0.32.2 - resolution: "@cosmjs/crypto@npm:0.32.2" - dependencies: - "@cosmjs/encoding": ^0.32.2 - "@cosmjs/math": ^0.32.2 - "@cosmjs/utils": ^0.32.2 - "@noble/hashes": ^1 - bn.js: ^5.2.0 - elliptic: ^6.5.4 - libsodium-wrappers-sumo: ^0.7.11 - checksum: 7600bd48f718b8c352038bf96af325b9597310ccf51d2885bba4603a567b52d59446d193288f519ddf354a8668bd0ffba899c518642b3c9bb039bf24a7261faa - languageName: node - linkType: hard - "@cosmjs/crypto@npm:^0.29.3, @cosmjs/crypto@npm:^0.29.5": version: 0.29.5 resolution: "@cosmjs/crypto@npm:0.29.5" @@ -2354,40 +2346,44 @@ __metadata: languageName: node linkType: hard -"@cosmjs/crypto@npm:^0.32.4": - version: 0.32.4 - resolution: "@cosmjs/crypto@npm:0.32.4" +"@cosmjs/crypto@npm:^0.32.2": + version: 0.32.2 + resolution: "@cosmjs/crypto@npm:0.32.2" dependencies: - "@cosmjs/encoding": ^0.32.4 - "@cosmjs/math": ^0.32.4 - "@cosmjs/utils": ^0.32.4 + "@cosmjs/encoding": ^0.32.2 + "@cosmjs/math": ^0.32.2 + "@cosmjs/utils": ^0.32.2 "@noble/hashes": ^1 bn.js: ^5.2.0 elliptic: ^6.5.4 libsodium-wrappers-sumo: ^0.7.11 - checksum: 432313296350c070936af9516249a7c96c3c057242ab4a8ca261fcf12a5cfddf151d8b84dabec324e0d51e01643b0d92b798ab652ad4ec16321b691e875c93b3 + checksum: 7600bd48f718b8c352038bf96af325b9597310ccf51d2885bba4603a567b52d59446d193288f519ddf354a8668bd0ffba899c518642b3c9bb039bf24a7261faa languageName: node linkType: hard -"@cosmjs/encoding@npm:0.27.1": - version: 0.27.1 - resolution: "@cosmjs/encoding@npm:0.27.1" +"@cosmjs/crypto@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/crypto@npm:0.36.0" dependencies: - base64-js: ^1.3.0 - bech32: ^1.1.4 - readonly-date: ^1.0.0 - checksum: 34dad88ee64b6d3b920daa5e605dafb2722d2f9cf9c44da8e652ebf24d5f76557cdd422be3ea5252186b8ea19d172819f8053749c3e81232a7c2bbff5f24fa81 + "@cosmjs/encoding": ^0.36.0 + "@cosmjs/math": ^0.36.0 + "@cosmjs/utils": ^0.36.0 + "@noble/ciphers": ^1.3.0 + "@noble/curves": ^1.9.2 + "@noble/hashes": ^1 + hash-wasm: ^4.12.0 + checksum: 57e0522e2f3d073fc63d972819fba48750a67318855ee0e6b86270c12df780ee69767cf106771fde3ec6bc4833bdf9f3cc212ec99a2539711ff204dc7bb97760 languageName: node linkType: hard -"@cosmjs/encoding@npm:0.32.2, @cosmjs/encoding@npm:^0.32.2": - version: 0.32.2 - resolution: "@cosmjs/encoding@npm:0.32.2" +"@cosmjs/encoding@npm:0.27.1": + version: 0.27.1 + resolution: "@cosmjs/encoding@npm:0.27.1" dependencies: base64-js: ^1.3.0 bech32: ^1.1.4 readonly-date: ^1.0.0 - checksum: a9ee00b730aa7f422cf3946097cb96a0c9d5d7a9f6b3aa31d8e96e4f815220928226ae2133b76e835c781df0231e9691c8ebf1c98f68468e2f936a1d431e4c30 + checksum: 34dad88ee64b6d3b920daa5e605dafb2722d2f9cf9c44da8e652ebf24d5f76557cdd422be3ea5252186b8ea19d172819f8053749c3e81232a7c2bbff5f24fa81 languageName: node linkType: hard @@ -2424,14 +2420,25 @@ __metadata: languageName: node linkType: hard -"@cosmjs/encoding@npm:^0.32.4": - version: 0.32.4 - resolution: "@cosmjs/encoding@npm:0.32.4" +"@cosmjs/encoding@npm:^0.32.2": + version: 0.32.2 + resolution: "@cosmjs/encoding@npm:0.32.2" + dependencies: + base64-js: ^1.3.0 + bech32: ^1.1.4 + readonly-date: ^1.0.0 + checksum: a9ee00b730aa7f422cf3946097cb96a0c9d5d7a9f6b3aa31d8e96e4f815220928226ae2133b76e835c781df0231e9691c8ebf1c98f68468e2f936a1d431e4c30 + languageName: node + linkType: hard + +"@cosmjs/encoding@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/encoding@npm:0.36.0" dependencies: base64-js: ^1.3.0 bech32: ^1.1.4 readonly-date: ^1.0.0 - checksum: 9a2a1d87b7fe3fa7ad05a0b049b783b5b08ccfd61ed5bb3a1a37e0ae93a0ad9bc8c6701b1d3112e7c154b2dd48a0c221263a39a4d6878a495dc59ac5eeef6ec2 + checksum: 12e026d2bc1248c78df802e22983127731898427172a2241b184bd4c6a2b5cef01cda7cc0c829da019ffbf26cad79b5357aa53f8e7299cb87c3c8552510b2adc languageName: node linkType: hard @@ -2475,6 +2482,16 @@ __metadata: languageName: node linkType: hard +"@cosmjs/json-rpc@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/json-rpc@npm:0.36.0" + dependencies: + "@cosmjs/stream": ^0.36.0 + xstream: ^11.14.0 + checksum: 741bea513b1260b2908d0cb731eb496668630bf94419ab5b602b4a0e053c032bc89c1631f0e30437e2babce98a8be01a323ecfd15d78604ab9afe9fe6589c196 + languageName: node + linkType: hard + "@cosmjs/launchpad@npm:0.27.1": version: 0.27.1 resolution: "@cosmjs/launchpad@npm:0.27.1" @@ -2490,18 +2507,18 @@ __metadata: languageName: node linkType: hard -"@cosmjs/ledger-amino@npm:^0.32.4": - version: 0.32.4 - resolution: "@cosmjs/ledger-amino@npm:0.32.4" +"@cosmjs/ledger-amino@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/ledger-amino@npm:0.36.0" dependencies: - "@cosmjs/amino": ^0.32.4 - "@cosmjs/crypto": ^0.32.4 - "@cosmjs/encoding": ^0.32.4 - "@cosmjs/math": ^0.32.4 - "@cosmjs/utils": ^0.32.4 - ledger-cosmos-js: ^2.1.8 + "@cosmjs/amino": ^0.36.0 + "@cosmjs/crypto": ^0.36.0 + "@cosmjs/encoding": ^0.36.0 + "@cosmjs/math": ^0.36.0 + "@cosmjs/utils": ^0.36.0 + "@zondax/ledger-cosmos-js": ^4.0.1 semver: ^7.5.2 - checksum: ac2d27c6b7b1609930c720dbdaf9e0d95a1e897e75101ef4c22489fb27094c016a272ca2f1b40e6e603ec23e4b0556e5590c5c81ff36a1f1887d02b1dc4c1c84 + checksum: cd3af9866825738932b8bbfd654d6ecef2e8c65f0c0810c14a71733d56ad586f6b1030839e353aa7da39522b235b2ee610ea11ca67be295e1586ba1edbcc74f7 languageName: node linkType: hard @@ -2514,15 +2531,6 @@ __metadata: languageName: node linkType: hard -"@cosmjs/math@npm:0.32.2, @cosmjs/math@npm:^0.32.2": - version: 0.32.2 - resolution: "@cosmjs/math@npm:0.32.2" - dependencies: - bn.js: ^5.2.0 - checksum: 3ea9c811d1b53b61f24c10ae4e3707fb7f926194202e5c57ea5aa1a41996ffc872ce5599967f74cc6f289d30e064d372b7ff30c1128d682847b865ca597aca59 - languageName: node - linkType: hard - "@cosmjs/math@npm:^0.20.0": version: 0.20.1 resolution: "@cosmjs/math@npm:0.20.1" @@ -2550,12 +2558,19 @@ __metadata: languageName: node linkType: hard -"@cosmjs/math@npm:^0.32.4": - version: 0.32.4 - resolution: "@cosmjs/math@npm:0.32.4" +"@cosmjs/math@npm:^0.32.2": + version: 0.32.2 + resolution: "@cosmjs/math@npm:0.32.2" dependencies: bn.js: ^5.2.0 - checksum: 1269ad0c33a78b05c9f7c1bc7a7222d3b4504263ade3a15b07f95eb18c2620c96e4c79beeab66d7053294828b32cf04d0cc5a71610f755e1d1da06b04d462043 + checksum: 3ea9c811d1b53b61f24c10ae4e3707fb7f926194202e5c57ea5aa1a41996ffc872ce5599967f74cc6f289d30e064d372b7ff30c1128d682847b865ca597aca59 + languageName: node + linkType: hard + +"@cosmjs/math@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/math@npm:0.36.0" + checksum: 11af6cabf8c0aa63445236ac829929f2552d9b35a74d9ce87e30ce78055a1d4ce949e3a5299159e99933ad66529e83203d1fabe1b960f6e14d1f18b9140027a2 languageName: node linkType: hard @@ -2618,6 +2633,20 @@ __metadata: languageName: node linkType: hard +"@cosmjs/proto-signing@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/proto-signing@npm:0.36.0" + dependencies: + "@cosmjs/amino": ^0.36.0 + "@cosmjs/crypto": ^0.36.0 + "@cosmjs/encoding": ^0.36.0 + "@cosmjs/math": ^0.36.0 + "@cosmjs/utils": ^0.36.0 + cosmjs-types: ^0.10.1 + checksum: 869ffffb5148e59cef1fd04e662b5f1ae7a71c93f087cbe94013a5b5cf4ce4c09fe761aea3dc7bc11b80bba1102da31cfcac5e12d4d775420790bbb9ea92ac43 + languageName: node + linkType: hard + "@cosmjs/socket@npm:^0.29.5": version: 0.29.5 resolution: "@cosmjs/socket@npm:0.29.5" @@ -2654,6 +2683,18 @@ __metadata: languageName: node linkType: hard +"@cosmjs/socket@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/socket@npm:0.36.0" + dependencies: + "@cosmjs/stream": ^0.36.0 + isomorphic-ws: ^4.0.1 + ws: ^7 + xstream: ^11.14.0 + checksum: c7c005675ed62eb6a221e2010c0ea92e601ef53af795e3127d138ebba960585f42e57980ecac5ecfc729d2d82b54bc81293bf2e4f6bd27265dac85e068fe3ca9 + languageName: node + linkType: hard + "@cosmjs/stargate@npm:0.29.3": version: 0.29.3 resolution: "@cosmjs/stargate@npm:0.29.3" @@ -2714,7 +2755,7 @@ __metadata: languageName: node linkType: hard -"@cosmjs/stargate@npm:0.32.2, @cosmjs/stargate@npm:^0.32.2": +"@cosmjs/stargate@npm:0.32.2": version: 0.32.2 resolution: "@cosmjs/stargate@npm:0.32.2" dependencies: @@ -2732,6 +2773,22 @@ __metadata: languageName: node linkType: hard +"@cosmjs/stargate@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/stargate@npm:0.36.0" + dependencies: + "@cosmjs/amino": ^0.36.0 + "@cosmjs/encoding": ^0.36.0 + "@cosmjs/math": ^0.36.0 + "@cosmjs/proto-signing": ^0.36.0 + "@cosmjs/stream": ^0.36.0 + "@cosmjs/tendermint-rpc": ^0.36.0 + "@cosmjs/utils": ^0.36.0 + cosmjs-types: ^0.10.1 + checksum: 77c2259d6bd74421c507201b8d78c657c96d7793490cdbbe207f65ca4ca869668d45c718b9664e424653c81247c2bb9dd62805a83aa7674b41e110165aa10adc + languageName: node + linkType: hard + "@cosmjs/stream@npm:^0.29.3, @cosmjs/stream@npm:^0.29.5": version: 0.29.5 resolution: "@cosmjs/stream@npm:0.29.5" @@ -2768,6 +2825,15 @@ __metadata: languageName: node linkType: hard +"@cosmjs/stream@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/stream@npm:0.36.0" + dependencies: + xstream: ^11.14.0 + checksum: 0e56bd62a96c8e8e66326726d0279da355df7631311eeda0f1cfa32c3f494114dde41f68dddcaf40ed3af3e8159c1e466c152eb26303983cbcc5a20b952df521 + languageName: node + linkType: hard + "@cosmjs/tendermint-rpc@npm:0.32.2, @cosmjs/tendermint-rpc@npm:^0.32.2": version: 0.32.2 resolution: "@cosmjs/tendermint-rpc@npm:0.32.2" @@ -2822,6 +2888,23 @@ __metadata: languageName: node linkType: hard +"@cosmjs/tendermint-rpc@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/tendermint-rpc@npm:0.36.0" + dependencies: + "@cosmjs/crypto": ^0.36.0 + "@cosmjs/encoding": ^0.36.0 + "@cosmjs/json-rpc": ^0.36.0 + "@cosmjs/math": ^0.36.0 + "@cosmjs/socket": ^0.36.0 + "@cosmjs/stream": ^0.36.0 + "@cosmjs/utils": ^0.36.0 + readonly-date: ^1.0.0 + xstream: ^11.14.0 + checksum: 79d7bb2df21b83d8d9459faafd27f8fa044f839c695b15c0489f5888e000c5da7ad8a6bea84f33b08cdc5d4a64c5e70e501f06bb13b239116eacfc3933199c94 + languageName: node + linkType: hard + "@cosmjs/utils@npm:0.27.1": version: 0.27.1 resolution: "@cosmjs/utils@npm:0.27.1" @@ -2857,10 +2940,10 @@ __metadata: languageName: node linkType: hard -"@cosmjs/utils@npm:^0.32.4": - version: 0.32.4 - resolution: "@cosmjs/utils@npm:0.32.4" - checksum: 92f4d0878bedda53d113894ebadd31a6d189fdd45f2f884049ee99c2d7f907703b6dc40c8bc9b88b912443c38f3dbf77a9474183f41b85dec1f9ef3bec9d86c4 +"@cosmjs/utils@npm:^0.36.0": + version: 0.36.0 + resolution: "@cosmjs/utils@npm:0.36.0" + checksum: 30a65dcb78dfdb46d8b6163a5371bd39f936f853db2826bdb3274c923fda7562f91d513767fc7c525437070168c2485c25112f9ce5eda329c319dac4923e7cd9 languageName: node linkType: hard @@ -4261,49 +4344,32 @@ __metadata: languageName: node linkType: hard -"@gnolang/gno-js-client@npm:^1.3.0": - version: 1.3.0 - resolution: "@gnolang/gno-js-client@npm:1.3.0" - dependencies: - "@cosmjs/ledger-amino": ^0.32.4 - "@gnolang/tm2-js-client": ^1.2.1 - long: ^5.2.3 - protobufjs: ^7.2.3 - checksum: 65de2b562cea8ddc8713aa3fdfb7aa2df173188455020406b4b591c41a63fdacf6f01ba91cba6288ef54281f887f227a7b4b3da7567af33e87d06382f7bef1a9 - languageName: node - linkType: hard - -"@gnolang/tm2-js-client@npm:1.2.1": - version: 1.2.1 - resolution: "@gnolang/tm2-js-client@npm:1.2.1" +"@gnolang/gno-js-client@npm:^1.4.4": + version: 1.4.4 + resolution: "@gnolang/gno-js-client@npm:1.4.4" dependencies: - "@cosmjs/amino": ^0.32.4 - "@cosmjs/crypto": ^0.32.4 - "@cosmjs/ledger-amino": ^0.32.4 - "@types/uuid": ^9.0.4 - axios: ^1.4.0 - long: ^5.2.3 - protobufjs: ^7.2.3 - uuid: ^9.0.1 - ws: ^8.16.0 - checksum: aadc03e5edfa130ff34a963fd6b571332e4380fb9d2e98bd40f301325dc1dfd40ab2634654a7c97edbba685c58cc8a79e58eeb96e8326d766dc3bdc89bb78ad9 + "@cosmjs/ledger-amino": ^0.36.0 + "@gnolang/tm2-js-client": ^1.3.3 + long: ^5.3.2 + protobufjs: ^7.5.3 + checksum: 764d52c92aceb8a4eb2ae28f834905480837b64a6b26495dec6b38138fd11aac816b8a1d66e3cab686818c7ced62c878c3e6df1a85befc4816c1d9736e545127 languageName: node linkType: hard -"@gnolang/tm2-js-client@patch:@gnolang/tm2-js-client@npm%3A1.2.1#./.yarn/patches/@gnolang-tm2-js-client-npm-1.2.1-1ea3bc3862.patch::locator=teritori-dapp%40workspace%3A.": - version: 1.2.1 - resolution: "@gnolang/tm2-js-client@patch:@gnolang/tm2-js-client@npm%3A1.2.1#./.yarn/patches/@gnolang-tm2-js-client-npm-1.2.1-1ea3bc3862.patch::version=1.2.1&hash=3c7277&locator=teritori-dapp%40workspace%3A." +"@gnolang/tm2-js-client@npm:^1.3.3": + version: 1.3.3 + resolution: "@gnolang/tm2-js-client@npm:1.3.3" dependencies: - "@cosmjs/amino": ^0.32.4 - "@cosmjs/crypto": ^0.32.4 - "@cosmjs/ledger-amino": ^0.32.4 - "@types/uuid": ^9.0.4 - axios: ^1.4.0 - long: ^5.2.3 - protobufjs: ^7.2.3 - uuid: ^9.0.1 - ws: ^8.16.0 - checksum: a8853be7c0a52d4f4f38f2381cc671e8b4d7f62512cf00a2dee779039d70772f3ca62c583f7f93a50a79b6f2d44a2bc1c83abbe8c6f46751b2b071ccab6b96f9 + "@cosmjs/amino": ^0.36.0 + "@cosmjs/crypto": ^0.36.0 + "@cosmjs/ledger-amino": ^0.36.0 + "@types/uuid": ^10.0.0 + axios: ^1.11.0 + long: ^5.3.2 + protobufjs: ^7.5.3 + uuid: ^11.1.0 + ws: ^8.18.0 + checksum: 4a7ac6e4d560f30b1a49dc35e438266f6440f86808941c18723bc0163ab9d3ecde5e9a141874d620c3c0818d766a19c4abf35870bf1e171e681992aa48edf163 languageName: node linkType: hard @@ -4936,40 +5002,53 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/devices@npm:^5.51.1": - version: 5.51.1 - resolution: "@ledgerhq/devices@npm:5.51.1" +"@ledgerhq/devices@npm:8.5.0, @ledgerhq/devices@npm:^8.4.4": + version: 8.5.0 + resolution: "@ledgerhq/devices@npm:8.5.0" dependencies: - "@ledgerhq/errors": ^5.50.0 - "@ledgerhq/logs": ^5.50.0 - rxjs: 6 + "@ledgerhq/errors": ^6.24.0 + "@ledgerhq/logs": ^6.13.0 + rxjs: ^7.8.1 semver: ^7.3.5 - checksum: bb63548b4b143d3669fab33f219aa705d9114be9fbb42f1b26064fbf89a047186972518cd608ad90329a760a6ff0e91b32aaf9d2e543ae384fe381fbf29fea64 + checksum: d999aa609e9b1225606b6495971e726db1d3df91cfa87933b84c96f629dbb416adecc24241f2c6605cf5ba52e58cc23023d5e7f6302d83bf4bfdc8460b9dd6a0 + languageName: node + linkType: hard + +"@ledgerhq/errors@npm:^6.19.1, @ledgerhq/errors@npm:^6.24.0": + version: 6.24.0 + resolution: "@ledgerhq/errors@npm:6.24.0" + checksum: 84ed9f50be401390b2e9cc74aa30890fc617899b0059f5e8e41fa389a557432c65fe3379a0357a4db2673c7f86faa3f5c08f97ab3ed7c1866b119928eac660a2 languageName: node linkType: hard -"@ledgerhq/errors@npm:^5.50.0": - version: 5.50.0 - resolution: "@ledgerhq/errors@npm:5.50.0" - checksum: 2933e85f5a3768bfb303ba08b759e01f3de9bfc6d1a18b4b0f9353bb16cfbac302a5e6f683867056d3a4d9897ec8c2656c268662338e881df27315936809084d +"@ledgerhq/hw-transport@npm:6.31.4": + version: 6.31.4 + resolution: "@ledgerhq/hw-transport@npm:6.31.4" + dependencies: + "@ledgerhq/devices": ^8.4.4 + "@ledgerhq/errors": ^6.19.1 + "@ledgerhq/logs": ^6.12.0 + events: ^3.3.0 + checksum: bb5204513f2df3dbb646265954d1539bf6117cc08e73a4d1761ec10cb5f8255fe2b30112debc2433608de7260ee8878340c9f67690f5f62447a1466daa241ea7 languageName: node linkType: hard -"@ledgerhq/hw-transport@npm:^5.25.0": - version: 5.51.1 - resolution: "@ledgerhq/hw-transport@npm:5.51.1" +"@ledgerhq/hw-transport@npm:6.31.9": + version: 6.31.9 + resolution: "@ledgerhq/hw-transport@npm:6.31.9" dependencies: - "@ledgerhq/devices": ^5.51.1 - "@ledgerhq/errors": ^5.50.0 + "@ledgerhq/devices": 8.5.0 + "@ledgerhq/errors": ^6.24.0 + "@ledgerhq/logs": ^6.13.0 events: ^3.3.0 - checksum: 55c8c1a05cd71e24fdbe8c9a95a327bf3416199f85be53169d57aec3f53fcedd8ec57ab048c8869031809fb947128157c260d8afe169b3271308a6c6abbbb13e + checksum: 966be416b4fed54cd2d3acfb8308e3fd14a69bb3771736806243a1e7e8568bba4e5ab5cf5bb4274f136605d0750740b8d1c9806e58c792617502f5b2941af51a languageName: node linkType: hard -"@ledgerhq/logs@npm:^5.50.0": - version: 5.50.0 - resolution: "@ledgerhq/logs@npm:5.50.0" - checksum: ad2e2f0f52ef2c921ccd19e4e65911d661fe625880f9358dc7cde5375d2a3fbc30bc0af6f1d219887878366e814e05b5008e924bfcabf35880c927909dd20b83 +"@ledgerhq/logs@npm:^6.12.0, @ledgerhq/logs@npm:^6.13.0": + version: 6.13.0 + resolution: "@ledgerhq/logs@npm:6.13.0" + checksum: b2b64af45630eb2851f49af505e46a378cd62edfa73b154867a8d86641a684a36c9fee12a5e9ca94fb8fb3d81b47462fdb369ba9f0261079db1c6a81d9c0f12b languageName: node linkType: hard @@ -5129,6 +5208,13 @@ __metadata: languageName: node linkType: hard +"@noble/ciphers@npm:^1.3.0": + version: 1.3.0 + resolution: "@noble/ciphers@npm:1.3.0" + checksum: 19722c35475df9bc78db60d261d0b5ef8a6d722561efc2135453f943eaa421b492195dc666e3e4df2b755bca3739e04f04b9c660198559f5dd05d3cfbf1b9e92 + languageName: node + linkType: hard + "@noble/curves@npm:1.4.2, @noble/curves@npm:~1.4.0": version: 1.4.2 resolution: "@noble/curves@npm:1.4.2" @@ -5165,7 +5251,16 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.3.3, @noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0, @noble/hashes@npm:^1.2.0, @noble/hashes@npm:^1.3.2": +"@noble/curves@npm:^1.9.2": + version: 1.9.7 + resolution: "@noble/curves@npm:1.9.7" + dependencies: + "@noble/hashes": 1.8.0 + checksum: 65acad44ac6944ab96471109087d6cfcbcaa251faad6295961be9a5ace220634f4b7c74a96d1ee2274ad3880ea953d8e8259893ed8c906c831ef29f5c04ec9cc + languageName: node + linkType: hard + +"@noble/hashes@npm:1.3.3": version: 1.3.3 resolution: "@noble/hashes@npm:1.3.3" checksum: 8a6496d1c0c64797339bc694ad06cdfaa0f9e56cd0c3f68ae3666cfb153a791a55deb0af9c653c7ed2db64d537aa3e3054629740d2f2338bb1dcb7ab60cd205b @@ -5193,17 +5288,24 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.7.0, @noble/hashes@npm:^1.5.0, @noble/hashes@npm:~1.7.0": +"@noble/hashes@npm:1.7.0": version: 1.7.0 resolution: "@noble/hashes@npm:1.7.0" checksum: c06949ead7f5771a74f6fc9a346c7519212b3484c5b7916c8cad6b1b0e5f5f6c997ac3a43c0884ef8b99cfc55fac89058eefb29b6aad1cb41f436c748b316a1c languageName: node linkType: hard -"@noble/hashes@npm:^1.4.0": - version: 1.5.0 - resolution: "@noble/hashes@npm:1.5.0" - checksum: 9cc031d5c888c455bfeef76af649b87f75380a4511405baea633c1e4912fd84aff7b61e99716f0231d244c9cfeda1fafd7d718963e6a0c674ed705e9b1b4f76b +"@noble/hashes@npm:1.8.0, @noble/hashes@npm:^1, @noble/hashes@npm:^1.0.0, @noble/hashes@npm:^1.2.0, @noble/hashes@npm:^1.3.2, @noble/hashes@npm:^1.4.0, @noble/hashes@npm:^1.5.0, @noble/hashes@npm:^1.7.1": + version: 1.8.0 + resolution: "@noble/hashes@npm:1.8.0" + checksum: c94e98b941963676feaba62475b1ccfa8341e3f572adbb3b684ee38b658df44100187fa0ef4220da580b13f8d27e87d5492623c8a02ecc61f23fb9960c7918f5 + languageName: node + linkType: hard + +"@noble/hashes@npm:~1.7.0": + version: 1.7.2 + resolution: "@noble/hashes@npm:1.7.2" + checksum: f9e3c2e62c2850073f8d6ac30cc33b03a25cae859eb2209b33ae90ed3d1e003cb2a1ddacd2aacd6b7c98a5ad70795a234ccce04b0526657cd8020ce4ffdb491f languageName: node linkType: hard @@ -6348,6 +6450,13 @@ __metadata: languageName: node linkType: hard +"@scure/base@npm:^1.2.4": + version: 1.2.6 + resolution: "@scure/base@npm:1.2.6" + checksum: 1058cb26d5e4c1c46c9cc0ae0b67cc66d306733baf35d6ebdd8ddaba242b80c3807b726e3b48cb0411bb95ec10d37764969063ea62188f86ae9315df8ea6b325 + languageName: node + linkType: hard + "@scure/base@npm:~1.1.6": version: 1.1.9 resolution: "@scure/base@npm:1.1.9" @@ -7475,6 +7584,13 @@ __metadata: languageName: node linkType: hard +"@types/uuid@npm:^10.0.0": + version: 10.0.0 + resolution: "@types/uuid@npm:10.0.0" + checksum: e3958f8b0fe551c86c14431f5940c3470127293280830684154b91dc7eb3514aeb79fe3216968833cf79d4d1c67f580f054b5be2cd562bebf4f728913e73e944 + languageName: node + linkType: hard + "@types/uuid@npm:^8.3.1": version: 8.3.4 resolution: "@types/uuid@npm:8.3.4" @@ -7489,13 +7605,6 @@ __metadata: languageName: node linkType: hard -"@types/uuid@npm:^9.0.4": - version: 9.0.8 - resolution: "@types/uuid@npm:9.0.8" - checksum: b8c60b7ba8250356b5088302583d1704a4e1a13558d143c549c408bf8920535602ffc12394ede77f8a8083511b023704bc66d1345792714002bfa261b17c5275 - languageName: node - linkType: hard - "@types/ws@npm:^7.4.4": version: 7.4.7 resolution: "@types/ws@npm:7.4.7" @@ -8025,6 +8134,29 @@ __metadata: languageName: node linkType: hard +"@zondax/ledger-cosmos-js@npm:^4.0.1": + version: 4.0.1 + resolution: "@zondax/ledger-cosmos-js@npm:4.0.1" + dependencies: + "@ledgerhq/hw-transport": 6.31.4 + "@noble/hashes": ^1.7.1 + "@scure/base": ^1.2.4 + "@zondax/ledger-js": ^1.2.0 + buffer: ^6.0.3 + ripemd160: ^2.0.2 + checksum: f64ad27a23e924bdc6a7f0258a8a255dd69b463ec70220087ee80407aef5761834616bf0e228f7949ff40b539e5971cff3390ebba9426ddef2422213bf744d37 + languageName: node + linkType: hard + +"@zondax/ledger-js@npm:^1.2.0": + version: 1.3.1 + resolution: "@zondax/ledger-js@npm:1.3.1" + dependencies: + "@ledgerhq/hw-transport": 6.31.9 + checksum: 5f35cbcc8fc4c0f957f65fa19e5543959c31e696198b1ff2bac8134559eb2440f861db55aa1de0eaf45d624834dabcc424c5c2ce2dc14fd4b753c6e322e22ec0 + languageName: node + linkType: hard + "JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" @@ -8750,7 +8882,18 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.4.0, axios@npm:^1.6.0": +"axios@npm:^1.11.0": + version: 1.11.0 + resolution: "axios@npm:1.11.0" + dependencies: + follow-redirects: ^1.15.6 + form-data: ^4.0.4 + proxy-from-env: ^1.1.0 + checksum: 0a33dc600b588bfd3111b198d5985527ed89f722817455d7cdb66c1d055e5f8859cc2bebb7320888957fc8458ebe77d5f83af02af9cd260217c91c4e92b6dfb6 + languageName: node + linkType: hard + +"axios@npm:^1.6.0": version: 1.6.5 resolution: "axios@npm:1.6.5" dependencies: @@ -9542,6 +9685,16 @@ __metadata: languageName: node linkType: hard +"call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: ^1.3.0 + function-bind: ^1.1.2 + checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b + languageName: node + linkType: hard + "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": version: 1.0.5 resolution: "call-bind@npm:1.0.5" @@ -10392,6 +10545,13 @@ __metadata: languageName: node linkType: hard +"cosmjs-types@npm:^0.10.1": + version: 0.10.1 + resolution: "cosmjs-types@npm:0.10.1" + checksum: cbb4bbb78e02b1669d65ae99101da9330b7045d9860a6765f76f665caaad632fd223412f409d1653edaa5f6a8b2fec4457d0ccd489b3604812962d9551f49b5d + languageName: node + linkType: hard + "cosmjs-types@npm:^0.8.0": version: 0.8.0 resolution: "cosmjs-types@npm:0.8.0" @@ -11417,6 +11577,17 @@ __metadata: languageName: node linkType: hard +"dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: ^1.0.1 + es-errors: ^1.3.0 + gopd: ^1.2.0 + checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 + languageName: node + linkType: hard + "duplexify@npm:^4.1.2": version: 4.1.3 resolution: "duplexify@npm:4.1.3" @@ -11736,6 +11907,20 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + "es-iterator-helpers@npm:^1.0.12": version: 1.0.15 resolution: "es-iterator-helpers@npm:1.0.15" @@ -11758,6 +11943,15 @@ __metadata: languageName: node linkType: hard +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: ^1.3.0 + checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.2 resolution: "es-set-tostringtag@npm:2.0.2" @@ -11769,6 +11963,18 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 + languageName: node + linkType: hard + "es-shim-unscopables@npm:^1.0.0": version: 1.0.2 resolution: "es-shim-unscopables@npm:1.0.2" @@ -13272,6 +13478,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.15.6": + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" + peerDependenciesMeta: + debug: + optional: true + checksum: 20bf55e9504f59e6cc3743ba27edb2ebf41edea1baab34799408f2c050f73f0c612728db21c691276296d2795ea8a812dc532a98e8793619fcab91abe06d017f + languageName: node + linkType: hard + "fontfaceobserver@npm:^2.1.0": version: 2.3.0 resolution: "fontfaceobserver@npm:2.3.0" @@ -13338,6 +13554,19 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.4": + version: 4.0.4 + resolution: "form-data@npm:4.0.4" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + es-set-tostringtag: ^2.1.0 + hasown: ^2.0.2 + mime-types: ^2.1.12 + checksum: 9b7788836df9fa5a6999e0c02515b001946b2a868cfe53f026c69e2c537a2ff9fbfb8e9d2b678744628f3dc7a2d6e14e4e45dfaf68aa6239727f0bdb8ce0abf2 + languageName: node + linkType: hard + "form-data@npm:~2.3.2": version: 2.3.3 resolution: "form-data@npm:2.3.3" @@ -13519,6 +13748,24 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.2.6": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" + dependencies: + call-bind-apply-helpers: ^1.0.2 + es-define-property: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + function-bind: ^1.1.2 + get-proto: ^1.0.1 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + math-intrinsics: ^1.1.0 + checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d + languageName: node + linkType: hard + "get-package-type@npm:^0.1.0": version: 0.1.0 resolution: "get-package-type@npm:0.1.0" @@ -13533,6 +13780,16 @@ __metadata: languageName: node linkType: hard +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: ^1.0.1 + es-object-atoms: ^1.0.0 + checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + "get-stdin@npm:^8.0.0": version: 8.0.0 resolution: "get-stdin@npm:8.0.0" @@ -13809,6 +14066,13 @@ __metadata: languageName: node linkType: hard +"gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 + languageName: node + linkType: hard + "got@npm:^11.8.5": version: 11.8.6 resolution: "got@npm:11.8.6" @@ -13973,6 +14237,13 @@ __metadata: languageName: node linkType: hard +"has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b + languageName: node + linkType: hard + "has-tostringtag@npm:^1.0.0": version: 1.0.0 resolution: "has-tostringtag@npm:1.0.0" @@ -13982,6 +14253,15 @@ __metadata: languageName: node linkType: hard +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d + languageName: node + linkType: hard + "hash-base@npm:^3.0.0": version: 3.1.0 resolution: "hash-base@npm:3.1.0" @@ -13993,6 +14273,13 @@ __metadata: languageName: node linkType: hard +"hash-wasm@npm:^4.12.0": + version: 4.12.0 + resolution: "hash-wasm@npm:4.12.0" + checksum: f292c94a19a3d7c075e1e7de2764ba8a006ae5a9551b1a35c61f693035df7977e6cb41f3fc036deb4a724e1949711b7cba06f7ad174f5aeb295edb64649b4a32 + languageName: node + linkType: hard + "hash.js@npm:1.1.7, hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:~1.1.7": version: 1.1.7 resolution: "hash.js@npm:1.1.7" @@ -14012,6 +14299,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db + languageName: node + linkType: hard + "hermes-estree@npm:0.15.0": version: 0.15.0 resolution: "hermes-estree@npm:0.15.0" @@ -15804,18 +16100,6 @@ __metadata: languageName: node linkType: hard -"ledger-cosmos-js@npm:^2.1.8": - version: 2.1.8 - resolution: "ledger-cosmos-js@npm:2.1.8" - dependencies: - "@babel/runtime": ^7.11.2 - "@ledgerhq/hw-transport": ^5.25.0 - bech32: ^1.1.4 - ripemd160: ^2.0.2 - checksum: cba4f5e29d97a1fa6b34b6458a26c8fec72fc58ce34f7dce3a5b1b56aca8382221a0e98e93f50efb3e9df49e934722ea7870c8cac952fe447949c7f34c4cfae2 - languageName: node - linkType: hard - "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -16175,13 +16459,20 @@ __metadata: languageName: node linkType: hard -"long@npm:^5.0.0, long@npm:^5.2.0, long@npm:^5.2.1, long@npm:^5.2.3": +"long@npm:^5.0.0, long@npm:^5.2.0, long@npm:^5.2.3": version: 5.2.3 resolution: "long@npm:5.2.3" checksum: 885ede7c3de4facccbd2cacc6168bae3a02c3e836159ea4252c87b6e34d40af819824b2d4edce330bfb5c4d6e8ce3ec5864bdcf9473fa1f53a4f8225860e5897 languageName: node linkType: hard +"long@npm:^5.3.2": + version: 5.3.2 + resolution: "long@npm:5.3.2" + checksum: be215816b563f4ca27ad3677678b53415bc489f9e3466414e54d2d85f5f8e86768547fa58493bacfb363ffc57a664debc83403ccc2178aef0c40aca28bad47c9 + languageName: node + linkType: hard + "loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" @@ -16395,6 +16686,13 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 + languageName: node + linkType: hard + "md5-file@npm:^3.2.3": version: 3.2.3 resolution: "md5-file@npm:3.2.3" @@ -17954,7 +18252,7 @@ __metadata: languageName: node linkType: hard -"pako@npm:^2.0.2, pako@npm:^2.0.4": +"pako@npm:^2.0.4, pako@npm:^2.1.0": version: 2.1.0 resolution: "pako@npm:2.1.0" checksum: 71666548644c9a4d056bcaba849ca6fd7242c6cf1af0646d3346f3079a1c7f4a66ffec6f7369ee0dc88f61926c10d6ab05da3e1fca44b83551839e89edd75a3e @@ -18618,7 +18916,7 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:^7.0.0, protobufjs@npm:^7.2.3, protobufjs@npm:^7.2.4, protobufjs@npm:^7.2.5": +"protobufjs@npm:^7.0.0, protobufjs@npm:^7.2.4, protobufjs@npm:^7.2.5": version: 7.2.6 resolution: "protobufjs@npm:7.2.6" dependencies: @@ -18638,6 +18936,26 @@ __metadata: languageName: node linkType: hard +"protobufjs@npm:^7.5.3": + version: 7.5.4 + resolution: "protobufjs@npm:7.5.4" + dependencies: + "@protobufjs/aspromise": ^1.1.2 + "@protobufjs/base64": ^1.1.2 + "@protobufjs/codegen": ^2.0.4 + "@protobufjs/eventemitter": ^1.1.0 + "@protobufjs/fetch": ^1.1.0 + "@protobufjs/float": ^1.0.2 + "@protobufjs/inquire": ^1.1.0 + "@protobufjs/path": ^1.1.2 + "@protobufjs/pool": ^1.1.0 + "@protobufjs/utf8": ^1.1.0 + "@types/node": ">=13.7.0" + long: ^5.0.0 + checksum: 53bf83b9a726b05d43da35bb990dba7536759787dccea9a67b8f31be9df470ba17f1f1b982ca19956cfc7726f3ec7e0e883ca4ad93b5ec753cc025a637fc704f + languageName: node + linkType: hard + "proxy-from-env@npm:0.0.1": version: 0.0.1 resolution: "proxy-from-env@npm:0.0.1" @@ -20166,7 +20484,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:6, rxjs@npm:^6.4.0": +"rxjs@npm:^6.4.0": version: 6.6.7 resolution: "rxjs@npm:6.6.7" dependencies: @@ -21604,17 +21922,17 @@ __metadata: "@babel/plugin-transform-arrow-functions": ^7.23.3 "@babel/plugin-transform-shorthand-properties": ^7.23.3 "@babel/plugin-transform-template-literals": ^7.23.3 - "@bufbuild/protobuf": ^2.6.0 + "@bufbuild/protobuf": ^2.7.0 "@chain-registry/types": ^0.17.1 "@chain-registry/utils": 1.18.0 - "@cosmjs/amino": 0.32.2 - "@cosmjs/cosmwasm-stargate": 0.32.2 - "@cosmjs/crypto": 0.32.2 - "@cosmjs/encoding": 0.32.2 - "@cosmjs/math": 0.32.2 - "@cosmjs/proto-signing": 0.32.2 - "@cosmjs/stargate": 0.32.2 - "@cosmjs/tendermint-rpc": 0.32.2 + "@cosmjs/amino": ^0.36.0 + "@cosmjs/cosmwasm-stargate": ^0.36.0 + "@cosmjs/crypto": ^0.36.0 + "@cosmjs/encoding": ^0.36.0 + "@cosmjs/math": ^0.36.0 + "@cosmjs/proto-signing": ^0.36.0 + "@cosmjs/stargate": ^0.36.0 + "@cosmjs/tendermint-rpc": ^0.36.0 "@cosmology/core": 2.0.1 "@cosmwasm/ts-codegen": ^0.35.7 "@dotlottie/react-player": ^1.6.5 @@ -21630,8 +21948,8 @@ __metadata: "@expo-google-fonts/exo": ^0.2.2 "@expo/metro-runtime": ~3.1.3 "@faker-js/faker": ^8.4.1 - "@gnolang/gno-js-client": ^1.3.0 - "@gnolang/tm2-js-client": ^1.2.1 + "@gnolang/gno-js-client": ^1.4.4 + "@gnolang/tm2-js-client": ^1.3.3 "@hookform/resolvers": ^3.6.0 "@improbable-eng/grpc-web": ^0.15.0 "@improbable-eng/grpc-web-node-http-transport": ^0.15.0 @@ -21727,7 +22045,7 @@ __metadata: leaflet.markercluster: ^1.5.3 listr2: ^8.0.1 lodash: ^4.17.21 - long: ^5.2.1 + long: ^5.3.2 lottie-react-native: 6.5.1 markdown-it: ^14.1.0 markdown-it-emoji: ^3.0.0 @@ -22865,6 +23183,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^11.1.0": + version: 11.1.0 + resolution: "uuid@npm:11.1.0" + bin: + uuid: dist/esm/bin/uuid + checksum: 840f19758543c4631e58a29439e51b5b669d5f34b4dd2700b6a1d15c5708c7a6e0c3e2c8c4a2eae761a3a7caa7e9884d00c86c02622ba91137bd3deade6b4b4a + languageName: node + linkType: hard + "uuid@npm:^7.0.3": version: 7.0.3 resolution: "uuid@npm:7.0.3" @@ -22883,7 +23210,7 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^9.0.0, uuid@npm:^9.0.1": +"uuid@npm:^9.0.0": version: 9.0.1 resolution: "uuid@npm:9.0.1" bin: @@ -23794,7 +24121,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.18.0, ws@npm:^8.16.0": +"ws@npm:8.18.0": version: 8.18.0 resolution: "ws@npm:8.18.0" peerDependencies: @@ -23848,6 +24175,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.18.0": + version: 8.18.3 + resolution: "ws@npm:8.18.3" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: d64ef1631227bd0c5fe21b3eb3646c9c91229402fb963d12d87b49af0a1ef757277083af23a5f85742bae1e520feddfb434cb882ea59249b15673c16dc3f36e0 + languageName: node + linkType: hard + "ws@npm:~8.11.0": version: 8.11.0 resolution: "ws@npm:8.11.0"