From d06fc10cfe9d35e821ceb52b894592bf84cd4a93 Mon Sep 17 00:00:00 2001 From: Nattapat Iammelap Date: Wed, 8 Apr 2026 11:18:39 +0700 Subject: [PATCH 1/7] add secret chain --- go.mod | 19 + go.sum | 289 ++++++++++++- internal/relayertest/mocks/signer_grpc.go | 35 ++ proto/fkms/v1/signer.pb.go | 356 ++++++++++++--- proto/fkms/v1/signer.proto | 24 + proto/fkms/v1/signer_grpc.pb.go | 38 ++ relayer/chains/secret/client.go | 310 +++++++++++++ relayer/chains/secret/config.go | 69 +++ relayer/chains/secret/provider.go | 409 ++++++++++++++++++ relayer/chains/secret/types.go | 34 ++ relayer/chains/types/chain_type.go | 2 + relayer/config/config.go | 15 + .../postgres/00005_add_secret_chain_type.sql | 7 + .../sqlite/00001_create_transactions.sql | 2 +- relayer/store/filesystem.go | 3 + relayer/wallet/secret/remote_signer.go | 60 +++ relayer/wallet/secret/types.go | 42 ++ relayer/wallet/secret/wallet.go | 14 + 18 files changed, 1670 insertions(+), 58 deletions(-) create mode 100644 relayer/chains/secret/client.go create mode 100644 relayer/chains/secret/config.go create mode 100644 relayer/chains/secret/provider.go create mode 100644 relayer/chains/secret/types.go create mode 100644 relayer/db/migrations/postgres/00005_add_secret_chain_type.sql create mode 100644 relayer/wallet/secret/remote_signer.go create mode 100644 relayer/wallet/secret/types.go create mode 100644 relayer/wallet/secret/wallet.go diff --git a/go.mod b/go.mod index d64b7985..01675af2 100644 --- a/go.mod +++ b/go.mod @@ -46,6 +46,7 @@ require ( cosmossdk.io/store v1.1.1 // indirect filippo.io/edwards25519 v1.1.1 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/DataDog/datadog-go v3.2.0+incompatible // indirect github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect @@ -61,6 +62,7 @@ require ( github.com/btcsuite/btcd/btcutil v1.1.6 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/catppuccin/go v0.3.0 // indirect + github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charmbracelet/bubbles v0.21.0 // indirect github.com/charmbracelet/bubbletea v1.3.4 // indirect @@ -82,6 +84,7 @@ require ( github.com/cosmos/cosmos-db v1.1.1 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v1.2.2 // indirect github.com/cosmos/ics23/go v0.11.0 // indirect github.com/cosmos/ledger-cosmos-go v0.14.0 // indirect @@ -91,6 +94,7 @@ require ( github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/crypto/ripemd160 v1.0.2 // 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/v4 v4.2.0 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -99,6 +103,8 @@ require ( github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect github.com/evalphobia/logrus_fluent v0.5.4 // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fluent/fluent-logger-golang v1.4.0 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect @@ -113,6 +119,7 @@ require ( github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect + github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang/glog v1.2.5 // indirect @@ -122,15 +129,23 @@ require ( github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v1.12.1 // indirect github.com/google/go-cmp v0.7.0 // indirect + github.com/gorilla/handlers v1.5.1 // indirect + github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-metrics v0.5.3 // indirect + github.com/hashicorp/go-plugin v1.5.2 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect github.com/hdevalence/ed25519consensus v0.1.0 // indirect github.com/holiman/uint256 v1.3.2 // indirect + github.com/huandu/skiplist v1.2.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect + github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect @@ -153,6 +168,7 @@ require ( github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mattn/go-sqlite3 v1.14.22 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -162,6 +178,7 @@ require ( github.com/muesli/termenv v0.16.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a // indirect + github.com/oklog/run v1.1.0 // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect github.com/philhofer/fwd v1.0.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -173,6 +190,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/rs/zerolog v1.33.0 // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sasha-s/go-deadlock v0.3.5 // indirect @@ -221,6 +239,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.1 // indirect + nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/go.sum b/go.sum index 95c4f1ca..916cd47d 100644 --- a/go.sum +++ b/go.sum @@ -61,6 +61,7 @@ github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dX github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= @@ -69,6 +70,8 @@ github.com/Peersyst/xrpl-go v0.1.14 h1:4iCyLCzTnpp+1cjvRm536edsPW3brHfNLS4wDT6an github.com/Peersyst/xrpl-go v0.1.14/go.mod h1:QwEypVCDdluBo6P4jgSq0cC0+OYspFQCHOHEeaCAH2c= github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU= github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/VictoriaMetrics/fastcache v1.13.0 h1:AW4mheMR5Vd9FkAPUv+NH6Nhw+fmbTMGMsNAoA/+4G0= @@ -76,6 +79,7 @@ github.com/VictoriaMetrics/fastcache v1.13.0/go.mod h1:hHXhl4DA2fTL2HTZDJFXWgW0L 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/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -83,16 +87,27 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= @@ -130,9 +145,13 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= +github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/catppuccin/go v0.3.0 h1:d+0/YicIq+hSTo5oPuRi5kOpqkVA5tAsU6dNhvRu+aY= github.com/catppuccin/go v0.3.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc= -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.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -170,11 +189,21 @@ github.com/charmbracelet/x/xpty v0.1.2 h1:Pqmu4TEJ8KeA9uSkISKMU3f+C1F6OGBn8ABuGl github.com/charmbracelet/x/xpty v0.1.2/go.mod h1:XK2Z0id5rtLWcpeNiMYBccNNBrP2IJnzHI0Lq13Xzq4= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= @@ -189,13 +218,17 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/cometbft/cometbft v0.38.21 h1:qcIJSH9LiwU5s6ZgKR5eRbsLNucbubfraDs5bzgjtOI= github.com/cometbft/cometbft v0.38.21/go.mod h1:UCu8dlHqvkAsmAFmWDRWNZJPlu6ya2fTWZlDrWsivwo= github.com/cometbft/cometbft-db v0.14.1 h1:SxoamPghqICBAIcGpleHbmoPqy+crij/++eZz3DlerQ= github.com/cometbft/cometbft-db v0.14.1/go.mod h1:KHP1YghilyGV/xjD5DP3+2hyigWx0WTp9X+0Gnx0RxQ= github.com/consensys/gnark-crypto v0.18.1 h1:RyLV6UhPRoYYzaFnPQA4qK3DyuDgkTgskDdoGqFt3fI= github.com/consensys/gnark-crypto v0.18.1/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNCM= @@ -208,6 +241,7 @@ github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= github.com/cosmos/iavl v1.2.2 h1:qHhKW3I70w+04g5KdsdVSHRbFLgt3yY3qTMd4Xa4rC8= @@ -218,10 +252,12 @@ github.com/cosmos/keyring v1.2.0 h1:8C1lBP9xhImmIabyXW4c3vFjjLiBdGCmfLUfeZlV1Yo= github.com/cosmos/keyring v1.2.0/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= @@ -251,19 +287,29 @@ github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8Bzu github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= @@ -275,8 +321,11 @@ github.com/ethereum/go-ethereum v1.17.0 h1:2D+1Fe23CwZ5tQoAS5DfwKFNI1HGcTwi65/kR github.com/ethereum/go-ethereum v1.17.0/go.mod h1:2W3msvdosS/MCWytpqTcqgFiRYbTH59FxDJzqah120o= github.com/evalphobia/logrus_fluent v0.5.4 h1:G4BSBTm7+L+oanWfFtA/A5Y3pvL2OMxviczyZPYO5xc= github.com/evalphobia/logrus_fluent v0.5.4/go.mod h1:hasyj+CXm3BDP1YhFk/rnTcjlegyqvkokV9A25cQsaA= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY= @@ -285,6 +334,8 @@ github.com/fluent/fluent-logger-golang v1.4.0 h1:uT1Lzz5yFV16YvDwWbjX6s3AYngnJz8 github.com/fluent/fluent-logger-golang v1.4.0/go.mod h1:2/HCT/jTy78yGyeNGQLGQsjF3zzzAuy6Xlk6FCMV5eU= 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.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -294,6 +345,11 @@ github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8 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/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= @@ -301,6 +357,7 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -321,13 +378,28 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +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.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= 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= @@ -335,9 +407,14 @@ 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 v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= @@ -347,6 +424,7 @@ github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I= github.com/golang/glog v1.2.5/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= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -380,6 +458,7 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.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.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -399,6 +478,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -419,15 +499,22 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0/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= @@ -435,15 +522,23 @@ github.com/grafana/pyroscope-go v1.2.7 h1:VWBBlqxjyR0Cwk2W6UrE8CdcdD80GOFNutj0Kb github.com/grafana/pyroscope-go v1.2.7/go.mod h1:o/bpSLiJYYP6HQtvcoVKiE9s5RiNgjYTj1DhiddP2Pc= github.com/grafana/pyroscope-go/godeltaprof v0.1.9 h1:c1Us8i6eSmkW+Ez05d3co8kasnuOY813tbMN8i/a3Og= github.com/grafana/pyroscope-go/godeltaprof v0.1.9/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -451,18 +546,29 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.5.2 h1:aWv8eimFqWlsEiMrYZdPYl+FdHaBJSN4AWwGWfT1G2Y= github.com/hashicorp/go-plugin v1.5.2/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= @@ -474,8 +580,11 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= @@ -485,8 +594,10 @@ github.com/icon-project/goloop v1.4.4 h1:DgVL/t0tMmtVIKM66gWhK5hV6rXJf6Qy1HPdDKr github.com/icon-project/goloop v1.4.4/go.mod h1:afo1sZEgOjT5eMvRx6OzdGqKkbDrpZX+qi2lJOVXXKo= github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= @@ -499,17 +610,23 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd 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.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= +github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -519,11 +636,16 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.3.0 h1:z1n1AOHVVydOOVuyphbOKyR4NICDQFiJMn1IK5hVQ5Y= github.com/jsternberg/zap-logfmt v1.3.0/go.mod h1:N3DENp9WNmCZxvkBD/eReWwz1149BK6jEN9cQ4fNwZE= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= @@ -546,19 +668,31 @@ github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8 github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= +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.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -566,21 +700,30 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miguelmota/go-ethereum-hdwallet v0.1.3 h1:YO/zmmdfM1hPPI8ZLg/UMm/s4M09j9ozXsjJO4s5efc= github.com/miguelmota/go-ethereum-hdwallet v0.1.3/go.mod h1:rdfIHQY4mIL1LF8HPUc9AchObyOpN/ElXBgyvlZL0OQ= github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= @@ -603,15 +746,27 @@ github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3 github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/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= @@ -623,14 +778,29 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +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/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -648,11 +818,15 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= @@ -662,14 +836,19 @@ github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5 github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 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.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= @@ -677,9 +856,11 @@ github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJ github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= @@ -687,48 +868,67 @@ github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzM github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= 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.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +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/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE= github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -738,9 +938,11 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -763,11 +965,17 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -779,6 +987,7 @@ github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNl github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= @@ -791,8 +1000,12 @@ github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5 h1:qxen9oVGzDdIRP6ejyAJc760RwW4SnVDiTYTzwnXuxo= go.etcd.io/bbolt v1.4.0-alpha.0.0.20240404170359-43604f3112c5/go.mod h1:eW0HG9/oHQhvRCvb1/pIXW4cOvtDqeQK+XSi3TnwaXY= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -813,19 +1026,34 @@ go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6 go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= 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= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -841,6 +1069,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= @@ -867,8 +1096,12 @@ golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -879,6 +1112,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -886,6 +1120,7 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -897,7 +1132,9 @@ golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= @@ -922,10 +1159,14 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -935,15 +1176,19 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -951,6 +1196,7 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -962,17 +1208,23 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -994,21 +1246,27 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +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.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -1018,6 +1276,9 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1025,6 +1286,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1051,6 +1313,7 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1068,6 +1331,7 @@ google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -1081,6 +1345,7 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1097,6 +1362,7 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1106,16 +1372,23 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b h1:uA40e2M6fYRBf0+8uN5mLlqUtV192iiksiICIBkYJ1E= google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:Xa7le7qx2vmqB/SzWUBa7KdMjpdpAHlh5QCSnjessQk= google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b h1:Mv8VFug0MP9e5vUxfBcE3vUkV6CImK3cMNMIDFjmzxU= google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1124,8 +1397,12 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM= google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1140,6 +1417,7 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= @@ -1151,21 +1429,27 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v9 v9.31.0 h1:bmXmP2RSNtFES+bn4uYuHT7iJFJv7Vj+an+ZQdDaD1M= gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -1181,6 +1465,7 @@ gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4= gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1195,5 +1480,7 @@ pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/internal/relayertest/mocks/signer_grpc.go b/internal/relayertest/mocks/signer_grpc.go index 47f23588..f35f5014 100644 --- a/internal/relayertest/mocks/signer_grpc.go +++ b/internal/relayertest/mocks/signer_grpc.go @@ -102,6 +102,26 @@ func (mr *MockFkmsServiceClientMockRecorder) SignIcon(ctx, in any, opts ...any) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignIcon", reflect.TypeOf((*MockFkmsServiceClient)(nil).SignIcon), varargs...) } +// SignSecret mocks base method. +func (m *MockFkmsServiceClient) SignSecret(ctx context.Context, in *fkmsv1.SignSecretRequest, opts ...grpc.CallOption) (*fkmsv1.SignSecretResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "SignSecret", varargs...) + ret0, _ := ret[0].(*fkmsv1.SignSecretResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SignSecret indicates an expected call of SignSecret. +func (mr *MockFkmsServiceClientMockRecorder) SignSecret(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignSecret", reflect.TypeOf((*MockFkmsServiceClient)(nil).SignSecret), varargs...) +} + // SignXrpl mocks base method. func (m *MockFkmsServiceClient) SignXrpl(ctx context.Context, in *fkmsv1.SignXrplRequest, opts ...grpc.CallOption) (*fkmsv1.SignXrplResponse, error) { m.ctrl.T.Helper() @@ -191,6 +211,21 @@ func (mr *MockFkmsServiceServerMockRecorder) SignIcon(arg0, arg1 any) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignIcon", reflect.TypeOf((*MockFkmsServiceServer)(nil).SignIcon), arg0, arg1) } +// SignSecret mocks base method. +func (m *MockFkmsServiceServer) SignSecret(arg0 context.Context, arg1 *fkmsv1.SignSecretRequest) (*fkmsv1.SignSecretResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SignSecret", arg0, arg1) + ret0, _ := ret[0].(*fkmsv1.SignSecretResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SignSecret indicates an expected call of SignSecret. +func (mr *MockFkmsServiceServerMockRecorder) SignSecret(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SignSecret", reflect.TypeOf((*MockFkmsServiceServer)(nil).SignSecret), arg0, arg1) +} + // SignXrpl mocks base method. func (m *MockFkmsServiceServer) SignXrpl(arg0 context.Context, arg1 *fkmsv1.SignXrplRequest) (*fkmsv1.SignXrplResponse, error) { m.ctrl.T.Helper() diff --git a/proto/fkms/v1/signer.pb.go b/proto/fkms/v1/signer.pb.go index cf724a51..38cb26c5 100644 --- a/proto/fkms/v1/signer.pb.go +++ b/proto/fkms/v1/signer.pb.go @@ -24,9 +24,10 @@ const ( type ChainType int32 const ( - ChainType_EVM ChainType = 0 - ChainType_XRPL ChainType = 1 - ChainType_ICON ChainType = 2 + ChainType_EVM ChainType = 0 + ChainType_XRPL ChainType = 1 + ChainType_ICON ChainType = 2 + ChainType_SECRET ChainType = 3 ) // Enum value maps for ChainType. @@ -35,11 +36,13 @@ var ( 0: "EVM", 1: "XRPL", 2: "ICON", + 3: "SECRET", } ChainType_value = map[string]int32{ - "EVM": 0, - "XRPL": 1, - "ICON": 2, + "EVM": 0, + "XRPL": 1, + "ICON": 2, + "SECRET": 3, } ) @@ -358,6 +361,102 @@ func (x *SignIconResponse) GetTxParams() []byte { return nil } +type SignSecretRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + SignerPayload *SecretSignerPayload `protobuf:"bytes,1,opt,name=signer_payload,json=signerPayload,proto3" json:"signer_payload,omitempty"` + Tss *Tss `protobuf:"bytes,2,opt,name=tss,proto3" json:"tss,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignSecretRequest) Reset() { + *x = SignSecretRequest{} + mi := &file_proto_fkms_v1_signer_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignSecretRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignSecretRequest) ProtoMessage() {} + +func (x *SignSecretRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_fkms_v1_signer_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignSecretRequest.ProtoReflect.Descriptor instead. +func (*SignSecretRequest) Descriptor() ([]byte, []int) { + return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{6} +} + +func (x *SignSecretRequest) GetSignerPayload() *SecretSignerPayload { + if x != nil { + return x.SignerPayload + } + return nil +} + +func (x *SignSecretRequest) GetTss() *Tss { + if x != nil { + return x.Tss + } + return nil +} + +type SignSecretResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + TxBlob []byte `protobuf:"bytes,1,opt,name=tx_blob,json=txBlob,proto3" json:"tx_blob,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignSecretResponse) Reset() { + *x = SignSecretResponse{} + mi := &file_proto_fkms_v1_signer_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignSecretResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignSecretResponse) ProtoMessage() {} + +func (x *SignSecretResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_fkms_v1_signer_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignSecretResponse.ProtoReflect.Descriptor instead. +func (*SignSecretResponse) Descriptor() ([]byte, []int) { + return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{7} +} + +func (x *SignSecretResponse) GetTxBlob() []byte { + if x != nil { + return x.TxBlob + } + return nil +} + type GetSignerAddressesRequest struct { state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields @@ -366,7 +465,7 @@ type GetSignerAddressesRequest struct { func (x *GetSignerAddressesRequest) Reset() { *x = GetSignerAddressesRequest{} - mi := &file_proto_fkms_v1_signer_proto_msgTypes[6] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -378,7 +477,7 @@ func (x *GetSignerAddressesRequest) String() string { func (*GetSignerAddressesRequest) ProtoMessage() {} func (x *GetSignerAddressesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_fkms_v1_signer_proto_msgTypes[6] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -391,7 +490,7 @@ func (x *GetSignerAddressesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSignerAddressesRequest.ProtoReflect.Descriptor instead. func (*GetSignerAddressesRequest) Descriptor() ([]byte, []int) { - return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{6} + return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{8} } type GetSignerAddressesResponse struct { @@ -403,7 +502,7 @@ type GetSignerAddressesResponse struct { func (x *GetSignerAddressesResponse) Reset() { *x = GetSignerAddressesResponse{} - mi := &file_proto_fkms_v1_signer_proto_msgTypes[7] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -415,7 +514,7 @@ func (x *GetSignerAddressesResponse) String() string { func (*GetSignerAddressesResponse) ProtoMessage() {} func (x *GetSignerAddressesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_fkms_v1_signer_proto_msgTypes[7] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -428,7 +527,7 @@ func (x *GetSignerAddressesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSignerAddressesResponse.ProtoReflect.Descriptor instead. func (*GetSignerAddressesResponse) Descriptor() ([]byte, []int) { - return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{7} + return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{9} } func (x *GetSignerAddressesResponse) GetSigners() []*Signers { @@ -450,7 +549,7 @@ type XrplSignerPayload struct { func (x *XrplSignerPayload) Reset() { *x = XrplSignerPayload{} - mi := &file_proto_fkms_v1_signer_proto_msgTypes[8] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -462,7 +561,7 @@ func (x *XrplSignerPayload) String() string { func (*XrplSignerPayload) ProtoMessage() {} func (x *XrplSignerPayload) ProtoReflect() protoreflect.Message { - mi := &file_proto_fkms_v1_signer_proto_msgTypes[8] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -475,7 +574,7 @@ func (x *XrplSignerPayload) ProtoReflect() protoreflect.Message { // Deprecated: Use XrplSignerPayload.ProtoReflect.Descriptor instead. func (*XrplSignerPayload) Descriptor() ([]byte, []int) { - return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{8} + return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{10} } func (x *XrplSignerPayload) GetAccount() string { @@ -518,7 +617,7 @@ type IconSignerPayload struct { func (x *IconSignerPayload) Reset() { *x = IconSignerPayload{} - mi := &file_proto_fkms_v1_signer_proto_msgTypes[9] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -530,7 +629,7 @@ func (x *IconSignerPayload) String() string { func (*IconSignerPayload) ProtoMessage() {} func (x *IconSignerPayload) ProtoReflect() protoreflect.Message { - mi := &file_proto_fkms_v1_signer_proto_msgTypes[9] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -543,7 +642,7 @@ func (x *IconSignerPayload) ProtoReflect() protoreflect.Message { // Deprecated: Use IconSignerPayload.ProtoReflect.Descriptor instead. func (*IconSignerPayload) Descriptor() ([]byte, []int) { - return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{9} + return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{11} } func (x *IconSignerPayload) GetRelayer() string { @@ -574,6 +673,122 @@ func (x *IconSignerPayload) GetNetworkId() string { return "" } +type SecretSignerPayload struct { + state protoimpl.MessageState `protogen:"open.v1"` + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` + ChainId string `protobuf:"bytes,3,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + AccountNumber uint64 `protobuf:"varint,4,opt,name=account_number,json=accountNumber,proto3" json:"account_number,omitempty"` + Sequence uint64 `protobuf:"varint,5,opt,name=sequence,proto3" json:"sequence,omitempty"` + GasLimit uint64 `protobuf:"varint,6,opt,name=gas_limit,json=gasLimit,proto3" json:"gas_limit,omitempty"` + GasPrices string `protobuf:"bytes,7,opt,name=gas_prices,json=gasPrices,proto3" json:"gas_prices,omitempty"` + Memo string `protobuf:"bytes,8,opt,name=memo,proto3" json:"memo,omitempty"` + CodeHash string `protobuf:"bytes,9,opt,name=code_hash,json=codeHash,proto3" json:"code_hash,omitempty"` + Pubkey string `protobuf:"bytes,10,opt,name=pubkey,proto3" json:"pubkey,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SecretSignerPayload) Reset() { + *x = SecretSignerPayload{} + mi := &file_proto_fkms_v1_signer_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecretSignerPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecretSignerPayload) ProtoMessage() {} + +func (x *SecretSignerPayload) ProtoReflect() protoreflect.Message { + mi := &file_proto_fkms_v1_signer_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecretSignerPayload.ProtoReflect.Descriptor instead. +func (*SecretSignerPayload) Descriptor() ([]byte, []int) { + return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{12} +} + +func (x *SecretSignerPayload) GetSender() string { + if x != nil { + return x.Sender + } + return "" +} + +func (x *SecretSignerPayload) GetContractAddress() string { + if x != nil { + return x.ContractAddress + } + return "" +} + +func (x *SecretSignerPayload) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + +func (x *SecretSignerPayload) GetAccountNumber() uint64 { + if x != nil { + return x.AccountNumber + } + return 0 +} + +func (x *SecretSignerPayload) GetSequence() uint64 { + if x != nil { + return x.Sequence + } + return 0 +} + +func (x *SecretSignerPayload) GetGasLimit() uint64 { + if x != nil { + return x.GasLimit + } + return 0 +} + +func (x *SecretSignerPayload) GetGasPrices() string { + if x != nil { + return x.GasPrices + } + return "" +} + +func (x *SecretSignerPayload) GetMemo() string { + if x != nil { + return x.Memo + } + return "" +} + +func (x *SecretSignerPayload) GetCodeHash() string { + if x != nil { + return x.CodeHash + } + return "" +} + +func (x *SecretSignerPayload) GetPubkey() string { + if x != nil { + return x.Pubkey + } + return "" +} + type Tss struct { state protoimpl.MessageState `protogen:"open.v1"` Message []byte `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` @@ -585,7 +800,7 @@ type Tss struct { func (x *Tss) Reset() { *x = Tss{} - mi := &file_proto_fkms_v1_signer_proto_msgTypes[10] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -597,7 +812,7 @@ func (x *Tss) String() string { func (*Tss) ProtoMessage() {} func (x *Tss) ProtoReflect() protoreflect.Message { - mi := &file_proto_fkms_v1_signer_proto_msgTypes[10] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -610,7 +825,7 @@ func (x *Tss) ProtoReflect() protoreflect.Message { // Deprecated: Use Tss.ProtoReflect.Descriptor instead. func (*Tss) Descriptor() ([]byte, []int) { - return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{10} + return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{13} } func (x *Tss) GetMessage() []byte { @@ -644,7 +859,7 @@ type Signers struct { func (x *Signers) Reset() { *x = Signers{} - mi := &file_proto_fkms_v1_signer_proto_msgTypes[11] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -656,7 +871,7 @@ func (x *Signers) String() string { func (*Signers) ProtoMessage() {} func (x *Signers) ProtoReflect() protoreflect.Message { - mi := &file_proto_fkms_v1_signer_proto_msgTypes[11] + mi := &file_proto_fkms_v1_signer_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -669,7 +884,7 @@ func (x *Signers) ProtoReflect() protoreflect.Message { // Deprecated: Use Signers.ProtoReflect.Descriptor instead. func (*Signers) Descriptor() ([]byte, []int) { - return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{11} + return file_proto_fkms_v1_signer_proto_rawDescGZIP(), []int{14} } func (x *Signers) GetChainType() ChainType { @@ -705,7 +920,12 @@ const file_proto_fkms_v1_signer_proto_rawDesc = "" + "\x0esigner_payload\x18\x01 \x01(\v2\x1a.fkms.v1.IconSignerPayloadR\rsignerPayload\x12\x1e\n" + "\x03tss\x18\x02 \x01(\v2\f.fkms.v1.TssR\x03tss\"/\n" + "\x10SignIconResponse\x12\x1b\n" + - "\ttx_params\x18\x01 \x01(\fR\btxParams\"\x1b\n" + + "\ttx_params\x18\x01 \x01(\fR\btxParams\"x\n" + + "\x11SignSecretRequest\x12C\n" + + "\x0esigner_payload\x18\x01 \x01(\v2\x1c.fkms.v1.SecretSignerPayloadR\rsignerPayload\x12\x1e\n" + + "\x03tss\x18\x02 \x01(\v2\f.fkms.v1.TssR\x03tss\"-\n" + + "\x12SignSecretResponse\x12\x17\n" + + "\atx_blob\x18\x01 \x01(\fR\x06txBlob\"\x1b\n" + "\x19GetSignerAddressesRequest\"H\n" + "\x1aGetSignerAddressesResponse\x12*\n" + "\asigners\x18\x01 \x03(\v2\x10.fkms.v1.SignersR\asigners\"x\n" + @@ -720,7 +940,20 @@ const file_proto_fkms_v1_signer_proto_rawDesc = "" + "\n" + "step_limit\x18\x03 \x01(\x04R\tstepLimit\x12\x1d\n" + "\n" + - "network_id\x18\x04 \x01(\tR\tnetworkId\"a\n" + + "network_id\x18\x04 \x01(\tR\tnetworkId\"\xbb\x02\n" + + "\x13SecretSignerPayload\x12\x16\n" + + "\x06sender\x18\x01 \x01(\tR\x06sender\x12)\n" + + "\x10contract_address\x18\x02 \x01(\tR\x0fcontractAddress\x12\x19\n" + + "\bchain_id\x18\x03 \x01(\tR\achainId\x12%\n" + + "\x0eaccount_number\x18\x04 \x01(\x04R\raccountNumber\x12\x1a\n" + + "\bsequence\x18\x05 \x01(\x04R\bsequence\x12\x1b\n" + + "\tgas_limit\x18\x06 \x01(\x04R\bgasLimit\x12\x1d\n" + + "\n" + + "gas_prices\x18\a \x01(\tR\tgasPrices\x12\x12\n" + + "\x04memo\x18\b \x01(\tR\x04memo\x12\x1b\n" + + "\tcode_hash\x18\t \x01(\tR\bcodeHash\x12\x16\n" + + "\x06pubkey\x18\n" + + " \x01(\tR\x06pubkey\"a\n" + "\x03Tss\x12\x18\n" + "\amessage\x18\x01 \x01(\fR\amessage\x12\x1f\n" + "\vrandom_addr\x18\x02 \x01(\fR\n" + @@ -730,15 +963,19 @@ const file_proto_fkms_v1_signer_proto_rawDesc = "" + "\aSigners\x121\n" + "\n" + "chain_type\x18\x01 \x01(\x0e2\x12.fkms.v1.ChainTypeR\tchainType\x12\x1c\n" + - "\taddresses\x18\x02 \x03(\tR\taddresses*(\n" + + "\taddresses\x18\x02 \x03(\tR\taddresses*4\n" + "\tChainType\x12\a\n" + "\x03EVM\x10\x00\x12\b\n" + "\x04XRPL\x10\x01\x12\b\n" + - "\x04ICON\x10\x022\xac\x02\n" + + "\x04ICON\x10\x02\x12\n" + + "\n" + + "\x06SECRET\x10\x032\xf3\x02\n" + "\vFkmsService\x12<\n" + "\aSignEvm\x12\x17.fkms.v1.SignEvmRequest\x1a\x18.fkms.v1.SignEvmResponse\x12?\n" + "\bSignXrpl\x12\x18.fkms.v1.SignXrplRequest\x1a\x19.fkms.v1.SignXrplResponse\x12?\n" + - "\bSignIcon\x12\x18.fkms.v1.SignIconRequest\x1a\x19.fkms.v1.SignIconResponse\x12]\n" + + "\bSignIcon\x12\x18.fkms.v1.SignIconRequest\x1a\x19.fkms.v1.SignIconResponse\x12E\n" + + "\n" + + "SignSecret\x12\x1a.fkms.v1.SignSecretRequest\x1a\x1b.fkms.v1.SignSecretResponse\x12]\n" + "\x12GetSignerAddresses\x12\".fkms.v1.GetSignerAddressesRequest\x1a#.fkms.v1.GetSignerAddressesResponseB5Z3github.com/bandprotocol/falcon/proto/fkms/v1;fkmsv1b\x06proto3" var ( @@ -754,7 +991,7 @@ func file_proto_fkms_v1_signer_proto_rawDescGZIP() []byte { } var file_proto_fkms_v1_signer_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_fkms_v1_signer_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_proto_fkms_v1_signer_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_proto_fkms_v1_signer_proto_goTypes = []any{ (ChainType)(0), // 0: fkms.v1.ChainType (*SignEvmRequest)(nil), // 1: fkms.v1.SignEvmRequest @@ -763,33 +1000,40 @@ var file_proto_fkms_v1_signer_proto_goTypes = []any{ (*SignXrplResponse)(nil), // 4: fkms.v1.SignXrplResponse (*SignIconRequest)(nil), // 5: fkms.v1.SignIconRequest (*SignIconResponse)(nil), // 6: fkms.v1.SignIconResponse - (*GetSignerAddressesRequest)(nil), // 7: fkms.v1.GetSignerAddressesRequest - (*GetSignerAddressesResponse)(nil), // 8: fkms.v1.GetSignerAddressesResponse - (*XrplSignerPayload)(nil), // 9: fkms.v1.XrplSignerPayload - (*IconSignerPayload)(nil), // 10: fkms.v1.IconSignerPayload - (*Tss)(nil), // 11: fkms.v1.Tss - (*Signers)(nil), // 12: fkms.v1.Signers + (*SignSecretRequest)(nil), // 7: fkms.v1.SignSecretRequest + (*SignSecretResponse)(nil), // 8: fkms.v1.SignSecretResponse + (*GetSignerAddressesRequest)(nil), // 9: fkms.v1.GetSignerAddressesRequest + (*GetSignerAddressesResponse)(nil), // 10: fkms.v1.GetSignerAddressesResponse + (*XrplSignerPayload)(nil), // 11: fkms.v1.XrplSignerPayload + (*IconSignerPayload)(nil), // 12: fkms.v1.IconSignerPayload + (*SecretSignerPayload)(nil), // 13: fkms.v1.SecretSignerPayload + (*Tss)(nil), // 14: fkms.v1.Tss + (*Signers)(nil), // 15: fkms.v1.Signers } var file_proto_fkms_v1_signer_proto_depIdxs = []int32{ - 9, // 0: fkms.v1.SignXrplRequest.signer_payload:type_name -> fkms.v1.XrplSignerPayload - 11, // 1: fkms.v1.SignXrplRequest.tss:type_name -> fkms.v1.Tss - 10, // 2: fkms.v1.SignIconRequest.signer_payload:type_name -> fkms.v1.IconSignerPayload - 11, // 3: fkms.v1.SignIconRequest.tss:type_name -> fkms.v1.Tss - 12, // 4: fkms.v1.GetSignerAddressesResponse.signers:type_name -> fkms.v1.Signers - 0, // 5: fkms.v1.Signers.chain_type:type_name -> fkms.v1.ChainType - 1, // 6: fkms.v1.FkmsService.SignEvm:input_type -> fkms.v1.SignEvmRequest - 3, // 7: fkms.v1.FkmsService.SignXrpl:input_type -> fkms.v1.SignXrplRequest - 5, // 8: fkms.v1.FkmsService.SignIcon:input_type -> fkms.v1.SignIconRequest - 7, // 9: fkms.v1.FkmsService.GetSignerAddresses:input_type -> fkms.v1.GetSignerAddressesRequest - 2, // 10: fkms.v1.FkmsService.SignEvm:output_type -> fkms.v1.SignEvmResponse - 4, // 11: fkms.v1.FkmsService.SignXrpl:output_type -> fkms.v1.SignXrplResponse - 6, // 12: fkms.v1.FkmsService.SignIcon:output_type -> fkms.v1.SignIconResponse - 8, // 13: fkms.v1.FkmsService.GetSignerAddresses:output_type -> fkms.v1.GetSignerAddressesResponse - 10, // [10:14] is the sub-list for method output_type - 6, // [6:10] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 11, // 0: fkms.v1.SignXrplRequest.signer_payload:type_name -> fkms.v1.XrplSignerPayload + 14, // 1: fkms.v1.SignXrplRequest.tss:type_name -> fkms.v1.Tss + 12, // 2: fkms.v1.SignIconRequest.signer_payload:type_name -> fkms.v1.IconSignerPayload + 14, // 3: fkms.v1.SignIconRequest.tss:type_name -> fkms.v1.Tss + 13, // 4: fkms.v1.SignSecretRequest.signer_payload:type_name -> fkms.v1.SecretSignerPayload + 14, // 5: fkms.v1.SignSecretRequest.tss:type_name -> fkms.v1.Tss + 15, // 6: fkms.v1.GetSignerAddressesResponse.signers:type_name -> fkms.v1.Signers + 0, // 7: fkms.v1.Signers.chain_type:type_name -> fkms.v1.ChainType + 1, // 8: fkms.v1.FkmsService.SignEvm:input_type -> fkms.v1.SignEvmRequest + 3, // 9: fkms.v1.FkmsService.SignXrpl:input_type -> fkms.v1.SignXrplRequest + 5, // 10: fkms.v1.FkmsService.SignIcon:input_type -> fkms.v1.SignIconRequest + 7, // 11: fkms.v1.FkmsService.SignSecret:input_type -> fkms.v1.SignSecretRequest + 9, // 12: fkms.v1.FkmsService.GetSignerAddresses:input_type -> fkms.v1.GetSignerAddressesRequest + 2, // 13: fkms.v1.FkmsService.SignEvm:output_type -> fkms.v1.SignEvmResponse + 4, // 14: fkms.v1.FkmsService.SignXrpl:output_type -> fkms.v1.SignXrplResponse + 6, // 15: fkms.v1.FkmsService.SignIcon:output_type -> fkms.v1.SignIconResponse + 8, // 16: fkms.v1.FkmsService.SignSecret:output_type -> fkms.v1.SignSecretResponse + 10, // 17: fkms.v1.FkmsService.GetSignerAddresses:output_type -> fkms.v1.GetSignerAddressesResponse + 13, // [13:18] is the sub-list for method output_type + 8, // [8:13] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_proto_fkms_v1_signer_proto_init() } @@ -803,7 +1047,7 @@ func file_proto_fkms_v1_signer_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_fkms_v1_signer_proto_rawDesc), len(file_proto_fkms_v1_signer_proto_rawDesc)), NumEnums: 1, - NumMessages: 12, + NumMessages: 15, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/fkms/v1/signer.proto b/proto/fkms/v1/signer.proto index 7c6ba39b..60030439 100644 --- a/proto/fkms/v1/signer.proto +++ b/proto/fkms/v1/signer.proto @@ -8,6 +8,7 @@ service FkmsService { rpc SignEvm(SignEvmRequest) returns (SignEvmResponse); rpc SignXrpl(SignXrplRequest) returns (SignXrplResponse); rpc SignIcon(SignIconRequest) returns (SignIconResponse); + rpc SignSecret(SignSecretRequest) returns (SignSecretResponse); rpc GetSignerAddresses(GetSignerAddressesRequest) returns (GetSignerAddressesResponse); } @@ -38,6 +39,15 @@ message SignIconResponse { bytes tx_params = 1; } +message SignSecretRequest { + SecretSignerPayload signer_payload = 1; + Tss tss = 2; +} + +message SignSecretResponse { + bytes tx_blob = 1; +} + message GetSignerAddressesRequest {} message GetSignerAddressesResponse { @@ -58,6 +68,19 @@ message IconSignerPayload { string network_id = 4; } +message SecretSignerPayload { + string sender = 1; + string contract_address = 2; + string chain_id = 3; + uint64 account_number = 4; + uint64 sequence = 5; + uint64 gas_limit = 6; + string gas_prices = 7; + string memo = 8; + string code_hash = 9; + string pubkey = 10; +} + message Tss { bytes message = 1; bytes random_addr = 2; @@ -73,4 +96,5 @@ enum ChainType { EVM = 0; XRPL = 1; ICON = 2; + SECRET = 3; } diff --git a/proto/fkms/v1/signer_grpc.pb.go b/proto/fkms/v1/signer_grpc.pb.go index f0887a33..5f0912ea 100644 --- a/proto/fkms/v1/signer_grpc.pb.go +++ b/proto/fkms/v1/signer_grpc.pb.go @@ -22,6 +22,7 @@ const ( FkmsService_SignEvm_FullMethodName = "/fkms.v1.FkmsService/SignEvm" FkmsService_SignXrpl_FullMethodName = "/fkms.v1.FkmsService/SignXrpl" FkmsService_SignIcon_FullMethodName = "/fkms.v1.FkmsService/SignIcon" + FkmsService_SignSecret_FullMethodName = "/fkms.v1.FkmsService/SignSecret" FkmsService_GetSignerAddresses_FullMethodName = "/fkms.v1.FkmsService/GetSignerAddresses" ) @@ -32,6 +33,7 @@ type FkmsServiceClient interface { SignEvm(ctx context.Context, in *SignEvmRequest, opts ...grpc.CallOption) (*SignEvmResponse, error) SignXrpl(ctx context.Context, in *SignXrplRequest, opts ...grpc.CallOption) (*SignXrplResponse, error) SignIcon(ctx context.Context, in *SignIconRequest, opts ...grpc.CallOption) (*SignIconResponse, error) + SignSecret(ctx context.Context, in *SignSecretRequest, opts ...grpc.CallOption) (*SignSecretResponse, error) GetSignerAddresses(ctx context.Context, in *GetSignerAddressesRequest, opts ...grpc.CallOption) (*GetSignerAddressesResponse, error) } @@ -73,6 +75,16 @@ func (c *fkmsServiceClient) SignIcon(ctx context.Context, in *SignIconRequest, o return out, nil } +func (c *fkmsServiceClient) SignSecret(ctx context.Context, in *SignSecretRequest, opts ...grpc.CallOption) (*SignSecretResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(SignSecretResponse) + err := c.cc.Invoke(ctx, FkmsService_SignSecret_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *fkmsServiceClient) GetSignerAddresses(ctx context.Context, in *GetSignerAddressesRequest, opts ...grpc.CallOption) (*GetSignerAddressesResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetSignerAddressesResponse) @@ -90,6 +102,7 @@ type FkmsServiceServer interface { SignEvm(context.Context, *SignEvmRequest) (*SignEvmResponse, error) SignXrpl(context.Context, *SignXrplRequest) (*SignXrplResponse, error) SignIcon(context.Context, *SignIconRequest) (*SignIconResponse, error) + SignSecret(context.Context, *SignSecretRequest) (*SignSecretResponse, error) GetSignerAddresses(context.Context, *GetSignerAddressesRequest) (*GetSignerAddressesResponse, error) mustEmbedUnimplementedFkmsServiceServer() } @@ -110,6 +123,9 @@ func (UnimplementedFkmsServiceServer) SignXrpl(context.Context, *SignXrplRequest func (UnimplementedFkmsServiceServer) SignIcon(context.Context, *SignIconRequest) (*SignIconResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SignIcon not implemented") } +func (UnimplementedFkmsServiceServer) SignSecret(context.Context, *SignSecretRequest) (*SignSecretResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignSecret not implemented") +} func (UnimplementedFkmsServiceServer) GetSignerAddresses(context.Context, *GetSignerAddressesRequest) (*GetSignerAddressesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSignerAddresses not implemented") } @@ -188,6 +204,24 @@ func _FkmsService_SignIcon_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _FkmsService_SignSecret_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SignSecretRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FkmsServiceServer).SignSecret(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: FkmsService_SignSecret_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FkmsServiceServer).SignSecret(ctx, req.(*SignSecretRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _FkmsService_GetSignerAddresses_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetSignerAddressesRequest) if err := dec(in); err != nil { @@ -225,6 +259,10 @@ var FkmsService_ServiceDesc = grpc.ServiceDesc{ MethodName: "SignIcon", Handler: _FkmsService_SignIcon_Handler, }, + { + MethodName: "SignSecret", + Handler: _FkmsService_SignSecret_Handler, + }, { MethodName: "GetSignerAddresses", Handler: _FkmsService_GetSignerAddresses_Handler, diff --git a/relayer/chains/secret/client.go b/relayer/chains/secret/client.go new file mode 100644 index 00000000..49955b3f --- /dev/null +++ b/relayer/chains/secret/client.go @@ -0,0 +1,310 @@ +package secret + +import ( + "context" + "encoding/hex" + "fmt" + "math/big" + "sync" + "time" + + "github.com/bandprotocol/falcon/relayer/alert" + "github.com/bandprotocol/falcon/relayer/chains" + "github.com/bandprotocol/falcon/relayer/logger" + sdkclient "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + std "github.com/cosmos/cosmos-sdk/std" + sdk "github.com/cosmos/cosmos-sdk/types" + authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + + rpchttp "github.com/cometbft/cometbft/rpc/client/http" + libclient "github.com/cometbft/cometbft/rpc/jsonrpc/client" +) + +type SecretClients = chains.ClientPool[sdkclient.Context] + +// Client defines the Cosmos RPC operations required by the Secret chain provider. +type Client interface { + Connect(ctx context.Context) error + CheckAndConnect(ctx context.Context) error + StartLivelinessCheck(ctx context.Context, interval time.Duration) + + BroadcastTx(txBlob []byte) (string, error) + GetBalance(address string) (*big.Int, error) + GetTx(txHash string) (*typesTxResult, error) + GetBlockByHeight(height *big.Int) (*typesBlockResult, error) + GetAccount(sender string) (accountNumber uint64, sequence uint64, err error) +} + +// typesTxResult mirrors the subset of TxResult fields we need in provider. +type typesTxResult struct { + StatusCode uint32 + GasUsed int64 + Height int64 + Log string +} + +// typesBlockResult mirrors the subset of block fields we need in provider. +type typesBlockResult struct { + Time time.Time +} + +var _ Client = (*client)(nil) + +type client struct { + chainName string + endpoints []string + denom string + + log logger.Logger + alert alert.Alert + clients SecretClients +} + +func NewClient(chainName string, cpc *SecretChainProviderConfig, log logger.Logger, alert alert.Alert) *client { + return &client{ + chainName: chainName, + endpoints: cpc.Endpoints, + denom: cpc.Denom, + log: log.With("chain_name", chainName), + alert: alert, + clients: chains.NewClientPool[sdkclient.Context](), + } +} + +func makeEncodingConfig() struct { + InterfaceRegistry codectypes.InterfaceRegistry + Marshaler codec.Codec + TxConfig sdkclient.TxConfig +} { + interfaceRegistry := codectypes.NewInterfaceRegistry() + marshaler := codec.NewProtoCodec(interfaceRegistry) + txCfg := authtx.NewTxConfig(marshaler, authtx.DefaultSignModes) + + std.RegisterInterfaces(interfaceRegistry) + authtypes.RegisterInterfaces(interfaceRegistry) + + return struct { + InterfaceRegistry codectypes.InterfaceRegistry + Marshaler codec.Codec + TxConfig sdkclient.TxConfig + }{ + InterfaceRegistry: interfaceRegistry, + Marshaler: marshaler, + TxConfig: txCfg, + } +} + +func newRPCClient(addr string, timeout time.Duration) (*rpchttp.HTTP, error) { + httpClient, err := libclient.DefaultHTTPClient(addr) + if err != nil { + return nil, err + } + + httpClient.Timeout = timeout + + // Websocket endpoint is required by cometbft client for some queries. + rpcClient, err := rpchttp.NewWithClient(addr, "/websocket", httpClient) + if err != nil { + return nil, err + } + return rpcClient, nil +} + +func (c *client) Connect(_ context.Context) error { + var wg sync.WaitGroup + + for _, endpoint := range c.endpoints { + _, ok := c.clients.GetClient(endpoint) + if ok { + continue + } + + wg.Add(1) + go func(endpoint string) { + defer wg.Done() + + enc := makeEncodingConfig() + + // NOTE: band-feeder uses a larger timeout; we keep it conservative here. + rpcClient, err := newRPCClient(endpoint, 3*time.Second) + if err != nil { + c.log.Error("Failed to create cometbft rpc client", "endpoint", endpoint, "err", err) + return + } + + ctx := sdkclient.Context{}. + WithAccountRetriever(authtypes.AccountRetriever{}). + WithBroadcastMode(flags.BroadcastSync). + WithCodec(enc.Marshaler). + WithInterfaceRegistry(enc.InterfaceRegistry). + WithTxConfig(enc.TxConfig). + WithClient(rpcClient). + WithNodeURI(endpoint) + + c.clients.SetClient(endpoint, &ctx) + }(endpoint) + } + + wg.Wait() + + // Select the first connected endpoint (or just first endpoint if none exist yet). + if c.clients.GetSelectedEndpoint() == "" && len(c.endpoints) > 0 { + c.clients.SetSelectedEndpoint(c.endpoints[0]) + } + + return nil +} + +func (c *client) StartLivelinessCheck(ctx context.Context, interval time.Duration) { + ticker := time.NewTicker(interval) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + _ = c.Connect(ctx) + } + } +} + +func (c *client) CheckAndConnect(ctx context.Context) error { + if _, err := c.clients.GetSelectedClient(); err != nil { + return c.Connect(ctx) + } + return nil +} + +func (c *client) getSelectedClient() (*sdkclient.Context, error) { + cli, err := c.clients.GetSelectedClient() + if err != nil { + return nil, fmt.Errorf("no selected rpc endpoint: %w", err) + } + return cli, nil +} + +func (c *client) BroadcastTx(txBlob []byte) (string, error) { + cli, err := c.getSelectedClient() + if err != nil { + return "", err + } + + res, err := cli.BroadcastTx(txBlob) + if err != nil { + return "", err + } + if res.Code != 0 { + return "", fmt.Errorf("transaction failed with code %d: %s", res.Code, res.RawLog) + } + return res.TxHash, nil +} + +func (c *client) GetAccount(sender string) (accountNumber uint64, sequence uint64, err error) { + cli, err := c.getSelectedClient() + if err != nil { + return 0, 0, err + } + + acc, err := sdk.AccAddressFromBech32(sender) + if err != nil { + return 0, 0, err + } + + account, err := cli.AccountRetriever.GetAccount(*cli, acc) + if err != nil { + return 0, 0, err + } + + return account.GetAccountNumber(), account.GetSequence(), nil +} + +func (c *client) GetBalance(address string) (*big.Int, error) { + cli, err := c.getSelectedClient() + if err != nil { + return nil, err + } + + queryClient := banktypes.NewQueryClient(*cli) + req := banktypes.QueryBalanceRequest{ + Address: address, + Denom: c.denom, + } + + resp, err := queryClient.Balance(context.Background(), &req) + if err != nil { + return nil, err + } + + amount := resp.GetBalance().Amount + return amount.BigInt(), nil +} + +func (c *client) GetTx(txHash string) (*typesTxResult, error) { + cli, err := c.getSelectedClient() + if err != nil { + return nil, err + } + + node, err := cli.GetNode() + if err != nil { + return nil, err + } + + txHashBytes, err := hex.DecodeString(txHash) + if err != nil { + return nil, err + } + + resultTx, err := node.Tx(context.Background(), txHashBytes, true) + if err != nil { + return nil, err + } + + code := resultTx.TxResult.Code + gasUsed := resultTx.TxResult.GasUsed + height := resultTx.Height + log := resultTx.TxResult.Log + + // normalize logs: some nodes return empty log on success + if code == 0 { + log = "" + } + + return &typesTxResult{ + StatusCode: code, + GasUsed: gasUsed, + Height: height, + Log: log, + }, nil +} + +func (c *client) GetBlockByHeight(height *big.Int) (*typesBlockResult, error) { + cli, err := c.getSelectedClient() + if err != nil { + return nil, err + } + + node, err := cli.GetNode() + if err != nil { + return nil, err + } + + h := height.Int64() + resBlock, err := node.Block(context.Background(), &h) + if err != nil { + return nil, err + } + + if resBlock.Block == nil { + return nil, fmt.Errorf("block not found at height %d", h) + } + + // Block timestamp is in UTC. + return &typesBlockResult{Time: resBlock.Block.Header.Time.UTC()}, nil +} diff --git a/relayer/chains/secret/config.go b/relayer/chains/secret/config.go new file mode 100644 index 00000000..3a29320f --- /dev/null +++ b/relayer/chains/secret/config.go @@ -0,0 +1,69 @@ +package secret + +import ( + "time" + + "github.com/bandprotocol/falcon/relayer/alert" + "github.com/bandprotocol/falcon/relayer/chains" + "github.com/bandprotocol/falcon/relayer/chains/types" + "github.com/bandprotocol/falcon/relayer/logger" + "github.com/bandprotocol/falcon/relayer/wallet" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +var _ chains.ChainProviderConfig = &SecretChainProviderConfig{} + +const bech32PrefixAccAddr = "secret" + +// SecretChainProviderConfig is the configuration for the Secret (CosmWasm) chain provider. +type SecretChainProviderConfig struct { + chains.BaseChainProviderConfig `mapstructure:",squash"` + + // Cosmos SDK chain id used for signing (passed to fkms). + CosmosChainID string `mapstructure:"cosmos_chain_id" toml:"cosmos_chain_id"` + + // GasPrice and denom are used for gas/fee and balance queries. + GasPrice string `mapstructure:"gas_price" toml:"gas_price"` + Denom string `mapstructure:"denom" toml:"denom"` + + GasLimitBase uint64 `mapstructure:"gas_limit_base" toml:"gas_limit_base"` + GasLimitEach uint64 `mapstructure:"gas_limit_each" toml:"gas_limit_each"` + + // Memo is included in the Cosmos SDK TxBody (passed to fkms). + Memo string `mapstructure:"memo" toml:"memo"` + + // Secret contract encryption parameters (passed to fkms). + CodeHash string `mapstructure:"code_hash" toml:"code_hash"` + // Secret chain's public key (used for signing, passed to fkms). + PubKey string `mapstructure:"pub_key" toml:"pub_key"` + + WaitingTxDuration time.Duration `mapstructure:"waiting_tx_duration" toml:"waiting_tx_duration"` + CheckingTxInterval time.Duration `mapstructure:"checking_tx_interval" toml:"checking_tx_interval"` +} + +func (cpc *SecretChainProviderConfig) NewChainProvider( + chainName string, + log logger.Logger, + wallet wallet.Wallet, + alert alert.Alert, +) (chains.ChainProvider, error) { + client := NewClient(chainName, cpc, log, alert) + + accountPubKeyPrefix := bech32PrefixAccAddr + "pub" + validatorAddressPrefix := bech32PrefixAccAddr + "valoper" + validatorPubKeyPrefix := bech32PrefixAccAddr + "valoperpub" + consNodeAddressPrefix := bech32PrefixAccAddr + "valcons" + consNodePubKeyPrefix := bech32PrefixAccAddr + "valconspub" + + config := sdk.GetConfig() + config.SetBech32PrefixForAccount(bech32PrefixAccAddr, accountPubKeyPrefix) + config.SetBech32PrefixForValidator(validatorAddressPrefix, validatorPubKeyPrefix) + config.SetBech32PrefixForConsensusNode(consNodeAddressPrefix, consNodePubKeyPrefix) + + return NewSecretChainProvider(chainName, client, cpc, log, wallet, alert), nil +} + +func (cpc *SecretChainProviderConfig) GetChainType() types.ChainType { + return types.ChainTypeSecret +} diff --git a/relayer/chains/secret/provider.go b/relayer/chains/secret/provider.go new file mode 100644 index 00000000..4c6ab3f4 --- /dev/null +++ b/relayer/chains/secret/provider.go @@ -0,0 +1,409 @@ +package secret + +import ( + "context" + "encoding/json" + "fmt" + "math/big" + "strings" + "time" + + "github.com/shopspring/decimal" + + "github.com/bandprotocol/falcon/internal/relayermetrics" + "github.com/bandprotocol/falcon/relayer/alert" + bandtypes "github.com/bandprotocol/falcon/relayer/band/types" + "github.com/bandprotocol/falcon/relayer/chains" + "github.com/bandprotocol/falcon/relayer/chains/types" + "github.com/bandprotocol/falcon/relayer/db" + "github.com/bandprotocol/falcon/relayer/logger" + "github.com/bandprotocol/falcon/relayer/wallet" + secretwallet "github.com/bandprotocol/falcon/relayer/wallet/secret" +) + +var _ chains.ChainProvider = (*SecretChainProvider)(nil) + +// SecretChainProvider handles interactions with the Secret Network chain. +type SecretChainProvider struct { + Config *SecretChainProviderConfig + + ChainName string + Client Client + Log logger.Logger + + Wallet wallet.Wallet + DB db.Database + Alert alert.Alert + FreeSigners chan wallet.Signer +} + +func NewSecretChainProvider( + chainName string, + client Client, + cfg *SecretChainProviderConfig, + log logger.Logger, + wallet wallet.Wallet, + alert alert.Alert, +) *SecretChainProvider { + return &SecretChainProvider{ + Config: cfg, + ChainName: chainName, + Client: client, + Log: log.With("chain_name", chainName), + Wallet: wallet, + Alert: alert, + FreeSigners: chains.LoadSigners(wallet), + } +} + +func (cp *SecretChainProvider) Init(ctx context.Context) error { + if err := cp.Client.Connect(ctx); err != nil { + return err + } + + go cp.Client.StartLivelinessCheck(ctx, cp.Config.LivelinessCheckingInterval) + return nil +} + +func (cp *SecretChainProvider) SetDatabase(database db.Database) { + cp.DB = database +} + +func (cp *SecretChainProvider) QueryTunnelInfo( + _ context.Context, + tunnelID uint64, + tunnelDestinationAddr string, +) (*types.Tunnel, error) { + tunnel := types.NewTunnel(tunnelID, tunnelDestinationAddr, true, nil, nil) + return tunnel, nil +} + +func countValidSecretSymbolRates(signalPrices []bandtypes.SignalPrice) uint64 { + // Mirrors fkms/cosmwasm_secret expectations: parse "CS:BTC-USD" and only count "USD" quote with price > 0. + var count uint64 + for _, sp := range signalPrices { + if sp.Price == 0 { + continue + } + parts := strings.Split(sp.SignalID, ":") + if len(parts) != 2 { + continue + } + right := strings.Split(parts[1], "-") + if len(right) != 2 { + continue + } + if right[1] != "USD" { + continue + } + count++ + } + return count +} + +// RelayPacket relays the given Band packet to Secret Network by: +// - building a SignSecretRequest payload for fkms (including per-tunnel contract address) +// - delegating tx signing & encryption to fkms via remote signer +// - broadcasting the returned signed tx blob +func (cp *SecretChainProvider) RelayPacket(ctx context.Context, packet *bandtypes.Packet) error { + cp.Log.Info("Start relaying a packet", "tunnel_id", packet.TunnelID, "sequence", packet.Sequence) + if err := cp.Client.CheckAndConnect(ctx); err != nil { + return err + } + + freeSigner := <-cp.FreeSigners + defer func() { cp.FreeSigners <- freeSigner }() + + log := cp.Log.With( + "tunnel_id", packet.TunnelID, + "sequence", packet.Sequence, + "signer_address", freeSigner.GetAddress(), + ) + + var lastErr error + for retryCount := 1; retryCount <= cp.Config.MaxRetry; retryCount++ { + log.Info("Relaying a message", "retry_count", retryCount) + + signing, err := chains.SelectSigning(packet) + if err != nil { + log.Error("Select signing error", "retry_count", retryCount, err) + lastErr = err + continue + } + + accountNumber, sequence, err := cp.Client.GetAccount(freeSigner.GetAddress()) + if err != nil { + log.Error("Get account error", "retry_count", retryCount, err) + lastErr = err + continue + } + + // fkms signs using gas_limit + gas_prices, and the fee impact depends on the number of symbol rates. + validSymbolRates := countValidSecretSymbolRates(packet.SignalPrices) + gasLimit := cp.Config.GasLimitBase + cp.Config.GasLimitEach*validSymbolRates + + signerPayload := secretwallet.NewSignerPayload( + freeSigner.GetAddress(), + packet.TargetAddress, + cp.Config.CosmosChainID, + accountNumber, + sequence, + gasLimit, + cp.Config.GasPrice, + cp.Config.Memo, + cp.Config.CodeHash, + cp.Config.PubKey, + ) + + payloadBytes, err := json.Marshal(signerPayload) + if err != nil { + log.Error("Marshal signer payload error", "retry_count", retryCount, err) + lastErr = err + continue + } + + rAddress, signature := chains.ExtractEVMSignature(signing.EVMSignature) + tssPayload := wallet.NewTssPayload(signing.Message, rAddress, signature) + + txBlob, err := freeSigner.Sign(payloadBytes, tssPayload) + if err != nil { + log.Error("Sign transaction error", "retry_count", retryCount, err) + lastErr = err + continue + } + + cp.Log.Info("Successfully signed, tx blob ready to be broadcasted", "tx_blob", fmt.Sprintf("%X", txBlob)) + + var balance *big.Int + if cp.DB != nil { + balance, err = cp.Client.GetBalance(freeSigner.GetAddress()) + if err != nil { + log.Error("Failed to get balance", "retry_count", retryCount, err) + alert.HandleAlert(cp.Alert, alert.NewTopic(alert.GetBalanceErrorMsg). + WithTunnelID(packet.TunnelID). + WithChainName(cp.ChainName), err.Error()) + } else { + alert.HandleReset(cp.Alert, alert.NewTopic(alert.GetBalanceErrorMsg). + WithTunnelID(packet.TunnelID). + WithChainName(cp.ChainName)) + } + } + + txHash, err := cp.Client.BroadcastTx(txBlob) + if err != nil { + log.Error("Broadcast transaction error", "retry_count", retryCount, err) + lastErr = err + continue + } + + createdAt := time.Now() + log.Info("Submitted a message; checking transaction status", "tx_hash", txHash, "retry_count", retryCount) + + // save pending tx in db + if cp.DB != nil { + tx := cp.prepareTransaction(ctx, txHash, freeSigner.GetAddress(), packet, nil, balance, log, retryCount) + chains.HandleSaveTransaction(cp.DB, cp.Alert, tx, log) + } + + txResult := cp.WaitForConfirmedTx(ctx, txHash, log) + cp.handleMetrics(packet.TunnelID, createdAt, txResult) + + if cp.DB != nil { + tx := cp.prepareTransaction(ctx, txHash, freeSigner.GetAddress(), packet, &txResult, balance, log, retryCount) + chains.HandleSaveTransaction(cp.DB, cp.Alert, tx, log) + } + + if txResult.Status == types.TX_STATUS_SUCCESS { + alert.HandleReset(cp.Alert, alert.NewTopic(alert.RelayTxErrorMsg). + WithTunnelID(packet.TunnelID). + WithChainName(cp.ChainName)) + return nil + } + + lastErr = fmt.Errorf("transaction failed: %s", txResult.FailureReason) + } + + alert.HandleAlert( + cp.Alert, + alert.NewTopic(alert.RelayTxErrorMsg).WithTunnelID(packet.TunnelID).WithChainName(cp.ChainName), + lastErr.Error(), + ) + return fmt.Errorf("failed to relay packet after %d attempts", cp.Config.MaxRetry) +} + +func (cp *SecretChainProvider) QueryBalance(ctx context.Context, keyName string) (*big.Int, error) { + signer, ok := cp.Wallet.GetSigner(keyName) + if !ok { + cp.Log.Error("Key name does not exist", "key_name", keyName) + return nil, fmt.Errorf("key name does not exist: %s", keyName) + } + return cp.Client.GetBalance(signer.GetAddress()) +} + +func (cp *SecretChainProvider) GetChainName() string { return cp.ChainName } +func (cp *SecretChainProvider) ChainType() types.ChainType { return types.ChainTypeSecret } +func (cp *SecretChainProvider) GetWallet() wallet.Wallet { return cp.Wallet } + +func (cp *SecretChainProvider) prepareTransaction( + _ context.Context, + txHash string, + signerAddress string, + packet *bandtypes.Packet, + txResult *TxResult, + oldBalance *big.Int, + log logger.Logger, + retryCount int, +) *db.Transaction { + if txHash == "" { + return nil + } + + var signalPrices []db.SignalPrice + for _, p := range packet.SignalPrices { + signalPrices = append(signalPrices, *db.NewSignalPrice(p.SignalID, p.Price)) + } + + txStatus := types.TX_STATUS_PENDING + gasUsed := decimal.NullDecimal{} + effectiveGasPrice := decimal.NullDecimal{} + balanceDelta := decimal.NullDecimal{} + + var blockTimestamp *time.Time + if txResult != nil { + txStatus = txResult.Status + gasUsed = txResult.GasUsed + effectiveGasPrice = txResult.EffectiveGasPrice + + if (txResult.Status == types.TX_STATUS_SUCCESS || txResult.Status == types.TX_STATUS_FAILED) && txResult.BlockHeight != nil { + block, err := cp.Client.GetBlockByHeight(txResult.BlockHeight) + if err != nil { + log.Error("Failed to get block by height", "retry_count", retryCount, "block_height", txResult.BlockHeight, err) + alert.HandleAlert(cp.Alert, alert.NewTopic(alert.GetHeaderBlockErrorMsg). + WithTunnelID(packet.TunnelID). + WithChainName(cp.ChainName), err.Error()) + } else { + timestamp := block.Time.UTC() + blockTimestamp = ×tamp + alert.HandleReset(cp.Alert, alert.NewTopic(alert.GetHeaderBlockErrorMsg). + WithTunnelID(packet.TunnelID). + WithChainName(cp.ChainName)) + } + } + + if oldBalance != nil { + newBalance, err := cp.Client.GetBalance(signerAddress) + if err != nil { + log.Error("Failed to get balance", "retry_count", retryCount, err) + alert.HandleAlert(cp.Alert, alert.NewTopic(alert.GetBalanceErrorMsg). + WithTunnelID(packet.TunnelID). + WithChainName(cp.ChainName), err.Error()) + } else { + diff := new(big.Int).Sub(newBalance, oldBalance) + balanceDelta = decimal.NewNullDecimal(decimal.NewFromBigInt(diff, 0)) + alert.HandleReset(cp.Alert, alert.NewTopic(alert.GetBalanceErrorMsg). + WithTunnelID(packet.TunnelID). + WithChainName(cp.ChainName)) + } + } + } + + tx := db.NewTransaction( + txHash, + packet.TunnelID, + packet.Sequence, + cp.ChainName, + types.ChainTypeSecret, + signerAddress, + txStatus, + gasUsed, + effectiveGasPrice, + balanceDelta, + signalPrices, + blockTimestamp, + ) + + return tx +} + +func (cp *SecretChainProvider) CheckConfirmedTx( + ctx context.Context, + txHash string, +) (TxResult, error) { + tx, err := cp.Client.GetTx(txHash) + if err != nil { + err = fmt.Errorf("failed to get transaction: %w", err) + return NewTxResult( + types.TX_STATUS_PENDING, + decimal.NullDecimal{}, + decimal.NullDecimal{}, + nil, + err.Error(), + ), err + } + + gasUsed := decimal.NewNullDecimal(decimal.New(tx.GasUsed, 0)) + blockHeight := big.NewInt(tx.Height) + + if tx.StatusCode == 0 { + return NewTxResult(types.TX_STATUS_SUCCESS, gasUsed, decimal.NullDecimal{}, blockHeight, ""), nil + } + return NewTxResult( + types.TX_STATUS_FAILED, + gasUsed, + decimal.NullDecimal{}, + blockHeight, + fmt.Sprintf("transaction failed with failure message %s", tx.Log), + ), nil +} + +func (cp *SecretChainProvider) WaitForConfirmedTx( + ctx context.Context, + txHash string, + log logger.Logger, +) TxResult { + createdAt := time.Now() + var lastErr error + for time.Since(createdAt) <= cp.Config.WaitingTxDuration { + result, err := cp.CheckConfirmedTx(ctx, txHash) + if err != nil { + lastErr = err + log.Debug("Failed to check tx status", "tx_hash", txHash, "err", err) + } + + switch result.Status { + case types.TX_STATUS_SUCCESS, types.TX_STATUS_FAILED: + return result + case types.TX_STATUS_PENDING: + time.Sleep(cp.Config.CheckingTxInterval) + } + } + + failureReason := fmt.Sprintf("timed out waiting %s for tx %s to be confirmed", cp.Config.WaitingTxDuration, txHash) + if lastErr != nil { + failureReason = fmt.Sprintf("%s: %v", failureReason, lastErr) + } + + return NewTxResult(types.TX_STATUS_TIMEOUT, decimal.NullDecimal{}, decimal.NullDecimal{}, nil, failureReason) +} + +func (cp *SecretChainProvider) handleMetrics(tunnelID uint64, createdAt time.Time, txResult TxResult) { + relayermetrics.IncTxsCount(tunnelID, cp.ChainName, types.ChainTypeSecret.String(), txResult.Status.String()) + + switch txResult.Status { + case types.TX_STATUS_SUCCESS, types.TX_STATUS_FAILED: + relayermetrics.ObserveTxProcessTime( + tunnelID, + cp.ChainName, + types.ChainTypeSecret.String(), + txResult.Status.String(), + time.Since(createdAt).Milliseconds(), + ) + relayermetrics.ObserveGasUsed( + tunnelID, + cp.ChainName, + types.ChainTypeSecret.String(), + txResult.Status.String(), + txResult.GasUsed.Decimal.InexactFloat64(), + ) + } +} diff --git a/relayer/chains/secret/types.go b/relayer/chains/secret/types.go new file mode 100644 index 00000000..06ca402a --- /dev/null +++ b/relayer/chains/secret/types.go @@ -0,0 +1,34 @@ +package secret + +import ( + "math/big" + + "github.com/shopspring/decimal" + + "github.com/bandprotocol/falcon/relayer/chains/types" +) + +// TxResult is the result of transaction confirmation. +type TxResult struct { + Status types.TxStatus + GasUsed decimal.NullDecimal + EffectiveGasPrice decimal.NullDecimal + BlockHeight *big.Int + FailureReason string +} + +func NewTxResult( + status types.TxStatus, + gasUsed decimal.NullDecimal, + effectiveGasPrice decimal.NullDecimal, + blockHeight *big.Int, + failureReason string, +) TxResult { + return TxResult{ + Status: status, + GasUsed: gasUsed, + EffectiveGasPrice: effectiveGasPrice, + BlockHeight: blockHeight, + FailureReason: failureReason, + } +} diff --git a/relayer/chains/types/chain_type.go b/relayer/chains/types/chain_type.go index e5165e54..3587a2b9 100644 --- a/relayer/chains/types/chain_type.go +++ b/relayer/chains/types/chain_type.go @@ -17,12 +17,14 @@ const ( ChainTypeEVM ChainTypeXRPL ChainTypeIcon + ChainTypeSecret ) var chainTypeNameMap = map[ChainType]string{ ChainTypeEVM: "evm", ChainTypeXRPL: "xrpl", ChainTypeIcon: "icon", + ChainTypeSecret: "secret", } var nameToChainTypeMap map[string]ChainType diff --git a/relayer/config/config.go b/relayer/config/config.go index e09bff83..8d1a8027 100644 --- a/relayer/config/config.go +++ b/relayer/config/config.go @@ -13,6 +13,7 @@ import ( "github.com/bandprotocol/falcon/relayer/chains" "github.com/bandprotocol/falcon/relayer/chains/evm" "github.com/bandprotocol/falcon/relayer/chains/icon" + "github.com/bandprotocol/falcon/relayer/chains/secret" chainstypes "github.com/bandprotocol/falcon/relayer/chains/types" "github.com/bandprotocol/falcon/relayer/chains/xrpl" ) @@ -105,6 +106,20 @@ func ParseChainProviderConfig(w ChainProviderConfigWrapper) (chains.ChainProvide return nil, err } + cfg = &newCfg + case chainstypes.ChainTypeSecret: + var newCfg secret.SecretChainProviderConfig + + decoderConfig.Result = &newCfg + decoder, err := mapstructure.NewDecoder(&decoderConfig) + if err != nil { + return nil, err + } + + if err := decoder.Decode(w); err != nil { + return nil, err + } + cfg = &newCfg default: return cfg, fmt.Errorf("unsupported chain type: %s", typeName) diff --git a/relayer/db/migrations/postgres/00005_add_secret_chain_type.sql b/relayer/db/migrations/postgres/00005_add_secret_chain_type.sql new file mode 100644 index 00000000..c1a4f37d --- /dev/null +++ b/relayer/db/migrations/postgres/00005_add_secret_chain_type.sql @@ -0,0 +1,7 @@ +-- +goose Up +ALTER TYPE chain_type ADD VALUE IF NOT EXISTS 'secret'; + +-- +goose Down +-- NOTE: PostgreSQL does not support removing values from an ENUM type. +-- To "undo" this, would typically have to drop and recreate the type, +-- which is dangerous if data already exists. diff --git a/relayer/db/migrations/sqlite/00001_create_transactions.sql b/relayer/db/migrations/sqlite/00001_create_transactions.sql index d04541f2..21f3a4c9 100644 --- a/relayer/db/migrations/sqlite/00001_create_transactions.sql +++ b/relayer/db/migrations/sqlite/00001_create_transactions.sql @@ -7,7 +7,7 @@ CREATE TABLE transactions ( tunnel_id INTEGER NOT NULL, sequence INTEGER NOT NULL, chain_name TEXT NOT NULL, - chain_type TEXT NOT NULL CHECK (chain_type IN ('evm')), + chain_type TEXT NOT NULL CHECK (chain_type IN ('evm', 'xrpl', 'icon', 'secret')), status TEXT NOT NULL CHECK (status IN ('Pending','Success','Failed','Timeout')), sender TEXT, gas_used DECIMAL NULL, diff --git a/relayer/store/filesystem.go b/relayer/store/filesystem.go index 18211d7f..eb0b7a8e 100644 --- a/relayer/store/filesystem.go +++ b/relayer/store/filesystem.go @@ -13,6 +13,7 @@ import ( "github.com/bandprotocol/falcon/relayer/wallet" "github.com/bandprotocol/falcon/relayer/wallet/evm" "github.com/bandprotocol/falcon/relayer/wallet/icon" + "github.com/bandprotocol/falcon/relayer/wallet/secret" "github.com/bandprotocol/falcon/relayer/wallet/xrpl" ) @@ -113,6 +114,8 @@ func (fs *FileSystem) NewWallet(chainType chainstypes.ChainType, chainName, pass return xrpl.NewWallet(passphrase, fs.HomePath, chainName) case chainstypes.ChainTypeIcon: return icon.NewWallet(passphrase, fs.HomePath, chainName) + case chainstypes.ChainTypeSecret: + return secret.NewWallet(passphrase, fs.HomePath, chainName) default: return nil, fmt.Errorf("unsupported chain type: %s", chainType) } diff --git a/relayer/wallet/secret/remote_signer.go b/relayer/wallet/secret/remote_signer.go new file mode 100644 index 00000000..a344e997 --- /dev/null +++ b/relayer/wallet/secret/remote_signer.go @@ -0,0 +1,60 @@ +package secret + +import ( + "encoding/json" + + fkmsv1 "github.com/bandprotocol/falcon/proto/fkms/v1" + "github.com/bandprotocol/falcon/relayer/wallet" +) + +var _ wallet.Signer = (*RemoteSigner)(nil) + +// RemoteSigner signs Cosmos SDK transactions via fkms.SignSecret. +type RemoteSigner struct { + wallet.BaseRemoteSigner +} + +// NewRemoteSigner creates a Secret RemoteSigner. +func NewRemoteSigner(name, address, url string, key string) (wallet.Signer, error) { + base, err := wallet.NewBaseRemoteSigner(name, address, url, key) + if err != nil { + return nil, err + } + return &RemoteSigner{BaseRemoteSigner: *base}, nil +} + +// Sign requests fkms to build & sign a Secret Network TxRaw, then returns it as tx_blob bytes. +func (r *RemoteSigner) Sign(payload []byte, tssPayload wallet.TssPayload) ([]byte, error) { + var signerPayload SignerPayload + if err := json.Unmarshal(payload, &signerPayload); err != nil { + return nil, err + } + + res, err := r.FkmsClient.SignSecret( + r.ContextWithKey(), + &fkmsv1.SignSecretRequest{ + SignerPayload: &fkmsv1.SecretSignerPayload{ + Sender: signerPayload.Sender, + ContractAddress: signerPayload.ContractAddress, + ChainId: signerPayload.ChainID, + AccountNumber: signerPayload.AccountNumber, + Sequence: signerPayload.Sequence, + GasLimit: signerPayload.GasLimit, + GasPrices: signerPayload.GasPrices, + Memo: signerPayload.Memo, + CodeHash: signerPayload.CodeHash, + Pubkey: signerPayload.PubKey, + }, + Tss: &fkmsv1.Tss{ + Message: tssPayload.TssMessage, + RandomAddr: tssPayload.RandomAddr, + SignatureS: tssPayload.Signature, + }, + }, + ) + if err != nil { + return nil, err + } + + return res.TxBlob, nil +} diff --git a/relayer/wallet/secret/types.go b/relayer/wallet/secret/types.go new file mode 100644 index 00000000..e35e361e --- /dev/null +++ b/relayer/wallet/secret/types.go @@ -0,0 +1,42 @@ +package secret + +// SignerPayload is the JSON payload sent to the remote signer via WalletSigner.Sign(). +// It is then mapped 1:1 onto fkms.v1.SecretSignerPayload. +type SignerPayload struct { + Sender string `json:"sender"` + ContractAddress string `json:"contract_address"` + ChainID string `json:"chain_id"` + AccountNumber uint64 `json:"account_number"` + Sequence uint64 `json:"sequence"` + GasLimit uint64 `json:"gas_limit"` + GasPrices string `json:"gas_prices"` + Memo string `json:"memo"` + CodeHash string `json:"code_hash"` + PubKey string `json:"pubkey"` +} + +func NewSignerPayload( + sender string, + contractAddress string, + chainID string, + accountNumber uint64, + sequence uint64, + gasLimit uint64, + gasPrices string, + memo string, + codeHash string, + pubKey string, +) SignerPayload { + return SignerPayload{ + Sender: sender, + ContractAddress: contractAddress, + ChainID: chainID, + AccountNumber: accountNumber, + Sequence: sequence, + GasLimit: gasLimit, + GasPrices: gasPrices, + Memo: memo, + CodeHash: codeHash, + PubKey: pubKey, + } +} diff --git a/relayer/wallet/secret/wallet.go b/relayer/wallet/secret/wallet.go new file mode 100644 index 00000000..a9fd9b13 --- /dev/null +++ b/relayer/wallet/secret/wallet.go @@ -0,0 +1,14 @@ +package secret + +import "github.com/bandprotocol/falcon/relayer/wallet" + +// NewWallet creates a wallet for the Secret chain. +// Secret signing is remote-only via fkms.SignSecret, so passphrase is unused. +func NewWallet(passphrase, homePath, chainName string) (*wallet.BaseWallet, error) { + return wallet.NewBaseWallet( + passphrase, + homePath, + chainName, + wallet.NewRemoteOnlyAdapter(NewRemoteSigner), + ) +} From 9226b7e2d7bf618057dc2145a4a22d0ca8f92b84 Mon Sep 17 00:00:00 2001 From: Nattapat Iammelap Date: Wed, 8 Apr 2026 11:20:32 +0700 Subject: [PATCH 2/7] run lint --- relayer/chains/secret/client.go | 12 ++++++------ relayer/chains/secret/config.go | 4 ++-- relayer/chains/types/chain_type.go | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/relayer/chains/secret/client.go b/relayer/chains/secret/client.go index 49955b3f..885fdf6d 100644 --- a/relayer/chains/secret/client.go +++ b/relayer/chains/secret/client.go @@ -8,9 +8,8 @@ import ( "sync" "time" - "github.com/bandprotocol/falcon/relayer/alert" - "github.com/bandprotocol/falcon/relayer/chains" - "github.com/bandprotocol/falcon/relayer/logger" + rpchttp "github.com/cometbft/cometbft/rpc/client/http" + libclient "github.com/cometbft/cometbft/rpc/jsonrpc/client" sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/codec" @@ -21,8 +20,9 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - rpchttp "github.com/cometbft/cometbft/rpc/client/http" - libclient "github.com/cometbft/cometbft/rpc/jsonrpc/client" + "github.com/bandprotocol/falcon/relayer/alert" + "github.com/bandprotocol/falcon/relayer/chains" + "github.com/bandprotocol/falcon/relayer/logger" ) type SecretClients = chains.ClientPool[sdkclient.Context] @@ -306,5 +306,5 @@ func (c *client) GetBlockByHeight(height *big.Int) (*typesBlockResult, error) { } // Block timestamp is in UTC. - return &typesBlockResult{Time: resBlock.Block.Header.Time.UTC()}, nil + return &typesBlockResult{Time: resBlock.Block.Time.UTC()}, nil } diff --git a/relayer/chains/secret/config.go b/relayer/chains/secret/config.go index 3a29320f..b6721cb5 100644 --- a/relayer/chains/secret/config.go +++ b/relayer/chains/secret/config.go @@ -3,13 +3,13 @@ package secret import ( "time" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/bandprotocol/falcon/relayer/alert" "github.com/bandprotocol/falcon/relayer/chains" "github.com/bandprotocol/falcon/relayer/chains/types" "github.com/bandprotocol/falcon/relayer/logger" "github.com/bandprotocol/falcon/relayer/wallet" - - sdk "github.com/cosmos/cosmos-sdk/types" ) var _ chains.ChainProviderConfig = &SecretChainProviderConfig{} diff --git a/relayer/chains/types/chain_type.go b/relayer/chains/types/chain_type.go index 3587a2b9..631794bd 100644 --- a/relayer/chains/types/chain_type.go +++ b/relayer/chains/types/chain_type.go @@ -21,9 +21,9 @@ const ( ) var chainTypeNameMap = map[ChainType]string{ - ChainTypeEVM: "evm", - ChainTypeXRPL: "xrpl", - ChainTypeIcon: "icon", + ChainTypeEVM: "evm", + ChainTypeXRPL: "xrpl", + ChainTypeIcon: "icon", ChainTypeSecret: "secret", } From e923e5dd542a4e580a317c1867f6d2cbdc84360d Mon Sep 17 00:00:00 2001 From: Nattapat Iammelap Date: Fri, 17 Apr 2026 15:19:01 +0700 Subject: [PATCH 3/7] update proto file --- proto/fkms/v1/signer.pb.go | 14 +++++++------- proto/fkms/v1/signer.proto | 2 +- relayer/chains/secret/config.go | 2 +- relayer/chains/secret/provider.go | 2 +- relayer/wallet/secret/remote_signer.go | 2 +- relayer/wallet/secret/types.go | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/proto/fkms/v1/signer.pb.go b/proto/fkms/v1/signer.pb.go index 38cb26c5..b8ba3a2f 100644 --- a/proto/fkms/v1/signer.pb.go +++ b/proto/fkms/v1/signer.pb.go @@ -684,7 +684,7 @@ type SecretSignerPayload struct { GasPrices string `protobuf:"bytes,7,opt,name=gas_prices,json=gasPrices,proto3" json:"gas_prices,omitempty"` Memo string `protobuf:"bytes,8,opt,name=memo,proto3" json:"memo,omitempty"` CodeHash string `protobuf:"bytes,9,opt,name=code_hash,json=codeHash,proto3" json:"code_hash,omitempty"` - Pubkey string `protobuf:"bytes,10,opt,name=pubkey,proto3" json:"pubkey,omitempty"` + ChainPubkey string `protobuf:"bytes,10,opt,name=chain_pubkey,json=chainPubkey,proto3" json:"chain_pubkey,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -782,9 +782,9 @@ func (x *SecretSignerPayload) GetCodeHash() string { return "" } -func (x *SecretSignerPayload) GetPubkey() string { +func (x *SecretSignerPayload) GetChainPubkey() string { if x != nil { - return x.Pubkey + return x.ChainPubkey } return "" } @@ -940,7 +940,7 @@ const file_proto_fkms_v1_signer_proto_rawDesc = "" + "\n" + "step_limit\x18\x03 \x01(\x04R\tstepLimit\x12\x1d\n" + "\n" + - "network_id\x18\x04 \x01(\tR\tnetworkId\"\xbb\x02\n" + + "network_id\x18\x04 \x01(\tR\tnetworkId\"\xc6\x02\n" + "\x13SecretSignerPayload\x12\x16\n" + "\x06sender\x18\x01 \x01(\tR\x06sender\x12)\n" + "\x10contract_address\x18\x02 \x01(\tR\x0fcontractAddress\x12\x19\n" + @@ -951,9 +951,9 @@ const file_proto_fkms_v1_signer_proto_rawDesc = "" + "\n" + "gas_prices\x18\a \x01(\tR\tgasPrices\x12\x12\n" + "\x04memo\x18\b \x01(\tR\x04memo\x12\x1b\n" + - "\tcode_hash\x18\t \x01(\tR\bcodeHash\x12\x16\n" + - "\x06pubkey\x18\n" + - " \x01(\tR\x06pubkey\"a\n" + + "\tcode_hash\x18\t \x01(\tR\bcodeHash\x12!\n" + + "\fchain_pubkey\x18\n" + + " \x01(\tR\vchainPubkey\"a\n" + "\x03Tss\x12\x18\n" + "\amessage\x18\x01 \x01(\fR\amessage\x12\x1f\n" + "\vrandom_addr\x18\x02 \x01(\fR\n" + diff --git a/proto/fkms/v1/signer.proto b/proto/fkms/v1/signer.proto index 60030439..c0f9819c 100644 --- a/proto/fkms/v1/signer.proto +++ b/proto/fkms/v1/signer.proto @@ -78,7 +78,7 @@ message SecretSignerPayload { string gas_prices = 7; string memo = 8; string code_hash = 9; - string pubkey = 10; + string chain_pubkey = 10; } message Tss { diff --git a/relayer/chains/secret/config.go b/relayer/chains/secret/config.go index b6721cb5..f929812d 100644 --- a/relayer/chains/secret/config.go +++ b/relayer/chains/secret/config.go @@ -36,7 +36,7 @@ type SecretChainProviderConfig struct { // Secret contract encryption parameters (passed to fkms). CodeHash string `mapstructure:"code_hash" toml:"code_hash"` // Secret chain's public key (used for signing, passed to fkms). - PubKey string `mapstructure:"pub_key" toml:"pub_key"` + ChainPubkey string `mapstructure:"chain_pubkey" toml:"chain_pubkey"` WaitingTxDuration time.Duration `mapstructure:"waiting_tx_duration" toml:"waiting_tx_duration"` CheckingTxInterval time.Duration `mapstructure:"checking_tx_interval" toml:"checking_tx_interval"` diff --git a/relayer/chains/secret/provider.go b/relayer/chains/secret/provider.go index 4c6ab3f4..f1c24f34 100644 --- a/relayer/chains/secret/provider.go +++ b/relayer/chains/secret/provider.go @@ -152,7 +152,7 @@ func (cp *SecretChainProvider) RelayPacket(ctx context.Context, packet *bandtype cp.Config.GasPrice, cp.Config.Memo, cp.Config.CodeHash, - cp.Config.PubKey, + cp.Config.ChainPubkey, ) payloadBytes, err := json.Marshal(signerPayload) diff --git a/relayer/wallet/secret/remote_signer.go b/relayer/wallet/secret/remote_signer.go index a344e997..dc7d58e5 100644 --- a/relayer/wallet/secret/remote_signer.go +++ b/relayer/wallet/secret/remote_signer.go @@ -43,7 +43,7 @@ func (r *RemoteSigner) Sign(payload []byte, tssPayload wallet.TssPayload) ([]byt GasPrices: signerPayload.GasPrices, Memo: signerPayload.Memo, CodeHash: signerPayload.CodeHash, - Pubkey: signerPayload.PubKey, + ChainPubkey: signerPayload.ChainPubkey, }, Tss: &fkmsv1.Tss{ Message: tssPayload.TssMessage, diff --git a/relayer/wallet/secret/types.go b/relayer/wallet/secret/types.go index e35e361e..23d4968b 100644 --- a/relayer/wallet/secret/types.go +++ b/relayer/wallet/secret/types.go @@ -12,7 +12,7 @@ type SignerPayload struct { GasPrices string `json:"gas_prices"` Memo string `json:"memo"` CodeHash string `json:"code_hash"` - PubKey string `json:"pubkey"` + ChainPubkey string `json:"chain_pubkey"` } func NewSignerPayload( @@ -25,7 +25,7 @@ func NewSignerPayload( gasPrices string, memo string, codeHash string, - pubKey string, + chainPubkey string, ) SignerPayload { return SignerPayload{ Sender: sender, @@ -37,6 +37,6 @@ func NewSignerPayload( GasPrices: gasPrices, Memo: memo, CodeHash: codeHash, - PubKey: pubKey, + ChainPubkey: chainPubkey, } } From aefb52726445f180e74104a393ebfae54c1b726e Mon Sep 17 00:00:00 2001 From: Nattapat Iammelap Date: Fri, 17 Apr 2026 17:38:45 +0700 Subject: [PATCH 4/7] remove global set bech32prerfix --- relayer/chains/secret/client.go | 7 +++++-- relayer/chains/secret/config.go | 12 ------------ 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/relayer/chains/secret/client.go b/relayer/chains/secret/client.go index 885fdf6d..3eb14035 100644 --- a/relayer/chains/secret/client.go +++ b/relayer/chains/secret/client.go @@ -211,12 +211,15 @@ func (c *client) GetAccount(sender string) (accountNumber uint64, sequence uint6 return 0, 0, err } - acc, err := sdk.AccAddressFromBech32(sender) + queryClient := authtypes.NewQueryClient(*cli) + req := &authtypes.QueryAccountRequest{Address: sender} + resp, err := queryClient.Account(context.Background(), req) if err != nil { return 0, 0, err } - account, err := cli.AccountRetriever.GetAccount(*cli, acc) + var account sdk.AccountI + err = cli.InterfaceRegistry.UnpackAny(resp.Account, &account) if err != nil { return 0, 0, err } diff --git a/relayer/chains/secret/config.go b/relayer/chains/secret/config.go index f929812d..45aaf20e 100644 --- a/relayer/chains/secret/config.go +++ b/relayer/chains/secret/config.go @@ -3,7 +3,6 @@ package secret import ( "time" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/bandprotocol/falcon/relayer/alert" "github.com/bandprotocol/falcon/relayer/chains" @@ -50,17 +49,6 @@ func (cpc *SecretChainProviderConfig) NewChainProvider( ) (chains.ChainProvider, error) { client := NewClient(chainName, cpc, log, alert) - accountPubKeyPrefix := bech32PrefixAccAddr + "pub" - validatorAddressPrefix := bech32PrefixAccAddr + "valoper" - validatorPubKeyPrefix := bech32PrefixAccAddr + "valoperpub" - consNodeAddressPrefix := bech32PrefixAccAddr + "valcons" - consNodePubKeyPrefix := bech32PrefixAccAddr + "valconspub" - - config := sdk.GetConfig() - config.SetBech32PrefixForAccount(bech32PrefixAccAddr, accountPubKeyPrefix) - config.SetBech32PrefixForValidator(validatorAddressPrefix, validatorPubKeyPrefix) - config.SetBech32PrefixForConsensusNode(consNodeAddressPrefix, consNodePubKeyPrefix) - return NewSecretChainProvider(chainName, client, cpc, log, wallet, alert), nil } From e215cb6b693477df489b57d8de374706f39a0144 Mon Sep 17 00:00:00 2001 From: Nattapat Iammelap Date: Fri, 17 Apr 2026 18:13:14 +0700 Subject: [PATCH 5/7] fix secret client func --- relayer/chains/secret/client.go | 133 ++++++++++++++++++++++++++---- relayer/chains/secret/provider.go | 18 ++-- relayer/chains/secret/types.go | 8 ++ 3 files changed, 132 insertions(+), 27 deletions(-) diff --git a/relayer/chains/secret/client.go b/relayer/chains/secret/client.go index 3eb14035..fd13c462 100644 --- a/relayer/chains/secret/client.go +++ b/relayer/chains/secret/client.go @@ -34,10 +34,10 @@ type Client interface { StartLivelinessCheck(ctx context.Context, interval time.Duration) BroadcastTx(txBlob []byte) (string, error) - GetBalance(address string) (*big.Int, error) - GetTx(txHash string) (*typesTxResult, error) - GetBlockByHeight(height *big.Int) (*typesBlockResult, error) - GetAccount(sender string) (accountNumber uint64, sequence uint64, err error) + GetBalance(ctx context.Context, address string) (*big.Int, error) + GetTx(ctx context.Context, txHash string) (*typesTxResult, error) + GetBlockByHeight(ctx context.Context, height *big.Int) (*typesBlockResult, error) + GetAccount(ctx context.Context, sender string) (accountNumber uint64, sequence uint64, err error) } // typesTxResult mirrors the subset of TxResult fields we need in provider. @@ -115,7 +115,7 @@ func newRPCClient(addr string, timeout time.Duration) (*rpchttp.HTTP, error) { return rpcClient, nil } -func (c *client) Connect(_ context.Context) error { +func (c *client) Connect(ctx context.Context) error { var wg sync.WaitGroup for _, endpoint := range c.endpoints { @@ -137,7 +137,7 @@ func (c *client) Connect(_ context.Context) error { return } - ctx := sdkclient.Context{}. + ctxCli := sdkclient.Context{}. WithAccountRetriever(authtypes.AccountRetriever{}). WithBroadcastMode(flags.BroadcastSync). WithCodec(enc.Marshaler). @@ -146,17 +146,25 @@ func (c *client) Connect(_ context.Context) error { WithClient(rpcClient). WithNodeURI(endpoint) - c.clients.SetClient(endpoint, &ctx) + c.clients.SetClient(endpoint, &ctxCli) }(endpoint) } wg.Wait() - // Select the first connected endpoint (or just first endpoint if none exist yet). - if c.clients.GetSelectedEndpoint() == "" && len(c.endpoints) > 0 { - c.clients.SetSelectedEndpoint(c.endpoints[0]) + res, err := c.getClientWithMaxHeight(ctx) + if err != nil { + c.log.Error("Failed to connect to secret chain", err) + return err + } + + // only log when new endpoint is used + if c.clients.GetSelectedEndpoint() != res.Endpoint { + c.log.Info("Connected to secret chain", "endpoint", res.Endpoint) } + c.clients.SetSelectedEndpoint(res.Endpoint) + return nil } @@ -205,7 +213,7 @@ func (c *client) BroadcastTx(txBlob []byte) (string, error) { return res.TxHash, nil } -func (c *client) GetAccount(sender string) (accountNumber uint64, sequence uint64, err error) { +func (c *client) GetAccount(ctx context.Context, sender string) (accountNumber uint64, sequence uint64, err error) { cli, err := c.getSelectedClient() if err != nil { return 0, 0, err @@ -213,7 +221,7 @@ func (c *client) GetAccount(sender string) (accountNumber uint64, sequence uint6 queryClient := authtypes.NewQueryClient(*cli) req := &authtypes.QueryAccountRequest{Address: sender} - resp, err := queryClient.Account(context.Background(), req) + resp, err := queryClient.Account(ctx, req) if err != nil { return 0, 0, err } @@ -227,7 +235,7 @@ func (c *client) GetAccount(sender string) (accountNumber uint64, sequence uint6 return account.GetAccountNumber(), account.GetSequence(), nil } -func (c *client) GetBalance(address string) (*big.Int, error) { +func (c *client) GetBalance(ctx context.Context, address string) (*big.Int, error) { cli, err := c.getSelectedClient() if err != nil { return nil, err @@ -239,7 +247,7 @@ func (c *client) GetBalance(address string) (*big.Int, error) { Denom: c.denom, } - resp, err := queryClient.Balance(context.Background(), &req) + resp, err := queryClient.Balance(ctx, &req) if err != nil { return nil, err } @@ -248,7 +256,7 @@ func (c *client) GetBalance(address string) (*big.Int, error) { return amount.BigInt(), nil } -func (c *client) GetTx(txHash string) (*typesTxResult, error) { +func (c *client) GetTx(ctx context.Context, txHash string) (*typesTxResult, error) { cli, err := c.getSelectedClient() if err != nil { return nil, err @@ -264,7 +272,7 @@ func (c *client) GetTx(txHash string) (*typesTxResult, error) { return nil, err } - resultTx, err := node.Tx(context.Background(), txHashBytes, true) + resultTx, err := node.Tx(ctx, txHashBytes, true) if err != nil { return nil, err } @@ -287,7 +295,7 @@ func (c *client) GetTx(txHash string) (*typesTxResult, error) { }, nil } -func (c *client) GetBlockByHeight(height *big.Int) (*typesBlockResult, error) { +func (c *client) GetBlockByHeight(ctx context.Context, height *big.Int) (*typesBlockResult, error) { cli, err := c.getSelectedClient() if err != nil { return nil, err @@ -299,7 +307,7 @@ func (c *client) GetBlockByHeight(height *big.Int) (*typesBlockResult, error) { } h := height.Int64() - resBlock, err := node.Block(context.Background(), &h) + resBlock, err := node.Block(ctx, &h) if err != nil { return nil, err } @@ -311,3 +319,92 @@ func (c *client) GetBlockByHeight(height *big.Int) (*typesBlockResult, error) { // Block timestamp is in UTC. return &typesBlockResult{Time: resBlock.Block.Time.UTC()}, nil } + +// getClientWithMaxHeight connects to the endpoint that has the highest block height. +func (c *client) getClientWithMaxHeight(ctx context.Context) (ClientConnectionResult, error) { + ch := make(chan ClientConnectionResult, len(c.endpoints)) + + for _, endpoint := range c.endpoints { + go func(endpoint string) { + cli, ok := c.clients.GetClient(endpoint) + + if !ok { + ch <- ClientConnectionResult{Endpoint: endpoint, Client: nil, BlockHeight: 0} + return + } + + node, err := cli.GetNode() + if err != nil { + c.log.Warn( + "Failed to get node from client", + "endpoint", endpoint, + "err", err, + ) + ch <- ClientConnectionResult{Endpoint: endpoint, Client: nil, BlockHeight: 0} + alert.HandleAlert( + c.alert, + alert.NewTopic(alert.ConnectSingleChainClientErrorMsg). + WithChainName(c.chainName). + WithEndpoint(endpoint), + err.Error(), + ) + return + } + + status, err := node.Status(ctx) + if err != nil { + c.log.Warn( + "Failed to get status from node", + "endpoint", endpoint, + "err", err, + ) + ch <- ClientConnectionResult{Endpoint: endpoint, Client: nil, BlockHeight: 0} + alert.HandleAlert( + c.alert, + alert.NewTopic(alert.ConnectSingleChainClientErrorMsg). + WithChainName(c.chainName). + WithEndpoint(endpoint), + err.Error(), + ) + return + } + + c.log.Debug( + "Get height of the given client", + "endpoint", endpoint, + "block_number", status.SyncInfo.LatestBlockHeight, + ) + alert.HandleReset( + c.alert, + alert.NewTopic(alert.ConnectSingleChainClientErrorMsg). + WithChainName(c.chainName). + WithEndpoint(endpoint), + ) + + ch <- ClientConnectionResult{Endpoint: endpoint, Client: cli, BlockHeight: status.SyncInfo.LatestBlockHeight} + }(endpoint) + } + + var result ClientConnectionResult + for i := 0; i < len(c.endpoints); i++ { + r := <-ch + if r.Client != nil { + if r.BlockHeight > result.BlockHeight || (r.Endpoint == c.clients.GetSelectedEndpoint() && r.BlockHeight == result.BlockHeight) { + result = r + } + } + } + + if result.Client == nil { + alert.HandleAlert( + c.alert, + alert.NewTopic(alert.ConnectAllChainClientErrorMsg).WithChainName(c.chainName), + fmt.Sprintf("failed to connect to secret chain on all endpoints: %s", c.endpoints), + ) + return ClientConnectionResult{}, fmt.Errorf("failed to connect to secret chain") + } + + alert.HandleReset(c.alert, alert.NewTopic(alert.ConnectAllChainClientErrorMsg).WithChainName(c.chainName)) + + return result, nil +} diff --git a/relayer/chains/secret/provider.go b/relayer/chains/secret/provider.go index f1c24f34..2503ba80 100644 --- a/relayer/chains/secret/provider.go +++ b/relayer/chains/secret/provider.go @@ -111,6 +111,8 @@ func (cp *SecretChainProvider) RelayPacket(ctx context.Context, packet *bandtype return err } + // get a free signer + cp.Log.Debug("Waiting for a free signer...") freeSigner := <-cp.FreeSigners defer func() { cp.FreeSigners <- freeSigner }() @@ -131,7 +133,7 @@ func (cp *SecretChainProvider) RelayPacket(ctx context.Context, packet *bandtype continue } - accountNumber, sequence, err := cp.Client.GetAccount(freeSigner.GetAddress()) + accountNumber, sequence, err := cp.Client.GetAccount(ctx, freeSigner.GetAddress()) if err != nil { log.Error("Get account error", "retry_count", retryCount, err) lastErr = err @@ -172,11 +174,9 @@ func (cp *SecretChainProvider) RelayPacket(ctx context.Context, packet *bandtype continue } - cp.Log.Info("Successfully signed, tx blob ready to be broadcasted", "tx_blob", fmt.Sprintf("%X", txBlob)) - var balance *big.Int if cp.DB != nil { - balance, err = cp.Client.GetBalance(freeSigner.GetAddress()) + balance, err = cp.Client.GetBalance(ctx, freeSigner.GetAddress()) if err != nil { log.Error("Failed to get balance", "retry_count", retryCount, err) alert.HandleAlert(cp.Alert, alert.NewTopic(alert.GetBalanceErrorMsg). @@ -237,7 +237,7 @@ func (cp *SecretChainProvider) QueryBalance(ctx context.Context, keyName string) cp.Log.Error("Key name does not exist", "key_name", keyName) return nil, fmt.Errorf("key name does not exist: %s", keyName) } - return cp.Client.GetBalance(signer.GetAddress()) + return cp.Client.GetBalance(ctx, signer.GetAddress()) } func (cp *SecretChainProvider) GetChainName() string { return cp.ChainName } @@ -245,7 +245,7 @@ func (cp *SecretChainProvider) ChainType() types.ChainType { return types.ChainT func (cp *SecretChainProvider) GetWallet() wallet.Wallet { return cp.Wallet } func (cp *SecretChainProvider) prepareTransaction( - _ context.Context, + ctx context.Context, txHash string, signerAddress string, packet *bandtypes.Packet, @@ -275,7 +275,7 @@ func (cp *SecretChainProvider) prepareTransaction( effectiveGasPrice = txResult.EffectiveGasPrice if (txResult.Status == types.TX_STATUS_SUCCESS || txResult.Status == types.TX_STATUS_FAILED) && txResult.BlockHeight != nil { - block, err := cp.Client.GetBlockByHeight(txResult.BlockHeight) + block, err := cp.Client.GetBlockByHeight(ctx, txResult.BlockHeight) if err != nil { log.Error("Failed to get block by height", "retry_count", retryCount, "block_height", txResult.BlockHeight, err) alert.HandleAlert(cp.Alert, alert.NewTopic(alert.GetHeaderBlockErrorMsg). @@ -291,7 +291,7 @@ func (cp *SecretChainProvider) prepareTransaction( } if oldBalance != nil { - newBalance, err := cp.Client.GetBalance(signerAddress) + newBalance, err := cp.Client.GetBalance(ctx, signerAddress) if err != nil { log.Error("Failed to get balance", "retry_count", retryCount, err) alert.HandleAlert(cp.Alert, alert.NewTopic(alert.GetBalanceErrorMsg). @@ -329,7 +329,7 @@ func (cp *SecretChainProvider) CheckConfirmedTx( ctx context.Context, txHash string, ) (TxResult, error) { - tx, err := cp.Client.GetTx(txHash) + tx, err := cp.Client.GetTx(ctx, txHash) if err != nil { err = fmt.Errorf("failed to get transaction: %w", err) return NewTxResult( diff --git a/relayer/chains/secret/types.go b/relayer/chains/secret/types.go index 06ca402a..e1a86a3a 100644 --- a/relayer/chains/secret/types.go +++ b/relayer/chains/secret/types.go @@ -3,11 +3,19 @@ package secret import ( "math/big" + sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/shopspring/decimal" "github.com/bandprotocol/falcon/relayer/chains/types" ) +// ClientConnectionResult is the struct that contains the result of connecting to the specific endpoint. +type ClientConnectionResult struct { + Endpoint string + Client *sdkclient.Context + BlockHeight int64 +} + // TxResult is the result of transaction confirmation. type TxResult struct { Status types.TxStatus From 3c02d2ea14a364e2850a764c95dae7fec1204f33 Mon Sep 17 00:00:00 2001 From: Nattapat Iammelap Date: Fri, 17 Apr 2026 18:13:54 +0700 Subject: [PATCH 6/7] add secret wallet test --- relayer/wallet/secret/remote_signer_test.go | 91 +++++++++++++++++++++ relayer/wallet/secret/wallet.go | 4 +- relayer/wallet/secret/wallet_test.go | 66 +++++++++++++++ 3 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 relayer/wallet/secret/remote_signer_test.go create mode 100644 relayer/wallet/secret/wallet_test.go diff --git a/relayer/wallet/secret/remote_signer_test.go b/relayer/wallet/secret/remote_signer_test.go new file mode 100644 index 00000000..73370784 --- /dev/null +++ b/relayer/wallet/secret/remote_signer_test.go @@ -0,0 +1,91 @@ +package secret_test + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" + + "github.com/bandprotocol/falcon/internal/relayertest/mocks" + fkmsv1 "github.com/bandprotocol/falcon/proto/fkms/v1" + "github.com/bandprotocol/falcon/relayer/wallet" + "github.com/bandprotocol/falcon/relayer/wallet/secret" +) + +func TestSecretRemoteSignerSign(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + mockFkmsClient := mocks.NewMockFkmsServiceClient(ctrl) + name := "test-remote" + address := "secret1x1234567890abcdef" + url := "localhost:50051" + apiKey := "test-api-key" + + signerIface, err := secret.NewRemoteSigner(name, address, url, apiKey) + require.NoError(t, err) + + signer, ok := signerIface.(*secret.RemoteSigner) + require.True(t, ok) + + signer.FkmsClient = mockFkmsClient + + assert.Equal(t, name, signer.GetName()) + assert.Equal(t, address, signer.GetAddress()) + + _, err = signer.ExportPrivateKey() + assert.Error(t, err) + + signerPayload := secret.SignerPayload{ + Sender: "secret1sender", + ContractAddress: "secret1contract", + ChainID: "testing", + AccountNumber: 1, + Sequence: 2, + GasLimit: 3000000, + GasPrices: "0.1uscrt", + Memo: "test memo", + CodeHash: "1234abcd", + ChainPubkey: "pubkey123", + } + + payload, err := json.Marshal(signerPayload) + require.NoError(t, err) + + tssPayload := wallet.TssPayload{ + TssMessage: []byte("tss-msg"), + RandomAddr: []byte("random-addr"), + Signature: []byte("signature"), + } + + expectedTxBlob := []byte("signed-secret-tx") + + mockFkmsClient.EXPECT().SignSecret( + gomock.Any(), + &fkmsv1.SignSecretRequest{ + SignerPayload: &fkmsv1.SecretSignerPayload{ + Sender: signerPayload.Sender, + ContractAddress: signerPayload.ContractAddress, + ChainId: signerPayload.ChainID, + AccountNumber: signerPayload.AccountNumber, + Sequence: signerPayload.Sequence, + GasLimit: signerPayload.GasLimit, + GasPrices: signerPayload.GasPrices, + Memo: signerPayload.Memo, + CodeHash: signerPayload.CodeHash, + ChainPubkey: signerPayload.ChainPubkey, + }, + Tss: &fkmsv1.Tss{ + Message: tssPayload.TssMessage, + RandomAddr: tssPayload.RandomAddr, + SignatureS: tssPayload.Signature, + }, + }, + ).Return(&fkmsv1.SignSecretResponse{TxBlob: expectedTxBlob}, nil) + + signedBlob, err := signer.Sign(payload, tssPayload) + require.NoError(t, err) + assert.Equal(t, expectedTxBlob, signedBlob) +} diff --git a/relayer/wallet/secret/wallet.go b/relayer/wallet/secret/wallet.go index a9fd9b13..090a6ca8 100644 --- a/relayer/wallet/secret/wallet.go +++ b/relayer/wallet/secret/wallet.go @@ -2,8 +2,8 @@ package secret import "github.com/bandprotocol/falcon/relayer/wallet" -// NewWallet creates a wallet for the Secret chain. -// Secret signing is remote-only via fkms.SignSecret, so passphrase is unused. +// NewWallet creates a new wallet for the Secret chain. +// Secret is remote-only — passphrase is unused but kept for a consistent signature. func NewWallet(passphrase, homePath, chainName string) (*wallet.BaseWallet, error) { return wallet.NewBaseWallet( passphrase, diff --git a/relayer/wallet/secret/wallet_test.go b/relayer/wallet/secret/wallet_test.go new file mode 100644 index 00000000..fc286a2e --- /dev/null +++ b/relayer/wallet/secret/wallet_test.go @@ -0,0 +1,66 @@ +package secret_test + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/bandprotocol/falcon/relayer/wallet/secret" +) + +func TestNewSignerPayload(t *testing.T) { + payload := secret.NewSignerPayload( + "secret1sender", + "secret1contract", + "testing", + 1, + 2, + 3000000, + "0.1uscrt", + "test memo", + "1234abcd", + "pubkey123", + ) + + assert.Equal(t, "secret1sender", payload.Sender) + assert.Equal(t, "secret1contract", payload.ContractAddress) + assert.Equal(t, "testing", payload.ChainID) + assert.Equal(t, uint64(1), payload.AccountNumber) + assert.Equal(t, uint64(2), payload.Sequence) + assert.Equal(t, uint64(3000000), payload.GasLimit) + assert.Equal(t, "0.1uscrt", payload.GasPrices) + assert.Equal(t, "test memo", payload.Memo) + assert.Equal(t, "1234abcd", payload.CodeHash) + assert.Equal(t, "pubkey123", payload.ChainPubkey) +} + +func TestSecretWalletRemoteOnly(t *testing.T) { + tmpHome, err := os.MkdirTemp("", "secret-wallet-test") + require.NoError(t, err) + defer os.RemoveAll(tmpHome) + + chainName := "secret-test" + passphrase := "test-passphrase" + + w, err := secret.NewWallet(passphrase, tmpHome, chainName) + require.NoError(t, err) + assert.Empty(t, w.GetSigners()) + + // Local key import should not be supported. + _, err = w.SaveByMnemonic("mnemonic-1", "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", 1, 0, 0) + assert.Error(t, err) + + // Remote signer keys are supported. + remoteName := "remote-key" + remoteAddr := "secret1x1234567890abcdef" + remoteURL := "localhost:50051" + assert.NoError(t, w.SaveRemoteSignerKey(remoteName, remoteAddr, remoteURL, "api-key")) + assert.True(t, w.IsAddressExist(remoteAddr)) + assert.Len(t, w.GetSigners(), 1) + + signer, ok := w.GetSigner(remoteName) + require.True(t, ok) + assert.Equal(t, remoteAddr, signer.GetAddress()) +} From c8d01df54cae4529d497f30b37d70f94609d659b Mon Sep 17 00:00:00 2001 From: Nattapat Iammelap Date: Fri, 17 Apr 2026 18:14:18 +0700 Subject: [PATCH 7/7] run lint --- relayer/chains/secret/config.go | 1 - 1 file changed, 1 deletion(-) diff --git a/relayer/chains/secret/config.go b/relayer/chains/secret/config.go index 45aaf20e..546bcb6c 100644 --- a/relayer/chains/secret/config.go +++ b/relayer/chains/secret/config.go @@ -3,7 +3,6 @@ package secret import ( "time" - "github.com/bandprotocol/falcon/relayer/alert" "github.com/bandprotocol/falcon/relayer/chains" "github.com/bandprotocol/falcon/relayer/chains/types"