From a2dcaf6817cc7d19ba6807d93b22dae9042cfb46 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Fri, 12 Apr 2024 12:21:12 +0545 Subject: [PATCH 01/46] feat: steller initial setup --- go.mod | 18 +++-- go.sum | 79 +++++++++++++++++----- relayer/chains/steller/client.go | 24 +++++++ relayer/chains/steller/config.go | 61 +++++++++++++++++ relayer/chains/steller/keys.go | 20 ++++++ relayer/chains/steller/listener.go | 12 ++++ relayer/chains/steller/provider.go | 97 +++++++++++++++++++++++++++ relayer/chains/steller/tx.go | 22 ++++++ relayer/chains/steller/types/types.go | 5 ++ 9 files changed, 318 insertions(+), 20 deletions(-) create mode 100644 relayer/chains/steller/client.go create mode 100644 relayer/chains/steller/config.go create mode 100644 relayer/chains/steller/keys.go create mode 100644 relayer/chains/steller/listener.go create mode 100644 relayer/chains/steller/provider.go create mode 100644 relayer/chains/steller/tx.go create mode 100644 relayer/chains/steller/types/types.go diff --git a/go.mod b/go.mod index ca755c65..00fc6565 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/icon-project/centralized-relay go 1.22 require ( - github.com/BurntSushi/toml v1.2.1 + github.com/BurntSushi/toml v1.3.2 github.com/CosmWasm/wasmd v0.50.0 github.com/avast/retry-go/v4 v4.5.1 github.com/cometbft/cometbft v0.38.2 @@ -21,6 +21,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 + github.com/stellar/go v0.0.0-20240329200747-a30c441b6cd6 github.com/stretchr/testify v1.8.4 github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d go.uber.org/multierr v1.11.0 @@ -50,6 +51,8 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/evalphobia/logrus_fluent v0.5.4 // indirect github.com/fluent/fluent-logger-golang v1.9.0 // indirect + github.com/go-chi/chi v4.1.2+incompatible // indirect + github.com/go-errors/errors v1.5.1 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.1 // indirect @@ -60,9 +63,11 @@ require ( github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect + github.com/gorilla/schema v1.2.0 // indirect github.com/labstack/echo/v4 v4.11.3 // indirect github.com/labstack/gommon v0.4.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect + github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -74,8 +79,11 @@ require ( github.com/prometheus/statsd_exporter v0.26.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect + github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 // indirect + github.com/stretchr/objx v0.5.1 // indirect github.com/tinylib/msgp v1.1.9 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect @@ -121,7 +129,7 @@ require ( 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.1 // indirect - github.com/aws/aws-sdk-go v1.44.224 // indirect + github.com/aws/aws-sdk-go v1.45.26 // indirect github.com/aws/aws-sdk-go-v2 v1.26.0 github.com/aws/aws-sdk-go-v2/config v1.27.9 github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.4 // indirect @@ -132,7 +140,7 @@ require ( github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chzyer/readline v1.5.1 // indirect @@ -219,7 +227,7 @@ require ( github.com/klauspost/compress v1.17.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lib/pq v1.10.7 // indirect + github.com/lib/pq v1.10.9 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/linxGnu/grocksdb v1.8.6 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -244,7 +252,7 @@ require ( github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/cors v1.8.3 // indirect + github.com/rs/cors v1.10.1 // indirect github.com/rs/zerolog v1.31.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect diff --git a/go.sum b/go.sum index de68d621..b7ea0e79 100644 --- a/go.sum +++ b/go.sum @@ -249,8 +249,8 @@ github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= -github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CosmWasm/wasmd v0.50.0 h1:NVaGqCSTRfb9UTDHJwT6nQIWcb6VjlQl88iI+u1+qjE= github.com/CosmWasm/wasmd v0.50.0/go.mod h1:UjmShW4l9YxaMytwJZ7IB7MWzHiynSZP3DdWrG0FRtk= @@ -287,6 +287,8 @@ github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f h1:zvClvFQwU++UpIUBGC8YmDlfhUrweEy1R1Fj1gu5iIM= +github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= 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= @@ -297,6 +299,8 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8V github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -316,8 +320,8 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.30.1/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.44.76/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.224 h1:09CiaaF35nRmxrzWZ2uRq5v6Ghg/d2RiPjZnSgtt+RQ= -github.com/aws/aws-sdk-go v1.44.224/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.45.26 h1:PJ2NJNY5N/yeobLYe1Y+xLdavBi67ZI8gvph6ftwVCg= +github.com/aws/aws-sdk-go v1.45.26/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2 v1.26.0 h1:/Ce4OCiM3EkpW7Y+xUnfAFpchU78K7/Ug01sZni9PgA= @@ -414,8 +418,8 @@ github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEe github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= 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/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= @@ -635,6 +639,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -662,6 +668,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/garslo/gogen v0.0.0-20170307003452-d6ebae628c7c/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955 h1:gmtGRvSexPU4B1T/yYo0sLOKzER1YT+b4kPxPpm0Ty4= +github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= @@ -679,12 +687,14 @@ github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= +github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-critic/go-critic v0.3.5-0.20190904082202-d79a9f0c64db/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= github.com/go-critic/go-critic v0.4.0/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -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-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= +github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -871,6 +881,8 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -943,6 +955,8 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= +github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -1065,6 +1079,8 @@ github.com/icon-project/icon-bridge v0.0.11 h1:1qUYq6YmzUQR+zCDJGnXQxXKs81NmkxAT github.com/icon-project/icon-bridge v0.0.11/go.mod h1:7GcN+biPaXdsYLvsiwC1Y/5ro6ENPinhUqm2MZL4tgQ= github.com/icza/dyno v0.0.0-20230330125955-09f820a8d9c0 h1:nHoRIX8iXob3Y2kdt9KsjyIb7iApSvb3vgsd93xb5Ow= github.com/icza/dyno v0.0.0-20230330125955-09f820a8d9c0/go.mod h1:c1tRKs5Tx7E2+uHGSyyncziFjvGpgv4H2HrqXeUQ/Uk= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= 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/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= @@ -1126,6 +1142,8 @@ github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jarcoal/httpmock v0.0.0-20161210151336-4442edb3db31 h1:Aw95BEvxJ3K6o9GGv5ppCd1P8hkeIeEJ30FO+OhOJpM= +github.com/jarcoal/httpmock v0.0.0-20161210151336-4442edb3db31/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= @@ -1224,8 +1242,8 @@ github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= @@ -1405,6 +1423,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 h1:ykXz+pRRTibcSjG1yRhpdSHInF8yZY/mfn+Rz2Nd1rE= +github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739/go.mod h1:zUx1mhth20V3VKgL5jbd1BSQcW4Fy6Qs4PZvQwRFwzM= github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1497,6 +1517,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db h1:eZgFHVkk9uOTaOQLC6tgjkzdp7Ays8eEVecBcfHZlJQ= +github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= @@ -1601,8 +1623,8 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q= -github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -1743,8 +1765,8 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -1766,11 +1788,15 @@ github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71e github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do= +github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 h1:S4OC0+OBKz6mJnzuHioeEat74PuQ4Sgvbf8eus695sc= +github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2/go.mod h1:8zLRYR5npGjaOXgPSKat5+oOh+UHd8OdbS18iqX9F6Y= github.com/segmentio/golines v0.0.0-20200824192126-7f30d3046793/go.mod h1:bQSh5qdVR67XiCKbaVvYO41s50c5hQo+3cY/1CQQ3xQ= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= @@ -1833,6 +1859,10 @@ github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobt github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= +github.com/stellar/go v0.0.0-20240329200747-a30c441b6cd6 h1:q4ULC3Noju198IpT6s4o4T2UuR/DiTjDe7b1LJsAQbk= +github.com/stellar/go v0.0.0-20240329200747-a30c441b6cd6/go.mod h1:ckzsX0B0qfTMVZQJtPELJLs7cJ6xXMYHPVLyIsReGsU= +github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 h1:OzCVd0SV5qE3ZcDeSFCmOWLZfEWZ3Oe8KtmSOYKEVWE= +github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2/go.mod h1:yoxyU/M8nl9LKeWIoBrbDPQ7Cy+4jxRcWcOayZ4BMps= 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= @@ -1840,8 +1870,9 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= +github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1921,6 +1952,8 @@ github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= +github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= @@ -1944,11 +1977,25 @@ github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1: github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xdrpp/goxdr v0.1.1 h1:E1B2c6E8eYhOVyd7yEpOyopzTPirUeF6mVOfXfGyJyc= +github.com/xdrpp/goxdr v0.1.1/go.mod h1:dXo1scL/l6s7iME1gxHWo2XCppbHEKZS7m/KyYWkNzA= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb h1:06WAhQa+mYv7BiOk13B/ywyTlkoE/S7uu6TBKU6FHnE= +github.com/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d h1:yJIizrfO599ot2kQ6Af1enICnwBD3XoxgX3MrMwot2M= +github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20150405163532-d1c525dea8ce h1:888GrqRxabUce7lj4OaoShPxodm3kXOMpSa85wdYzfY= +github.com/yudai/golcs v0.0.0-20150405163532-d1c525dea8ce/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -2731,6 +2778,8 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gavv/httpexpect.v1 v1.0.0-20170111145843-40724cf1e4a0 h1:r5ptJ1tBxVAeqw4CrYWhXIMr0SybY3CDHuIbCg5CFVw= +gopkg.in/gavv/httpexpect.v1 v1.0.0-20170111145843-40724cf1e4a0/go.mod h1:WtiW9ZA1LdaWqtQRo1VbIL/v4XZ8NDta+O/kSpGgVek= 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= diff --git a/relayer/chains/steller/client.go b/relayer/chains/steller/client.go new file mode 100644 index 00000000..c5aa3d0c --- /dev/null +++ b/relayer/chains/steller/client.go @@ -0,0 +1,24 @@ +package steller + +import ( + "context" + + "github.com/stellar/go/clients/horizonclient" +) + +type IClient interface { + GetLatestLedgerSeq(ctx context.Context) (uint64, error) +} + +type Client struct { + horizon *horizonclient.Client +} + +func NewClient(hClient *horizonclient.Client) IClient { + return &Client{horizon: hClient} +} + +func (cl *Client) GetLatestLedgerSeq(ctx context.Context) (uint64, error) { + //Todo + return 0, nil +} diff --git a/relayer/chains/steller/config.go b/relayer/chains/steller/config.go new file mode 100644 index 00000000..b502482e --- /dev/null +++ b/relayer/chains/steller/config.go @@ -0,0 +1,61 @@ +package steller + +import ( + "context" + "net/http" + + "github.com/icon-project/centralized-relay/relayer/provider" + relayertypes "github.com/icon-project/centralized-relay/relayer/types" + "github.com/stellar/go/clients/horizonclient" + "go.uber.org/zap" +) + +type Config struct { + ChainID string `yaml:"chain-id"` + ChainName string `yaml:"-"` + HorizonUrl string `yaml:"horizon-url"` + Address string `yaml:"address"` + Contracts relayertypes.ContractConfigMap `yaml:"contracts"` + NID string `json:"nid" yaml:"nid"` + HomeDir string `yaml:"home-dir"` + GasPrice uint64 `yaml:"gas-price"` + GasMin uint64 `yaml:"gas-min"` + GasLimit uint64 `yaml:"gas-limit"` +} + +func (pc *Config) NewProvider(ctx context.Context, logger *zap.Logger, homePath string, debug bool, chainName string) (provider.ChainProvider, error) { + pc.HomeDir = homePath + pc.ChainName = chainName + + if err := pc.Validate(); err != nil { + return nil, err + } + + httpClient := http.Client{} + horizonClient := &horizonclient.Client{ + HorizonURL: pc.HorizonUrl, + HTTP: &httpClient, + AppName: "centralized-relay", + } + + client := NewClient(horizonClient) + + return &Provider{ + log: logger.With(zap.String("nid ", pc.NID), zap.String("name", pc.ChainName)), + cfg: pc, + client: client, + }, nil +} + +func (pc *Config) SetWallet(addr string) { + pc.Address = addr +} + +func (pc *Config) GetWallet() string { + return pc.Address +} + +func (pc *Config) Validate() error { + //Todo + return nil +} diff --git a/relayer/chains/steller/keys.go b/relayer/chains/steller/keys.go new file mode 100644 index 00000000..0fa96bf1 --- /dev/null +++ b/relayer/chains/steller/keys.go @@ -0,0 +1,20 @@ +package steller + +import ( + "context" +) + +func (p *Provider) RestoreKeystore(ctx context.Context) error { + //Todo + return nil +} + +func (p *Provider) NewKeystore(password string) (string, error) { + //Todo + return "", nil +} + +func (p *Provider) ImportKeystore(ctx context.Context, keyPath, passphrase string) (string, error) { + //Todo + return "", nil +} diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go new file mode 100644 index 00000000..58ada37c --- /dev/null +++ b/relayer/chains/steller/listener.go @@ -0,0 +1,12 @@ +package steller + +import ( + "context" + + relayertypes "github.com/icon-project/centralized-relay/relayer/types" +) + +func (p *Provider) Listener(ctx context.Context, lastSavedCheckpointSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { + // + return nil +} diff --git a/relayer/chains/steller/provider.go b/relayer/chains/steller/provider.go new file mode 100644 index 00000000..164cb9d9 --- /dev/null +++ b/relayer/chains/steller/provider.go @@ -0,0 +1,97 @@ +package steller + +import ( + "context" + "math/big" + + "github.com/icon-project/centralized-relay/relayer/chains/steller/types" + "github.com/icon-project/centralized-relay/relayer/kms" + "github.com/icon-project/centralized-relay/relayer/provider" + relayertypes "github.com/icon-project/centralized-relay/relayer/types" + "go.uber.org/zap" +) + +type Provider struct { + log *zap.Logger + cfg *Config + client IClient + kms kms.KMS +} + +func (p *Provider) QueryLatestHeight(ctx context.Context) (uint64, error) { + return p.client.GetLatestLedgerSeq(ctx) +} + +func (p *Provider) NID() string { + return p.cfg.NID +} + +func (p *Provider) Name() string { + return p.cfg.ChainName +} + +func (p *Provider) Init(ctx context.Context, homePath string, kms kms.KMS) error { + p.kms = kms + return nil +} + +// Type returns chain-type +func (p *Provider) Type() string { + return types.ChainType +} + +func (p *Provider) Config() provider.Config { + return p.cfg +} + +// FinalityBlock returns the number of blocks the chain has to advance from current block inorder to +// consider it as final. In Steller ledgers are analogues to blocks and ledgers once published are +// final. So Steller doesn't need to be checked for block/ledger finality. +func (p *Provider) FinalityBlock(ctx context.Context) uint64 { + return 0 +} + +func (p *Provider) GenerateMessages(ctx context.Context, messageKey *relayertypes.MessageKeyWithMessageHeight) ([]*relayertypes.Message, error) { + //Todo + return nil, nil +} + +func (p *Provider) SetAdmin(ctx context.Context, admin string) error { + //Todo + return nil +} + +func (p *Provider) RevertMessage(ctx context.Context, sn *big.Int) error { + //Todo + return nil +} + +func (p *Provider) GetFee(ctx context.Context, networkID string, responseFee bool) (uint64, error) { + //Todo + return 0, nil +} + +func (p *Provider) SetFee(ctx context.Context, networkID string, msgFee, resFee uint64) error { + //Todo + return nil +} + +func (p *Provider) ClaimFee(ctx context.Context) error { + //Todo + return nil +} + +func (p *Provider) QueryBalance(ctx context.Context, addr string) (*relayertypes.Coin, error) { + //Todo + return nil, nil +} + +func (p *Provider) ShouldReceiveMessage(ctx context.Context, messagekey *relayertypes.Message) (bool, error) { + //Todo + return true, nil +} + +func (p *Provider) ShouldSendMessage(ctx context.Context, messageKey *relayertypes.Message) (bool, error) { + //Todo + return true, nil +} diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go new file mode 100644 index 00000000..18642b87 --- /dev/null +++ b/relayer/chains/steller/tx.go @@ -0,0 +1,22 @@ +package steller + +import ( + "context" + + relayertypes "github.com/icon-project/centralized-relay/relayer/types" +) + +func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, callback relayertypes.TxResponseFunc) error { + //Todo + return nil +} + +func (p *Provider) QueryTransactionReceipt(ctx context.Context, txDigest string) (*relayertypes.Receipt, error) { + //Todo + return nil, nil +} + +func (p *Provider) MessageReceived(ctx context.Context, key *relayertypes.MessageKey) (bool, error) { + //Todo + return false, nil +} diff --git a/relayer/chains/steller/types/types.go b/relayer/chains/steller/types/types.go new file mode 100644 index 00000000..21072732 --- /dev/null +++ b/relayer/chains/steller/types/types.go @@ -0,0 +1,5 @@ +package types + +const ( + ChainType = "steller" +) From afa51a168176a277d7acfa1a6d91ea7f2079272d Mon Sep 17 00:00:00 2001 From: sherpalden Date: Fri, 12 Apr 2024 15:09:51 +0545 Subject: [PATCH 02/46] feat: add soroban rpc client --- cmd/config.go | 3 + example/configs/steller.json | 19 +++ relayer/chains/steller/client.go | 13 +- relayer/chains/steller/config.go | 10 +- relayer/chains/steller/listener.go | 17 ++- relayer/chains/steller/provider.go | 6 +- .../chains/steller/sorobanclient/client.go | 128 ++++++++++++++++++ .../chains/steller/sorobanclient/jsonrpc.go | 43 ++++++ relayer/chains/steller/sorobanclient/types.go | 7 + 9 files changed, 236 insertions(+), 10 deletions(-) create mode 100644 example/configs/steller.json create mode 100644 relayer/chains/steller/sorobanclient/client.go create mode 100644 relayer/chains/steller/sorobanclient/jsonrpc.go create mode 100644 relayer/chains/steller/sorobanclient/types.go diff --git a/cmd/config.go b/cmd/config.go index 081185cd..663a6b80 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -9,6 +9,7 @@ import ( jsoniter "github.com/json-iterator/go" + "github.com/icon-project/centralized-relay/relayer/chains/steller" "github.com/icon-project/centralized-relay/relayer/chains/wasm" "github.com/icon-project/centralized-relay/relayer" @@ -251,6 +252,8 @@ func (iw *ProviderConfigYAMLWrapper) UnmarshalYAML(n *yaml.Node) error { iw.Value = new(evm.Config) case "cosmos": iw.Value = new(wasm.ProviderConfig) + case "steller": + iw.Value = new(steller.Config) default: return fmt.Errorf("%s is an invalid chain type, check your config file", iw.Type) } diff --git a/example/configs/steller.json b/example/configs/steller.json new file mode 100644 index 00000000..d2e4d07c --- /dev/null +++ b/example/configs/steller.json @@ -0,0 +1,19 @@ +{ + "type": "steller", + "value": { + "horizon-url": "https://horizon-testnet.stellar.org", + "soroban-url": "https://soroban-testnet.stellar.org", + "start-height": 0, + "address": "GCQ5YPTO5ORNZ7WMADFAWP2D7NOJBZGDLWAUYNMSNLIHRNMSJXXFFWE3", + "gas-price": 3453, + "gas-limit": 987789978, + "contracts": { + "xcall": "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDE", + "connection": "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDD" + }, + "nid": "testnet.steller", + "finality-block": 10, + "block-interval": "5s" + } +} + \ No newline at end of file diff --git a/relayer/chains/steller/client.go b/relayer/chains/steller/client.go index c5aa3d0c..5226248e 100644 --- a/relayer/chains/steller/client.go +++ b/relayer/chains/steller/client.go @@ -3,22 +3,23 @@ package steller import ( "context" + "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" "github.com/stellar/go/clients/horizonclient" ) type IClient interface { - GetLatestLedgerSeq(ctx context.Context) (uint64, error) + GetLatestLedger(ctx context.Context) (*sorobanclient.LatestLedgerResponse, error) } type Client struct { horizon *horizonclient.Client + soroban *sorobanclient.Client } -func NewClient(hClient *horizonclient.Client) IClient { - return &Client{horizon: hClient} +func NewClient(hClient *horizonclient.Client, srbClient *sorobanclient.Client) IClient { + return &Client{horizon: hClient, soroban: srbClient} } -func (cl *Client) GetLatestLedgerSeq(ctx context.Context) (uint64, error) { - //Todo - return 0, nil +func (cl *Client) GetLatestLedger(ctx context.Context) (*sorobanclient.LatestLedgerResponse, error) { + return cl.soroban.GetLatestLedger(ctx) } diff --git a/relayer/chains/steller/config.go b/relayer/chains/steller/config.go index b502482e..350447b2 100644 --- a/relayer/chains/steller/config.go +++ b/relayer/chains/steller/config.go @@ -2,8 +2,10 @@ package steller import ( "context" + "fmt" "net/http" + "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" "github.com/icon-project/centralized-relay/relayer/provider" relayertypes "github.com/icon-project/centralized-relay/relayer/types" "github.com/stellar/go/clients/horizonclient" @@ -14,6 +16,7 @@ type Config struct { ChainID string `yaml:"chain-id"` ChainName string `yaml:"-"` HorizonUrl string `yaml:"horizon-url"` + SorobanUrl string `yaml:"soroban-url"` Address string `yaml:"address"` Contracts relayertypes.ContractConfigMap `yaml:"contracts"` NID string `json:"nid" yaml:"nid"` @@ -38,7 +41,12 @@ func (pc *Config) NewProvider(ctx context.Context, logger *zap.Logger, homePath AppName: "centralized-relay", } - client := NewClient(horizonClient) + sorobanclient, err := sorobanclient.New(pc.SorobanUrl, &httpClient) + if err != nil { + return nil, fmt.Errorf("failed to create soroban client: %v", err) + } + + client := NewClient(horizonClient, sorobanclient) return &Provider{ log: logger.With(zap.String("nid ", pc.NID), zap.String("name", pc.ChainName)), diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 58ada37c..2d0c2521 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -4,9 +4,22 @@ import ( "context" relayertypes "github.com/icon-project/centralized-relay/relayer/types" + "go.uber.org/zap" ) func (p *Provider) Listener(ctx context.Context, lastSavedCheckpointSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { - // - return nil + //Todo + latestLedger, err := p.client.GetLatestLedger(ctx) + if err != nil { + return err + } + + p.log.Info("steller listener started from", zap.Uint64("height", latestLedger.Sequence)) + + for { + select { + case <-ctx.Done(): + return ctx.Err() + } + } } diff --git a/relayer/chains/steller/provider.go b/relayer/chains/steller/provider.go index 164cb9d9..34e67cea 100644 --- a/relayer/chains/steller/provider.go +++ b/relayer/chains/steller/provider.go @@ -19,7 +19,11 @@ type Provider struct { } func (p *Provider) QueryLatestHeight(ctx context.Context) (uint64, error) { - return p.client.GetLatestLedgerSeq(ctx) + latestLedger, err := p.client.GetLatestLedger(ctx) + if err != nil { + return 0, err + } + return latestLedger.Sequence, nil } func (p *Provider) NID() string { diff --git a/relayer/chains/steller/sorobanclient/client.go b/relayer/chains/steller/sorobanclient/client.go new file mode 100644 index 00000000..92269086 --- /dev/null +++ b/relayer/chains/steller/sorobanclient/client.go @@ -0,0 +1,128 @@ +package sorobanclient + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "reflect" + "strconv" + "sync/atomic" +) + +const ( + jsonRPCVersion = "2.0" +) + +type Client struct { + idCounter uint64 + httpClient *http.Client + rpcUrl string +} + +func New(rpcUrl string, httpCl *http.Client) (*Client, error) { + if _, err := url.Parse(rpcUrl); err != nil { + return nil, err + } + + if httpCl == nil { + httpCl = &http.Client{} + } + + return &Client{ + httpClient: httpCl, + rpcUrl: rpcUrl, + }, nil +} + +func (c *Client) GetLatestLedger(ctx context.Context) (*LatestLedgerResponse, error) { + ledgerRes := &LatestLedgerResponse{} + if err := c.CallContext(ctx, ledgerRes, "getLatestLedger"); err != nil { + return nil, err + } + return ledgerRes, nil +} + +func (c *Client) CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error { + if result != nil && reflect.TypeOf(result).Kind() != reflect.Ptr { + return fmt.Errorf("call result parameter must be pointer or nil interface: %v", result) + } + + msg, err := c.newMessage(method, args...) + if err != nil { + return err + } + + respBody, err := c.doRequest(ctx, msg) + if err != nil { + return err + } + defer respBody.Close() + + var respmsg jsonRPCResponse + if err := json.NewDecoder(respBody).Decode(&respmsg); err != nil { + return err + } + if respmsg.Error != nil { + return respmsg.Error + } + if len(respmsg.Result) == 0 { + return fmt.Errorf("result is empty") + } + + return json.Unmarshal(respmsg.Result, result) +} + +func (c *Client) newMessage(method string, paramsIn ...interface{}) (*jsonRPCRequest, error) { + msg := &jsonRPCRequest{Version: jsonRPCVersion, ID: c.nextID(), Method: method} + if paramsIn != nil { // prevent sending "params":null + var err error + if msg.Params, err = json.Marshal(paramsIn); err != nil { + return nil, err + } + } + return msg, nil +} + +func (c *Client) doRequest(ctx context.Context, msg interface{}) (io.ReadCloser, error) { + body, err := json.Marshal(msg) + if err != nil { + return nil, err + } + req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.rpcUrl, io.NopCloser(bytes.NewReader(body))) + if err != nil { + return nil, err + } + req.ContentLength = int64(len(body)) + req.GetBody = func() (io.ReadCloser, error) { return io.NopCloser(bytes.NewReader(body)), nil } + + req.Header.Set("Content-Type", "application/json") + + // do request + resp, err := c.httpClient.Do(req) + if err != nil { + return nil, err + } + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + var buf bytes.Buffer + var body []byte + if _, err := buf.ReadFrom(resp.Body); err == nil { + body = buf.Bytes() + } + + return nil, HTTPError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Body: body, + } + } + return resp.Body, nil +} + +func (c *Client) nextID() json.RawMessage { + id := atomic.AddUint64(&c.idCounter, 1) + return strconv.AppendUint(nil, uint64(id), 10) +} diff --git a/relayer/chains/steller/sorobanclient/jsonrpc.go b/relayer/chains/steller/sorobanclient/jsonrpc.go new file mode 100644 index 00000000..fc31d8b8 --- /dev/null +++ b/relayer/chains/steller/sorobanclient/jsonrpc.go @@ -0,0 +1,43 @@ +package sorobanclient + +import ( + "encoding/json" + "fmt" +) + +type jsonRPCRequest struct { + ID json.RawMessage `json:"id,omitempty"` + Version string `json:"jsonrpc"` + Method string `json:"method"` + Params json.RawMessage `json:"params,omitempty"` +} + +type jsonRPCResponse struct { + ID json.RawMessage `json:"id,omitempty"` + Version string `json:"jsonrpc"` + Result json.RawMessage `json:"result,omitempty"` + Error *jsonRPCError `json:"error,omitempty"` +} + +type jsonRPCError struct { + Code int64 `json:"code"` + Message string `json:"message"` + Data json.RawMessage `json:"data,omitempty"` +} + +func (err jsonRPCError) Error() string { + return fmt.Sprintf("json-rpc error with code: %d, message: %s, & data: %v", err.Code, err.Message, err.Data) +} + +type HTTPError struct { + StatusCode int + Status string + Body []byte +} + +func (err HTTPError) Error() string { + if len(err.Body) == 0 { + return err.Status + } + return fmt.Sprintf("%v: %s", err.Status, err.Body) +} diff --git a/relayer/chains/steller/sorobanclient/types.go b/relayer/chains/steller/sorobanclient/types.go new file mode 100644 index 00000000..66807b9f --- /dev/null +++ b/relayer/chains/steller/sorobanclient/types.go @@ -0,0 +1,7 @@ +package sorobanclient + +type LatestLedgerResponse struct { + ID string `json:"id"` + ProtocolVersion uint64 `json:"protocolVersion"` + Sequence uint64 `json:"sequence"` +} From 7d5ffa3b851de60de19b1877217a85413f7f11f7 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Tue, 16 Apr 2024 13:58:59 +0545 Subject: [PATCH 03/46] feat: add steller listener --- go.mod | 3 +- go.sum | 2 + relayer/chains/steller/client.go | 51 ++++++ relayer/chains/steller/config.go | 24 +-- relayer/chains/steller/listener.go | 222 +++++++++++++++++++++++- relayer/chains/steller/provider_test.go | 23 +++ relayer/chains/steller/types/types.go | 13 ++ utils/concurrency/patterns.go | 46 +++++ 8 files changed, 370 insertions(+), 14 deletions(-) create mode 100644 relayer/chains/steller/provider_test.go create mode 100644 utils/concurrency/patterns.go diff --git a/go.mod b/go.mod index 00fc6565..bc17aedf 100644 --- a/go.mod +++ b/go.mod @@ -19,9 +19,11 @@ require ( github.com/json-iterator/go v1.1.12 github.com/jsternberg/zap-logfmt v1.3.0 github.com/pkg/errors v0.9.1 + github.com/sigurn/crc16 v0.0.0-20240131213347-83fcde1e29d1 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 github.com/stellar/go v0.0.0-20240329200747-a30c441b6cd6 + github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 github.com/stretchr/testify v1.8.4 github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d go.uber.org/multierr v1.11.0 @@ -82,7 +84,6 @@ require ( github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 // indirect github.com/stretchr/objx v0.5.1 // indirect github.com/tinylib/msgp v1.1.9 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect diff --git a/go.sum b/go.sum index b7ea0e79..914fac66 100644 --- a/go.sum +++ b/go.sum @@ -1807,6 +1807,8 @@ github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sigurn/crc16 v0.0.0-20240131213347-83fcde1e29d1 h1:NVK+OqnavpyFmUiKfUMHrpvbCi2VFoWTrcpI7aDaJ2I= +github.com/sigurn/crc16 v0.0.0-20240131213347-83fcde1e29d1/go.mod h1:9/etS5gpQq9BJsJMWg1wpLbfuSnkm8dPF6FdW2JXVhA= 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= diff --git a/relayer/chains/steller/client.go b/relayer/chains/steller/client.go index 5226248e..33057b93 100644 --- a/relayer/chains/steller/client.go +++ b/relayer/chains/steller/client.go @@ -2,13 +2,20 @@ package steller import ( "context" + "encoding/hex" + "slices" "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" + "github.com/icon-project/centralized-relay/relayer/chains/steller/types" "github.com/stellar/go/clients/horizonclient" + "github.com/stellar/go/strkey" + "github.com/stellar/go/xdr" ) type IClient interface { GetLatestLedger(ctx context.Context) (*sorobanclient.LatestLedgerResponse, error) + + FetchEvents(ctx context.Context, eventFilter types.EventFilter) ([]types.Event, error) } type Client struct { @@ -23,3 +30,47 @@ func NewClient(hClient *horizonclient.Client, srbClient *sorobanclient.Client) I func (cl *Client) GetLatestLedger(ctx context.Context) (*sorobanclient.LatestLedgerResponse, error) { return cl.soroban.GetLatestLedger(ctx) } + +func (cl *Client) FetchEvents(ctx context.Context, eventFilter types.EventFilter) ([]types.Event, error) { + req := horizonclient.TransactionRequest{ + ForLedger: uint(eventFilter.LedgerSeq), + } + txnPage, err := cl.horizon.Transactions(req) + if err != nil { + return nil, err + } + + var events []types.Event + for _, txn := range txnPage.Embedded.Records { + var txnMeta xdr.TransactionMeta + if err := xdr.SafeUnmarshalBase64(txn.ResultMetaXdr, &txnMeta); err != nil { + return nil, err + } + if txnMeta.V3 == nil || txnMeta.V3.SorobanMeta == nil { + continue + } + for _, ev := range txnMeta.V3.SorobanMeta.Events { + hexBytes, err := hex.DecodeString(ev.ContractId.HexString()) + if err != nil { + break + } + contractID, err := strkey.Encode(strkey.VersionByteContract, hexBytes) + if err != nil { + return nil, err + } + if slices.Contains(eventFilter.ContractIds, contractID) { + for _, topic := range ev.Body.V0.Topics { + if slices.Contains(eventFilter.Topics, topic.String()) { + events = append(events, types.Event{ + ContractEvent: ev, + LedgerSeq: uint64(txn.Ledger), + }) + break + } + } + } + } + } + + return events, nil +} diff --git a/relayer/chains/steller/config.go b/relayer/chains/steller/config.go index 350447b2..5a21d78c 100644 --- a/relayer/chains/steller/config.go +++ b/relayer/chains/steller/config.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net/http" + "time" "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" "github.com/icon-project/centralized-relay/relayer/provider" @@ -13,17 +14,18 @@ import ( ) type Config struct { - ChainID string `yaml:"chain-id"` - ChainName string `yaml:"-"` - HorizonUrl string `yaml:"horizon-url"` - SorobanUrl string `yaml:"soroban-url"` - Address string `yaml:"address"` - Contracts relayertypes.ContractConfigMap `yaml:"contracts"` - NID string `json:"nid" yaml:"nid"` - HomeDir string `yaml:"home-dir"` - GasPrice uint64 `yaml:"gas-price"` - GasMin uint64 `yaml:"gas-min"` - GasLimit uint64 `yaml:"gas-limit"` + ChainID string `yaml:"chain-id"` + ChainName string `yaml:"-"` + HorizonUrl string `yaml:"horizon-url"` + SorobanUrl string `yaml:"soroban-url"` + Address string `yaml:"address"` + Contracts relayertypes.ContractConfigMap `yaml:"contracts"` + NID string `json:"nid" yaml:"nid"` + HomeDir string `yaml:"home-dir"` + GasPrice uint64 `yaml:"gas-price"` + GasMin uint64 `yaml:"gas-min"` + GasLimit uint64 `yaml:"gas-limit"` + BlockInterval time.Duration `yaml:"block-interval"` } func (pc *Config) NewProvider(ctx context.Context, logger *zap.Logger, homePath string, debug bool, chainName string) (provider.ChainProvider, error) { diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 2d0c2521..52a59698 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -2,24 +2,242 @@ package steller import ( "context" + "encoding/hex" + "time" + "github.com/icon-project/centralized-relay/relayer/chains/steller/types" + relayerevents "github.com/icon-project/centralized-relay/relayer/events" relayertypes "github.com/icon-project/centralized-relay/relayer/types" + "github.com/icon-project/centralized-relay/utils/concurrency" + "github.com/icon-project/centralized-relay/utils/sorter" "go.uber.org/zap" ) -func (p *Provider) Listener(ctx context.Context, lastSavedCheckpointSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { +func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { //Todo latestLedger, err := p.client.GetLatestLedger(ctx) if err != nil { return err } - p.log.Info("steller listener started from", zap.Uint64("height", latestLedger.Sequence)) + lastSavedLedgerSeq = 1066354 + + latestSeq := latestLedger.Sequence + + startSeq := latestSeq + if lastSavedLedgerSeq != 0 && lastSavedLedgerSeq < latestSeq { + startSeq = lastSavedLedgerSeq + } + + blockIntervalTicker := time.NewTicker(p.cfg.BlockInterval) + defer blockIntervalTicker.Stop() + + p.log.Info("start querying from ledger seq", zap.Uint64("start-seq", startSeq)) for { select { case <-ctx.Done(): return ctx.Err() + case <-blockIntervalTicker.C: + newLatestLedger, err := p.client.GetLatestLedger(ctx) + if err != nil { + p.log.Error("failed to query latest ledger", zap.Error(err)) + } else if newLatestLedger.Sequence > latestSeq { + latestSeq = newLatestLedger.Sequence + } + default: + if startSeq < latestSeq { + p.log.Info("Query started.", zap.Uint64("from-seq", startSeq), zap.Uint64("to-seq", latestSeq)) + p.runLedgerQuery(blockInfo, startSeq, latestSeq) + startSeq = latestSeq + 1 + } + } + } +} + +func (p *Provider) runLedgerQuery(blockInfoChan chan *relayertypes.BlockInfo, fromSeq, toSeq uint64) { + done := make(chan interface{}) + defer close(done) + + seqStream := p.getLedgerSeqStream(done, fromSeq, toSeq) + + // numOfPipelines := int(toSeq - fromSeq + 1) + // if numOfPipelines > runtime.NumCPU() { + // numOfPipelines = runtime.NumCPU() + // } + numOfPipelines := 1 + + pipelines := make([]<-chan interface{}, numOfPipelines) + + for i := 0; i < numOfPipelines; i++ { + pipelines[i] = p.getLedgerInfoStream(done, seqStream) + } + + var blockInfoList []relayertypes.BlockInfo + for bn := range concurrency.Take(done, concurrency.FanIn(done, pipelines...), int(toSeq-fromSeq+1)) { + if bn != nil { + block := bn.(relayertypes.BlockInfo) + blockInfoList = append(blockInfoList, block) + } + } + + sorter.Sort(blockInfoList, func(p1, p2 relayertypes.BlockInfo) bool { + return p1.Height < p2.Height //ascending order + }) + + for _, blockInfo := range blockInfoList { + blockInfoChan <- &relayertypes.BlockInfo{ + Height: blockInfo.Height, Messages: blockInfo.Messages, } } } + +func (p *Provider) getLedgerSeqStream(done <-chan interface{}, fromSeq, toSeq uint64) <-chan uint64 { + seqStream := make(chan uint64) + seq := fromSeq + go func() { + defer close(seqStream) + for seq <= toSeq { + select { + case <-done: + return + default: + seqStream <- seq + seq++ + } + } + }() + return seqStream +} + +func (p *Provider) getLedgerInfoStream(done <-chan interface{}, seqStream <-chan uint64) <-chan interface{} { + ledgerInfoStream := make(chan interface{}) + go func() { + defer close(ledgerInfoStream) + Loop: + for { + select { + case <-done: + return + case seq, ok := <-seqStream: + if ok { + for { // will block until and unless ledger messages are fetched so that we are not skipping/missing this ledger seq. + messages, err := p.fetchLedgerMessages(context.Background(), seq) + if err != nil { + p.log.Error("failed to fetch ledger messages: ", zap.Error(err), zap.Uint64("ledger seq", seq)) + time.Sleep(1 * time.Second) + } else { + ledgerInfoStream <- relayertypes.BlockInfo{ + Height: seq, + Messages: messages, + } + break + } + } + } else { + break Loop // break out of the outer loop + } + } + } + }() + return ledgerInfoStream +} + +func (p *Provider) fetchLedgerMessages(ctx context.Context, ledgerSeq uint64) ([]*relayertypes.Message, error) { + eventFilter := types.EventFilter{ + LedgerSeq: ledgerSeq, + ContractIds: []string{p.cfg.Contracts[relayertypes.ConnectionContract]}, + Topics: []string{"new_message"}, + } + events, err := p.client.FetchEvents(ctx, eventFilter) + if err != nil { + return nil, err + } + + messages, err := p.parseMessagesFromEvents(events) + for _, msg := range messages { + p.log.Info("detected event log:", zap.Any("event", *msg)) + } + return messages, err +} + +func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertypes.Message, error) { + messages := []*relayertypes.Message{} + for _, ev := range events { + var eventType string + for _, topic := range ev.Body.V0.Topics { + switch topic.String() { + case "new_message": //used only for testing; need to remove + eventType = "new_message" + case "emitMessage": + eventType = relayerevents.EmitMessage + case "callMessage": + eventType = relayerevents.CallMessage + } + } + + // if event type is not matched then skip this event + if eventType == "" { + continue + } + + msg := &relayertypes.Message{ + EventType: eventType, + MessageHeight: ev.LedgerSeq, + } + + scval := ev.Body.V0.Data + scMap, ok := scval.GetMap() + if !ok { + continue + } + + for _, mapItem := range *scMap { + key, ok := mapItem.Key.GetStr() + if !ok { + break + } + switch key { + case "sn": + val, ok := mapItem.Val.GetU64() + if !ok { + break + } + msg.Sn = uint64(val) + case "reqId": + val, ok := mapItem.Val.GetU64() + if !ok { + break + } + msg.ReqID = uint64(val) + case "src": + val, ok := mapItem.Val.GetStr() + if !ok { + break + } + msg.Src = string(val) + case "dst": + val, ok := mapItem.Val.GetStr() + if !ok { + break + } + msg.Dst = string(val) + case "data": + val, ok := mapItem.Val.GetStr() + if !ok { + break + } + data, err := hex.DecodeString(string(val)) + if err != nil { + return nil, err + } + msg.Data = data + } + } + + messages = append(messages, msg) + + } + + return messages, nil +} diff --git a/relayer/chains/steller/provider_test.go b/relayer/chains/steller/provider_test.go new file mode 100644 index 00000000..e5cd2f9d --- /dev/null +++ b/relayer/chains/steller/provider_test.go @@ -0,0 +1,23 @@ +package steller + +import ( + "encoding/hex" + "fmt" + "testing" + + "github.com/stellar/go/strkey" + "github.com/stretchr/testify/assert" +) + +func TestBase58(t *testing.T) { + hexString := "70e9bcd9996297b6e5efd00ed53dd3459d920c4d883023f9a661b513470f75af" + + // Decode hexadecimal string into bytes + hexBytes, err := hex.DecodeString(hexString) + assert.NoError(t, err) + + val, err := strkey.Encode(strkey.VersionByteContract, hexBytes) + assert.NoError(t, err) + + fmt.Println("Result: ", val) +} diff --git a/relayer/chains/steller/types/types.go b/relayer/chains/steller/types/types.go index 21072732..87653a12 100644 --- a/relayer/chains/steller/types/types.go +++ b/relayer/chains/steller/types/types.go @@ -1,5 +1,18 @@ package types +import "github.com/stellar/go/xdr" + const ( ChainType = "steller" ) + +type EventFilter struct { + LedgerSeq uint64 + ContractIds []string + Topics []string +} + +type Event struct { + xdr.ContractEvent + LedgerSeq uint64 +} diff --git a/utils/concurrency/patterns.go b/utils/concurrency/patterns.go new file mode 100644 index 00000000..d789beb5 --- /dev/null +++ b/utils/concurrency/patterns.go @@ -0,0 +1,46 @@ +package concurrency + +import "sync" + +func FanIn(done <-chan interface{}, channels ...<-chan interface{}) <-chan interface{} { + multiplex := func(c <-chan interface{}, wg *sync.WaitGroup, mStream chan interface{}) { + defer wg.Done() + for i := range c { + select { + case <-done: + return + case mStream <- i: + } + } + } + + multiplexedStream := make(chan interface{}) + wg := &sync.WaitGroup{} + + wg.Add(len(channels)) + for _, c := range channels { + go multiplex(c, wg, multiplexedStream) + } + + go func() { + wg.Wait() + close(multiplexedStream) + }() + + return multiplexedStream +} + +func Take(done <-chan interface{}, valueStream <-chan interface{}, freq int) <-chan interface{} { + takeStream := make(chan interface{}) + go func() { + defer close(takeStream) + for i := 0; i < freq; i++ { + select { + case <-done: + return + case takeStream <- <-valueStream: + } + } + }() + return takeStream +} From de9230fe438d93b4ec36ce8c07af1511d38887ae Mon Sep 17 00:00:00 2001 From: sherpalden Date: Tue, 16 Apr 2024 16:00:05 +0545 Subject: [PATCH 04/46] fix: proper message parsing from events --- relayer/chains/steller/listener.go | 67 ++++++++++++++---------------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 52a59698..e8df337d 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -1,8 +1,11 @@ package steller import ( + "bytes" "context" "encoding/hex" + "fmt" + "runtime" "time" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" @@ -10,6 +13,7 @@ import ( relayertypes "github.com/icon-project/centralized-relay/relayer/types" "github.com/icon-project/centralized-relay/utils/concurrency" "github.com/icon-project/centralized-relay/utils/sorter" + xdr "github.com/stellar/go-xdr/xdr3" "go.uber.org/zap" ) @@ -20,7 +24,7 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc return err } - lastSavedLedgerSeq = 1066354 + // lastSavedLedgerSeq = 1066354 latestSeq := latestLedger.Sequence @@ -61,11 +65,10 @@ func (p *Provider) runLedgerQuery(blockInfoChan chan *relayertypes.BlockInfo, fr seqStream := p.getLedgerSeqStream(done, fromSeq, toSeq) - // numOfPipelines := int(toSeq - fromSeq + 1) - // if numOfPipelines > runtime.NumCPU() { - // numOfPipelines = runtime.NumCPU() - // } - numOfPipelines := 1 + numOfPipelines := int(toSeq - fromSeq + 1) + if numOfPipelines > runtime.NumCPU() { + numOfPipelines = runtime.NumCPU() + } pipelines := make([]<-chan interface{}, numOfPipelines) @@ -193,50 +196,44 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype } for _, mapItem := range *scMap { - key, ok := mapItem.Key.GetStr() - if !ok { - break + valBytes, err := mapItem.Val.MarshalBinary() + if err != nil { + return nil, err } - switch key { + decoder := xdr.NewDecoder(bytes.NewBuffer(valBytes)) + switch mapItem.Key.String() { case "sn": - val, ok := mapItem.Val.GetU64() - if !ok { - break + intVal, _, err := decoder.DecodeInt() + if err != nil { + return nil, fmt.Errorf("failed to decode sn: %v", err) } - msg.Sn = uint64(val) + msg.Sn = uint64(intVal) case "reqId": - val, ok := mapItem.Val.GetU64() - if !ok { - break + intVal, _, err := decoder.DecodeInt() + if err != nil { + return nil, fmt.Errorf("failed to decode reqId: %v", err) } - msg.ReqID = uint64(val) + msg.ReqID = uint64(intVal) case "src": - val, ok := mapItem.Val.GetStr() - if !ok { - break - } - msg.Src = string(val) + msg.Src = mapItem.Val.String() case "dst": - val, ok := mapItem.Val.GetStr() - if !ok { - break - } - msg.Dst = string(val) + msg.Dst = mapItem.Val.String() case "data": - val, ok := mapItem.Val.GetStr() - if !ok { - break - } - data, err := hex.DecodeString(string(val)) + data, err := hex.DecodeString(mapItem.Val.String()) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to decode data: %v", err) } msg.Data = data } } - messages = append(messages, msg) + //skip invalid message + if msg.Sn == 0 || msg.Src == "" || msg.Dst == "" { + p.log.Warn("detected invalid message: ", zap.Any("msg", msg)) + continue + } + messages = append(messages, msg) } return messages, nil From f3ca797efa3a8ddaf9fc874f8a5af81bd6afc3ed Mon Sep 17 00:00:00 2001 From: sherpalden Date: Tue, 16 Apr 2024 16:14:35 +0545 Subject: [PATCH 05/46] chore: proper variable name and comments --- utils/concurrency/patterns.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/utils/concurrency/patterns.go b/utils/concurrency/patterns.go index d789beb5..123c2f11 100644 --- a/utils/concurrency/patterns.go +++ b/utils/concurrency/patterns.go @@ -2,6 +2,12 @@ package concurrency import "sync" +/* +FanIn multiplexes multiple input channels into a single output channel. It reads from each input channel +concurrently until all channels are closed, then closes the output channel. The function takes a 'done' +channel to signal cancellation, and variadic 'channels' representing the input channels to multiplex. +It returns a single output channel where values from all input channels are sent. +*/ func FanIn(done <-chan interface{}, channels ...<-chan interface{}) <-chan interface{} { multiplex := func(c <-chan interface{}, wg *sync.WaitGroup, mStream chan interface{}) { defer wg.Done() @@ -30,11 +36,16 @@ func FanIn(done <-chan interface{}, channels ...<-chan interface{}) <-chan inter return multiplexedStream } -func Take(done <-chan interface{}, valueStream <-chan interface{}, freq int) <-chan interface{} { +/* +Take reads values from the 'valueStream' input channel and sends them to the output channel 'takeStream'. +It reads until 'noOfItemsToTake' items are taken from 'valueStream' or a cancellation signal is received +on the 'done' channel. The function returns a channel 'takeStream' where the taken values are sent. +*/ +func Take(done <-chan interface{}, valueStream <-chan interface{}, noOfItemsToTake int) <-chan interface{} { takeStream := make(chan interface{}) go func() { defer close(takeStream) - for i := 0; i < freq; i++ { + for i := 0; i < noOfItemsToTake; i++ { select { case <-done: return From 02a5780609fc0a8507290fbe9b4f0be52867da56 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Wed, 17 Apr 2024 11:55:08 +0545 Subject: [PATCH 06/46] fix: add test case for creating seq batches and log successful ledger queries --- relayer/chains/steller/listener.go | 35 +++++++--- relayer/chains/steller/provider_test.go | 90 ++++++++++++++++++++++--- relayer/chains/steller/types/types.go | 8 ++- 3 files changed, 112 insertions(+), 21 deletions(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index e8df337d..4b287870 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -18,14 +18,11 @@ import ( ) func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { - //Todo latestLedger, err := p.client.GetLatestLedger(ctx) if err != nil { return err } - // lastSavedLedgerSeq = 1066354 - latestSeq := latestLedger.Sequence startSeq := latestSeq @@ -52,7 +49,10 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc default: if startSeq < latestSeq { p.log.Info("Query started.", zap.Uint64("from-seq", startSeq), zap.Uint64("to-seq", latestSeq)) - p.runLedgerQuery(blockInfo, startSeq, latestSeq) + for _, seqBatch := range getSeqBatches(startSeq, latestSeq, types.LedgerSeqBatchSize) { + p.runLedgerQuery(blockInfo, seqBatch.FromSeq, seqBatch.ToSeq) + p.log.Info("Query completed.", zap.Uint64("from-seq", seqBatch.FromSeq), zap.Uint64("to-seq", seqBatch.ToSeq)) + } startSeq = latestSeq + 1 } } @@ -63,7 +63,7 @@ func (p *Provider) runLedgerQuery(blockInfoChan chan *relayertypes.BlockInfo, fr done := make(chan interface{}) defer close(done) - seqStream := p.getLedgerSeqStream(done, fromSeq, toSeq) + seqStream := getLedgerSeqStream(done, fromSeq, toSeq) numOfPipelines := int(toSeq - fromSeq + 1) if numOfPipelines > runtime.NumCPU() { @@ -84,9 +84,12 @@ func (p *Provider) runLedgerQuery(blockInfoChan chan *relayertypes.BlockInfo, fr } } - sorter.Sort(blockInfoList, func(p1, p2 relayertypes.BlockInfo) bool { - return p1.Height < p2.Height //ascending order - }) + sorter.Sort( + blockInfoList, + func(p1, p2 relayertypes.BlockInfo) bool { + return p1.Height < p2.Height //ascending order + }, + ) for _, blockInfo := range blockInfoList { blockInfoChan <- &relayertypes.BlockInfo{ @@ -95,7 +98,20 @@ func (p *Provider) runLedgerQuery(blockInfoChan chan *relayertypes.BlockInfo, fr } } -func (p *Provider) getLedgerSeqStream(done <-chan interface{}, fromSeq, toSeq uint64) <-chan uint64 { +func getSeqBatches(fromSeq, toSeq, batchSize uint64) []types.LedgerSeqBatch { + seqBatches := []types.LedgerSeqBatch{} + seq := fromSeq + for seq+batchSize <= toSeq { + seqBatches = append(seqBatches, types.LedgerSeqBatch{FromSeq: seq, ToSeq: seq + batchSize - 1}) + seq = seq + batchSize + } + if seq <= toSeq { + seqBatches = append(seqBatches, types.LedgerSeqBatch{FromSeq: seq, ToSeq: toSeq}) + } + return seqBatches +} + +func getLedgerSeqStream(done <-chan interface{}, fromSeq, toSeq uint64) <-chan uint64 { seqStream := make(chan uint64) seq := fromSeq go func() { @@ -161,6 +177,7 @@ func (p *Provider) fetchLedgerMessages(ctx context.Context, ledgerSeq uint64) ([ for _, msg := range messages { p.log.Info("detected event log:", zap.Any("event", *msg)) } + p.log.Debug("query successful", zap.Uint64("ledger-seq", ledgerSeq)) return messages, err } diff --git a/relayer/chains/steller/provider_test.go b/relayer/chains/steller/provider_test.go index e5cd2f9d..3d9ab7c3 100644 --- a/relayer/chains/steller/provider_test.go +++ b/relayer/chains/steller/provider_test.go @@ -1,23 +1,91 @@ package steller import ( - "encoding/hex" - "fmt" "testing" - "github.com/stellar/go/strkey" + "github.com/icon-project/centralized-relay/relayer/chains/steller/types" "github.com/stretchr/testify/assert" ) -func TestBase58(t *testing.T) { - hexString := "70e9bcd9996297b6e5efd00ed53dd3459d920c4d883023f9a661b513470f75af" +func TestGetSeqBatches(t *testing.T) { + done := make(chan interface{}) + defer close(done) - // Decode hexadecimal string into bytes - hexBytes, err := hex.DecodeString(hexString) - assert.NoError(t, err) + type testCase struct { + name string + fromSeq, toSeq, batchSize uint64 + expected []types.LedgerSeqBatch + } - val, err := strkey.Encode(strkey.VersionByteContract, hexBytes) - assert.NoError(t, err) + testCases := []testCase{ + { + name: "case-0", + fromSeq: 1, + toSeq: 1, + batchSize: 1, + expected: []types.LedgerSeqBatch{ + {FromSeq: 1, ToSeq: 1}, + }, + }, + { + name: "case-1", + fromSeq: 1, + toSeq: 2, + batchSize: 1, + expected: []types.LedgerSeqBatch{ + {FromSeq: 1, ToSeq: 1}, + {FromSeq: 2, ToSeq: 2}, + }, + }, + { + name: "case-2", + fromSeq: 1, + toSeq: 4, + batchSize: 2, + expected: []types.LedgerSeqBatch{ + {FromSeq: 1, ToSeq: 2}, + {FromSeq: 3, ToSeq: 4}, + }, + }, + { + name: "case-3", + fromSeq: 1, + toSeq: 4, + batchSize: 3, + expected: []types.LedgerSeqBatch{ + {FromSeq: 1, ToSeq: 3}, + {FromSeq: 4, ToSeq: 4}, + }, + }, + { + name: "case-4", + fromSeq: 1, + toSeq: 4, + batchSize: 4, + expected: []types.LedgerSeqBatch{ + {FromSeq: 1, ToSeq: 4}, + }, + }, + { + name: "case-5", + fromSeq: 1, + toSeq: 4, + batchSize: 5, + expected: []types.LedgerSeqBatch{ + {FromSeq: 1, ToSeq: 4}, + }, + }, + } - fmt.Println("Result: ", val) + for _, testCase := range testCases { + t.Run(testCase.name, func(subTest *testing.T) { + // batchStream := getLedgerSeqBatchStream(done, testCase.fromSeq, testCase.toSeq, testCase.batchSize) + // batches := []types.LedgerSeqBatch{} + // for batch := range batchStream { + // batches = append(batches, batch) + // } + batches := getSeqBatches(testCase.fromSeq, testCase.toSeq, testCase.batchSize) + assert.Equal(subTest, testCase.expected, batches) + }) + } } diff --git a/relayer/chains/steller/types/types.go b/relayer/chains/steller/types/types.go index 87653a12..136c1f6a 100644 --- a/relayer/chains/steller/types/types.go +++ b/relayer/chains/steller/types/types.go @@ -3,7 +3,8 @@ package types import "github.com/stellar/go/xdr" const ( - ChainType = "steller" + ChainType = "steller" + LedgerSeqBatchSize = 50 // the number of ledger sequences to query concurrently for listener ) type EventFilter struct { @@ -16,3 +17,8 @@ type Event struct { xdr.ContractEvent LedgerSeq uint64 } + +type LedgerSeqBatch struct { + FromSeq uint64 + ToSeq uint64 +} From 98d660297880903982b555624696abc1f8b6a318 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Wed, 17 Apr 2024 11:56:18 +0545 Subject: [PATCH 07/46] chore: remove unwanted comments --- relayer/chains/steller/provider_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/relayer/chains/steller/provider_test.go b/relayer/chains/steller/provider_test.go index 3d9ab7c3..01bc4709 100644 --- a/relayer/chains/steller/provider_test.go +++ b/relayer/chains/steller/provider_test.go @@ -79,11 +79,6 @@ func TestGetSeqBatches(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(subTest *testing.T) { - // batchStream := getLedgerSeqBatchStream(done, testCase.fromSeq, testCase.toSeq, testCase.batchSize) - // batches := []types.LedgerSeqBatch{} - // for batch := range batchStream { - // batches = append(batches, batch) - // } batches := getSeqBatches(testCase.fromSeq, testCase.toSeq, testCase.batchSize) assert.Equal(subTest, testCase.expected, batches) }) From 8b1762dc268d68f74122960c2dca8e6085c4f805 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Thu, 18 Apr 2024 13:34:40 +0545 Subject: [PATCH 08/46] feat: steller kms integration --- relayer/chains/steller/keys.go | 98 ++++++++++++++++++++++++++++-- relayer/chains/steller/provider.go | 2 + 2 files changed, 95 insertions(+), 5 deletions(-) diff --git a/relayer/chains/steller/keys.go b/relayer/chains/steller/keys.go index 0fa96bf1..5e143dbb 100644 --- a/relayer/chains/steller/keys.go +++ b/relayer/chains/steller/keys.go @@ -2,19 +2,107 @@ package steller import ( "context" + "os" + "path" + + "github.com/stellar/go/keypair" + "github.com/stellar/go/strkey" ) func (p *Provider) RestoreKeystore(ctx context.Context) error { - //Todo + encryptedPkSeed, err := os.ReadFile(p.keystorePath(p.cfg.Address)) + if err != nil { + return err + } + + rawPkSeed, err := p.kms.Decrypt(ctx, encryptedPkSeed) + if err != nil { + return err + } + + seed, err := strkey.Encode(strkey.VersionByteSeed, rawPkSeed) + if err != nil { + return err + } + + fkp, err := keypair.ParseFull(seed) + if err != nil { + return err + } + + p.wallet = fkp + return nil } func (p *Provider) NewKeystore(password string) (string, error) { - //Todo - return "", nil + kp, err := keypair.Random() + if err != nil { + return "", err + } + + rawSeed, err := strkey.Decode(strkey.VersionByteSeed, kp.Seed()) + if err != nil { + return "", err + } + + keyStoreContent, err := p.kms.Encrypt(context.Background(), rawSeed) + if err != nil { + return "", err + } + passphraseCipher, err := p.kms.Encrypt(context.Background(), []byte(password)) + if err != nil { + return "", err + } + + path := p.keystorePath(kp.Address()) + if err = os.WriteFile(path, keyStoreContent, 0o644); err != nil { + return "", err + } + if err = os.WriteFile(path+".pass", passphraseCipher, 0o644); err != nil { + return "", err + } + + return kp.Address(), nil } func (p *Provider) ImportKeystore(ctx context.Context, keyPath, passphrase string) (string, error) { - //Todo - return "", nil + pkSeedFile, err := os.ReadFile(keyPath) + if err != nil { + return "", err + } + pkSeed := string(pkSeedFile) + + fullKeyPair, err := keypair.ParseFull(pkSeed) + if err != nil { + return "", err + } + + rawSeed, err := strkey.Decode(strkey.VersionByteSeed, fullKeyPair.Seed()) + if err != nil { + return "", err + } + + keyStoreContent, err := p.kms.Encrypt(ctx, rawSeed) + if err != nil { + return "", err + } + passphraseCipher, err := p.kms.Encrypt(ctx, []byte(passphrase)) + if err != nil { + return "", err + } + + path := p.keystorePath(fullKeyPair.Address()) + if err = os.WriteFile(path, keyStoreContent, 0o644); err != nil { + return "", err + } + if err = os.WriteFile(path+".pass", passphraseCipher, 0o644); err != nil { + return "", err + } + + return fullKeyPair.Address(), nil +} + +func (p *Provider) keystorePath(addr string) string { + return path.Join(p.cfg.HomeDir, "keystore", p.NID(), addr) } diff --git a/relayer/chains/steller/provider.go b/relayer/chains/steller/provider.go index 34e67cea..dfe073f8 100644 --- a/relayer/chains/steller/provider.go +++ b/relayer/chains/steller/provider.go @@ -8,6 +8,7 @@ import ( "github.com/icon-project/centralized-relay/relayer/kms" "github.com/icon-project/centralized-relay/relayer/provider" relayertypes "github.com/icon-project/centralized-relay/relayer/types" + "github.com/stellar/go/keypair" "go.uber.org/zap" ) @@ -16,6 +17,7 @@ type Provider struct { cfg *Config client IClient kms kms.KMS + wallet *keypair.Full } func (p *Provider) QueryLatestHeight(ctx context.Context) (uint64, error) { From 1d561c99338ddbc72693a6a8dcc22afc915a4958 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Mon, 22 Apr 2024 20:33:50 +0545 Subject: [PATCH 09/46] feat: send transaction --- relayer/chains/steller/client.go | 26 +++++++ relayer/chains/steller/listener.go | 9 +++ relayer/chains/steller/provider_test.go | 28 +++++++ .../chains/steller/sorobanclient/client.go | 14 ++++ relayer/chains/steller/sorobanclient/types.go | 6 ++ relayer/chains/steller/tx.go | 76 ++++++++++++++++++- 6 files changed, 158 insertions(+), 1 deletion(-) diff --git a/relayer/chains/steller/client.go b/relayer/chains/steller/client.go index 33057b93..df58a157 100644 --- a/relayer/chains/steller/client.go +++ b/relayer/chains/steller/client.go @@ -8,11 +8,21 @@ import ( "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" "github.com/stellar/go/clients/horizonclient" + "github.com/stellar/go/protocols/horizon" "github.com/stellar/go/strkey" + "github.com/stellar/go/txnbuild" "github.com/stellar/go/xdr" ) type IClient interface { + SimulateTransaction(txXDR string) (*sorobanclient.TxSimulationResult, error) + + SubmitTransactionXDR(txXDR string) (horizon.Transaction, error) + + SubmitTransaction(tx *txnbuild.Transaction) (horizon.Transaction, error) + + AccountDetail(addr string) (horizon.Account, error) + GetLatestLedger(ctx context.Context) (*sorobanclient.LatestLedgerResponse, error) FetchEvents(ctx context.Context, eventFilter types.EventFilter) ([]types.Event, error) @@ -27,6 +37,22 @@ func NewClient(hClient *horizonclient.Client, srbClient *sorobanclient.Client) I return &Client{horizon: hClient, soroban: srbClient} } +func (cl *Client) SimulateTransaction(txXDR string) (*sorobanclient.TxSimulationResult, error) { + return cl.soroban.SimulateTransaction(txXDR) +} + +func (cl *Client) SubmitTransactionXDR(txXDR string) (horizon.Transaction, error) { + return cl.horizon.SubmitTransactionXDR(txXDR) +} + +func (cl *Client) SubmitTransaction(tx *txnbuild.Transaction) (horizon.Transaction, error) { + return cl.horizon.SubmitTransaction(tx) +} + +func (cl *Client) AccountDetail(addr string) (horizon.Account, error) { + return cl.horizon.AccountDetail(horizonclient.AccountRequest{AccountID: addr}) +} + func (cl *Client) GetLatestLedger(ctx context.Context) (*sorobanclient.LatestLedgerResponse, error) { return cl.soroban.GetLatestLedger(ctx) } diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 4b287870..8a67bbba 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -18,6 +18,15 @@ import ( ) func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { + go func() { + if err := p.RestoreKeystore(ctx); err != nil { + p.log.Error("error restoring keystore: ", zap.Error(err)) + } + if err := p.Route(ctx, nil, nil); err != nil { + p.log.Error("error sending tx: ", zap.Error(err)) + } + }() + latestLedger, err := p.client.GetLatestLedger(ctx) if err != nil { return err diff --git a/relayer/chains/steller/provider_test.go b/relayer/chains/steller/provider_test.go index 01bc4709..b615cae9 100644 --- a/relayer/chains/steller/provider_test.go +++ b/relayer/chains/steller/provider_test.go @@ -1,12 +1,40 @@ package steller import ( + "encoding/hex" + "fmt" "testing" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" + "github.com/stellar/go/strkey" + "github.com/stellar/go/xdr" "github.com/stretchr/testify/assert" ) +func TestContractHash(t *testing.T) { + contractID := "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDD" + // cidBytes, err := base32.StdEncoding.DecodeString(contractID) + // assert.NoError(t, err) + + contractHash, err := strkey.Decode(strkey.VersionByteContract, contractID) + assert.NoError(t, err) + + fmt.Println("Generated Hash: ", hex.EncodeToString(contractHash)) +} + +func TestScVal(t *testing.T) { + // var scStr xdr.ScString + + data := xdr.ScBytes([]byte("hello")) + + dst := xdr.ScVal{ + Type: xdr.ScValTypeScvBytes, + Bytes: &data, + } + + fmt.Println("Data: ", dst.String()) +} + func TestGetSeqBatches(t *testing.T) { done := make(chan interface{}) defer close(done) diff --git a/relayer/chains/steller/sorobanclient/client.go b/relayer/chains/steller/sorobanclient/client.go index 92269086..08e9a5c2 100644 --- a/relayer/chains/steller/sorobanclient/client.go +++ b/relayer/chains/steller/sorobanclient/client.go @@ -38,6 +38,20 @@ func New(rpcUrl string, httpCl *http.Client) (*Client, error) { }, nil } +func (c *Client) SimulateTransaction(txnXdr string) (*TxSimulationResult, error) { + simResult := &TxSimulationResult{} + if err := c.CallContext( + context.Background(), + simResult, + "simulateTransaction", + txnXdr, + ); err != nil { + return nil, err + } + + return simResult, nil +} + func (c *Client) GetLatestLedger(ctx context.Context) (*LatestLedgerResponse, error) { ledgerRes := &LatestLedgerResponse{} if err := c.CallContext(ctx, ledgerRes, "getLatestLedger"); err != nil { diff --git a/relayer/chains/steller/sorobanclient/types.go b/relayer/chains/steller/sorobanclient/types.go index 66807b9f..dc99cd02 100644 --- a/relayer/chains/steller/sorobanclient/types.go +++ b/relayer/chains/steller/sorobanclient/types.go @@ -5,3 +5,9 @@ type LatestLedgerResponse struct { ProtocolVersion uint64 `json:"protocolVersion"` Sequence uint64 `json:"sequence"` } + +type TxSimulationResult struct { + LatestLedger uint64 `json:"latestLedger"` + MinResourceFee string `json:"minResourceFee"` // Recommended minimum resource fee to add when submitting the transaction. This fee is to be added on top of the Stellar network fee. + TransactionDataXDR string `json:"transactionData"` // The recommended Soroban Transaction Data to use when submitting the simulated transaction. This data contains the refundable fee and resource usage information such as the ledger footprint and IO access data (serialized in a base64 string). +} diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 18642b87..2cd5b84f 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -2,12 +2,86 @@ package steller import ( "context" + "fmt" relayertypes "github.com/icon-project/centralized-relay/relayer/types" + "github.com/stellar/go/network" + "github.com/stellar/go/strkey" + "github.com/stellar/go/txnbuild" + "github.com/stellar/go/xdr" ) func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, callback relayertypes.TxResponseFunc) error { - //Todo + contractHash, err := strkey.Decode(strkey.VersionByteContract, p.cfg.Contracts["connection"]) + if err != nil { + return err + } + + contractAddr, err := xdr.NewScAddress(xdr.ScAddressTypeScAddressTypeContract, xdr.Hash(contractHash)) + if err != nil { + return err + } + + dst, err := xdr.NewScVal(xdr.ScValTypeScvString, xdr.ScString("icon")) + if err != nil { + return err + } + + data, err := xdr.NewScVal(xdr.ScValTypeScvBytes, xdr.ScBytes([]byte("hello"))) + if err != nil { + return err + } + + sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) + if err != nil { + return err + } + + contractCallOp := txnbuild.InvokeHostFunction{ + SourceAccount: sourceAccount.AccountID, + HostFunction: xdr.HostFunction{ + Type: xdr.HostFunctionTypeHostFunctionTypeInvokeContract, + InvokeContract: &xdr.InvokeContractArgs{ + ContractAddress: contractAddr, + FunctionName: xdr.ScSymbol("new_message"), + Args: []xdr.ScVal{dst, data}, + }, + }, + } + + tx, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ + SourceAccount: &sourceAccount, + IncrementSequenceNum: true, + BaseFee: txnbuild.MinBaseFee, + Operations: []txnbuild.Operation{&contractCallOp}, + Preconditions: txnbuild.Preconditions{ + TimeBounds: txnbuild.NewTimeout(300), + }, + }) + if err != nil { + return err + } + + tx, err = tx.Sign(network.TestNetworkPassphrase, p.wallet) + if err != nil { + return err + } + + txe, err := tx.Base64() + if err != nil { + return err + } + + fmt.Println("envelope xdr: ", txe) + + // Send the transaction to the network + resp, err := p.client.SimulateTransaction(txe) + if err != nil { + return err + } + + fmt.Printf("\nSimulation Response: %+v\n", resp) + return nil } From 88b591cd0f1fc1789e563350cfa10618a20ba375 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Tue, 23 Apr 2024 16:31:51 +0545 Subject: [PATCH 10/46] feat: organize tx send operation --- relayer/chains/steller/client.go | 2 +- relayer/chains/steller/listener.go | 6 +- .../chains/steller/sorobanclient/client.go | 3 +- relayer/chains/steller/sorobanclient/types.go | 4 + relayer/chains/steller/tx.go | 155 ++++++++++++++---- relayer/chains/steller/types/msg.go | 40 +++++ relayer/chains/steller/types/types.go | 10 ++ 7 files changed, 187 insertions(+), 33 deletions(-) create mode 100644 relayer/chains/steller/types/msg.go diff --git a/relayer/chains/steller/client.go b/relayer/chains/steller/client.go index df58a157..156c5322 100644 --- a/relayer/chains/steller/client.go +++ b/relayer/chains/steller/client.go @@ -38,7 +38,7 @@ func NewClient(hClient *horizonclient.Client, srbClient *sorobanclient.Client) I } func (cl *Client) SimulateTransaction(txXDR string) (*sorobanclient.TxSimulationResult, error) { - return cl.soroban.SimulateTransaction(txXDR) + return cl.soroban.SimulateTransaction(txXDR, nil) } func (cl *Client) SubmitTransactionXDR(txXDR string) (horizon.Transaction, error) { diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 8a67bbba..5f5ec15a 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -19,10 +19,14 @@ import ( func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { go func() { + time.Sleep(5 * time.Second) if err := p.RestoreKeystore(ctx); err != nil { p.log.Error("error restoring keystore: ", zap.Error(err)) } - if err := p.Route(ctx, nil, nil); err != nil { + if err := p.Route(ctx, &relayertypes.Message{ + Dst: "icon", + Data: []byte("hello"), + }, nil); err != nil { p.log.Error("error sending tx: ", zap.Error(err)) } }() diff --git a/relayer/chains/steller/sorobanclient/client.go b/relayer/chains/steller/sorobanclient/client.go index 08e9a5c2..376a6b4b 100644 --- a/relayer/chains/steller/sorobanclient/client.go +++ b/relayer/chains/steller/sorobanclient/client.go @@ -38,13 +38,14 @@ func New(rpcUrl string, httpCl *http.Client) (*Client, error) { }, nil } -func (c *Client) SimulateTransaction(txnXdr string) (*TxSimulationResult, error) { +func (c *Client) SimulateTransaction(txnXdr string, resourceCfg *ResourceConfig) (*TxSimulationResult, error) { simResult := &TxSimulationResult{} if err := c.CallContext( context.Background(), simResult, "simulateTransaction", txnXdr, + resourceCfg, ); err != nil { return nil, err } diff --git a/relayer/chains/steller/sorobanclient/types.go b/relayer/chains/steller/sorobanclient/types.go index dc99cd02..d7da4a0d 100644 --- a/relayer/chains/steller/sorobanclient/types.go +++ b/relayer/chains/steller/sorobanclient/types.go @@ -11,3 +11,7 @@ type TxSimulationResult struct { MinResourceFee string `json:"minResourceFee"` // Recommended minimum resource fee to add when submitting the transaction. This fee is to be added on top of the Stellar network fee. TransactionDataXDR string `json:"transactionData"` // The recommended Soroban Transaction Data to use when submitting the simulated transaction. This data contains the refundable fee and resource usage information such as the ledger footprint and IO access data (serialized in a base64 string). } + +type ResourceConfig struct { + InstructionLeeway uint64 `json:"instructionLeeway"` +} diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 2cd5b84f..4cf576e1 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -4,83 +4,178 @@ import ( "context" "fmt" + "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" + "github.com/icon-project/centralized-relay/relayer/chains/steller/types" + evtypes "github.com/icon-project/centralized-relay/relayer/events" relayertypes "github.com/icon-project/centralized-relay/relayer/types" "github.com/stellar/go/network" + "github.com/stellar/go/protocols/horizon" "github.com/stellar/go/strkey" "github.com/stellar/go/txnbuild" "github.com/stellar/go/xdr" ) -func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, callback relayertypes.TxResponseFunc) error { - contractHash, err := strkey.Decode(strkey.VersionByteContract, p.cfg.Contracts["connection"]) +func (p *Provider) scContractAddr(addr string) (*xdr.ScAddress, error) { + contractHash, err := strkey.Decode(strkey.VersionByteContract, addr) if err != nil { - return err + return nil, err } - contractAddr, err := xdr.NewScAddress(xdr.ScAddressTypeScAddressTypeContract, xdr.Hash(contractHash)) + scContractAddr, err := xdr.NewScAddress(xdr.ScAddressTypeScAddressTypeContract, xdr.Hash(contractHash)) if err != nil { - return err + return nil, err } - dst, err := xdr.NewScVal(xdr.ScValTypeScvString, xdr.ScString("icon")) - if err != nil { - return err - } + return &scContractAddr, nil +} - data, err := xdr.NewScVal(xdr.ScValTypeScvBytes, xdr.ScBytes([]byte("hello"))) +func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeContractArgs, error) { + scXcallAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) //Todo change to xcall contract if err != nil { - return err + return nil, err } - - sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) + scConnAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) if err != nil { - return err + return nil, err } - contractCallOp := txnbuild.InvokeHostFunction{ - SourceAccount: sourceAccount.AccountID, - HostFunction: xdr.HostFunction{ - Type: xdr.HostFunctionTypeHostFunctionTypeInvokeContract, - InvokeContract: &xdr.InvokeContractArgs{ - ContractAddress: contractAddr, - FunctionName: xdr.ScSymbol("new_message"), - Args: []xdr.ScVal{dst, data}, + stellerMsg := types.StellerMsg{Message: msg} + + switch msg.EventType { + case evtypes.EmitMessage: + return &xdr.InvokeContractArgs{ + ContractAddress: *scConnAddr, + FunctionName: xdr.ScSymbol("recv_message"), + Args: []xdr.ScVal{ + stellerMsg.ScvSn(), + stellerMsg.ScvSrc(), + stellerMsg.ScvData(), }, - }, + }, nil + case evtypes.CallMessage: + return &xdr.InvokeContractArgs{ + ContractAddress: *scXcallAddr, + FunctionName: xdr.ScSymbol("execute_call"), + Args: []xdr.ScVal{ + stellerMsg.ScvReqID(), + }, + }, nil + default: + return &xdr.InvokeContractArgs{ //temporarily used for testing + ContractAddress: *scConnAddr, + FunctionName: xdr.ScSymbol("new_message"), + Args: []xdr.ScVal{ + stellerMsg.ScvDst(), + stellerMsg.ScvData(), + }, + }, nil + // return nil, fmt.Errorf("invalid message type") } +} + +func (p *Provider) simulateTransaction(op txnbuild.Operation) (*sorobanclient.TxSimulationResult, error) { + sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) + if err != nil { + return nil, err + } tx, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ SourceAccount: &sourceAccount, IncrementSequenceNum: true, BaseFee: txnbuild.MinBaseFee, - Operations: []txnbuild.Operation{&contractCallOp}, + Operations: []txnbuild.Operation{op}, Preconditions: txnbuild.Preconditions{ TimeBounds: txnbuild.NewTimeout(300), }, }) if err != nil { - return err + return nil, err + } + + txe, err := tx.Base64() + if err != nil { + return nil, err + } + + return p.client.SimulateTransaction(txe) +} + +func (p *Provider) sendTransaction(fn func(param *txnbuild.TransactionParams)) (*horizon.Transaction, error) { + sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) + if err != nil { + return nil, err + } + + txParam := txnbuild.TransactionParams{ + SourceAccount: &sourceAccount, + IncrementSequenceNum: true, + BaseFee: txnbuild.MinBaseFee, + Preconditions: txnbuild.Preconditions{ + TimeBounds: txnbuild.NewTimeout(300), + }, + } + + fn(&txParam) + + tx, err := txnbuild.NewTransaction(txParam) + if err != nil { + return nil, err } tx, err = tx.Sign(network.TestNetworkPassphrase, p.wallet) if err != nil { - return err + return nil, err } txe, err := tx.Base64() if err != nil { + return nil, err + } + + txRes, err := p.client.SubmitTransactionXDR(txe) + if err != nil { + return nil, err + } + + return &txRes, nil +} + +func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, callback relayertypes.TxResponseFunc) error { + callArgs, err := p.newContractCallArgs(*message) + if err != nil { + return err + } + callOp := txnbuild.InvokeHostFunction{ + HostFunction: xdr.HostFunction{ + Type: xdr.HostFunctionTypeHostFunctionTypeInvokeContract, + InvokeContract: callArgs, + }, + } + + simres, err := p.simulateTransaction(&callOp) + if err != nil { + return err + } + + var sorobanTxnData xdr.SorobanTransactionData + if err := xdr.SafeUnmarshalBase64(simres.TransactionDataXDR, &sorobanTxnData); err != nil { return err } - fmt.Println("envelope xdr: ", txe) + callOp.Ext = xdr.TransactionExt{ + V: 1, + SorobanData: &sorobanTxnData, + } - // Send the transaction to the network - resp, err := p.client.SimulateTransaction(txe) + txRes, err := p.sendTransaction(func(param *txnbuild.TransactionParams) { + param.Operations = []txnbuild.Operation{&callOp} + param.BaseFee = 4074165 + }) if err != nil { return err } - fmt.Printf("\nSimulation Response: %+v\n", resp) + fmt.Printf("\nTx Resp: %+v\n", txRes) return nil } diff --git a/relayer/chains/steller/types/msg.go b/relayer/chains/steller/types/msg.go new file mode 100644 index 00000000..727a8a5f --- /dev/null +++ b/relayer/chains/steller/types/msg.go @@ -0,0 +1,40 @@ +package types + +import ( + relayertypes "github.com/icon-project/centralized-relay/relayer/types" + "github.com/stellar/go/xdr" +) + +type StellerMsg struct { + relayertypes.Message +} + +func (m StellerMsg) ScvSn() xdr.ScVal { + scVal, _ := xdr.NewScVal(xdr.ScValTypeScvU64, xdr.Uint64(m.Sn)) + return scVal +} + +func (m StellerMsg) ScvMessageHeight() xdr.ScVal { + scVal, _ := xdr.NewScVal(xdr.ScValTypeScvU64, xdr.Uint64(m.MessageHeight)) + return scVal +} + +func (m StellerMsg) ScvReqID() xdr.ScVal { + scVal, _ := xdr.NewScVal(xdr.ScValTypeScvU64, xdr.Uint64(m.ReqID)) + return scVal +} + +func (m StellerMsg) ScvSrc() xdr.ScVal { + scVal, _ := xdr.NewScVal(xdr.ScValTypeScvString, xdr.ScString(m.Src)) + return scVal +} + +func (m StellerMsg) ScvDst() xdr.ScVal { + scVal, _ := xdr.NewScVal(xdr.ScValTypeScvString, xdr.ScString(m.Dst)) + return scVal +} + +func (m StellerMsg) ScvData() xdr.ScVal { + scVal, _ := xdr.NewScVal(xdr.ScValTypeScvBytes, xdr.ScBytes(m.Data)) + return scVal +} diff --git a/relayer/chains/steller/types/types.go b/relayer/chains/steller/types/types.go index 136c1f6a..e2d0009d 100644 --- a/relayer/chains/steller/types/types.go +++ b/relayer/chains/steller/types/types.go @@ -22,3 +22,13 @@ type LedgerSeqBatch struct { FromSeq uint64 ToSeq uint64 } + +type ScMessage struct { + Dst xdr.ScString + Src xdr.ScString + Sn xdr.Uint64 + Data xdr.ScBytes + MessageHeight xdr.Uint64 + EventType xdr.ScString + ReqID xdr.Uint64 +} From acaa0ffe2abd70e96753d0fa5848ea966ae80587 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Tue, 23 Apr 2024 16:35:28 +0545 Subject: [PATCH 11/46] feat: add network passphrase to the steller config --- relayer/chains/steller/config.go | 25 +++++++++++++------------ relayer/chains/steller/tx.go | 3 +-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/relayer/chains/steller/config.go b/relayer/chains/steller/config.go index 5a21d78c..41e24487 100644 --- a/relayer/chains/steller/config.go +++ b/relayer/chains/steller/config.go @@ -14,18 +14,19 @@ import ( ) type Config struct { - ChainID string `yaml:"chain-id"` - ChainName string `yaml:"-"` - HorizonUrl string `yaml:"horizon-url"` - SorobanUrl string `yaml:"soroban-url"` - Address string `yaml:"address"` - Contracts relayertypes.ContractConfigMap `yaml:"contracts"` - NID string `json:"nid" yaml:"nid"` - HomeDir string `yaml:"home-dir"` - GasPrice uint64 `yaml:"gas-price"` - GasMin uint64 `yaml:"gas-min"` - GasLimit uint64 `yaml:"gas-limit"` - BlockInterval time.Duration `yaml:"block-interval"` + ChainID string `yaml:"chain-id"` + ChainName string `yaml:"-"` + HorizonUrl string `yaml:"horizon-url"` + SorobanUrl string `yaml:"soroban-url"` + Address string `yaml:"address"` + Contracts relayertypes.ContractConfigMap `yaml:"contracts"` + NID string `json:"nid" yaml:"nid"` + HomeDir string `yaml:"home-dir"` + GasPrice uint64 `yaml:"gas-price"` + GasMin uint64 `yaml:"gas-min"` + GasLimit uint64 `yaml:"gas-limit"` + BlockInterval time.Duration `yaml:"block-interval"` + NetworkPassphrase string `yaml:"network-passphrase"` } func (pc *Config) NewProvider(ctx context.Context, logger *zap.Logger, homePath string, debug bool, chainName string) (provider.ChainProvider, error) { diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 4cf576e1..6b54dd1e 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -8,7 +8,6 @@ import ( "github.com/icon-project/centralized-relay/relayer/chains/steller/types" evtypes "github.com/icon-project/centralized-relay/relayer/events" relayertypes "github.com/icon-project/centralized-relay/relayer/types" - "github.com/stellar/go/network" "github.com/stellar/go/protocols/horizon" "github.com/stellar/go/strkey" "github.com/stellar/go/txnbuild" @@ -122,7 +121,7 @@ func (p *Provider) sendTransaction(fn func(param *txnbuild.TransactionParams)) ( return nil, err } - tx, err = tx.Sign(network.TestNetworkPassphrase, p.wallet) + tx, err = tx.Sign(p.cfg.NetworkPassphrase, p.wallet) if err != nil { return nil, err } From 9d14db3400f2fb58bc74af85af155a0881243123 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Wed, 24 Apr 2024 13:56:47 +0545 Subject: [PATCH 12/46] fix: proper sequence number sync for tx execution in steller --- relayer/chains/steller/config.go | 6 +- relayer/chains/steller/listener.go | 10 +- relayer/chains/steller/provider.go | 2 + relayer/chains/steller/tx.go | 201 ++++++++++++++--------------- 4 files changed, 111 insertions(+), 108 deletions(-) diff --git a/relayer/chains/steller/config.go b/relayer/chains/steller/config.go index 41e24487..3c0f826e 100644 --- a/relayer/chains/steller/config.go +++ b/relayer/chains/steller/config.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net/http" + "sync" "time" "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" @@ -22,9 +23,7 @@ type Config struct { Contracts relayertypes.ContractConfigMap `yaml:"contracts"` NID string `json:"nid" yaml:"nid"` HomeDir string `yaml:"home-dir"` - GasPrice uint64 `yaml:"gas-price"` - GasMin uint64 `yaml:"gas-min"` - GasLimit uint64 `yaml:"gas-limit"` + MaxInclusionFee uint64 `yaml:"max-inclusion-fee"` // in stroop: the smallest unit of a lumen, one ten-millionth of a lumen (.0000001 XLM). BlockInterval time.Duration `yaml:"block-interval"` NetworkPassphrase string `yaml:"network-passphrase"` } @@ -55,6 +54,7 @@ func (pc *Config) NewProvider(ctx context.Context, logger *zap.Logger, homePath log: logger.With(zap.String("nid ", pc.NID), zap.String("name", pc.ChainName)), cfg: pc, client: client, + txmut: &sync.Mutex{}, }, nil } diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 5f5ec15a..c6622df7 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -18,7 +18,7 @@ import ( ) func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { - go func() { + go func() { //Todo remove: used temporarily for testing purpose only time.Sleep(5 * time.Second) if err := p.RestoreKeystore(ctx); err != nil { p.log.Error("error restoring keystore: ", zap.Error(err)) @@ -26,7 +26,13 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc if err := p.Route(ctx, &relayertypes.Message{ Dst: "icon", Data: []byte("hello"), - }, nil); err != nil { + }, func(key *relayertypes.MessageKey, response *relayertypes.TxResponse, err error) { + if err != nil { + p.log.Info("message relay failed", zap.String("src", "steller"), zap.String("dst", "icon"), zap.Int64("height", response.Height), zap.String("hash", response.TxHash), zap.Error(err)) + } else { + p.log.Info("message relay successfull", zap.String("src", "steller"), zap.String("dst", "icon"), zap.Int64("height", response.Height), zap.String("hash", response.TxHash)) + } + }); err != nil { p.log.Error("error sending tx: ", zap.Error(err)) } }() diff --git a/relayer/chains/steller/provider.go b/relayer/chains/steller/provider.go index dfe073f8..4ca4b6de 100644 --- a/relayer/chains/steller/provider.go +++ b/relayer/chains/steller/provider.go @@ -3,6 +3,7 @@ package steller import ( "context" "math/big" + "sync" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" "github.com/icon-project/centralized-relay/relayer/kms" @@ -18,6 +19,7 @@ type Provider struct { client IClient kms kms.KMS wallet *keypair.Full + txmut *sync.Mutex } func (p *Provider) QueryLatestHeight(ctx context.Context) (uint64, error) { diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 6b54dd1e..0668eea1 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -3,8 +3,8 @@ package steller import ( "context" "fmt" + "strconv" - "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" evtypes "github.com/icon-project/centralized-relay/relayer/events" relayertypes "github.com/icon-project/centralized-relay/relayer/types" @@ -14,169 +14,164 @@ import ( "github.com/stellar/go/xdr" ) -func (p *Provider) scContractAddr(addr string) (*xdr.ScAddress, error) { - contractHash, err := strkey.Decode(strkey.VersionByteContract, addr) - if err != nil { - return nil, err - } - - scContractAddr, err := xdr.NewScAddress(xdr.ScAddressTypeScAddressTypeContract, xdr.Hash(contractHash)) +func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, callback relayertypes.TxResponseFunc) error { + callArgs, err := p.newContractCallArgs(*message) if err != nil { - return nil, err + return err } - return &scContractAddr, nil -} + txRes, err := p.sendCallTransaction(*callArgs) -func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeContractArgs, error) { - scXcallAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) //Todo change to xcall contract - if err != nil { - return nil, err + cbTxResp := &relayertypes.TxResponse{} + if txRes != nil { + cbTxResp.Height = int64(txRes.Ledger) + cbTxResp.TxHash = txRes.Hash } - scConnAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) + + var cbErr error if err != nil { - return nil, err + cbErr = err + } else if txRes != nil && !txRes.Successful { + cbErr = fmt.Errorf("failed to send call transaction") } - stellerMsg := types.StellerMsg{Message: msg} - - switch msg.EventType { - case evtypes.EmitMessage: - return &xdr.InvokeContractArgs{ - ContractAddress: *scConnAddr, - FunctionName: xdr.ScSymbol("recv_message"), - Args: []xdr.ScVal{ - stellerMsg.ScvSn(), - stellerMsg.ScvSrc(), - stellerMsg.ScvData(), - }, - }, nil - case evtypes.CallMessage: - return &xdr.InvokeContractArgs{ - ContractAddress: *scXcallAddr, - FunctionName: xdr.ScSymbol("execute_call"), - Args: []xdr.ScVal{ - stellerMsg.ScvReqID(), - }, - }, nil - default: - return &xdr.InvokeContractArgs{ //temporarily used for testing - ContractAddress: *scConnAddr, - FunctionName: xdr.ScSymbol("new_message"), - Args: []xdr.ScVal{ - stellerMsg.ScvDst(), - stellerMsg.ScvData(), - }, - }, nil - // return nil, fmt.Errorf("invalid message type") - } + callback(message.MessageKey(), cbTxResp, cbErr) + return nil } -func (p *Provider) simulateTransaction(op txnbuild.Operation) (*sorobanclient.TxSimulationResult, error) { +func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizon.Transaction, error) { + p.txmut.Lock() + defer p.txmut.Unlock() + + callOp := txnbuild.InvokeHostFunction{ + HostFunction: xdr.HostFunction{ + Type: xdr.HostFunctionTypeHostFunctionTypeInvokeContract, + InvokeContract: &callArgs, + }, + } + sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) if err != nil { return nil, err } - tx, err := txnbuild.NewTransaction(txnbuild.TransactionParams{ + if _, err := sourceAccount.IncrementSequenceNumber(); err != nil { + return nil, err + } + + txParam := txnbuild.TransactionParams{ SourceAccount: &sourceAccount, - IncrementSequenceNum: true, + IncrementSequenceNum: false, + Operations: []txnbuild.Operation{&callOp}, BaseFee: txnbuild.MinBaseFee, - Operations: []txnbuild.Operation{op}, Preconditions: txnbuild.Preconditions{ TimeBounds: txnbuild.NewTimeout(300), }, - }) + } + + simtx, err := txnbuild.NewTransaction(txParam) if err != nil { return nil, err } - - txe, err := tx.Base64() + simtxe, err := simtx.Base64() if err != nil { return nil, err } - - return p.client.SimulateTransaction(txe) -} - -func (p *Provider) sendTransaction(fn func(param *txnbuild.TransactionParams)) (*horizon.Transaction, error) { - sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) + simres, err := p.client.SimulateTransaction(simtxe) if err != nil { return nil, err } - txParam := txnbuild.TransactionParams{ - SourceAccount: &sourceAccount, - IncrementSequenceNum: true, - BaseFee: txnbuild.MinBaseFee, - Preconditions: txnbuild.Preconditions{ - TimeBounds: txnbuild.NewTimeout(300), - }, + var sorobanTxnData xdr.SorobanTransactionData + if err := xdr.SafeUnmarshalBase64(simres.TransactionDataXDR, &sorobanTxnData); err != nil { + return nil, err } - fn(&txParam) + callOp.Ext = xdr.TransactionExt{ + V: 1, + SorobanData: &sorobanTxnData, + } - tx, err := txnbuild.NewTransaction(txParam) + minResourceFee, err := strconv.Atoi(simres.MinResourceFee) if err != nil { return nil, err } - tx, err = tx.Sign(p.cfg.NetworkPassphrase, p.wallet) + txParam.BaseFee = int64(minResourceFee) + int64(p.cfg.MaxInclusionFee) + + tx, err := txnbuild.NewTransaction(txParam) if err != nil { return nil, err } - - txe, err := tx.Base64() + tx, err = tx.Sign(p.cfg.NetworkPassphrase, p.wallet) if err != nil { return nil, err } - - txRes, err := p.client.SubmitTransactionXDR(txe) + txe, err := tx.Base64() if err != nil { return nil, err } + txRes, err := p.client.SubmitTransactionXDR(txe) - return &txRes, nil + return &txRes, err } -func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, callback relayertypes.TxResponseFunc) error { - callArgs, err := p.newContractCallArgs(*message) +func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeContractArgs, error) { + scXcallAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.XcallContract]) if err != nil { - return err - } - callOp := txnbuild.InvokeHostFunction{ - HostFunction: xdr.HostFunction{ - Type: xdr.HostFunctionTypeHostFunctionTypeInvokeContract, - InvokeContract: callArgs, - }, + return nil, err } - - simres, err := p.simulateTransaction(&callOp) + scConnAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) if err != nil { - return err + return nil, err } - var sorobanTxnData xdr.SorobanTransactionData - if err := xdr.SafeUnmarshalBase64(simres.TransactionDataXDR, &sorobanTxnData); err != nil { - return err - } + stellerMsg := types.StellerMsg{Message: msg} - callOp.Ext = xdr.TransactionExt{ - V: 1, - SorobanData: &sorobanTxnData, + switch msg.EventType { + case evtypes.EmitMessage: + return &xdr.InvokeContractArgs{ + ContractAddress: *scConnAddr, + FunctionName: xdr.ScSymbol("recv_message"), + Args: []xdr.ScVal{ + stellerMsg.ScvSn(), + stellerMsg.ScvSrc(), + stellerMsg.ScvData(), + }, + }, nil + case evtypes.CallMessage: + return &xdr.InvokeContractArgs{ + ContractAddress: *scXcallAddr, + FunctionName: xdr.ScSymbol("execute_call"), + Args: []xdr.ScVal{ + stellerMsg.ScvReqID(), + }, + }, nil + default: + return &xdr.InvokeContractArgs{ //temporarily used for testing + ContractAddress: *scConnAddr, + FunctionName: xdr.ScSymbol("new_message"), + Args: []xdr.ScVal{ + stellerMsg.ScvDst(), + stellerMsg.ScvData(), + }, + }, nil + // return nil, fmt.Errorf("invalid message type") } +} - txRes, err := p.sendTransaction(func(param *txnbuild.TransactionParams) { - param.Operations = []txnbuild.Operation{&callOp} - param.BaseFee = 4074165 - }) +func (p *Provider) scContractAddr(addr string) (*xdr.ScAddress, error) { + contractHash, err := strkey.Decode(strkey.VersionByteContract, addr) if err != nil { - return err + return nil, err } - fmt.Printf("\nTx Resp: %+v\n", txRes) + scContractAddr, err := xdr.NewScAddress(xdr.ScAddressTypeScAddressTypeContract, xdr.Hash(contractHash)) + if err != nil { + return nil, err + } - return nil + return &scContractAddr, nil } func (p *Provider) QueryTransactionReceipt(ctx context.Context, txDigest string) (*relayertypes.Receipt, error) { From 05aa80288601b777cb3f7d5252763d0206bd5060 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Thu, 25 Apr 2024 16:38:19 +0545 Subject: [PATCH 13/46] feat: implement txreceipt and query contract methods in steller --- relayer/chains/steller/client.go | 7 +- relayer/chains/steller/listener.go | 34 ++++++---- relayer/chains/steller/provider_test.go | 28 -------- relayer/chains/steller/sorobanclient/types.go | 12 +++- relayer/chains/steller/tx.go | 68 ++++++++++++++++++- 5 files changed, 97 insertions(+), 52 deletions(-) diff --git a/relayer/chains/steller/client.go b/relayer/chains/steller/client.go index 156c5322..4c0e9a22 100644 --- a/relayer/chains/steller/client.go +++ b/relayer/chains/steller/client.go @@ -10,7 +10,6 @@ import ( "github.com/stellar/go/clients/horizonclient" "github.com/stellar/go/protocols/horizon" "github.com/stellar/go/strkey" - "github.com/stellar/go/txnbuild" "github.com/stellar/go/xdr" ) @@ -19,7 +18,7 @@ type IClient interface { SubmitTransactionXDR(txXDR string) (horizon.Transaction, error) - SubmitTransaction(tx *txnbuild.Transaction) (horizon.Transaction, error) + GetTransaction(txHash string) (horizon.Transaction, error) AccountDetail(addr string) (horizon.Account, error) @@ -45,8 +44,8 @@ func (cl *Client) SubmitTransactionXDR(txXDR string) (horizon.Transaction, error return cl.horizon.SubmitTransactionXDR(txXDR) } -func (cl *Client) SubmitTransaction(tx *txnbuild.Transaction) (horizon.Transaction, error) { - return cl.horizon.SubmitTransaction(tx) +func (cl *Client) GetTransaction(txHash string) (horizon.Transaction, error) { + return cl.horizon.TransactionDetail(txHash) } func (cl *Client) AccountDetail(addr string) (horizon.Account, error) { diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index c6622df7..737c4880 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -13,28 +13,34 @@ import ( relayertypes "github.com/icon-project/centralized-relay/relayer/types" "github.com/icon-project/centralized-relay/utils/concurrency" "github.com/icon-project/centralized-relay/utils/sorter" - xdr "github.com/stellar/go-xdr/xdr3" + xdr3 "github.com/stellar/go-xdr/xdr3" + "github.com/stellar/go/xdr" "go.uber.org/zap" ) func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { go func() { //Todo remove: used temporarily for testing purpose only - time.Sleep(5 * time.Second) + // time.Sleep(5 * time.Second) if err := p.RestoreKeystore(ctx); err != nil { p.log.Error("error restoring keystore: ", zap.Error(err)) } - if err := p.Route(ctx, &relayertypes.Message{ - Dst: "icon", - Data: []byte("hello"), - }, func(key *relayertypes.MessageKey, response *relayertypes.TxResponse, err error) { - if err != nil { - p.log.Info("message relay failed", zap.String("src", "steller"), zap.String("dst", "icon"), zap.Int64("height", response.Height), zap.String("hash", response.TxHash), zap.Error(err)) - } else { - p.log.Info("message relay successfull", zap.String("src", "steller"), zap.String("dst", "icon"), zap.Int64("height", response.Height), zap.String("hash", response.TxHash)) - } - }); err != nil { - p.log.Error("error sending tx: ", zap.Error(err)) + if err := p.QueryContract(xdr.InvokeContractArgs{}, nil); err != nil { + p.log.Error("error querying contract: ", zap.Error(err)) } + + // if err := p.Route(ctx, &relayertypes.Message{ + // Dst: "icon", + // Data: []byte("hello"), + // }, func(key *relayertypes.MessageKey, response *relayertypes.TxResponse, err error) { + // if err != nil { + // p.log.Info("message relay failed", zap.String("src", "steller"), zap.String("dst", "icon"), zap.Int64("height", response.Height), zap.String("hash", response.TxHash), zap.Error(err)) + // } else { + // p.log.Info("message relay successfull", zap.String("src", "steller"), zap.String("dst", "icon"), zap.Int64("height", response.Height), zap.String("hash", response.TxHash)) + // } + // }); err != nil { + // p.log.Error("error sending tx: ", zap.Error(err)) + // } + }() latestLedger, err := p.client.GetLatestLedger(ctx) @@ -236,7 +242,7 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype if err != nil { return nil, err } - decoder := xdr.NewDecoder(bytes.NewBuffer(valBytes)) + decoder := xdr3.NewDecoder(bytes.NewBuffer(valBytes)) switch mapItem.Key.String() { case "sn": intVal, _, err := decoder.DecodeInt() diff --git a/relayer/chains/steller/provider_test.go b/relayer/chains/steller/provider_test.go index b615cae9..01bc4709 100644 --- a/relayer/chains/steller/provider_test.go +++ b/relayer/chains/steller/provider_test.go @@ -1,40 +1,12 @@ package steller import ( - "encoding/hex" - "fmt" "testing" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" - "github.com/stellar/go/strkey" - "github.com/stellar/go/xdr" "github.com/stretchr/testify/assert" ) -func TestContractHash(t *testing.T) { - contractID := "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDD" - // cidBytes, err := base32.StdEncoding.DecodeString(contractID) - // assert.NoError(t, err) - - contractHash, err := strkey.Decode(strkey.VersionByteContract, contractID) - assert.NoError(t, err) - - fmt.Println("Generated Hash: ", hex.EncodeToString(contractHash)) -} - -func TestScVal(t *testing.T) { - // var scStr xdr.ScString - - data := xdr.ScBytes([]byte("hello")) - - dst := xdr.ScVal{ - Type: xdr.ScValTypeScvBytes, - Bytes: &data, - } - - fmt.Println("Data: ", dst.String()) -} - func TestGetSeqBatches(t *testing.T) { done := make(chan interface{}) defer close(done) diff --git a/relayer/chains/steller/sorobanclient/types.go b/relayer/chains/steller/sorobanclient/types.go index d7da4a0d..925e0541 100644 --- a/relayer/chains/steller/sorobanclient/types.go +++ b/relayer/chains/steller/sorobanclient/types.go @@ -6,10 +6,16 @@ type LatestLedgerResponse struct { Sequence uint64 `json:"sequence"` } +type CallResult struct { + Xdr string `json:"xdr"` + Auth []string `json:"auth"` +} + type TxSimulationResult struct { - LatestLedger uint64 `json:"latestLedger"` - MinResourceFee string `json:"minResourceFee"` // Recommended minimum resource fee to add when submitting the transaction. This fee is to be added on top of the Stellar network fee. - TransactionDataXDR string `json:"transactionData"` // The recommended Soroban Transaction Data to use when submitting the simulated transaction. This data contains the refundable fee and resource usage information such as the ledger footprint and IO access data (serialized in a base64 string). + LatestLedger uint64 `json:"latestLedger"` + Results []CallResult `json:"results"` + MinResourceFee string `json:"minResourceFee"` // Recommended minimum resource fee to add when submitting the transaction. This fee is to be added on top of the Stellar network fee. + TransactionDataXDR string `json:"transactionData"` // The recommended Soroban Transaction Data to use when submitting the simulated transaction. This data contains the refundable fee and resource usage information such as the ledger footprint and IO access data (serialized in a base64 string). } type ResourceConfig struct { diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 0668eea1..9e4005ee 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -1,13 +1,16 @@ package steller import ( + "bytes" "context" + "encoding/base64" "fmt" "strconv" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" evtypes "github.com/icon-project/centralized-relay/relayer/events" relayertypes "github.com/icon-project/centralized-relay/relayer/types" + xdr3 "github.com/stellar/go-xdr/xdr3" "github.com/stellar/go/protocols/horizon" "github.com/stellar/go/strkey" "github.com/stellar/go/txnbuild" @@ -174,12 +177,71 @@ func (p *Provider) scContractAddr(addr string) (*xdr.ScAddress, error) { return &scContractAddr, nil } -func (p *Provider) QueryTransactionReceipt(ctx context.Context, txDigest string) (*relayertypes.Receipt, error) { - //Todo - return nil, nil +func (p *Provider) QueryTransactionReceipt(ctx context.Context, txHash string) (*relayertypes.Receipt, error) { + tx, err := p.client.GetTransaction(txHash) + if err != nil { + return nil, err + } + return &relayertypes.Receipt{ + TxHash: txHash, + Height: uint64(tx.Ledger), + Status: tx.Successful, + }, nil } func (p *Provider) MessageReceived(ctx context.Context, key *relayertypes.MessageKey) (bool, error) { //Todo return false, nil } + +func (p *Provider) QueryContract(callArgs xdr.InvokeContractArgs, dest interface{}) error { + sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) + if err != nil { + return err + } + + callOp := txnbuild.InvokeHostFunction{ + SourceAccount: sourceAccount.AccountID, + HostFunction: xdr.HostFunction{ + Type: xdr.HostFunctionTypeHostFunctionTypeInvokeContract, + InvokeContract: &callArgs, + }, + } + + txParam := txnbuild.TransactionParams{ + SourceAccount: &sourceAccount, + Operations: []txnbuild.Operation{&callOp}, + Preconditions: txnbuild.Preconditions{ + TimeBounds: txnbuild.NewTimeout(300), + }, + } + + queryTx, err := txnbuild.NewTransaction(txParam) + if err != nil { + return err + } + queryTxe, err := queryTx.Base64() + if err != nil { + return err + } + + queryRes, err := p.client.SimulateTransaction(queryTxe) + if err != nil { + return err + } + + for _, callResult := range queryRes.Results { + fmt.Println("XDR string: ", callResult.Xdr) + resBytes, err := base64.StdEncoding.DecodeString(callResult.Xdr) + if err != nil { + return err + } + if _, err := xdr3.Unmarshal(bytes.NewReader(resBytes), dest); err != nil { + return err + } else { + break + } + } + + return nil +} From 80230395a32f4796944d0292e323b188119beb48 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Thu, 25 Apr 2024 17:00:03 +0545 Subject: [PATCH 14/46] feat: implement balance query in steller --- relayer/chains/steller/provider.go | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/relayer/chains/steller/provider.go b/relayer/chains/steller/provider.go index 4ca4b6de..c4f520b0 100644 --- a/relayer/chains/steller/provider.go +++ b/relayer/chains/steller/provider.go @@ -3,6 +3,7 @@ package steller import ( "context" "math/big" + "strconv" "sync" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" @@ -90,16 +91,32 @@ func (p *Provider) ClaimFee(ctx context.Context) error { } func (p *Provider) QueryBalance(ctx context.Context, addr string) (*relayertypes.Coin, error) { - //Todo - return nil, nil + account, err := p.client.AccountDetail(addr) + if err != nil { + return nil, err + } + + var amt uint64 + for _, bal := range account.Balances { + balance, err := strconv.Atoi(bal.Balance) + if err != nil { + return nil, err + } else { + amt = uint64(balance) + break + } + } + + return &relayertypes.Coin{ + Denom: "XLM", + Amount: amt, + }, nil } func (p *Provider) ShouldReceiveMessage(ctx context.Context, messagekey *relayertypes.Message) (bool, error) { - //Todo return true, nil } func (p *Provider) ShouldSendMessage(ctx context.Context, messageKey *relayertypes.Message) (bool, error) { - //Todo return true, nil } From ebd682088be94165c982533f055884c5bc6c38c4 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Thu, 25 Apr 2024 17:18:13 +0545 Subject: [PATCH 15/46] feat: implement getReceipts in steller --- relayer/chains/steller/listener.go | 11 +++-------- relayer/chains/steller/tx.go | 30 ++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 737c4880..432b55da 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -14,20 +14,15 @@ import ( "github.com/icon-project/centralized-relay/utils/concurrency" "github.com/icon-project/centralized-relay/utils/sorter" xdr3 "github.com/stellar/go-xdr/xdr3" - "github.com/stellar/go/xdr" "go.uber.org/zap" ) func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { + if err := p.RestoreKeystore(ctx); err != nil { + return fmt.Errorf("failed to restore key: %w", err) + } go func() { //Todo remove: used temporarily for testing purpose only // time.Sleep(5 * time.Second) - if err := p.RestoreKeystore(ctx); err != nil { - p.log.Error("error restoring keystore: ", zap.Error(err)) - } - if err := p.QueryContract(xdr.InvokeContractArgs{}, nil); err != nil { - p.log.Error("error querying contract: ", zap.Error(err)) - } - // if err := p.Route(ctx, &relayertypes.Message{ // Dst: "icon", // Data: []byte("hello"), diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 9e4005ee..70476b27 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -190,11 +190,34 @@ func (p *Provider) QueryTransactionReceipt(ctx context.Context, txHash string) ( } func (p *Provider) MessageReceived(ctx context.Context, key *relayertypes.MessageKey) (bool, error) { - //Todo - return false, nil + connAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) + if err != nil { + return false, err + } + stellerMsg := types.StellerMsg{ + Message: relayertypes.Message{ + Sn: key.Sn, + Src: key.Src, + }, + } + callArgs := xdr.InvokeContractArgs{ + ContractAddress: *connAddr, + FunctionName: xdr.ScSymbol("getReceipts"), + Args: []xdr.ScVal{ + stellerMsg.ScvSn(), + stellerMsg.ScvSrc(), + }, + } + + var isReceived bool + if err := p.queryContract(callArgs, &isReceived); err != nil { + return false, err + } + + return isReceived, nil } -func (p *Provider) QueryContract(callArgs xdr.InvokeContractArgs, dest interface{}) error { +func (p *Provider) queryContract(callArgs xdr.InvokeContractArgs, dest interface{}) error { sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) if err != nil { return err @@ -231,7 +254,6 @@ func (p *Provider) QueryContract(callArgs xdr.InvokeContractArgs, dest interface } for _, callResult := range queryRes.Results { - fmt.Println("XDR string: ", callResult.Xdr) resBytes, err := base64.StdEncoding.DecodeString(callResult.Xdr) if err != nil { return err From f8d2a01f90e33edba33596a5c2135c65381809b3 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Thu, 25 Apr 2024 17:20:17 +0545 Subject: [PATCH 16/46] chore: update steller example config --- example/configs/steller.json | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/example/configs/steller.json b/example/configs/steller.json index d2e4d07c..46b147d1 100644 --- a/example/configs/steller.json +++ b/example/configs/steller.json @@ -1,19 +1,18 @@ { - "type": "steller", - "value": { - "horizon-url": "https://horizon-testnet.stellar.org", - "soroban-url": "https://soroban-testnet.stellar.org", - "start-height": 0, - "address": "GCQ5YPTO5ORNZ7WMADFAWP2D7NOJBZGDLWAUYNMSNLIHRNMSJXXFFWE3", - "gas-price": 3453, - "gas-limit": 987789978, - "contracts": { - "xcall": "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDE", - "connection": "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDD" - }, - "nid": "testnet.steller", - "finality-block": 10, - "block-interval": "5s" - } + "type": "steller", + "value": { + "chain-id": "testnet.steller", + "nid": "testnet.steller", + "horizon-url": "https://horizon-testnet.stellar.org", + "soroban-url": "https://soroban-testnet.stellar.org", + "start-height": 0, + "address": "GCQ5YPTO5ORNZ7WMADFAWP2D7NOJBZGDLWAUYNMSNLIHRNMSJXXFFWE3", + "max-inclusion-fee": 200, + "contracts": { + "xcall": "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDD", + "connection": "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDD" + }, + "block-interval": "5s", + "network-passphrase": "Test SDF Network ; September 2015" + } } - \ No newline at end of file From 9c7e4b43f96890e67551525a7762d56ea4f5d156 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Fri, 26 Apr 2024 15:20:58 +0545 Subject: [PATCH 17/46] fix: update soroban rpc implementation and implement decoding from xdr str to go types --- example/configs/steller.json | 4 +- go.mod | 5 +- go.sum | 10 ++- relayer/chains/steller/listener.go | 5 +- .../chains/steller/sorobanclient/client.go | 13 ++-- relayer/chains/steller/tx.go | 28 ++++++-- relayer/chains/steller/types/xdr.go | 64 +++++++++++++++++++ 7 files changed, 107 insertions(+), 22 deletions(-) create mode 100644 relayer/chains/steller/types/xdr.go diff --git a/example/configs/steller.json b/example/configs/steller.json index 46b147d1..b9941fa2 100644 --- a/example/configs/steller.json +++ b/example/configs/steller.json @@ -9,8 +9,8 @@ "address": "GCQ5YPTO5ORNZ7WMADFAWP2D7NOJBZGDLWAUYNMSNLIHRNMSJXXFFWE3", "max-inclusion-fee": 200, "contracts": { - "xcall": "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDD", - "connection": "CBYOTPGZTFRJPNXF57IA5VJ52NCZ3EQMJWEDAI7ZUZQ3KE2HB5227SDD" + "xcall": "CBD2YWKFJWNGD347TVKMFGQ6LSTPMVJ5QM5MLD62OLPKLMKIJWXJGK7O", + "connection": "CBD2YWKFJWNGD347TVKMFGQ6LSTPMVJ5QM5MLD62OLPKLMKIJWXJGK7O" }, "block-interval": "5s", "network-passphrase": "Test SDF Network ; September 2015" diff --git a/go.mod b/go.mod index bc17aedf..5d75140b 100644 --- a/go.mod +++ b/go.mod @@ -19,10 +19,9 @@ require ( github.com/json-iterator/go v1.1.12 github.com/jsternberg/zap-logfmt v1.3.0 github.com/pkg/errors v0.9.1 - github.com/sigurn/crc16 v0.0.0-20240131213347-83fcde1e29d1 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 - github.com/stellar/go v0.0.0-20240329200747-a30c441b6cd6 + github.com/stellar/go v0.0.0-20240425001602-ee9bbbf03be7 github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 github.com/stretchr/testify v1.8.4 github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d @@ -97,7 +96,7 @@ require ( go.opentelemetry.io/otel/metric v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/protobuf v1.33.0 // indirect diff --git a/go.sum b/go.sum index 914fac66..b3e2cb07 100644 --- a/go.sum +++ b/go.sum @@ -1807,8 +1807,6 @@ github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sigurn/crc16 v0.0.0-20240131213347-83fcde1e29d1 h1:NVK+OqnavpyFmUiKfUMHrpvbCi2VFoWTrcpI7aDaJ2I= -github.com/sigurn/crc16 v0.0.0-20240131213347-83fcde1e29d1/go.mod h1:9/etS5gpQq9BJsJMWg1wpLbfuSnkm8dPF6FdW2JXVhA= 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= @@ -1861,8 +1859,8 @@ github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobt github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= -github.com/stellar/go v0.0.0-20240329200747-a30c441b6cd6 h1:q4ULC3Noju198IpT6s4o4T2UuR/DiTjDe7b1LJsAQbk= -github.com/stellar/go v0.0.0-20240329200747-a30c441b6cd6/go.mod h1:ckzsX0B0qfTMVZQJtPELJLs7cJ6xXMYHPVLyIsReGsU= +github.com/stellar/go v0.0.0-20240425001602-ee9bbbf03be7 h1:GdvyV6jApjVjSlUqYkqGKQRmyO5xTWk2OAXmsTDMmv4= +github.com/stellar/go v0.0.0-20240425001602-ee9bbbf03be7/go.mod h1:akvnE6X/mbM4XFwlbF9D1/Wtgh65neAf5FXXQdcFjmY= github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 h1:OzCVd0SV5qE3ZcDeSFCmOWLZfEWZ3Oe8KtmSOYKEVWE= github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2/go.mod h1:yoxyU/M8nl9LKeWIoBrbDPQ7Cy+4jxRcWcOayZ4BMps= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -2219,8 +2217,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 432b55da..18ddb1a5 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -21,6 +21,8 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc if err := p.RestoreKeystore(ctx); err != nil { return fmt.Errorf("failed to restore key: %w", err) } + // p.QueryLastMessage() + go func() { //Todo remove: used temporarily for testing purpose only // time.Sleep(5 * time.Second) // if err := p.Route(ctx, &relayertypes.Message{ @@ -35,7 +37,6 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc // }); err != nil { // p.log.Error("error sending tx: ", zap.Error(err)) // } - }() latestLedger, err := p.client.GetLatestLedger(ctx) @@ -45,6 +46,8 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc latestSeq := latestLedger.Sequence + fmt.Println("last saved Seq: ", lastSavedLedgerSeq) + startSeq := latestSeq if lastSavedLedgerSeq != 0 && lastSavedLedgerSeq < latestSeq { startSeq = lastSavedLedgerSeq diff --git a/relayer/chains/steller/sorobanclient/client.go b/relayer/chains/steller/sorobanclient/client.go index 376a6b4b..53ac66c3 100644 --- a/relayer/chains/steller/sorobanclient/client.go +++ b/relayer/chains/steller/sorobanclient/client.go @@ -44,8 +44,9 @@ func (c *Client) SimulateTransaction(txnXdr string, resourceCfg *ResourceConfig) context.Background(), simResult, "simulateTransaction", - txnXdr, - resourceCfg, + map[string]interface{}{ + "transaction": txnXdr, + }, ); err != nil { return nil, err } @@ -55,18 +56,18 @@ func (c *Client) SimulateTransaction(txnXdr string, resourceCfg *ResourceConfig) func (c *Client) GetLatestLedger(ctx context.Context) (*LatestLedgerResponse, error) { ledgerRes := &LatestLedgerResponse{} - if err := c.CallContext(ctx, ledgerRes, "getLatestLedger"); err != nil { + if err := c.CallContext(ctx, ledgerRes, "getLatestLedger", nil); err != nil { return nil, err } return ledgerRes, nil } -func (c *Client) CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error { +func (c *Client) CallContext(ctx context.Context, result interface{}, method string, params interface{}) error { if result != nil && reflect.TypeOf(result).Kind() != reflect.Ptr { return fmt.Errorf("call result parameter must be pointer or nil interface: %v", result) } - msg, err := c.newMessage(method, args...) + msg, err := c.newMessage(method, params) if err != nil { return err } @@ -91,7 +92,7 @@ func (c *Client) CallContext(ctx context.Context, result interface{}, method str return json.Unmarshal(respmsg.Result, result) } -func (c *Client) newMessage(method string, paramsIn ...interface{}) (*jsonRPCRequest, error) { +func (c *Client) newMessage(method string, paramsIn interface{}) (*jsonRPCRequest, error) { msg := &jsonRPCRequest{Version: jsonRPCVersion, ID: c.nextID(), Method: method} if paramsIn != nil { // prevent sending "params":null var err error diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 70476b27..82fcd1ac 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -209,15 +209,15 @@ func (p *Provider) MessageReceived(ctx context.Context, key *relayertypes.Messag }, } - var isReceived bool + var isReceived types.ScvBool if err := p.queryContract(callArgs, &isReceived); err != nil { return false, err } - return isReceived, nil + return bool(isReceived), nil } -func (p *Provider) queryContract(callArgs xdr.InvokeContractArgs, dest interface{}) error { +func (p *Provider) queryContract(callArgs xdr.InvokeContractArgs, dest types.ScValConverter) error { sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) if err != nil { return err @@ -258,12 +258,32 @@ func (p *Provider) queryContract(callArgs xdr.InvokeContractArgs, dest interface if err != nil { return err } - if _, err := xdr3.Unmarshal(bytes.NewReader(resBytes), dest); err != nil { + var scVal xdr.ScVal + if _, err := xdr3.Unmarshal(bytes.NewReader(resBytes), &scVal); err != nil { return err } else { + if err := dest.Convert(scVal); err != nil { + return err + } break } } return nil } + +// Todo used for temporary purpose only: need to remove +func (p *Provider) QueryLastMessage() { + connAddr, _ := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) + callArgs := xdr.InvokeContractArgs{ + ContractAddress: *connAddr, + FunctionName: xdr.ScSymbol("get_last_message"), + } + + nm := types.NewMessage{} + if err := p.queryContract(callArgs, &nm); err != nil { + fmt.Println("Error occurred: ", err) + } + + fmt.Printf("\ngot new message: %+v\n", nm) +} diff --git a/relayer/chains/steller/types/xdr.go b/relayer/chains/steller/types/xdr.go new file mode 100644 index 00000000..1a8faaf7 --- /dev/null +++ b/relayer/chains/steller/types/xdr.go @@ -0,0 +1,64 @@ +package types + +import ( + "fmt" + + "github.com/stellar/go/xdr" +) + +const ( + ScValConversionErr = "ScVal conversion failed" +) + +// any type that needs conversion from ScVal should implement this interface +type ScValConverter interface { + Convert(val xdr.ScVal) error +} + +type ScvBool bool + +func (v *ScvBool) Convert(val xdr.ScVal) error { + b, ok := val.GetB() + if ok { + *v = ScvBool(b) + } else { + return fmt.Errorf("%s: got unexpected type: %s", ScValConversionErr, val.Type) + } + return nil +} + +// Todo need to remove: used just for testing purpose only +type NewMessage struct { + Sn uint64 + Src string + Dst string +} + +func (m *NewMessage) Convert(val xdr.ScVal) error { + for _, entry := range **val.Map { + switch entry.Key.String() { + case "sn": + snU32, ok := entry.Val.GetU32() + if ok { + m.Sn = uint64(snU32) + } else { + return fmt.Errorf("%s: got unexpected sn type: %s", ScValConversionErr, entry.Val.Type) + } + case "src": + srcStr, ok := entry.Val.GetStr() + if ok { + m.Src = string(srcStr) + } else { + return fmt.Errorf("%s: got unexpected src type: %s", ScValConversionErr, entry.Val.Type) + } + case "dst": + dstStr, ok := entry.Val.GetStr() + if ok { + m.Dst = string(dstStr) + } else { + return fmt.Errorf("%s: got unexpected dst type: %s", ScValConversionErr, entry.Val.Type) + } + } + } + return nil +} From dfa2c6a00c89f10712c0e381ac30403524ab3cfc Mon Sep 17 00:00:00 2001 From: sherpalden Date: Fri, 26 Apr 2024 15:33:22 +0545 Subject: [PATCH 18/46] fix: remove unused type --- relayer/chains/steller/types/types.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/relayer/chains/steller/types/types.go b/relayer/chains/steller/types/types.go index e2d0009d..136c1f6a 100644 --- a/relayer/chains/steller/types/types.go +++ b/relayer/chains/steller/types/types.go @@ -22,13 +22,3 @@ type LedgerSeqBatch struct { FromSeq uint64 ToSeq uint64 } - -type ScMessage struct { - Dst xdr.ScString - Src xdr.ScString - Sn xdr.Uint64 - Data xdr.ScBytes - MessageHeight xdr.Uint64 - EventType xdr.ScString - ReqID xdr.Uint64 -} From db7acb0f26424f0d5e3509df8338a9bcbb3c8d2d Mon Sep 17 00:00:00 2001 From: sherpalden Date: Mon, 29 Apr 2024 12:40:39 +0545 Subject: [PATCH 19/46] chore: remove temporary code --- relayer/chains/steller/listener.go | 21 ----------------- relayer/chains/steller/tx.go | 26 +-------------------- relayer/chains/steller/types/xdr.go | 36 ----------------------------- 3 files changed, 1 insertion(+), 82 deletions(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 18ddb1a5..8c8f484a 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -21,23 +21,6 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc if err := p.RestoreKeystore(ctx); err != nil { return fmt.Errorf("failed to restore key: %w", err) } - // p.QueryLastMessage() - - go func() { //Todo remove: used temporarily for testing purpose only - // time.Sleep(5 * time.Second) - // if err := p.Route(ctx, &relayertypes.Message{ - // Dst: "icon", - // Data: []byte("hello"), - // }, func(key *relayertypes.MessageKey, response *relayertypes.TxResponse, err error) { - // if err != nil { - // p.log.Info("message relay failed", zap.String("src", "steller"), zap.String("dst", "icon"), zap.Int64("height", response.Height), zap.String("hash", response.TxHash), zap.Error(err)) - // } else { - // p.log.Info("message relay successfull", zap.String("src", "steller"), zap.String("dst", "icon"), zap.Int64("height", response.Height), zap.String("hash", response.TxHash)) - // } - // }); err != nil { - // p.log.Error("error sending tx: ", zap.Error(err)) - // } - }() latestLedger, err := p.client.GetLatestLedger(ctx) if err != nil { @@ -46,8 +29,6 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc latestSeq := latestLedger.Sequence - fmt.Println("last saved Seq: ", lastSavedLedgerSeq) - startSeq := latestSeq if lastSavedLedgerSeq != 0 && lastSavedLedgerSeq < latestSeq { startSeq = lastSavedLedgerSeq @@ -210,8 +191,6 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype var eventType string for _, topic := range ev.Body.V0.Topics { switch topic.String() { - case "new_message": //used only for testing; need to remove - eventType = "new_message" case "emitMessage": eventType = relayerevents.EmitMessage case "callMessage": diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 82fcd1ac..488b257b 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -151,15 +151,7 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon }, }, nil default: - return &xdr.InvokeContractArgs{ //temporarily used for testing - ContractAddress: *scConnAddr, - FunctionName: xdr.ScSymbol("new_message"), - Args: []xdr.ScVal{ - stellerMsg.ScvDst(), - stellerMsg.ScvData(), - }, - }, nil - // return nil, fmt.Errorf("invalid message type") + return nil, fmt.Errorf("invalid message type") } } @@ -271,19 +263,3 @@ func (p *Provider) queryContract(callArgs xdr.InvokeContractArgs, dest types.ScV return nil } - -// Todo used for temporary purpose only: need to remove -func (p *Provider) QueryLastMessage() { - connAddr, _ := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) - callArgs := xdr.InvokeContractArgs{ - ContractAddress: *connAddr, - FunctionName: xdr.ScSymbol("get_last_message"), - } - - nm := types.NewMessage{} - if err := p.queryContract(callArgs, &nm); err != nil { - fmt.Println("Error occurred: ", err) - } - - fmt.Printf("\ngot new message: %+v\n", nm) -} diff --git a/relayer/chains/steller/types/xdr.go b/relayer/chains/steller/types/xdr.go index 1a8faaf7..44ef3bdc 100644 --- a/relayer/chains/steller/types/xdr.go +++ b/relayer/chains/steller/types/xdr.go @@ -26,39 +26,3 @@ func (v *ScvBool) Convert(val xdr.ScVal) error { } return nil } - -// Todo need to remove: used just for testing purpose only -type NewMessage struct { - Sn uint64 - Src string - Dst string -} - -func (m *NewMessage) Convert(val xdr.ScVal) error { - for _, entry := range **val.Map { - switch entry.Key.String() { - case "sn": - snU32, ok := entry.Val.GetU32() - if ok { - m.Sn = uint64(snU32) - } else { - return fmt.Errorf("%s: got unexpected sn type: %s", ScValConversionErr, entry.Val.Type) - } - case "src": - srcStr, ok := entry.Val.GetStr() - if ok { - m.Src = string(srcStr) - } else { - return fmt.Errorf("%s: got unexpected src type: %s", ScValConversionErr, entry.Val.Type) - } - case "dst": - dstStr, ok := entry.Val.GetStr() - if ok { - m.Dst = string(dstStr) - } else { - return fmt.Errorf("%s: got unexpected dst type: %s", ScValConversionErr, entry.Val.Type) - } - } - } - return nil -} From 89016943ffd684d23ae90c96d09768ca99b1217e Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Wed, 8 May 2024 18:03:25 +0545 Subject: [PATCH 20/46] feat: added code to execute call and recv message based on events for stellar chain and other misc functionalities --- cmd/config.go | 2 +- relayer/chains/steller/client.go | 3 +- relayer/chains/steller/listener.go | 56 ++++++------ relayer/chains/steller/provider.go | 70 ++++++++++++--- relayer/chains/steller/tx.go | 117 +++++++++++++++++++++++--- relayer/chains/steller/types/msg.go | 10 ++- relayer/chains/steller/types/types.go | 2 +- relayer/chains/steller/types/xdr.go | 13 +++ 8 files changed, 214 insertions(+), 59 deletions(-) diff --git a/cmd/config.go b/cmd/config.go index 663a6b80..626b807d 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -252,7 +252,7 @@ func (iw *ProviderConfigYAMLWrapper) UnmarshalYAML(n *yaml.Node) error { iw.Value = new(evm.Config) case "cosmos": iw.Value = new(wasm.ProviderConfig) - case "steller": + case "stellar": iw.Value = new(steller.Config) default: return fmt.Errorf("%s is an invalid chain type, check your config file", iw.Type) diff --git a/relayer/chains/steller/client.go b/relayer/chains/steller/client.go index 4c0e9a22..2519ff4c 100644 --- a/relayer/chains/steller/client.go +++ b/relayer/chains/steller/client.go @@ -58,7 +58,8 @@ func (cl *Client) GetLatestLedger(ctx context.Context) (*sorobanclient.LatestLed func (cl *Client) FetchEvents(ctx context.Context, eventFilter types.EventFilter) ([]types.Event, error) { req := horizonclient.TransactionRequest{ - ForLedger: uint(eventFilter.LedgerSeq), + ForLedger: uint(eventFilter.LedgerSeq), + IncludeFailed: false, } txnPage, err := cl.horizon.Transactions(req) if err != nil { diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 8c8f484a..62d1c601 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -1,9 +1,7 @@ package steller import ( - "bytes" "context" - "encoding/hex" "fmt" "runtime" "time" @@ -13,7 +11,6 @@ import ( relayertypes "github.com/icon-project/centralized-relay/relayer/types" "github.com/icon-project/centralized-relay/utils/concurrency" "github.com/icon-project/centralized-relay/utils/sorter" - xdr3 "github.com/stellar/go-xdr/xdr3" "go.uber.org/zap" ) @@ -21,7 +18,6 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc if err := p.RestoreKeystore(ctx); err != nil { return fmt.Errorf("failed to restore key: %w", err) } - latestLedger, err := p.client.GetLatestLedger(ctx) if err != nil { return err @@ -169,8 +165,8 @@ func (p *Provider) getLedgerInfoStream(done <-chan interface{}, seqStream <-chan func (p *Provider) fetchLedgerMessages(ctx context.Context, ledgerSeq uint64) ([]*relayertypes.Message, error) { eventFilter := types.EventFilter{ LedgerSeq: ledgerSeq, - ContractIds: []string{p.cfg.Contracts[relayertypes.ConnectionContract]}, - Topics: []string{"new_message"}, + ContractIds: []string{p.cfg.Contracts[relayertypes.ConnectionContract], p.cfg.Contracts[relayertypes.XcallContract]}, + Topics: []string{"EmitMessage", "CallMessage"}, } events, err := p.client.FetchEvents(ctx, eventFilter) if err != nil { @@ -191,9 +187,9 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype var eventType string for _, topic := range ev.Body.V0.Topics { switch topic.String() { - case "emitMessage": + case "EmitMessage": eventType = relayerevents.EmitMessage - case "callMessage": + case "CallMessage": eventType = relayerevents.CallMessage } } @@ -207,46 +203,48 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype EventType: eventType, MessageHeight: ev.LedgerSeq, } - scval := ev.Body.V0.Data scMap, ok := scval.GetMap() if !ok { continue } - for _, mapItem := range *scMap { - valBytes, err := mapItem.Val.MarshalBinary() - if err != nil { - return nil, err - } - decoder := xdr3.NewDecoder(bytes.NewBuffer(valBytes)) switch mapItem.Key.String() { case "sn": - intVal, _, err := decoder.DecodeInt() - if err != nil { - return nil, fmt.Errorf("failed to decode sn: %v", err) + sn, ok := mapItem.Val.GetU128() + if !ok { + return nil, fmt.Errorf("failed to decode sn") } - msg.Sn = uint64(intVal) - case "reqId": - intVal, _, err := decoder.DecodeInt() - if err != nil { - return nil, fmt.Errorf("failed to decode reqId: %v", err) + msg.Sn = uint64(sn.Lo) + case "req_id": + reqId, ok := mapItem.Val.GetU128() + if !ok { + return nil, fmt.Errorf("failed to decode req_id") } - msg.ReqID = uint64(intVal) - case "src": + msg.ReqID = uint64(reqId.Lo) + case "from": msg.Src = mapItem.Val.String() - case "dst": + case "to": msg.Dst = mapItem.Val.String() + case "msg": + data, ok := mapItem.Val.GetBytes() + if !ok { + return nil, fmt.Errorf("failed to decode data") + } + msg.Data = data case "data": - data, err := hex.DecodeString(mapItem.Val.String()) - if err != nil { - return nil, fmt.Errorf("failed to decode data: %v", err) + data, ok := mapItem.Val.GetBytes() + if !ok { + return nil, fmt.Errorf("failed to decode data") } msg.Data = data } } //skip invalid message + if msg.Src == "" && msg.Dst != "" { + msg.Src = p.cfg.NID + } if msg.Sn == 0 || msg.Src == "" || msg.Dst == "" { p.log.Warn("detected invalid message: ", zap.Any("msg", msg)) continue diff --git a/relayer/chains/steller/provider.go b/relayer/chains/steller/provider.go index c4f520b0..8aa41ace 100644 --- a/relayer/chains/steller/provider.go +++ b/relayer/chains/steller/provider.go @@ -2,11 +2,13 @@ package steller import ( "context" + "fmt" "math/big" "strconv" "sync" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" + evtypes "github.com/icon-project/centralized-relay/relayer/events" "github.com/icon-project/centralized-relay/relayer/kms" "github.com/icon-project/centralized-relay/relayer/provider" relayertypes "github.com/icon-project/centralized-relay/relayer/types" @@ -41,6 +43,9 @@ func (p *Provider) Name() string { func (p *Provider) Init(ctx context.Context, homePath string, kms kms.KMS) error { p.kms = kms + if err := p.RestoreKeystore(context.Background()); err != nil { + return nil + } return nil } @@ -61,33 +66,76 @@ func (p *Provider) FinalityBlock(ctx context.Context) uint64 { } func (p *Provider) GenerateMessages(ctx context.Context, messageKey *relayertypes.MessageKeyWithMessageHeight) ([]*relayertypes.Message, error) { - //Todo return nil, nil } func (p *Provider) SetAdmin(ctx context.Context, admin string) error { - //Todo - return nil + message := &relayertypes.Message{ + EventType: evtypes.SetAdmin, + Src: admin, + } + callArgs, err := p.newMiscContractCallArgs(*message) + if err != nil { + return err + } + _, err = p.sendCallTransaction(*callArgs) + fmt.Println(err) + return err } func (p *Provider) RevertMessage(ctx context.Context, sn *big.Int) error { - //Todo - return nil + message := &relayertypes.Message{ + EventType: evtypes.RevertMessage, + Sn: sn.Uint64(), + } + callArgs, err := p.newMiscContractCallArgs(*message) + if err != nil { + return err + } + _, err = p.sendCallTransaction(*callArgs) + return err } func (p *Provider) GetFee(ctx context.Context, networkID string, responseFee bool) (uint64, error) { - //Todo - return 0, nil + message := &relayertypes.Message{ + EventType: evtypes.GetFee, + Src: networkID, + } + callArgs, err := p.newMiscContractCallArgs(*message, responseFee) + if err != nil { + return 0, err + } + var fee types.ScvU64F128 + err = p.queryContract(*callArgs, &fee) + return uint64(fee), err } func (p *Provider) SetFee(ctx context.Context, networkID string, msgFee, resFee uint64) error { - //Todo - return nil + message := &relayertypes.Message{ + EventType: evtypes.SetFee, + Src: networkID, + Sn: msgFee, + ReqID: resFee, + } + callArgs, err := p.newMiscContractCallArgs(*message) + if err != nil { + return err + } + _, err = p.sendCallTransaction(*callArgs) + return err } func (p *Provider) ClaimFee(ctx context.Context) error { - //Todo - return nil + + message := &relayertypes.Message{ + EventType: evtypes.ClaimFee, + } + callArgs, err := p.newMiscContractCallArgs(*message) + if err != nil { + return err + } + _, err = p.sendCallTransaction(*callArgs) + return err } func (p *Provider) QueryBalance(ctx context.Context, addr string) (*relayertypes.Coin, error) { diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 488b257b..95cff9f5 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -22,13 +22,16 @@ func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, cal if err != nil { return err } - txRes, err := p.sendCallTransaction(*callArgs) - cbTxResp := &relayertypes.TxResponse{} + responseCode := relayertypes.Failed + if txRes != nil && txRes.Successful { + responseCode = relayertypes.Success + } if txRes != nil { cbTxResp.Height = int64(txRes.Ledger) cbTxResp.TxHash = txRes.Hash + cbTxResp.Code = responseCode } var cbErr error @@ -46,14 +49,12 @@ func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, cal func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizon.Transaction, error) { p.txmut.Lock() defer p.txmut.Unlock() - callOp := txnbuild.InvokeHostFunction{ HostFunction: xdr.HostFunction{ Type: xdr.HostFunctionTypeHostFunctionTypeInvokeContract, InvokeContract: &callArgs, }, } - sourceAccount, err := p.client.AccountDetail(p.wallet.Address()) if err != nil { return nil, err @@ -61,7 +62,6 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo if _, err := sourceAccount.IncrementSequenceNumber(); err != nil { return nil, err } - txParam := txnbuild.TransactionParams{ SourceAccount: &sourceAccount, IncrementSequenceNum: false, @@ -84,7 +84,6 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo if err != nil { return nil, err } - var sorobanTxnData xdr.SorobanTransactionData if err := xdr.SafeUnmarshalBase64(simres.TransactionDataXDR, &sorobanTxnData); err != nil { return nil, err @@ -94,12 +93,27 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo V: 1, SorobanData: &sorobanTxnData, } - + var auth []xdr.SorobanAuthorizationEntry + for _, res := range simres.Results { + var decodedRes xdr.ScVal + err := xdr.SafeUnmarshalBase64(res.Xdr, &decodedRes) + if err != nil { + return nil, err + } + for _, authBase64 := range res.Auth { + var authEntry xdr.SorobanAuthorizationEntry + err = xdr.SafeUnmarshalBase64(authBase64, &authEntry) + if err != nil { + return nil, err + } + auth = append(auth, authEntry) + } + } + callOp.Auth = auth minResourceFee, err := strconv.Atoi(simres.MinResourceFee) if err != nil { return nil, err } - txParam.BaseFee = int64(minResourceFee) + int64(p.cfg.MaxInclusionFee) tx, err := txnbuild.NewTransaction(txParam) @@ -115,7 +129,6 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo return nil, err } txRes, err := p.client.SubmitTransactionXDR(txe) - return &txRes, err } @@ -137,8 +150,8 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon ContractAddress: *scConnAddr, FunctionName: xdr.ScSymbol("recv_message"), Args: []xdr.ScVal{ - stellerMsg.ScvSn(), stellerMsg.ScvSrc(), + stellerMsg.ScvSn(), stellerMsg.ScvData(), }, }, nil @@ -148,6 +161,84 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon FunctionName: xdr.ScSymbol("execute_call"), Args: []xdr.ScVal{ stellerMsg.ScvReqID(), + stellerMsg.ScvData(), + }, + }, nil + default: + return nil, fmt.Errorf("invalid message type") + } +} + +func (p *Provider) newMiscContractCallArgs(msg relayertypes.Message, params ...interface{}) (*xdr.InvokeContractArgs, error) { + scXcallAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.XcallContract]) + if err != nil { + return nil, err + } + scConnAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) + if err != nil { + return nil, err + } + + stellerMsg := types.StellerMsg{Message: msg} + + switch msg.EventType { + case evtypes.GetFee: + rollBackVal := params[0].(bool) + rollbackParam := xdr.ScVal{ + Type: xdr.ScValTypeScvBool, + B: &rollBackVal, + } + src := &xdr.ScVec{} + sources := xdr.ScVal{ + Type: xdr.ScValTypeScvVec, + Vec: &src, + } + return &xdr.InvokeContractArgs{ + ContractAddress: *scXcallAddr, + FunctionName: xdr.ScSymbol("get_fee"), + Args: []xdr.ScVal{ + stellerMsg.ScvSrc(), + rollbackParam, + sources, + }, + }, nil + case evtypes.SetFee: + return &xdr.InvokeContractArgs{ + ContractAddress: *scConnAddr, + FunctionName: xdr.ScSymbol("set_fee"), + Args: []xdr.ScVal{ + stellerMsg.ScvSrc(), + stellerMsg.ScvSn(), + stellerMsg.ScvReqID(), + }, + }, nil + case evtypes.SetAdmin: + adminAddress := stellerMsg.Src + acc := xdr.MustAddressPtr(adminAddress) + adminAddressVal := xdr.ScVal{ + Type: xdr.ScValTypeScvAddress, + Address: &xdr.ScAddress{ + AccountId: acc, + }, + } + return &xdr.InvokeContractArgs{ + ContractAddress: *scXcallAddr, + FunctionName: xdr.ScSymbol("set_admin"), + Args: []xdr.ScVal{ + adminAddressVal, + }, + }, nil + case evtypes.ClaimFee: + return &xdr.InvokeContractArgs{ + ContractAddress: *scConnAddr, + FunctionName: xdr.ScSymbol("claim_fees"), + }, nil + case evtypes.RevertMessage: + return &xdr.InvokeContractArgs{ + ContractAddress: *scXcallAddr, + FunctionName: xdr.ScSymbol("revert_message"), + Args: []xdr.ScVal{ + stellerMsg.ScvSn(), }, }, nil default: @@ -194,10 +285,10 @@ func (p *Provider) MessageReceived(ctx context.Context, key *relayertypes.Messag } callArgs := xdr.InvokeContractArgs{ ContractAddress: *connAddr, - FunctionName: xdr.ScSymbol("getReceipts"), + FunctionName: xdr.ScSymbol("get_receipt"), Args: []xdr.ScVal{ - stellerMsg.ScvSn(), stellerMsg.ScvSrc(), + stellerMsg.ScvSn(), }, } @@ -239,12 +330,10 @@ func (p *Provider) queryContract(callArgs xdr.InvokeContractArgs, dest types.ScV if err != nil { return err } - queryRes, err := p.client.SimulateTransaction(queryTxe) if err != nil { return err } - for _, callResult := range queryRes.Results { resBytes, err := base64.StdEncoding.DecodeString(callResult.Xdr) if err != nil { diff --git a/relayer/chains/steller/types/msg.go b/relayer/chains/steller/types/msg.go index 727a8a5f..b5223cb9 100644 --- a/relayer/chains/steller/types/msg.go +++ b/relayer/chains/steller/types/msg.go @@ -10,7 +10,10 @@ type StellerMsg struct { } func (m StellerMsg) ScvSn() xdr.ScVal { - scVal, _ := xdr.NewScVal(xdr.ScValTypeScvU64, xdr.Uint64(m.Sn)) + scVal, _ := xdr.NewScVal(xdr.ScValTypeScvU128, xdr.UInt128Parts{ + Hi: xdr.Uint64(0), + Lo: xdr.Uint64(m.Sn), + }) return scVal } @@ -20,7 +23,10 @@ func (m StellerMsg) ScvMessageHeight() xdr.ScVal { } func (m StellerMsg) ScvReqID() xdr.ScVal { - scVal, _ := xdr.NewScVal(xdr.ScValTypeScvU64, xdr.Uint64(m.ReqID)) + scVal, _ := xdr.NewScVal(xdr.ScValTypeScvU128, xdr.UInt128Parts{ + Hi: xdr.Uint64(0), + Lo: xdr.Uint64(m.ReqID), + }) return scVal } diff --git a/relayer/chains/steller/types/types.go b/relayer/chains/steller/types/types.go index 136c1f6a..0868d2cd 100644 --- a/relayer/chains/steller/types/types.go +++ b/relayer/chains/steller/types/types.go @@ -3,7 +3,7 @@ package types import "github.com/stellar/go/xdr" const ( - ChainType = "steller" + ChainType = "stellar" LedgerSeqBatchSize = 50 // the number of ledger sequences to query concurrently for listener ) diff --git a/relayer/chains/steller/types/xdr.go b/relayer/chains/steller/types/xdr.go index 44ef3bdc..9bc14af1 100644 --- a/relayer/chains/steller/types/xdr.go +++ b/relayer/chains/steller/types/xdr.go @@ -26,3 +26,16 @@ func (v *ScvBool) Convert(val xdr.ScVal) error { } return nil } + +type ScvU64F128 uint64 + +func (v *ScvU64F128) Convert(val xdr.ScVal) error { + parts, ok := val.GetU128() + _ = parts + if ok { + *v = ScvU64F128(parts.Lo) + } else { + return fmt.Errorf("%s: got unexpected type: %s", ScValConversionErr, val.Type) + } + return nil +} From c29ac65e814fd8d740f26681dc9b0ffc40a95520 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Fri, 17 May 2024 22:43:22 +0545 Subject: [PATCH 21/46] chore: updated events and params as per new contracts --- relayer/chains/steller/listener.go | 19 ++++++------------- relayer/chains/steller/provider.go | 2 -- relayer/chains/steller/tx.go | 8 +++++++- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 62d1c601..91b2fb78 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -166,13 +166,12 @@ func (p *Provider) fetchLedgerMessages(ctx context.Context, ledgerSeq uint64) ([ eventFilter := types.EventFilter{ LedgerSeq: ledgerSeq, ContractIds: []string{p.cfg.Contracts[relayertypes.ConnectionContract], p.cfg.Contracts[relayertypes.XcallContract]}, - Topics: []string{"EmitMessage", "CallMessage"}, + Topics: []string{"Message", "CallMessage"}, } events, err := p.client.FetchEvents(ctx, eventFilter) if err != nil { return nil, err } - messages, err := p.parseMessagesFromEvents(events) for _, msg := range messages { p.log.Info("detected event log:", zap.Any("event", *msg)) @@ -187,7 +186,7 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype var eventType string for _, topic := range ev.Body.V0.Topics { switch topic.String() { - case "EmitMessage": + case "Message": eventType = relayerevents.EmitMessage case "CallMessage": eventType = relayerevents.CallMessage @@ -210,13 +209,13 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype } for _, mapItem := range *scMap { switch mapItem.Key.String() { - case "sn": + case "connSn", "sn": sn, ok := mapItem.Val.GetU128() if !ok { return nil, fmt.Errorf("failed to decode sn") } msg.Sn = uint64(sn.Lo) - case "req_id": + case "reqId": reqId, ok := mapItem.Val.GetU128() if !ok { return nil, fmt.Errorf("failed to decode req_id") @@ -224,15 +223,9 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype msg.ReqID = uint64(reqId.Lo) case "from": msg.Src = mapItem.Val.String() - case "to": + case "targetNetwork", "to": msg.Dst = mapItem.Val.String() - case "msg": - data, ok := mapItem.Val.GetBytes() - if !ok { - return nil, fmt.Errorf("failed to decode data") - } - msg.Data = data - case "data": + case "msg", "data": data, ok := mapItem.Val.GetBytes() if !ok { return nil, fmt.Errorf("failed to decode data") diff --git a/relayer/chains/steller/provider.go b/relayer/chains/steller/provider.go index 8aa41ace..108f567b 100644 --- a/relayer/chains/steller/provider.go +++ b/relayer/chains/steller/provider.go @@ -2,7 +2,6 @@ package steller import ( "context" - "fmt" "math/big" "strconv" "sync" @@ -79,7 +78,6 @@ func (p *Provider) SetAdmin(ctx context.Context, admin string) error { return err } _, err = p.sendCallTransaction(*callArgs) - fmt.Println(err) return err } diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 95cff9f5..b40f846a 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -141,7 +141,6 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon if err != nil { return nil, err } - stellerMsg := types.StellerMsg{Message: msg} switch msg.EventType { @@ -156,10 +155,17 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon }, }, nil case evtypes.CallMessage: + acc := xdr.MustAddressPtr(p.cfg.Address) return &xdr.InvokeContractArgs{ ContractAddress: *scXcallAddr, FunctionName: xdr.ScSymbol("execute_call"), Args: []xdr.ScVal{ + { + Type: xdr.ScValTypeScvAddress, + Address: &xdr.ScAddress{ + AccountId: acc, + }, + }, stellerMsg.ScvReqID(), stellerMsg.ScvData(), }, From 4f7f894cf85d84074d3a369c17ecc2e24f58e2da Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Mon, 20 May 2024 11:23:42 +0545 Subject: [PATCH 22/46] chore: added conversion to byte --- relayer/chains/steller/listener.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 91b2fb78..a6a1cc68 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -230,7 +230,7 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype if !ok { return nil, fmt.Errorf("failed to decode data") } - msg.Data = data + msg.Data = []byte(data) } } From 5ddff14c2fdc8ea4fd4e9bd4c829cea0caadde97 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Mon, 20 May 2024 16:30:31 +0545 Subject: [PATCH 23/46] chore: updated go mod for stellar --- go.mod | 36 +++++++++++--------- go.sum | 102 +++++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 91 insertions(+), 47 deletions(-) diff --git a/go.mod b/go.mod index 62507c5c..dfcbf52f 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,8 @@ require ( github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 + github.com/stellar/go v0.0.0-20240517163948-afd526d41b2d + github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 github.com/stretchr/testify v1.9.0 github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d go.uber.org/zap v1.27.0 @@ -27,6 +29,8 @@ require ( ) require ( + cloud.google.com/go/auth v0.3.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect cosmossdk.io/x/upgrade v0.1.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.9 // indirect @@ -47,6 +51,8 @@ require ( github.com/evalphobia/logrus_fluent v0.5.4 // indirect github.com/fluent/fluent-logger-golang v1.9.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect + github.com/go-chi/chi v4.1.2+incompatible // indirect + github.com/go-errors/errors v1.5.1 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.1 // indirect @@ -75,10 +81,11 @@ require ( github.com/prometheus/statsd_exporter v0.26.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/stretchr/objx v0.5.1 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/tinylib/msgp v1.1.9 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -96,18 +103,17 @@ require ( golang.org/x/net v0.24.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/go-playground/validator.v9 v9.31.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) require ( - cloud.google.com/go v0.112.1 // indirect - cloud.google.com/go/compute v1.24.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.6 // indirect - cloud.google.com/go/storage v1.39.0 // indirect + cloud.google.com/go v0.112.2 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect + cloud.google.com/go/iam v1.1.8 // indirect + cloud.google.com/go/storage v1.40.0 // indirect cosmossdk.io/api v0.7.4 // indirect cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/core v0.11.0 // indirect @@ -137,7 +143,7 @@ require ( github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.3 // indirect - github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect @@ -191,7 +197,7 @@ require ( github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.3 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect @@ -241,7 +247,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rivo/uniseg v0.4.3 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/rs/cors v1.8.3 // indirect + github.com/rs/cors v1.10.1 // indirect github.com/rs/zerolog v1.32.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect @@ -261,15 +267,15 @@ require ( go.etcd.io/bbolt v1.3.8 // indirect golang.org/x/crypto v0.22.0 // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/term v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.20.0 // indirect - google.golang.org/api v0.167.0 // indirect - google.golang.org/genproto v0.0.0-20240228224816-df926f6c8641 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240228224816-df926f6c8641 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect + google.golang.org/api v0.177.0 // indirect + google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gotest.tools/v3 v3.5.1 // indirect nhooyr.io/websocket v1.8.6 // indirect diff --git a/go.sum b/go.sum index a9e6d39b..1f54a198 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= -cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= +cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= +cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -46,6 +46,10 @@ cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjby cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/auth v0.3.0 h1:PRyzEpGfx/Z9e8+lHsbkoUVXD0gnu4MNmm7Gp8TQNIs= +cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= @@ -68,10 +72,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= @@ -109,8 +111,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= +cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -171,8 +173,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.39.0 h1:brbjUa4hbDHhpQf48tjqMaXEV+f1OGoaTmQau9tmCsA= -cloud.google.com/go/storage v1.39.0/go.mod h1:OAEj/WZwUYjA3YHQ10/YcN9ttGuEpLwvaoyBXIPikEk= +cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw= +cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= @@ -252,12 +254,16 @@ github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f h1:zvClvFQwU++UpIUBGC8YmDlfhUrweEy1R1Fj1gu5iIM= +github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/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= @@ -510,6 +516,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= @@ -527,6 +535,8 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955 h1:gmtGRvSexPU4B1T/yYo0sLOKzER1YT+b4kPxPpm0Ty4= +github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= @@ -539,8 +549,10 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm 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-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= +github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= +github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -723,8 +735,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -820,6 +832,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icon-project/goloop v1.3.11 h1:Lry7rCM9QeZudiAqi7n7CqmoOsg7qNDwrw6O12j7vuo= github.com/icon-project/goloop v1.3.11/go.mod h1:9PoWRb5kowidc9jYy0RLuLpay1zT5FXgEKijx7rDQjE= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= 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= @@ -828,6 +842,8 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jarcoal/httpmock v0.0.0-20161210151336-4442edb3db31 h1:Aw95BEvxJ3K6o9GGv5ppCd1P8hkeIeEJ30FO+OhOJpM= +github.com/jarcoal/httpmock v0.0.0-20161210151336-4442edb3db31/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/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= @@ -886,8 +902,8 @@ github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2 github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= @@ -900,6 +916,8 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V 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/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 h1:ykXz+pRRTibcSjG1yRhpdSHInF8yZY/mfn+Rz2Nd1rE= +github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739/go.mod h1:zUx1mhth20V3VKgL5jbd1BSQcW4Fy6Qs4PZvQwRFwzM= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -948,6 +966,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db h1:eZgFHVkk9uOTaOQLC6tgjkzdp7Ays8eEVecBcfHZlJQ= +github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1094,8 +1114,8 @@ github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/f github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= @@ -1113,6 +1133,10 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 h1:S4OC0+OBKz6mJnzuHioeEat74PuQ4Sgvbf8eus695sc= +github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2/go.mod h1:8zLRYR5npGjaOXgPSKat5+oOh+UHd8OdbS18iqX9F6Y= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= @@ -1153,6 +1177,10 @@ github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stellar/go v0.0.0-20240517163948-afd526d41b2d h1:6GjK/PKeInOLDu+2Gy15/2RIxnsFBmfIQB3WrO50CqU= +github.com/stellar/go v0.0.0-20240517163948-afd526d41b2d/go.mod h1:TuXKLL7WViqwrvpWno2I4UYGn2Ny9KZld1jUIN6fnK8= +github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 h1:OzCVd0SV5qE3ZcDeSFCmOWLZfEWZ3Oe8KtmSOYKEVWE= +github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2/go.mod h1:yoxyU/M8nl9LKeWIoBrbDPQ7Cy+4jxRcWcOayZ4BMps= 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= @@ -1213,6 +1241,8 @@ github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= +github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= @@ -1220,6 +1250,14 @@ github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+ github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/xdrpp/goxdr v0.1.1 h1:E1B2c6E8eYhOVyd7yEpOyopzTPirUeF6mVOfXfGyJyc= +github.com/xdrpp/goxdr v0.1.1/go.mod h1:dXo1scL/l6s7iME1gxHWo2XCppbHEKZS7m/KyYWkNzA= +github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076 h1:KM4T3G70MiR+JtqplcYkNVoNz7pDwYaBxWBXQK804So= +github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c h1:XZWnr3bsDQWAZg4Ne+cPoXRPILrNlPNQfxBuwLl43is= +github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20161231055540-f06f290571ce h1:cVSRGH8cOveJNwFEEZLXtB+XMnRqKLjUP6V/ZFYQCXI= +github.com/xeipuuv/gojsonschema v0.0.0-20161231055540-f06f290571ce/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= @@ -1265,8 +1303,8 @@ go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= -go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= @@ -1431,8 +1469,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1698,8 +1736,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.167.0 h1:CKHrQD1BLRii6xdkatBDXyKzM0mkawt2QP+H3LtPmSE= -google.golang.org/api v0.167.0/go.mod h1:4FcBc686KFi7QI/U51/2GKKevfZMpM17sCdibqe/bSA= +google.golang.org/api v0.177.0 h1:8a0p/BbPa65GlqGWtUKxot4p0TV8OGOfyTjtmkXNXmk= +google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= 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= @@ -1817,12 +1855,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20240228224816-df926f6c8641 h1:GihpvzHjeZHw+/mzsWpdxwr1LaG6E3ff/gyeZlVHbyc= -google.golang.org/genproto v0.0.0-20240228224816-df926f6c8641/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240228224816-df926f6c8641 h1:SO1wX9btGFrwj9EzH3ocqfwiPVOxfv4ggAJajzlHA5s= -google.golang.org/genproto/googleapis/api v0.0.0-20240228224816-df926f6c8641/go.mod h1:wLupoVsUfYPgOMwjzhYFbaVklw/INms+dqTp0tc1fv8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda h1:wu/KJm9KJwpfHWhkkZGohVC6KRrc1oJNr4jwtQMOQXw= +google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= +google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 h1:DTJM0R8LECCgFeUwApvcEJHz85HLagW8uRENYxHh1ww= +google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 h1:DujSIu+2tC9Ht0aPNA7jgj23Iq8Ewi5sgkQ++wdvonE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= 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= @@ -1882,8 +1920,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From a604694c5eacb4aeb2c85ce4672d593db7d6e113 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Mon, 20 May 2024 16:34:00 +0545 Subject: [PATCH 24/46] chore: fixed import --- cmd/config.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmd/config.go b/cmd/config.go index 43b5c1ad..3db57e08 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -9,11 +9,8 @@ import ( jsoniter "github.com/json-iterator/go" -<<<<<<< HEAD "github.com/icon-project/centralized-relay/relayer/chains/steller" -======= "github.com/icon-project/centralized-relay/relayer/chains/sui" ->>>>>>> feature/sui-integration "github.com/icon-project/centralized-relay/relayer/chains/wasm" "github.com/icon-project/centralized-relay/relayer" From 772cfe762553e826f7a8e56c64044000aa51fe00 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Tue, 21 May 2024 10:46:21 +0545 Subject: [PATCH 25/46] feat: added e2e testing integration for stellar chain --- test/chains/stellar/client.go | 236 ++++++++ test/chains/stellar/jsonrpc.go | 43 ++ test/chains/stellar/msg.go | 20 + test/chains/stellar/remotenet.go | 546 ++++++++++++++++++ test/chains/stellar/types.go | 34 ++ test/go.mod | 48 +- test/go.sum | 137 +++-- test/interchaintest/ibc/chain.go | 3 - .../centralized/centralized_relayer.go | 19 + ...D6HOQDRZVOUWNSQWP6OLYBIQ3XNPFKQ47G42H7WCGA | Bin 0 -> 140 bytes ...DRZVOUWNSQWP6OLYBIQ3XNPFKQ47G42H7WCGA.pass | Bin 0 -> 115 bytes test/sample-config.yaml | 123 ++-- test/testsuite/e2e_suite.go | 26 - test/testsuite/testsuite.go | 4 + 14 files changed, 1097 insertions(+), 142 deletions(-) create mode 100644 test/chains/stellar/client.go create mode 100644 test/chains/stellar/jsonrpc.go create mode 100644 test/chains/stellar/msg.go create mode 100644 test/chains/stellar/remotenet.go create mode 100644 test/chains/stellar/types.go create mode 100644 test/relayer/data/keystore/stellar.local/GCX3TODZ2KEHYGD6HOQDRZVOUWNSQWP6OLYBIQ3XNPFKQ47G42H7WCGA create mode 100644 test/relayer/data/keystore/stellar.local/GCX3TODZ2KEHYGD6HOQDRZVOUWNSQWP6OLYBIQ3XNPFKQ47G42H7WCGA.pass diff --git a/test/chains/stellar/client.go b/test/chains/stellar/client.go new file mode 100644 index 00000000..93bf7f9a --- /dev/null +++ b/test/chains/stellar/client.go @@ -0,0 +1,236 @@ +package stellar + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "reflect" + "strconv" + "sync/atomic" + + "github.com/icon-project/goloop/common/log" + "github.com/stellar/go/xdr" +) + +const ( + jsonRPCVersion = "2.0" +) + +type Client struct { + idCounter uint64 + httpClient *http.Client + rpcUrl string +} + +func New(rpcUrl string, httpCl *http.Client) (*Client, error) { + if _, err := url.Parse(rpcUrl); err != nil { + return nil, err + } + + if httpCl == nil { + httpCl = &http.Client{} + } + + return &Client{ + httpClient: httpCl, + rpcUrl: rpcUrl, + }, nil +} + +func (c *Client) GetLatestLedger(ctx context.Context) (*LatestLedgerResponse, error) { + ledgerRes := &LatestLedgerResponse{} + if err := c.CallContext(ctx, ledgerRes, "getLatestLedger", nil); err != nil { + return nil, err + } + return ledgerRes, nil +} + +func (c *Client) GetEvent(ctx context.Context, height uint64, inputSn, contractId, eventSignature string) (*EventResponseEvent, error) { + eventResponse := &EventResponse{} + params := EventQueryFilter{ + StartLedger: height - 500, + Pagination: Pagination{ + Limit: 100, + }, + Filters: []Filter{ + { + Type: "contract", + ContractIDS: []string{ + contractId, + }, + }, + }, + } + if err := c.CallContext(ctx, eventResponse, "getEvents", params); err != nil { + return nil, err + } + for _, event := range eventResponse.Events { + for _, topic := range event.Topic { + decodedTopic, _ := decodeTopic(topic) + if decodedTopic == eventSignature { + // check For Value + var xdrValue xdr.ScVal + bytesD, err := base64.StdEncoding.DecodeString(event.Value) + if err != nil { + return nil, err + } + err = xdr.SafeUnmarshal(bytesD, &xdrValue) + if err != nil { + return nil, err + } + eventValues, ok := xdrValue.GetMap() + if !ok { + return nil, fmt.Errorf("error geting map from values") + } + for _, mapItem := range *eventValues { + if mapItem.Key.String() == "sn" || mapItem.Key.String() == "reqId" { + sn, ok := mapItem.Val.GetU128() + if !ok { + return nil, fmt.Errorf("failed to decode sn") + } + if strconv.FormatUint(uint64(sn.Lo), 10) == inputSn { + decodecMap := convertScMapToMap(*eventValues) + event.ValueDecoded = decodecMap + return &event, nil + } + } + } + + } + } + } + return nil, fmt.Errorf("event not found") +} + +func convertScMapToMap(scMap xdr.ScMap) map[string]interface{} { + normalMap := make(map[string]interface{}) + + for _, entry := range scMap { + key := entry.Key.String() + var value interface{} + switch entry.Val.Type { + case xdr.ScValTypeScvBool: + valueBool, _ := entry.Val.GetB() + value = bool(valueBool) + case xdr.ScValTypeScvBytes: + valueBytes, _ := entry.Val.GetBytes() + value = []byte(valueBytes) + case xdr.ScValTypeScvU64: + value64, _ := entry.Val.GetU64() + value = uint64(value64) + case xdr.ScValTypeScvU128: + value128, _ := entry.Val.GetU128() + value = uint64(value128.Lo) + case xdr.ScValTypeScvString: + valueString, _ := entry.Val.GetStr() + value = string(valueString) + case xdr.ScValTypeScvU32: + value32, _ := entry.Val.GetU32() + value = uint64(value32) + default: + log.Info("Encountered unmatched type ", entry.Val.Type) + value = entry.Val + } + normalMap[key] = value + } + + return normalMap +} + +func decodeTopic(topic string) (string, error) { + bytesD, err := base64.StdEncoding.DecodeString(topic) + if err != nil { + return "", err + } + var xdrValue xdr.ScVal + err = xdr.SafeUnmarshal(bytesD, &xdrValue) + if err != nil { + return "", err + } + return xdrValue.String(), nil +} + +func (c *Client) CallContext(ctx context.Context, result interface{}, method string, params interface{}) error { + if result != nil && reflect.TypeOf(result).Kind() != reflect.Ptr { + return fmt.Errorf("call result parameter must be pointer or nil interface: %v", result) + } + + msg, err := c.newMessage(method, params) + if err != nil { + return err + } + + respBody, err := c.doRequest(ctx, msg) + if err != nil { + return err + } + defer respBody.Close() + + var respmsg jsonRPCResponse + if err := json.NewDecoder(respBody).Decode(&respmsg); err != nil { + return err + } + if respmsg.Error != nil { + return respmsg.Error + } + if len(respmsg.Result) == 0 { + return fmt.Errorf("result is empty") + } + return json.Unmarshal(respmsg.Result, &result) +} + +func (c *Client) newMessage(method string, paramsIn interface{}) (*jsonRPCRequest, error) { + msg := &jsonRPCRequest{Version: jsonRPCVersion, ID: c.nextID(), Method: method} + if paramsIn != nil { // prevent sending "params":null + var err error + if msg.Params, err = json.Marshal(paramsIn); err != nil { + return nil, err + } + } + return msg, nil +} + +func (c *Client) doRequest(ctx context.Context, msg interface{}) (io.ReadCloser, error) { + body, err := json.Marshal(msg) + if err != nil { + return nil, err + } + req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.rpcUrl, io.NopCloser(bytes.NewReader(body))) + if err != nil { + return nil, err + } + req.ContentLength = int64(len(body)) + req.GetBody = func() (io.ReadCloser, error) { return io.NopCloser(bytes.NewReader(body)), nil } + + req.Header.Set("Content-Type", "application/json") + + // do request + resp, err := c.httpClient.Do(req) + if err != nil { + return nil, err + } + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + var buf bytes.Buffer + var body []byte + if _, err := buf.ReadFrom(resp.Body); err == nil { + body = buf.Bytes() + } + + return nil, HTTPError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Body: body, + } + } + return resp.Body, nil +} + +func (c *Client) nextID() json.RawMessage { + id := atomic.AddUint64(&c.idCounter, 1) + return strconv.AppendUint(nil, uint64(id), 10) +} diff --git a/test/chains/stellar/jsonrpc.go b/test/chains/stellar/jsonrpc.go new file mode 100644 index 00000000..d0bf8b07 --- /dev/null +++ b/test/chains/stellar/jsonrpc.go @@ -0,0 +1,43 @@ +package stellar + +import ( + "encoding/json" + "fmt" +) + +type jsonRPCRequest struct { + ID json.RawMessage `json:"id,omitempty"` + Version string `json:"jsonrpc"` + Method string `json:"method"` + Params json.RawMessage `json:"params,omitempty"` +} + +type jsonRPCResponse struct { + ID json.RawMessage `json:"id,omitempty"` + Version string `json:"jsonrpc"` + Result json.RawMessage `json:"result,omitempty"` + Error *jsonRPCError `json:"error,omitempty"` +} + +type jsonRPCError struct { + Code int64 `json:"code"` + Message string `json:"message"` + Data json.RawMessage `json:"data,omitempty"` +} + +func (err jsonRPCError) Error() string { + return fmt.Sprintf("json-rpc error with code: %d, message: %s, & data: %v", err.Code, err.Message, err.Data) +} + +type HTTPError struct { + StatusCode int + Status string + Body []byte +} + +func (err HTTPError) Error() string { + if len(err.Body) == 0 { + return err.Status + } + return fmt.Sprintf("%v: %s", err.Status, err.Body) +} diff --git a/test/chains/stellar/msg.go b/test/chains/stellar/msg.go new file mode 100644 index 00000000..e061de8b --- /dev/null +++ b/test/chains/stellar/msg.go @@ -0,0 +1,20 @@ +package stellar + +import ( + jsoniter "github.com/json-iterator/go" +) + +type StellarMessage struct { + Params []string + Method string + PackageObjectId string + Module string +} + +func (m *StellarMessage) Type() string { + return m.Method +} + +func (m *StellarMessage) MsgBytes() ([]byte, error) { + return jsoniter.Marshal(m.Params) +} diff --git a/test/chains/stellar/remotenet.go b/test/chains/stellar/remotenet.go new file mode 100644 index 00000000..d60b0272 --- /dev/null +++ b/test/chains/stellar/remotenet.go @@ -0,0 +1,546 @@ +package stellar + +import ( + "context" + "encoding/hex" + "encoding/json" + "fmt" + "net/http" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/icon-project/centralized-relay/test/interchaintest/_internal/blockdb" + "github.com/icon-project/centralized-relay/test/interchaintest/_internal/dockerutil" + "github.com/icon-project/centralized-relay/test/interchaintest/ibc" + "github.com/icon-project/centralized-relay/test/interchaintest/relayer/centralized" + "github.com/icon-project/centralized-relay/test/testsuite/testconfig" + "github.com/stellar/go/clients/horizonclient" + "gopkg.in/yaml.v3" + + //chantypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types" + + "github.com/docker/docker/client" + "github.com/icon-project/centralized-relay/test/chains" + + "go.uber.org/zap" +) + +type StellarRemotenet struct { + log *zap.Logger + testName string + cfg ibc.ChainConfig + numValidators int + numFullNodes int + keystorePath string + scorePaths map[string]string + IBCAddresses map[string]string `json:"addresses"` + Wallets map[string]ibc.Wallet `json:"wallets"` + Client *client.Client + Network string + testconfig *testconfig.Chain + horizonClient *horizonclient.Client + sorobanClient *Client +} + +const xcall = "xcall" +const connection = "connection" + +func NewStellarRemotenet(testName string, log *zap.Logger, chainConfig ibc.ChainConfig, client *client.Client, network string, testconfig *testconfig.Chain) chains.Chain { + httpClient := http.Client{} + stellarHorizonClient := &horizonclient.Client{ + HorizonURL: testconfig.WebsocketUrl, + HTTP: &httpClient, + AppName: "centralized-relay-e2e", + } + stellarSorobanClient := &Client{ + idCounter: 0, + httpClient: &httpClient, + rpcUrl: testconfig.RPCUri, + } + return &StellarRemotenet{ + testName: testName, + cfg: chainConfig, + log: log, + scorePaths: testconfig.Contracts, + Wallets: map[string]ibc.Wallet{}, + IBCAddresses: make(map[string]string), + Client: client, + testconfig: testconfig, + Network: network, + horizonClient: stellarHorizonClient, + sorobanClient: stellarSorobanClient, + } +} + +// Config fetches the chain configuration. +func (sn *StellarRemotenet) Config() ibc.ChainConfig { + return sn.cfg +} + +func (sn *StellarRemotenet) OverrideConfig(key string, value any) { + if value == nil { + return + } + sn.cfg.ConfigFileOverrides[key] = value +} + +// Initialize initializes node structs so that things like initializing keys can be done before starting the chain +func (sn *StellarRemotenet) Initialize(ctx context.Context, testName string, cli *client.Client, networkID string) error { + return nil +} + +// Start sets up everything needed (validators, gentx, fullnodes, peering, additional accounts) for chain to start from genesis. +func (sn *StellarRemotenet) Start(testName string, ctx context.Context, additionalGenesisWallets ...ibc.WalletAmount) error { + return nil +} + +// Exec runs an arbitrary command using Chain's docker environment. +// Whether the invoked command is run in a one-off container or execing into an already running container +// is up to the chain implementation. +// +// "env" are environment variables in the format "MY_ENV_VAR=value" +func (sn *StellarRemotenet) Exec(ctx context.Context, cmd []string, env []string) (stdout []byte, stderr []byte, err error) { + cmd = append([]string{}, cmd...) + job := dockerutil.NewImage(sn.log, sn.Client, sn.Network, sn.testName, sn.cfg.Images[0].Repository, sn.cfg.Images[0].Version) + bindPaths := []string{ + sn.testconfig.ContractsPath + ":/contracts", + } + opts := dockerutil.ContainerOptions{ + Binds: bindPaths, + } + res := job.Run(ctx, cmd, opts) + return res.Stdout, res.Stderr, res.Err +} + +// ExportState exports the chain state at specific height. +func (sn *StellarRemotenet) ExportState(ctx context.Context, height int64) (string, error) { + block, err := sn.GetClientBlockByHeight(ctx, height) + return block, err +} + +// GetRPCAddress retrieves the rpc address that can be reached by other containers in the docker network. +func (sn *StellarRemotenet) GetRPCAddress() string { + return sn.testconfig.RPCUri +} + +func (sn *StellarRemotenet) GetRelayConfig(ctx context.Context, rlyHome string, keyName string) ([]byte, error) { + contracts := make(map[string]string) + contracts["xcall"] = sn.GetContractAddress("xcall") + contracts["connection"] = sn.GetContractAddress("connection") + config := ¢ralized.StellarRelayerChainConfig{ + Type: "stellar", + Value: centralized.StellarRelayerChainConfigValue{ + NID: sn.Config().ChainID, + SorobanUrl: sn.GetRPCAddress(), + HorizonUrl: sn.GetGRPCAddress(), + StartHeight: 0, + Contracts: contracts, + BlockInterval: "6s", + Address: sn.testconfig.RelayWalletAddress, + FinalityBlock: uint64(0), + NetworkPassphrase: sn.testconfig.KeystorePassword, + MaxInclusionFee: 200, + }, + } + return yaml.Marshal(config) +} + +// GetGRPCAddress retrieves the grpc address that can be reached by other containers in the docker network. +// Not Applicable for Icon +func (sn *StellarRemotenet) GetGRPCAddress() string { + return sn.testconfig.WebsocketUrl +} + +// GetHostRPCAddress returns the rpc address that can be reached by processes on the host machine. +// Note that this will not return a valid value until after Start returns. +func (sn *StellarRemotenet) GetHostRPCAddress() string { + return sn.testconfig.RPCUri +} + +// GetHostGRPCAddress returns the grpc address that can be reached by processes on the host machine. +// Note that this will not return a valid value until after Start returns. +// Not applicable for Icon +func (sn *StellarRemotenet) GetHostGRPCAddress() string { + return sn.testconfig.RPCUri +} + +// HomeDir is the home directory of a node running in a docker container. Therefore, this maps to +// the container's filesystem (not the host). +func (sn *StellarRemotenet) HomeDir() string { + return "" +} + +func (sn *StellarRemotenet) createKeystore(ctx context.Context, keyName string) (string, string, error) { + return "", "", nil +} + +// RecoverKey recovers an existing user from a given mnemonic. +func (sn *StellarRemotenet) RecoverKey(ctx context.Context, name string, mnemonic string) error { + panic("not implemented") // TODO: Implement +} + +// GetAddress fetches the bech32 address for a test key on the "user" node (either the first fullnode or the first validator if no fullnodes). +func (sn *StellarRemotenet) GetAddress(ctx context.Context, keyName string) ([]byte, error) { + addrInByte, err := json.Marshal(keyName) + if err != nil { + return nil, err + } + return addrInByte, nil +} + +// SendFunds sends funds to a wallet from a user account. +func (sn *StellarRemotenet) SendFunds(ctx context.Context, keyName string, amount ibc.WalletAmount) error { + return nil +} + +// Height returns the current block height or an error if unable to get current height. +func (sn *StellarRemotenet) Height(ctx context.Context) (uint64, error) { + res, err := sn.sorobanClient.GetLatestLedger(ctx) + return uint64(res.Sequence), err +} + +// GetGasFeesInNativeDenom gets the fees in native denom for an amount of spent gas. +func (sn *StellarRemotenet) GetGasFeesInNativeDenom(gasPaid int64) int64 { + gasPrice, _ := strconv.ParseFloat(strings.Replace(sn.cfg.GasPrices, sn.cfg.Denom, "", 1), 64) + fees := float64(gasPaid) * gasPrice + return int64(fees) +} + +// BuildRelayerWallet will return a chain-specific wallet populated with the mnemonic so that the wallet can +// be restored in the relayer node using the mnemonic. After it is built, that address is included in +// genesis with some funds. +func (sn *StellarRemotenet) BuildRelayerWallet(ctx context.Context, keyName string) (ibc.Wallet, error) { + return sn.BuildWallet(ctx, keyName, "") +} + +func (sn *StellarRemotenet) BuildWallet(ctx context.Context, keyName string, mnemonic string) (ibc.Wallet, error) { + return nil, nil +} + +func (sn *StellarRemotenet) FindTxs(ctx context.Context, height uint64) ([]blockdb.Tx, error) { + return nil, nil +} + +// GetBalance fetches the current balance for a specific account address and denom. +func (sn *StellarRemotenet) GetBalance(ctx context.Context, address string, denom string) (int64, error) { + return 0, nil +} + +func (sn *StellarRemotenet) SetupConnection(ctx context.Context, target chains.Chain) error { + if sn.testconfig.Environment == "preconfigured" { + return nil + } + connection, err := sn.DeployContractRemote(ctx, sn.scorePaths["connection"]) + if err != nil { + return err + } + params := make(map[string]string) + params["msg"] = `{"xcall_address":"` + sn.GetContractAddress("xcall") + `", "native_token":"CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC", "relayer":"` + sn.testconfig.RelayWalletAddress + `"}` + + _, err = sn.executeContract(context.Background(), connection, "initialize", params) + if err != nil { + return err + } + sn.IBCAddresses["connection"] = connection + return nil +} + +func (sn *StellarRemotenet) SetupXCall(ctx context.Context) error { + if sn.testconfig.Environment == "preconfigured" { + testcase := ctx.Value("testcase").(string) + sn.IBCAddresses["xcall"] = "CASJ76AJJKK6BFMMB4DLLYV5J6OBTBIO25FDWXWZY5BIXFVCNK7XACNG" + sn.IBCAddresses["connection"] = "CBLG6CNVXWSCF7X5XXM6B5JZ2ULFIPV7KRENAIB2HB4FAKMGIMD63BJU" + sn.IBCAddresses[fmt.Sprintf("dapp-%s", testcase)] = "CA2QFEESKXOWQZJRQ7LUIGTDEEWNOLR4KRYL35GUWNRK5XYZ3FDP3L7W" + return nil + } + xcall, err := sn.DeployContractRemote(ctx, sn.scorePaths["xcall"]) + if err != nil { + return err + } + sn.IBCAddresses["xcall"] = xcall + + //init xcall + params := make(map[string]string) + params["msg"] = `{"network_id":"` + sn.Config().ChainID + `", "sender":"` + sn.testconfig.RelayWalletAddress + `", "native_token":"CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC"}` + _, err = sn.executeContract(context.Background(), xcall, "initialize", params) + return err +} + +func (sn *StellarRemotenet) DeployXCallMockApp(ctx context.Context, keyName string, connections []chains.XCallConnection) error { + if sn.testconfig.Environment == "preconfigured" { + return nil + } + testcase := ctx.Value("testcase").(string) + + dapp, err := sn.DeployContractRemote(ctx, sn.scorePaths["dapp"]) + if err != nil { + return err + } + + //init dapp + xCall := sn.IBCAddresses["xcall"] + params := make(map[string]string) + params["xcall_address"] = xCall + sn.executeContract(ctx, dapp, "init", params) + + sn.IBCAddresses[fmt.Sprintf("dapp-%s", testcase)] = dapp + for _, connection := range connections { + params := make(map[string]string) + params["src_endpoint"] = sn.IBCAddresses[connection.Connection] + params["network_id"] = connection.Nid + params["dst_endpoint"] = connection.Destination + _, err = sn.executeContract(context.Background(), dapp, "add_connection", params) + if err != nil { + sn.log.Error("Unable to add connection", + zap.Error(err), + zap.String("nid", connection.Nid), + zap.String("source", sn.IBCAddresses[connection.Connection]), + zap.String("destination", connection.Destination), + ) + } + } + + return nil +} + +func (sn *StellarRemotenet) GetContractAddress(key string) string { + value, exist := sn.IBCAddresses[key] + if !exist { + panic(fmt.Sprintf(`IBC address not exist %s`, key)) + } + return value +} + +func (sn *StellarRemotenet) BackupConfig() ([]byte, error) { + panic("not implemented") +} + +func (sn *StellarRemotenet) RestoreConfig(backup []byte) error { + panic("not implemented") +} + +func (sn *StellarRemotenet) SendPacketXCall(ctx context.Context, keyName, _to string, data, rollback []byte) (context.Context, error) { + testcase := ctx.Value("testcase").(string) + dappKey := fmt.Sprintf("dapp-%s", testcase) + // TODO: send fees + params := make(map[string]string) + params["to"] = `{"0": "` + _to + `"}` + params["data"] = hex.EncodeToString(data) + params["sender"] = sn.testconfig.RelayWalletAddress + params["msg_type"] = "0" //or 2 for message Persisted + if rollback != nil { + params["rollback"] = hex.EncodeToString(rollback) + params["msg_type"] = "1" + } + + ctx, err := sn.executeContract(ctx, sn.IBCAddresses[dappKey], "send_call_message", params) + if err != nil { + return nil, err + } + sno := ctx.Value("sno").(string) + return context.WithValue(ctx, "sn", sno), nil +} + +// HasPacketReceipt returns the receipt of the packet sent to the target chain +func (sn *StellarRemotenet) IsPacketReceived(ctx context.Context, params map[string]interface{}, order ibc.Order) bool { + panic("not implemented") +} + +// FindTargetXCallMessage returns the request id and the data of the message sent to the target chain +func (sn *StellarRemotenet) FindTargetXCallMessage(ctx context.Context, target chains.Chain, height uint64, to string) (*chains.XCallResponse, error) { + testcase := ctx.Value("testcase").(string) + dappKey := fmt.Sprintf("dapp-%s", testcase) + sno := ctx.Value("sn").(string) + reqId, destData, err := target.FindCallMessage(ctx, height, sn.cfg.ChainID+"/"+sn.IBCAddresses[dappKey], to, sno) + return &chains.XCallResponse{SerialNo: sno, RequestID: reqId, Data: destData}, err +} + +func (sn *StellarRemotenet) XCall(ctx context.Context, targetChain chains.Chain, keyName, to string, data, rollback []byte) (*chains.XCallResponse, error) { + height, err := targetChain.(ibc.Chain).Height(ctx) + if err != nil { + return nil, err + } + // TODO: send fees + ctx, err = sn.SendPacketXCall(ctx, keyName, to, data, rollback) + if err != nil { + return nil, err + } + return sn.FindTargetXCallMessage(ctx, targetChain, height, strings.Split(to, "/")[1]) +} + +func (sn *StellarRemotenet) ExecuteCall(ctx context.Context, reqId, data string) (context.Context, error) { + panic("not required in e2e") +} + +func (sn *StellarRemotenet) ExecuteRollback(ctx context.Context, sno string) (context.Context, error) { + params := make(map[string]string) + params["sequence_no"] = sno + ctx, err := sn.executeContract(ctx, sn.IBCAddresses["xcall"], "execute_rollback", params) + if err != nil { + return nil, err + } + height, _ := sn.Height(ctx) + _, err = sn.FindEvent(ctx, height-20, "xcall", "RollbackExecuted", sno) + if err != nil { + return ctx, err + } + return context.WithValue(ctx, "IsRollbackEventFound", true), nil + +} + +func (sn *StellarRemotenet) FindCallMessage(ctx context.Context, startHeight uint64, from, to, sno string) (string, string, error) { + + event, err := sn.FindEvent(ctx, startHeight, "xcall", "CallMessage", sno) + if err != nil { + return "", "", err + } + reqId := event.ValueDecoded["reqId"].(uint64) + data := event.ValueDecoded["data"].([]byte) + return strconv.FormatUint(reqId, 10), string(data), nil +} + +func (sn *StellarRemotenet) FindCallResponse(ctx context.Context, startHeight uint64, sno string) (string, error) { + event, err := sn.FindEvent(ctx, startHeight, "xcall", "ResponseMessage", sno) + if err != nil { + return "", err + } + code := event.ValueDecoded["code"].(uint64) + return strconv.FormatUint(code, 10), nil +} + +func (sn *StellarRemotenet) FindEvent(ctx context.Context, startHeight uint64, contract, signature, sno string) (*EventResponseEvent, error) { + timeout := time.After(60 * time.Second) + ticker := time.NewTicker(2 * time.Second) + defer ticker.Stop() + for { + select { + case <-timeout: + return nil, fmt.Errorf("failed to find eventLog") + case <-ticker.C: + data, err := sn.getEvent(ctx, startHeight, sno, signature, sn.GetContractAddress(contract)) + if err != nil { + continue + } + return data, nil + } + } +} + +func (sn *StellarRemotenet) getEvent(ctx context.Context, startHeight uint64, sno, signature, contractId string) (*EventResponseEvent, error) { + return sn.sorobanClient.GetEvent(ctx, startHeight, sno, contractId, signature) +} + +// Remote implements chains.Chain +func (sn *StellarRemotenet) DeployContract(ctx context.Context, keyName string) (context.Context, error) { + return ctx, nil +} + +// executeContract implements chains.Chain +func (sn *StellarRemotenet) executeContract(ctx context.Context, contractAddress, methodName string, params map[string]string) (context.Context, error) { + var output string + stdout, err := sn.ExecCallTx(ctx, contractAddress, methodName, params) + if err != nil { + return nil, err + } + json.Unmarshal([]byte(stdout), &output) + return context.WithValue(ctx, "sno", output), err +} + +func (sn *StellarRemotenet) ExecuteContract(ctx context.Context, contractAddress, keyName, methodName string, params map[string]interface{}) (context.Context, error) { + return nil, nil +} + +func (sn *StellarRemotenet) GetBlockByHeight(context.Context) (context.Context, error) { + panic("not implemented") +} + +// GetBlockByHeight implements chains.Chain +func (sn *StellarRemotenet) GetClientBlockByHeight(ctx context.Context, height int64) (string, error) { + return "", nil +} + +// GetLastBlock implements chains.Chain +func (sn *StellarRemotenet) GetLastBlock(ctx context.Context) (context.Context, error) { + res, err := sn.sorobanClient.GetLatestLedger(ctx) + h := uint64(res.Sequence) + return context.WithValue(ctx, chains.LastBlock{}, h), err +} + +func (sn *StellarRemotenet) InitEventListener(ctx context.Context, contract string) chains.EventListener { + return nil +} + +// QueryContract implements chains.Chain +func (sn *StellarRemotenet) QueryContract(ctx context.Context, contractAddress, methodName string, params map[string]interface{}) (context.Context, error) { + return ctx, nil +} + +func (sn *StellarRemotenet) BuildWallets(ctx context.Context, keyName string) (ibc.Wallet, error) { + panic("not implemented") +} + +func (sn *StellarRemotenet) NodeCommand(command ...string) []string { + command = sn.BinCommand(command...) + return append(command, + "--rpc-url", sn.GetRPCAddress(), + "--source-account", sn.testconfig.KeystoreFile, + "--network-passphrase", sn.testconfig.KeystorePassword, + ) +} + +func (sn *StellarRemotenet) BinCommand(command ...string) []string { + command = append([]string{sn.Config().Bin}, command...) + return command +} + +func (sn *StellarRemotenet) ExecBin(ctx context.Context, command ...string) ([]byte, []byte, error) { + return sn.Exec(ctx, sn.BinCommand(command...), nil) +} + +func (sn *StellarRemotenet) DeployContractRemote(ctx context.Context, contractPath string) (string, error) { + _, score := filepath.Split(contractPath) + // Deploy the contract + contractId, err := sn.ExecTx(ctx, "/contracts/"+score) + if err != nil { + return "", err + } + return contractId, nil + +} + +func (sn *StellarRemotenet) ExecTx(ctx context.Context, filePath string, command ...string) (string, error) { + stdout, _, err := sn.Exec(ctx, sn.TxCommand(ctx, filePath, command...), nil) + return strings.Split(string(stdout), "\n")[0], err +} + +// TxCommand is a helper to retrieve a full command for broadcasting a tx +// with the chain node binary. +func (sn *StellarRemotenet) TxCommand(ctx context.Context, filePath string, command ...string) []string { + command = append([]string{"contract", "deploy", "--wasm", filePath}, command...) + return sn.NodeCommand(command...) +} + +func (sn *StellarRemotenet) ExecCallTx(ctx context.Context, scoreAddress, methodName string, params map[string]string) (string, error) { + stdout, _, err := sn.Exec(ctx, sn.ExecCallTxCommand(ctx, scoreAddress, methodName, params), nil) + return strings.Split(string(stdout), "\n")[0], err +} + +func (sn *StellarRemotenet) ExecCallTxCommand(ctx context.Context, scoreAddress, methodName string, params map[string]string) []string { + command := []string{"contract", "invoke"} + + command = append(command, + "--id", scoreAddress, + "--rpc-url", sn.GetRPCAddress(), + "--source-account", sn.testconfig.KeystoreFile, + "--network-passphrase", sn.testconfig.KeystorePassword, + "--", methodName, + ) + + for key, value := range params { + command = append(command, "--"+key, value) + } + command = sn.BinCommand(command...) + return command +} diff --git a/test/chains/stellar/types.go b/test/chains/stellar/types.go new file mode 100644 index 00000000..37222c3e --- /dev/null +++ b/test/chains/stellar/types.go @@ -0,0 +1,34 @@ +package stellar + +type LatestLedgerResponse struct { + ID string `json:"id"` + ProtocolVersion uint64 `json:"protocolVersion"` + Sequence uint64 `json:"sequence"` +} + +type EventResponseEvent struct { + Type string `json:"type"` + ContractId string `json:"contractID"` + Topic []string `json:"topic"` + Value string `json:"value"` + ValueDecoded map[string]interface{} +} + +type EventResponse struct { + Events []EventResponseEvent `json:"events"` +} + +type EventQueryFilter struct { + StartLedger uint64 `json:"startLedger"` + Pagination Pagination `json:"pagination"` + Filters []Filter `json:"filters"` +} + +type Pagination struct { + Limit uint64 `json:"limit"` +} + +type Filter struct { + Type string `json:"type"` + ContractIDS []string `json:"contractIds"` +} diff --git a/test/go.mod b/test/go.mod index 43dfdb31..765ed0c2 100644 --- a/test/go.mod +++ b/test/go.mod @@ -14,10 +14,13 @@ require ( github.com/ethereum/go-ethereum v1.14.0 github.com/fardream/go-bcs v0.4.0 github.com/gorilla/websocket v1.5.1 + github.com/icon-project/goloop v1.2.11 github.com/icon-project/icon-bridge v0.0.11 github.com/icza/dyno v0.0.0-20230330125955-09f820a8d9c0 github.com/json-iterator/go v1.1.12 + github.com/pelletier/go-toml/v2 v2.2.2 github.com/spf13/viper v1.18.2 + github.com/stellar/go v0.0.0-20240515181250-ae1019c78864 github.com/strangelove-ventures/interchaintest/v8 v8.2.0 github.com/stretchr/testify v1.9.0 go.uber.org/multierr v1.11.0 @@ -30,11 +33,12 @@ require ( ) require ( - cloud.google.com/go v0.112.0 // indirect - cloud.google.com/go/compute v1.24.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.6 // indirect - cloud.google.com/go/storage v1.36.0 // indirect + cloud.google.com/go v0.112.2 // indirect + cloud.google.com/go/auth v0.3.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect + cloud.google.com/go/iam v1.1.8 // indirect + cloud.google.com/go/storage v1.40.0 // indirect cosmossdk.io/api v0.7.4 // indirect cosmossdk.io/collections v0.4.0 // indirect cosmossdk.io/core v0.11.0 // indirect @@ -52,7 +56,7 @@ require ( github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/StackExchange/wmi v1.2.1 // indirect - github.com/aws/aws-sdk-go v1.44.224 // indirect + github.com/aws/aws-sdk-go v1.45.26 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect @@ -106,7 +110,8 @@ require ( github.com/fluent/fluent-logger-golang v1.4.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect - github.com/go-errors/errors v1.4.2 // indirect + github.com/go-chi/chi v4.1.2+incompatible // indirect + github.com/go-errors/errors v1.5.1 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -128,9 +133,10 @@ require ( github.com/google/s2a-go v0.1.7 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect + github.com/googleapis/gax-go/v2 v2.12.3 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/schema v1.2.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect @@ -152,7 +158,6 @@ require ( github.com/huandu/skiplist v1.2.0 // indirect github.com/hugobyte/keygen v0.1.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect - github.com/icon-project/goloop v1.2.11 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect @@ -162,11 +167,12 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/labstack/echo/v4 v4.10.0 // indirect github.com/labstack/gommon v0.4.0 // indirect - github.com/lib/pq v1.10.7 // indirect + github.com/lib/pq v1.10.9 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/linxGnu/grocksdb v1.8.14 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect + github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/minio/highwayhash v1.0.2 // indirect @@ -183,7 +189,6 @@ require ( github.com/oklog/run v1.1.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect github.com/philhofer/fwd v1.0.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -195,11 +200,12 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/rs/cors v1.8.3 // indirect + github.com/rs/cors v1.10.1 // indirect github.com/rs/zerolog v1.32.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect + github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -208,6 +214,8 @@ require ( github.com/spf13/cast v1.6.0 // indirect github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/supranational/blst v0.3.11 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect @@ -226,8 +234,8 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.8 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/otel v1.26.0 // indirect go.opentelemetry.io/otel/metric v1.26.0 // indirect go.opentelemetry.io/otel/sdk v1.26.0 // indirect @@ -236,18 +244,18 @@ require ( golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.24.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/term v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.20.0 // indirect - google.golang.org/api v0.162.0 // indirect + google.golang.org/api v0.177.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gotest.tools/v3 v3.5.1 // indirect diff --git a/test/go.sum b/test/go.sum index fd420d3c..213c8fea 100644 --- a/test/go.sum +++ b/test/go.sum @@ -33,8 +33,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= -cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= +cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= +cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -49,6 +49,10 @@ cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjby cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/auth v0.3.0 h1:PRyzEpGfx/Z9e8+lHsbkoUVXD0gnu4MNmm7Gp8TQNIs= +cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= @@ -72,10 +76,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= @@ -114,8 +116,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= -cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= +cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -176,8 +178,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= -cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw= +cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= @@ -293,6 +295,8 @@ github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f h1:zvClvFQwU++UpIUBGC8YmDlfhUrweEy1R1Fj1gu5iIM= +github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= 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= @@ -302,6 +306,8 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -321,8 +327,8 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.30.1/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.44.76/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.224 h1:09CiaaF35nRmxrzWZ2uRq5v6Ghg/d2RiPjZnSgtt+RQ= -github.com/aws/aws-sdk-go v1.44.224/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.45.26 h1:PJ2NJNY5N/yeobLYe1Y+xLdavBi67ZI8gvph6ftwVCg= +github.com/aws/aws-sdk-go v1.45.26/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= @@ -426,8 +432,6 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -603,8 +607,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.4.0/go.mod h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY= @@ -615,8 +617,6 @@ github.com/ethereum/go-ethereum v1.14.0 h1:xRWC5NlB6g1x7vNy4HDBLuqVNbtLrc7v8S6+U github.com/ethereum/go-ethereum v1.14.0/go.mod h1:1STrq471D0BQbCX9He0hUj4bHxX2k6mt5nOQJhDNOJ8= 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/fardream/go-bcs v0.2.1 h1:ffW/0Jr0b2WXLNPF8AX6wWI9ETVE4+aXkv2aIXVViwE= -github.com/fardream/go-bcs v0.2.1/go.mod h1:UsoxhIoe2GsVexX0s5NDLIChxeb/JUbjw7IWzzgF3Xk= github.com/fardream/go-bcs v0.4.0 h1:J2yQZRAnkg/yMgP9MPf/qj9jJfD6w/LCMdWtC9Cbn08= github.com/fardream/go-bcs v0.4.0/go.mod h1:UsoxhIoe2GsVexX0s5NDLIChxeb/JUbjw7IWzzgF3Xk= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -625,6 +625,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -651,6 +653,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/garslo/gogen v0.0.0-20170307003452-d6ebae628c7c/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955 h1:gmtGRvSexPU4B1T/yYo0sLOKzER1YT+b4kPxPpm0Ty4= +github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955/go.mod h1:vmp8DIyckQMXOPl0AQVHt+7n5h7Gb7hS6CUydiV8QeA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= @@ -668,12 +672,14 @@ github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= +github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-critic/go-critic v0.3.5-0.20190904082202-d79a9f0c64db/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= github.com/go-critic/go-critic v0.4.0/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -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-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= +github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -857,6 +863,8 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -917,8 +925,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -929,6 +937,8 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= +github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -1056,6 +1066,8 @@ github.com/icon-project/icon-bridge v0.0.11 h1:1qUYq6YmzUQR+zCDJGnXQxXKs81NmkxAT github.com/icon-project/icon-bridge v0.0.11/go.mod h1:7GcN+biPaXdsYLvsiwC1Y/5ro6ENPinhUqm2MZL4tgQ= github.com/icza/dyno v0.0.0-20230330125955-09f820a8d9c0 h1:nHoRIX8iXob3Y2kdt9KsjyIb7iApSvb3vgsd93xb5Ow= github.com/icza/dyno v0.0.0-20230330125955-09f820a8d9c0/go.mod h1:c1tRKs5Tx7E2+uHGSyyncziFjvGpgv4H2HrqXeUQ/Uk= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= 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/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= @@ -1119,6 +1131,8 @@ github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jarcoal/httpmock v0.0.0-20161210151336-4442edb3db31 h1:Aw95BEvxJ3K6o9GGv5ppCd1P8hkeIeEJ30FO+OhOJpM= +github.com/jarcoal/httpmock v0.0.0-20161210151336-4442edb3db31/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= @@ -1215,8 +1229,8 @@ github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= @@ -1398,6 +1412,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 h1:ykXz+pRRTibcSjG1yRhpdSHInF8yZY/mfn+Rz2Nd1rE= +github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739/go.mod h1:zUx1mhth20V3VKgL5jbd1BSQcW4Fy6Qs4PZvQwRFwzM= github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1496,6 +1512,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db h1:eZgFHVkk9uOTaOQLC6tgjkzdp7Ays8eEVecBcfHZlJQ= +github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= @@ -1617,8 +1635,8 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= -github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -1649,8 +1667,6 @@ github.com/pelletier/go-toml v1.0.1-0.20170904195809-1d6b12b7cb29/go.mod h1:5z9K github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= @@ -1749,8 +1765,8 @@ github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -1772,11 +1788,15 @@ github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71e github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do= +github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 h1:S4OC0+OBKz6mJnzuHioeEat74PuQ4Sgvbf8eus695sc= +github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2/go.mod h1:8zLRYR5npGjaOXgPSKat5+oOh+UHd8OdbS18iqX9F6Y= github.com/segmentio/golines v0.0.0-20200824192126-7f30d3046793/go.mod h1:bQSh5qdVR67XiCKbaVvYO41s50c5hQo+3cY/1CQQ3xQ= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= @@ -1839,6 +1859,10 @@ github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobt github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= +github.com/stellar/go v0.0.0-20240515181250-ae1019c78864 h1:1cGX5sfpiFK0c0hT8MrRaS0MrWOnJD2WDCa66DkZ2vA= +github.com/stellar/go v0.0.0-20240515181250-ae1019c78864/go.mod h1:TuXKLL7WViqwrvpWno2I4UYGn2Ny9KZld1jUIN6fnK8= +github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2 h1:OzCVd0SV5qE3ZcDeSFCmOWLZfEWZ3Oe8KtmSOYKEVWE= +github.com/stellar/go-xdr v0.0.0-20231122183749-b53fb00bcac2/go.mod h1:yoxyU/M8nl9LKeWIoBrbDPQ7Cy+4jxRcWcOayZ4BMps= github.com/strangelove-ventures/interchaintest/v8 v8.2.0 h1:EZXPvZXL1y/kvh9XI04A2stL+2UMvykhNUv28euRnL8= github.com/strangelove-ventures/interchaintest/v8 v8.2.0/go.mod h1:pupV0YN3A56/u9kHj9U1F8MdDUEolBIn05F0W1q/0oI= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1930,6 +1954,8 @@ github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= +github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= @@ -1951,11 +1977,25 @@ github.com/whyrusleeping/timecache v0.0.0-20160911033111-cfcb2f1abfee/go.mod h1: github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xdrpp/goxdr v0.1.1 h1:E1B2c6E8eYhOVyd7yEpOyopzTPirUeF6mVOfXfGyJyc= +github.com/xdrpp/goxdr v0.1.1/go.mod h1:dXo1scL/l6s7iME1gxHWo2XCppbHEKZS7m/KyYWkNzA= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb h1:06WAhQa+mYv7BiOk13B/ywyTlkoE/S7uu6TBKU6FHnE= +github.com/yalp/jsonpath v0.0.0-20150812003900-31a79c7593bb/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d h1:yJIizrfO599ot2kQ6Af1enICnwBD3XoxgX3MrMwot2M= +github.com/yudai/gojsondiff v0.0.0-20170107030110-7b1b7adf999d/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20150405163532-d1c525dea8ce h1:888GrqRxabUce7lj4OaoShPxodm3kXOMpSa85wdYzfY= +github.com/yudai/golcs v0.0.0-20150405163532-d1c525dea8ce/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1984,10 +2024,10 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= @@ -2202,8 +2242,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2474,8 +2514,9 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= @@ -2532,8 +2573,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.162.0 h1:Vhs54HkaEpkMBdgGdOT2P6F0csGG/vxDS0hWHJzmmps= -google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= +google.golang.org/api v0.177.0 h1:8a0p/BbPa65GlqGWtUKxot4p0TV8OGOfyTjtmkXNXmk= +google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= 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= @@ -2654,12 +2695,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda h1:wu/KJm9KJwpfHWhkkZGohVC6KRrc1oJNr4jwtQMOQXw= +google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= +google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 h1:DTJM0R8LECCgFeUwApvcEJHz85HLagW8uRENYxHh1ww= +google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 h1:DujSIu+2tC9Ht0aPNA7jgj23Iq8Ewi5sgkQ++wdvonE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= 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= @@ -2721,8 +2762,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2734,6 +2775,8 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gavv/httpexpect.v1 v1.0.0-20170111145843-40724cf1e4a0 h1:r5ptJ1tBxVAeqw4CrYWhXIMr0SybY3CDHuIbCg5CFVw= +gopkg.in/gavv/httpexpect.v1 v1.0.0-20170111145843-40724cf1e4a0/go.mod h1:WtiW9ZA1LdaWqtQRo1VbIL/v4XZ8NDta+O/kSpGgVek= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v9 v9.28.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= diff --git a/test/interchaintest/ibc/chain.go b/test/interchaintest/ibc/chain.go index e9ee7fd8..2b811df9 100644 --- a/test/interchaintest/ibc/chain.go +++ b/test/interchaintest/ibc/chain.go @@ -44,9 +44,6 @@ type Chain interface { // the container's filesystem (not the host). HomeDir() string - // CreateKey creates a test key in the "user" node (either the first fullnode or the first validator if no fullnodes). - CreateKey(ctx context.Context, keyName string) error - // RecoverKey recovers an existing user from a given mnemonic. RecoverKey(ctx context.Context, name, mnemonic string) error diff --git a/test/interchaintest/relayer/centralized/centralized_relayer.go b/test/interchaintest/relayer/centralized/centralized_relayer.go index 816b26e7..a1730407 100644 --- a/test/interchaintest/relayer/centralized/centralized_relayer.go +++ b/test/interchaintest/relayer/centralized/centralized_relayer.go @@ -70,6 +70,20 @@ type SUIRelayerChainConfigValue struct { GasLimit int `yaml:"gas-limit"` } +type StellarRelayerChainConfigValue struct { + NID string `yaml:"nid"` + SorobanUrl string `yaml:"soroban-url"` + HorizonUrl string `yaml:"horizon-url"` + StartHeight int `yaml:"start-height"` + NetworkID int `yaml:"network-id"` + Contracts map[string]string `yaml:"contracts"` + BlockInterval string `yaml:"block-interval"` + Address string `yaml:"address"` + FinalityBlock uint64 `yaml:"finality-block"` + MaxInclusionFee int64 `yaml:"max-inclusion-fee"` + NetworkPassphrase string `yaml:"network-passphrase"` +} + type EVMRelayerChainConfigValue struct { NID string `yaml:"nid"` RPCURL string `yaml:"rpc-url"` @@ -128,6 +142,11 @@ type SUIRelayerChainConfig struct { Value SUIRelayerChainConfigValue `json:"value"` } +type StellarRelayerChainConfig struct { + Type string `json:"type"` + Value StellarRelayerChainConfigValue `json:"value"` +} + const ( DefaultContainerImage = "centralized-relay" DefaultContainerVersion = "latest" diff --git a/test/relayer/data/keystore/stellar.local/GCX3TODZ2KEHYGD6HOQDRZVOUWNSQWP6OLYBIQ3XNPFKQ47G42H7WCGA b/test/relayer/data/keystore/stellar.local/GCX3TODZ2KEHYGD6HOQDRZVOUWNSQWP6OLYBIQ3XNPFKQ47G42H7WCGA new file mode 100644 index 0000000000000000000000000000000000000000..fae82d536613aec97a3be7fd2db66940e65d1735 GIT binary patch literal 140 zcmeZHEXuP=EHAdo&Mme|E!8bgEiTbDvN8k$BOova0;}xQN`2GRG;?zU6GPn;!&Ea} zlf*PbUCTruH`N44C7A%Flgt=^V9T8@ Date: Thu, 23 May 2024 11:30:26 +0545 Subject: [PATCH 26/46] chore: updated devnet url for e2e --- test/sample-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/sample-config.yaml b/test/sample-config.yaml index 05308617..990a11ca 100644 --- a/test/sample-config.yaml +++ b/test/sample-config.yaml @@ -3,10 +3,10 @@ chains: - name: stellar version: "3" environment: remote - rpc_uri: https://soroban-testnet.stellar.org - websocket_uri: https://horizon-testnet.stellar.org + rpc_uri: https://tt.net.solidwallet.io/stellar-rpc/rpc + websocket_uri: https://tt.net.solidwallet.io/stellar-rpc relay_wallet : GCX3TODZ2KEHYGD6HOQDRZVOUWNSQWP6OLYBIQ3XNPFKQ47G42H7WCGA - keystore_password: "Test SDF Network ; September 2015" + keystore_password: "Standalone Network ; February 2017" keystore_file: SDFOICJI3PHUWHFARICCQS2A3W6BNGQVWQ6JDNYPH62VW6GWDBHDH7GE contracts_path: "$BASE_PATH/artifacts/stellar" chain_config: From aa0bc28e3d31aae1b287c32494d8e2c8d94f44e5 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Fri, 24 May 2024 10:33:40 +0545 Subject: [PATCH 27/46] add: added code to handle archival state --- relayer/chains/steller/listener.go | 2 +- relayer/chains/steller/sorobanclient/types.go | 14 ++- relayer/chains/steller/tx.go | 97 ++++++++++++++++++- 3 files changed, 106 insertions(+), 7 deletions(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index a6a1cc68..91b2fb78 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -230,7 +230,7 @@ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertype if !ok { return nil, fmt.Errorf("failed to decode data") } - msg.Data = []byte(data) + msg.Data = data } } diff --git a/relayer/chains/steller/sorobanclient/types.go b/relayer/chains/steller/sorobanclient/types.go index 925e0541..d13ae14c 100644 --- a/relayer/chains/steller/sorobanclient/types.go +++ b/relayer/chains/steller/sorobanclient/types.go @@ -12,10 +12,16 @@ type CallResult struct { } type TxSimulationResult struct { - LatestLedger uint64 `json:"latestLedger"` - Results []CallResult `json:"results"` - MinResourceFee string `json:"minResourceFee"` // Recommended minimum resource fee to add when submitting the transaction. This fee is to be added on top of the Stellar network fee. - TransactionDataXDR string `json:"transactionData"` // The recommended Soroban Transaction Data to use when submitting the simulated transaction. This data contains the refundable fee and resource usage information such as the ledger footprint and IO access data (serialized in a base64 string). + LatestLedger uint64 `json:"latestLedger"` + Results []CallResult `json:"results"` + MinResourceFee string `json:"minResourceFee"` // Recommended minimum resource fee to add when submitting the transaction. This fee is to be added on top of the Stellar network fee. + TransactionDataXDR string `json:"transactionData"` // The recommended Soroban Transaction Data to use when submitting the simulated transaction. This data contains the refundable fee and resource usage information such as the ledger footprint and IO access data (serialized in a base64 string). + RestorePreamble *RestorePreamble `json:"restorePreamble,omitempty"` +} + +type RestorePreamble struct { + TransactionData string `json:"transactionData"` // SorobanTransactionData XDR in base64 + MinResourceFee int64 `json:"minResourceFee,string"` } type ResourceConfig struct { diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index b40f846a..6b251db8 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -7,6 +7,7 @@ import ( "fmt" "strconv" + "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" evtypes "github.com/icon-project/centralized-relay/relayer/events" relayertypes "github.com/icon-project/centralized-relay/relayer/types" @@ -81,9 +82,42 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo return nil, err } simres, err := p.client.SimulateTransaction(simtxe) + if simres.RestorePreamble != nil { + p.log.Info("Need to restore from archived state") + if err := p.handleArchivalState(simres, &sourceAccount); err != nil { + return nil, err + } + //re-run previous failed transaction + if _, err := sourceAccount.IncrementSequenceNumber(); err != nil { + return nil, err + } + txParam := txnbuild.TransactionParams{ + SourceAccount: &sourceAccount, + IncrementSequenceNum: false, + Operations: []txnbuild.Operation{&callOp}, + BaseFee: txnbuild.MinBaseFee, + Preconditions: txnbuild.Preconditions{ + TimeBounds: txnbuild.NewTimeout(300), + }, + } + + simtx, err := txnbuild.NewTransaction(txParam) + if err != nil { + return nil, err + } + simtxe, err := simtx.Base64() + if err != nil { + return nil, err + } + simres, err = p.client.SimulateTransaction(simtxe) + if err != nil { + return nil, err + } + } if err != nil { return nil, err } + var sorobanTxnData xdr.SorobanTransactionData if err := xdr.SafeUnmarshalBase64(simres.TransactionDataXDR, &sorobanTxnData); err != nil { return nil, err @@ -132,6 +166,54 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo return &txRes, err } +func (p *Provider) handleArchivalState(simResult *sorobanclient.TxSimulationResult, sourceAccount txnbuild.Account) error { + txParam := txnbuild.TransactionParams{ + SourceAccount: sourceAccount, + IncrementSequenceNum: false, + Operations: []txnbuild.Operation{ + &txnbuild.RestoreFootprint{}, + }, + BaseFee: txnbuild.MinBaseFee, + Preconditions: txnbuild.Preconditions{ + TimeBounds: txnbuild.NewTimeout(300), + }, + } + var transactionData xdr.SorobanTransactionData + dt := simResult.RestorePreamble.TransactionData + err := xdr.SafeUnmarshalBase64(dt, &transactionData) + if err != nil { + return err + } + op := txParam.Operations[0] + switch v := op.(type) { + case *txnbuild.ExtendFootprintTtl: + v.Ext = xdr.TransactionExt{ + V: 1, + SorobanData: &transactionData, + } + case *txnbuild.RestoreFootprint: + v.Ext = xdr.TransactionExt{ + V: 1, + SorobanData: &transactionData, + } + default: + p.log.Error("invalid type found") + } + txParam.Operations = []txnbuild.Operation{op} + txParam.BaseFee += simResult.RestorePreamble.MinResourceFee + simtx, _ := txnbuild.NewTransaction(txParam) + tx, err := simtx.Sign(p.cfg.NetworkPassphrase, p.wallet) + if err != nil { + return err + } + txe, err := tx.Base64() + if err != nil { + return err + } + _, err = p.client.SubmitTransactionXDR(txe) + return err +} + func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeContractArgs, error) { scXcallAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.XcallContract]) if err != nil { @@ -257,7 +339,6 @@ func (p *Provider) scContractAddr(addr string) (*xdr.ScAddress, error) { if err != nil { return nil, err } - scContractAddr, err := xdr.NewScAddress(xdr.ScAddressTypeScAddressTypeContract, xdr.Hash(contractHash)) if err != nil { return nil, err @@ -327,7 +408,6 @@ func (p *Provider) queryContract(callArgs xdr.InvokeContractArgs, dest types.ScV TimeBounds: txnbuild.NewTimeout(300), }, } - queryTx, err := txnbuild.NewTransaction(txParam) if err != nil { return err @@ -340,6 +420,19 @@ func (p *Provider) queryContract(callArgs xdr.InvokeContractArgs, dest types.ScV if err != nil { return err } + if queryRes.RestorePreamble != nil { + p.log.Info("Need to restore from archived state") + if _, err := sourceAccount.IncrementSequenceNumber(); err != nil { + return err + } + if err := p.handleArchivalState(queryRes, &sourceAccount); err != nil { + return err + } + queryRes, err = p.client.SimulateTransaction(queryTxe) + if err != nil { + return err + } + } for _, callResult := range queryRes.Results { resBytes, err := base64.StdEncoding.DecodeString(callResult.Xdr) if err != nil { From 9b7059faab1419bd7cb833f5208b3dd7346a1ef0 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Fri, 24 May 2024 16:19:21 +0545 Subject: [PATCH 28/46] fix: disabled multi connection registration by default --- test/testsuite/e2e_suite.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/testsuite/e2e_suite.go b/test/testsuite/e2e_suite.go index a8de21bf..21f59c70 100644 --- a/test/testsuite/e2e_suite.go +++ b/test/testsuite/e2e_suite.go @@ -8,12 +8,17 @@ import ( func (s *E2ETestSuite) SetupXCall(ctx context.Context) error { createdChains := s.GetChains() + pocessedChains := []string{} for index, chain := range createdChains { if err := chain.SetupXCall(ctx); err != nil { return err } for ind, cn := range createdChains { if ind != index { + if contains(pocessedChains, chain.Config().Name) { + continue + } + pocessedChains = append(pocessedChains, chain.Config().Name) if err := chain.SetupConnection(ctx, cn); err != nil { return err } @@ -23,6 +28,15 @@ func (s *E2ETestSuite) SetupXCall(ctx context.Context) error { return nil } +func contains(slice []string, item string) bool { + for _, v := range slice { + if v == item { + return true + } + } + return false +} + // SetupChainsAndRelayer create two chains, a relayer, establishes a connection and creates a channel // using the given channel options. The relayer returned by this function has not yet started. It should be started // with E2ETestSuite.StartRelayer if needed. From c6d351e64e1e5472eb8816c8ba38324f0f1aa020 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Tue, 28 May 2024 18:19:55 +0545 Subject: [PATCH 29/46] fix: added impl for generate message --- relayer/chains/steller/provider.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/relayer/chains/steller/provider.go b/relayer/chains/steller/provider.go index 108f567b..e724c302 100644 --- a/relayer/chains/steller/provider.go +++ b/relayer/chains/steller/provider.go @@ -2,6 +2,7 @@ package steller import ( "context" + "errors" "math/big" "strconv" "sync" @@ -65,7 +66,16 @@ func (p *Provider) FinalityBlock(ctx context.Context) uint64 { } func (p *Provider) GenerateMessages(ctx context.Context, messageKey *relayertypes.MessageKeyWithMessageHeight) ([]*relayertypes.Message, error) { - return nil, nil + p.log.Info("generating message", zap.Any("messagekey", messageKey)) + if messageKey == nil { + return nil, errors.New("GenerateMessage: message key cannot be nil") + } + messages, err := p.fetchLedgerMessages(context.Background(), messageKey.Height) + if len(messages) == 0 { + return nil, errors.New("GenerateMessage: no messages found") + } + return messages, err + } func (p *Provider) SetAdmin(ctx context.Context, admin string) error { From 7b685bd7a4b5bd38c9ed20d6995b0db52939bc22 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Fri, 14 Jun 2024 12:31:44 +0545 Subject: [PATCH 30/46] feat: modified listener to use streams which are re-created every 30 seconds with context timeout --- relayer/chains/steller/client.go | 66 +++++- relayer/chains/steller/listener.go | 278 +++++++++--------------- relayer/chains/steller/provider_test.go | 86 -------- relayer/chains/steller/tx.go | 18 +- relayer/chains/steller/types/types.go | 2 +- 5 files changed, 180 insertions(+), 270 deletions(-) delete mode 100644 relayer/chains/steller/provider_test.go diff --git a/relayer/chains/steller/client.go b/relayer/chains/steller/client.go index 2519ff4c..fe78f59c 100644 --- a/relayer/chains/steller/client.go +++ b/relayer/chains/steller/client.go @@ -25,6 +25,8 @@ type IClient interface { GetLatestLedger(ctx context.Context) (*sorobanclient.LatestLedgerResponse, error) FetchEvents(ctx context.Context, eventFilter types.EventFilter) ([]types.Event, error) + + StreamEvents(ctx context.Context, eventFilter types.EventFilter, eventChannel chan<- types.Event) } type Client struct { @@ -56,6 +58,68 @@ func (cl *Client) GetLatestLedger(ctx context.Context) (*sorobanclient.LatestLed return cl.soroban.GetLatestLedger(ctx) } +func (cl *Client) StreamEvents(ctx context.Context, eventFilter types.EventFilter, eventChannel chan<- types.Event) { + ledger, err := cl.horizon.LedgerDetail(uint32(eventFilter.LedgerSeq)) + if err != nil { + ctx.Done() + return + } + ledgerCursor := ledger.PagingToken() + trRequest := horizonclient.TransactionRequest{ + Cursor: ledgerCursor, + Order: horizonclient.OrderAsc, + IncludeFailed: false, + } + txnHandler := func(txn horizon.Transaction) { + var txnMeta xdr.TransactionMeta + if err := xdr.SafeUnmarshalBase64(txn.ResultMetaXdr, &txnMeta); err != nil { + return + } + if txnMeta.V3 == nil || txnMeta.V3.SorobanMeta == nil { + //update the processed height + eventChannel <- types.Event{ + LedgerSeq: uint64(txn.Ledger), + } + return + } + if len(txnMeta.V3.SorobanMeta.Events) == 0 { + eventChannel <- types.Event{ + LedgerSeq: uint64(txn.Ledger), + } + } + for _, ev := range txnMeta.V3.SorobanMeta.Events { + hexBytes, err := hex.DecodeString(ev.ContractId.HexString()) + if err != nil { + break + } + contractID, err := strkey.Encode(strkey.VersionByteContract, hexBytes) + if err != nil { + return + } + if slices.Contains(eventFilter.ContractIds, contractID) { + for _, topic := range ev.Body.V0.Topics { + if slices.Contains(eventFilter.Topics, topic.String()) { + eventChannel <- types.Event{ + ContractEvent: &ev, + LedgerSeq: uint64(txn.Ledger), + } + break + } + } + } else { + eventChannel <- types.Event{ + LedgerSeq: uint64(txn.Ledger), + } + } + } + } + err = cl.horizon.StreamTransactions(ctx, trRequest, txnHandler) + if err != nil { + ctx.Done() + return + } +} + func (cl *Client) FetchEvents(ctx context.Context, eventFilter types.EventFilter) ([]types.Event, error) { req := horizonclient.TransactionRequest{ ForLedger: uint(eventFilter.LedgerSeq), @@ -88,7 +152,7 @@ func (cl *Client) FetchEvents(ctx context.Context, eventFilter types.EventFilter for _, topic := range ev.Body.V0.Topics { if slices.Contains(eventFilter.Topics, topic.String()) { events = append(events, types.Event{ - ContractEvent: ev, + ContractEvent: &ev, LedgerSeq: uint64(txn.Ledger), }) break diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 91b2fb78..e3e66222 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -3,14 +3,11 @@ package steller import ( "context" "fmt" - "runtime" "time" "github.com/icon-project/centralized-relay/relayer/chains/steller/types" relayerevents "github.com/icon-project/centralized-relay/relayer/events" relayertypes "github.com/icon-project/centralized-relay/relayer/types" - "github.com/icon-project/centralized-relay/utils/concurrency" - "github.com/icon-project/centralized-relay/utils/sorter" "go.uber.org/zap" ) @@ -30,143 +27,57 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc startSeq = lastSavedLedgerSeq } - blockIntervalTicker := time.NewTicker(p.cfg.BlockInterval) - defer blockIntervalTicker.Stop() + reconnectCh := make(chan struct{}, 1) // reconnect channel + reconnect := func() { + select { + case reconnectCh <- struct{}{}: + default: + } + } p.log.Info("start querying from ledger seq", zap.Uint64("start-seq", startSeq)) - + eventChannel := make(chan types.Event, 10) + reconnect() + oneMinCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() for { select { case <-ctx.Done(): return ctx.Err() - case <-blockIntervalTicker.C: - newLatestLedger, err := p.client.GetLatestLedger(ctx) - if err != nil { - p.log.Error("failed to query latest ledger", zap.Error(err)) - } else if newLatestLedger.Sequence > latestSeq { - latestSeq = newLatestLedger.Sequence - } - default: - if startSeq < latestSeq { - p.log.Info("Query started.", zap.Uint64("from-seq", startSeq), zap.Uint64("to-seq", latestSeq)) - for _, seqBatch := range getSeqBatches(startSeq, latestSeq, types.LedgerSeqBatchSize) { - p.runLedgerQuery(blockInfo, seqBatch.FromSeq, seqBatch.ToSeq) - p.log.Info("Query completed.", zap.Uint64("from-seq", seqBatch.FromSeq), zap.Uint64("to-seq", seqBatch.ToSeq)) - } - startSeq = latestSeq + 1 - } - } - } -} - -func (p *Provider) runLedgerQuery(blockInfoChan chan *relayertypes.BlockInfo, fromSeq, toSeq uint64) { - done := make(chan interface{}) - defer close(done) - - seqStream := getLedgerSeqStream(done, fromSeq, toSeq) - - numOfPipelines := int(toSeq - fromSeq + 1) - if numOfPipelines > runtime.NumCPU() { - numOfPipelines = runtime.NumCPU() - } - - pipelines := make([]<-chan interface{}, numOfPipelines) - - for i := 0; i < numOfPipelines; i++ { - pipelines[i] = p.getLedgerInfoStream(done, seqStream) - } - - var blockInfoList []relayertypes.BlockInfo - for bn := range concurrency.Take(done, concurrency.FanIn(done, pipelines...), int(toSeq-fromSeq+1)) { - if bn != nil { - block := bn.(relayertypes.BlockInfo) - blockInfoList = append(blockInfoList, block) - } - } - - sorter.Sort( - blockInfoList, - func(p1, p2 relayertypes.BlockInfo) bool { - return p1.Height < p2.Height //ascending order - }, - ) - - for _, blockInfo := range blockInfoList { - blockInfoChan <- &relayertypes.BlockInfo{ - Height: blockInfo.Height, Messages: blockInfo.Messages, - } - } -} - -func getSeqBatches(fromSeq, toSeq, batchSize uint64) []types.LedgerSeqBatch { - seqBatches := []types.LedgerSeqBatch{} - seq := fromSeq - for seq+batchSize <= toSeq { - seqBatches = append(seqBatches, types.LedgerSeqBatch{FromSeq: seq, ToSeq: seq + batchSize - 1}) - seq = seq + batchSize - } - if seq <= toSeq { - seqBatches = append(seqBatches, types.LedgerSeqBatch{FromSeq: seq, ToSeq: toSeq}) - } - return seqBatches -} - -func getLedgerSeqStream(done <-chan interface{}, fromSeq, toSeq uint64) <-chan uint64 { - seqStream := make(chan uint64) - seq := fromSeq - go func() { - defer close(seqStream) - for seq <= toSeq { - select { - case <-done: - return - default: - seqStream <- seq - seq++ - } - } - }() - return seqStream -} - -func (p *Provider) getLedgerInfoStream(done <-chan interface{}, seqStream <-chan uint64) <-chan interface{} { - ledgerInfoStream := make(chan interface{}) - go func() { - defer close(ledgerInfoStream) - Loop: - for { - select { - case <-done: - return - case seq, ok := <-seqStream: - if ok { - for { // will block until and unless ledger messages are fetched so that we are not skipping/missing this ledger seq. - messages, err := p.fetchLedgerMessages(context.Background(), seq) - if err != nil { - p.log.Error("failed to fetch ledger messages: ", zap.Error(err), zap.Uint64("ledger seq", seq)) - time.Sleep(1 * time.Second) - } else { - ledgerInfoStream <- relayertypes.BlockInfo{ - Height: seq, - Messages: messages, - } - break + case <-oneMinCtx.Done(): + oneMinCtx, cancel = context.WithTimeout(ctx, 30*time.Second) + defer cancel() + reconnect() + case ev, ok := <-eventChannel: + if ok { + if ev.ContractEvent != nil { + messages := p.parseMessagesFromEvent(ev) + if messages != nil { + blockInfo <- &relayertypes.BlockInfo{ + Height: messages.MessageHeight, Messages: []*relayertypes.Message{messages}, } } - } else { - break Loop // break out of the outer loop } + startSeq = ev.LedgerSeq + 1 + } + case <-reconnectCh: + p.log.Info("Query started.", zap.Uint64("from-seq", startSeq)) + eventFilter := types.EventFilter{ + LedgerSeq: startSeq, + ContractIds: []string{p.cfg.Contracts[relayertypes.ConnectionContract], p.cfg.Contracts[relayertypes.XcallContract]}, + Topics: []string{"Message", "CallMessage", "RollbackMessage"}, } + go p.client.StreamEvents(oneMinCtx, eventFilter, eventChannel) + } - }() - return ledgerInfoStream + } } func (p *Provider) fetchLedgerMessages(ctx context.Context, ledgerSeq uint64) ([]*relayertypes.Message, error) { eventFilter := types.EventFilter{ LedgerSeq: ledgerSeq, ContractIds: []string{p.cfg.Contracts[relayertypes.ConnectionContract], p.cfg.Contracts[relayertypes.XcallContract]}, - Topics: []string{"Message", "CallMessage"}, + Topics: []string{"Message", "CallMessage", "RollbackMessage"}, } events, err := p.client.FetchEvents(ctx, eventFilter) if err != nil { @@ -183,68 +94,77 @@ func (p *Provider) fetchLedgerMessages(ctx context.Context, ledgerSeq uint64) ([ func (p *Provider) parseMessagesFromEvents(events []types.Event) ([]*relayertypes.Message, error) { messages := []*relayertypes.Message{} for _, ev := range events { - var eventType string - for _, topic := range ev.Body.V0.Topics { - switch topic.String() { - case "Message": - eventType = relayerevents.EmitMessage - case "CallMessage": - eventType = relayerevents.CallMessage - } + msg := p.parseMessagesFromEvent(ev) + if msg != nil { + messages = append(messages, msg) } + } + return messages, nil +} - // if event type is not matched then skip this event - if eventType == "" { - continue +func (p *Provider) parseMessagesFromEvent(ev types.Event) *relayertypes.Message { + var eventType string + for _, topic := range ev.Body.V0.Topics { + switch topic.String() { + case "Message": + eventType = relayerevents.EmitMessage + case "CallMessage": + eventType = relayerevents.CallMessage + case "RollbackMessage": + eventType = relayerevents.RollbackMessage } + } + if eventType == "" { + return nil + } - msg := &relayertypes.Message{ - EventType: eventType, - MessageHeight: ev.LedgerSeq, - } - scval := ev.Body.V0.Data - scMap, ok := scval.GetMap() - if !ok { - continue - } - for _, mapItem := range *scMap { - switch mapItem.Key.String() { - case "connSn", "sn": - sn, ok := mapItem.Val.GetU128() - if !ok { - return nil, fmt.Errorf("failed to decode sn") - } - msg.Sn = uint64(sn.Lo) - case "reqId": - reqId, ok := mapItem.Val.GetU128() - if !ok { - return nil, fmt.Errorf("failed to decode req_id") - } - msg.ReqID = uint64(reqId.Lo) - case "from": - msg.Src = mapItem.Val.String() - case "targetNetwork", "to": - msg.Dst = mapItem.Val.String() - case "msg", "data": - data, ok := mapItem.Val.GetBytes() - if !ok { - return nil, fmt.Errorf("failed to decode data") - } - msg.Data = data + msg := &relayertypes.Message{ + EventType: eventType, + MessageHeight: ev.LedgerSeq, + } + scval := ev.Body.V0.Data + scMap, ok := scval.GetMap() + if !ok { + return nil + } + for _, mapItem := range *scMap { + switch mapItem.Key.String() { + case "connSn", "sn": + sn, ok := mapItem.Val.GetU128() + if !ok { + p.log.Warn("failed to decode sn", zap.Any("value", mapItem.Val)) + return nil } + msg.Sn = uint64(sn.Lo) + case "reqId": + reqId, ok := mapItem.Val.GetU128() + if !ok { + p.log.Warn("failed to decode req_id", zap.Any("value", mapItem.Val)) + return nil + } + msg.ReqID = uint64(reqId.Lo) + case "from": + msg.Src = mapItem.Val.String() + case "targetNetwork", "to": + msg.Dst = mapItem.Val.String() + case "msg", "data": + data, ok := mapItem.Val.GetBytes() + if !ok { + p.log.Warn("failed to decode data", zap.Any("value", mapItem.Val)) + return nil + } + msg.Data = data } - - //skip invalid message - if msg.Src == "" && msg.Dst != "" { - msg.Src = p.cfg.NID - } - if msg.Sn == 0 || msg.Src == "" || msg.Dst == "" { - p.log.Warn("detected invalid message: ", zap.Any("msg", msg)) - continue - } - - messages = append(messages, msg) } - return messages, nil + //skip invalid message + if msg.Src == "" && msg.Dst != "" { + msg.Src = p.cfg.NID + } + if msg.EventType == "" { + p.log.Warn("detected invalid message: ", zap.Any("msg", msg)) + return nil + } + p.log.Info("Detected eventlog:", zap.Any("event", *msg)) + return msg } diff --git a/relayer/chains/steller/provider_test.go b/relayer/chains/steller/provider_test.go deleted file mode 100644 index 01bc4709..00000000 --- a/relayer/chains/steller/provider_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package steller - -import ( - "testing" - - "github.com/icon-project/centralized-relay/relayer/chains/steller/types" - "github.com/stretchr/testify/assert" -) - -func TestGetSeqBatches(t *testing.T) { - done := make(chan interface{}) - defer close(done) - - type testCase struct { - name string - fromSeq, toSeq, batchSize uint64 - expected []types.LedgerSeqBatch - } - - testCases := []testCase{ - { - name: "case-0", - fromSeq: 1, - toSeq: 1, - batchSize: 1, - expected: []types.LedgerSeqBatch{ - {FromSeq: 1, ToSeq: 1}, - }, - }, - { - name: "case-1", - fromSeq: 1, - toSeq: 2, - batchSize: 1, - expected: []types.LedgerSeqBatch{ - {FromSeq: 1, ToSeq: 1}, - {FromSeq: 2, ToSeq: 2}, - }, - }, - { - name: "case-2", - fromSeq: 1, - toSeq: 4, - batchSize: 2, - expected: []types.LedgerSeqBatch{ - {FromSeq: 1, ToSeq: 2}, - {FromSeq: 3, ToSeq: 4}, - }, - }, - { - name: "case-3", - fromSeq: 1, - toSeq: 4, - batchSize: 3, - expected: []types.LedgerSeqBatch{ - {FromSeq: 1, ToSeq: 3}, - {FromSeq: 4, ToSeq: 4}, - }, - }, - { - name: "case-4", - fromSeq: 1, - toSeq: 4, - batchSize: 4, - expected: []types.LedgerSeqBatch{ - {FromSeq: 1, ToSeq: 4}, - }, - }, - { - name: "case-5", - fromSeq: 1, - toSeq: 4, - batchSize: 5, - expected: []types.LedgerSeqBatch{ - {FromSeq: 1, ToSeq: 4}, - }, - }, - } - - for _, testCase := range testCases { - t.Run(testCase.name, func(subTest *testing.T) { - batches := getSeqBatches(testCase.fromSeq, testCase.toSeq, testCase.batchSize) - assert.Equal(subTest, testCase.expected, batches) - }) - } -} diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 6b251db8..2fcc26aa 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "encoding/base64" + "errors" "fmt" "strconv" @@ -16,6 +17,7 @@ import ( "github.com/stellar/go/strkey" "github.com/stellar/go/txnbuild" "github.com/stellar/go/xdr" + "go.uber.org/zap" ) func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, callback relayertypes.TxResponseFunc) error { @@ -39,7 +41,7 @@ func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, cal if err != nil { cbErr = err } else if txRes != nil && !txRes.Successful { - cbErr = fmt.Errorf("failed to send call transaction") + cbErr = errors.New("failed to send call transaction") } callback(message.MessageKey(), cbTxResp, cbErr) @@ -79,6 +81,7 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo } simtxe, err := simtx.Base64() if err != nil { + p.log.Warn("tx simulation failed", zap.Any("code", simtx)) return nil, err } simres, err := p.client.SimulateTransaction(simtxe) @@ -149,7 +152,6 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo return nil, err } txParam.BaseFee = int64(minResourceFee) + int64(p.cfg.MaxInclusionFee) - tx, err := txnbuild.NewTransaction(txParam) if err != nil { return nil, err @@ -163,6 +165,9 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo return nil, err } txRes, err := p.client.SubmitTransactionXDR(txe) + if err != nil { + p.log.Warn("error while executing txn", zap.Any("error", err), zap.Any("code", txe)) + } return &txRes, err } @@ -224,7 +229,6 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon return nil, err } stellerMsg := types.StellerMsg{Message: msg} - switch msg.EventType { case evtypes.EmitMessage: return &xdr.InvokeContractArgs{ @@ -252,6 +256,14 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon stellerMsg.ScvData(), }, }, nil + case evtypes.RollbackMessage: + return &xdr.InvokeContractArgs{ + ContractAddress: *scXcallAddr, + FunctionName: xdr.ScSymbol("execute_rollback"), + Args: []xdr.ScVal{ + stellerMsg.ScvSn(), + }, + }, nil default: return nil, fmt.Errorf("invalid message type") } diff --git a/relayer/chains/steller/types/types.go b/relayer/chains/steller/types/types.go index 0868d2cd..93f3c311 100644 --- a/relayer/chains/steller/types/types.go +++ b/relayer/chains/steller/types/types.go @@ -14,7 +14,7 @@ type EventFilter struct { } type Event struct { - xdr.ContractEvent + *xdr.ContractEvent LedgerSeq uint64 } From 2280e48994f5cedb9b8bc685e7da9030bd2f5b66 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Fri, 14 Jun 2024 12:48:52 +0545 Subject: [PATCH 31/46] feat: increased time to minute --- relayer/chains/steller/listener.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index e3e66222..a50a2d19 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -38,14 +38,14 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc p.log.Info("start querying from ledger seq", zap.Uint64("start-seq", startSeq)) eventChannel := make(chan types.Event, 10) reconnect() - oneMinCtx, cancel := context.WithTimeout(ctx, 30*time.Second) + oneMinCtx, cancel := context.WithTimeout(ctx, 60*time.Second) defer cancel() for { select { case <-ctx.Done(): return ctx.Err() case <-oneMinCtx.Done(): - oneMinCtx, cancel = context.WithTimeout(ctx, 30*time.Second) + oneMinCtx, cancel = context.WithTimeout(ctx, 60*time.Second) defer cancel() reconnect() case ev, ok := <-eventChannel: From 1370f7273ba9818efc9757f2b0bb760c6f734199 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Mon, 17 Jun 2024 08:51:54 +0545 Subject: [PATCH 32/46] feat: preferring reduncancy over chances of missing packets --- relayer/chains/steller/listener.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index a50a2d19..3cb233c6 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -58,7 +58,7 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc } } } - startSeq = ev.LedgerSeq + 1 + startSeq = ev.LedgerSeq } case <-reconnectCh: p.log.Info("Query started.", zap.Uint64("from-seq", startSeq)) From c0921ec71443847cb70a05807d7f2304e0d0f614 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Mon, 17 Jun 2024 10:39:20 +0545 Subject: [PATCH 33/46] feat: added provision to read start height from config with highest priority if set to other than 0 --- relayer/chains/steller/config.go | 21 +++++++++++---------- relayer/chains/steller/listener.go | 4 ++++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/relayer/chains/steller/config.go b/relayer/chains/steller/config.go index 3c0f826e..1a3fceb1 100644 --- a/relayer/chains/steller/config.go +++ b/relayer/chains/steller/config.go @@ -15,17 +15,18 @@ import ( ) type Config struct { - ChainID string `yaml:"chain-id"` - ChainName string `yaml:"-"` - HorizonUrl string `yaml:"horizon-url"` - SorobanUrl string `yaml:"soroban-url"` - Address string `yaml:"address"` - Contracts relayertypes.ContractConfigMap `yaml:"contracts"` + ChainID string `json:"chain-id" yaml:"chain-id"` + ChainName string `json:"-t" yaml:"-"` + HorizonUrl string `json:"horizon-url" yaml:"horizon-url"` + SorobanUrl string `json:"soroban-url" yaml:"soroban-url"` + Address string `json:"address" yaml:"address"` + Contracts relayertypes.ContractConfigMap `json:"contracts" yaml:"contracts"` NID string `json:"nid" yaml:"nid"` - HomeDir string `yaml:"home-dir"` - MaxInclusionFee uint64 `yaml:"max-inclusion-fee"` // in stroop: the smallest unit of a lumen, one ten-millionth of a lumen (.0000001 XLM). - BlockInterval time.Duration `yaml:"block-interval"` - NetworkPassphrase string `yaml:"network-passphrase"` + HomeDir string `json:"home-dir" yaml:"home-dir"` + MaxInclusionFee uint64 `json:"max-inclusion-fee" yaml:"max-inclusion-fee"` // in stroop: the smallest unit of a lumen, one ten-millionth of a lumen (.0000001 XLM). + BlockInterval time.Duration `json:"block-interval" yaml:"block-interval"` + NetworkPassphrase string `json:"network-passphrase" yaml:"network-passphrase"` + StartHeight uint64 `json:"start-height" yaml:"start-height"` // would be of highest priority } func (pc *Config) NewProvider(ctx context.Context, logger *zap.Logger, homePath string, debug bool, chainName string) (provider.ChainProvider, error) { diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 3cb233c6..64474584 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -27,6 +27,10 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc startSeq = lastSavedLedgerSeq } + if p.cfg.StartHeight != 0 && p.cfg.StartHeight < startSeq { + startSeq = p.cfg.StartHeight + } + reconnectCh := make(chan struct{}, 1) // reconnect channel reconnect := func() { From 68c375780f0e2c50711a8b6e3115f67f96007ec0 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Mon, 17 Jun 2024 16:55:52 +0545 Subject: [PATCH 34/46] fix: fixed logging position --- relayer/chains/steller/tx.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 2fcc26aa..3589b73c 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -81,10 +81,13 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo } simtxe, err := simtx.Base64() if err != nil { - p.log.Warn("tx simulation failed", zap.Any("code", simtx)) return nil, err } simres, err := p.client.SimulateTransaction(simtxe) + if err != nil { + p.log.Warn("tx simulation failed", zap.Any("code", simtx)) + return nil, err + } if simres.RestorePreamble != nil { p.log.Info("Need to restore from archived state") if err := p.handleArchivalState(simres, &sourceAccount); err != nil { @@ -117,10 +120,6 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo return nil, err } } - if err != nil { - return nil, err - } - var sorobanTxnData xdr.SorobanTransactionData if err := xdr.SafeUnmarshalBase64(simres.TransactionDataXDR, &sorobanTxnData); err != nil { return nil, err From 9ae638e0fb96e37b5d31381f07d51fa0ebb4f1e3 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Tue, 18 Jun 2024 15:23:18 +0545 Subject: [PATCH 35/46] fix: added extra logs for better visibility --- relayer/chains/steller/tx.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 3589b73c..31d7979e 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -26,6 +26,10 @@ func (p *Provider) Route(ctx context.Context, message *relayertypes.Message, cal return err } txRes, err := p.sendCallTransaction(*callArgs) + if err != nil { + p.log.Warn("error occurred while executing transaction", zap.Any("error", err), + zap.Any("sn", message.Sn), zap.Any("reqId", message.ReqID), zap.Any("type", message.EventType)) + } cbTxResp := &relayertypes.TxResponse{} responseCode := relayertypes.Failed if txRes != nil && txRes.Successful { @@ -85,7 +89,7 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo } simres, err := p.client.SimulateTransaction(simtxe) if err != nil { - p.log.Warn("tx simulation failed", zap.Any("code", simtx)) + p.log.Warn("tx simulation failed", zap.Any("code", simtxe)) return nil, err } if simres.RestorePreamble != nil { @@ -122,9 +126,9 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo } var sorobanTxnData xdr.SorobanTransactionData if err := xdr.SafeUnmarshalBase64(simres.TransactionDataXDR, &sorobanTxnData); err != nil { + p.log.Warn("tx result marshal failed", zap.Any("code", simtxe)) return nil, err } - callOp.Ext = xdr.TransactionExt{ V: 1, SorobanData: &sorobanTxnData, From 57bfb346309c972692a70bc76c5d9e815fa8a666 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Wed, 19 Jun 2024 13:42:46 +0545 Subject: [PATCH 36/46] fix: code refactoring --- relayer/chains/steller/listener.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 64474584..c1d91f9e 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -11,6 +11,10 @@ import ( "go.uber.org/zap" ) +var ( + hzContextTimeout = 2 * time.Minute +) + func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, blockInfo chan *relayertypes.BlockInfo) error { if err := p.RestoreKeystore(ctx); err != nil { return fmt.Errorf("failed to restore key: %w", err) @@ -42,14 +46,14 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc p.log.Info("start querying from ledger seq", zap.Uint64("start-seq", startSeq)) eventChannel := make(chan types.Event, 10) reconnect() - oneMinCtx, cancel := context.WithTimeout(ctx, 60*time.Second) + hzStreamCtx, cancel := context.WithTimeout(ctx, hzContextTimeout) defer cancel() for { select { case <-ctx.Done(): return ctx.Err() - case <-oneMinCtx.Done(): - oneMinCtx, cancel = context.WithTimeout(ctx, 60*time.Second) + case <-hzStreamCtx.Done(): + hzStreamCtx, cancel = context.WithTimeout(ctx, hzContextTimeout) defer cancel() reconnect() case ev, ok := <-eventChannel: @@ -71,7 +75,7 @@ func (p *Provider) Listener(ctx context.Context, lastSavedLedgerSeq uint64, bloc ContractIds: []string{p.cfg.Contracts[relayertypes.ConnectionContract], p.cfg.Contracts[relayertypes.XcallContract]}, Topics: []string{"Message", "CallMessage", "RollbackMessage"}, } - go p.client.StreamEvents(oneMinCtx, eventFilter, eventChannel) + go p.client.StreamEvents(hzStreamCtx, eventFilter, eventChannel) } } From 8b07b5b98a810fed1cabd9f0e845dd468b1e6796 Mon Sep 17 00:00:00 2001 From: "Biru C. Sainju" Date: Wed, 19 Jun 2024 15:54:28 +0545 Subject: [PATCH 37/46] fix: fixed e2e test cases after auto rollback on stellar --- go.work.sum | 247 +++++++++++++++++++++++++++++-- test/chains/stellar/remotenet.go | 20 ++- test/e2e/tests/xcall.go | 32 ++-- 3 files changed, 272 insertions(+), 27 deletions(-) diff --git a/go.work.sum b/go.work.sum index 6154ead7..9160396e 100644 --- a/go.work.sum +++ b/go.work.sum @@ -5,137 +5,254 @@ cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxK cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= cloud.google.com/go/accessapproval v1.7.5/go.mod h1:g88i1ok5dvQ9XJsxpUInWWvUBrIZhyPDPbk4T01OoJ0= +cloud.google.com/go/accessapproval v1.7.6/go.mod h1:bdDCS3iLSLhlK3pu8lJClaeIVghSpTLGChl1Ihr9Fsc= cloud.google.com/go/accesscontextmanager v1.8.5/go.mod h1:TInEhcZ7V9jptGNqN3EzZ5XMhT6ijWxTGjzyETwmL0Q= +cloud.google.com/go/accesscontextmanager v1.8.6/go.mod h1:rMC0Z8pCe/JR6yQSksprDc6swNKjMEvkfCbaesh+OS0= cloud.google.com/go/aiplatform v1.60.0/go.mod h1:eTlGuHOahHprZw3Hio5VKmtThIOak5/qy6pzdsqcQnM= +cloud.google.com/go/aiplatform v1.66.0/go.mod h1:bPQS0UjaXaTAq57UgP3XWDCtYFOIbXXpkMsl6uP4JAc= cloud.google.com/go/analytics v0.23.0/go.mod h1:YPd7Bvik3WS95KBok2gPXDqQPHy08TsCQG6CdUCb+u0= +cloud.google.com/go/analytics v0.23.1/go.mod h1:N+piBUJo0RfnVTa/u8E/d31jAxxQaHlnoJfUx0dechM= cloud.google.com/go/apigateway v1.6.5/go.mod h1:6wCwvYRckRQogyDDltpANi3zsCDl6kWi0b4Je+w2UiI= +cloud.google.com/go/apigateway v1.6.6/go.mod h1:bFH3EwOkeEC+31wVxKNuiadhk2xa7y9gJ3rK4Mctq6o= cloud.google.com/go/apigeeconnect v1.6.5/go.mod h1:MEKm3AiT7s11PqTfKE3KZluZA9O91FNysvd3E6SJ6Ow= +cloud.google.com/go/apigeeconnect v1.6.6/go.mod h1:j8V/Xj51tEUl/cWnqwlolPvCpHj5OvgKrHEGfmYXG9Y= cloud.google.com/go/apigeeregistry v0.8.3/go.mod h1:aInOWnqF4yMQx8kTjDqHNXjZGh/mxeNlAf52YqtASUs= +cloud.google.com/go/apigeeregistry v0.8.4/go.mod h1:oA6iN7olOol8Rc28n1qd2q0LSD3ro2pdf/1l/y8SK4E= cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= cloud.google.com/go/appengine v1.8.5/go.mod h1:uHBgNoGLTS5di7BvU25NFDuKa82v0qQLjyMJLuPQrVo= +cloud.google.com/go/appengine v1.8.6/go.mod h1:J0Vk696gUey9gbmTub3Qe4NYPy6qulXMkfwcQjadFnM= cloud.google.com/go/area120 v0.8.5/go.mod h1:BcoFCbDLZjsfe4EkCnEq1LKvHSK0Ew/zk5UFu6GMyA0= +cloud.google.com/go/area120 v0.8.6/go.mod h1:sjEk+S9QiyDt1fxo75TVut560XZLnuD9lMtps0qQSH0= cloud.google.com/go/artifactregistry v1.14.7/go.mod h1:0AUKhzWQzfmeTvT4SjfI4zjot72EMfrkvL9g9aRjnnM= +cloud.google.com/go/artifactregistry v1.14.8/go.mod h1:1UlSXh6sTXYrIT4kMO21AE1IDlMFemlZuX6QS+JXW7I= cloud.google.com/go/asset v1.17.2/go.mod h1:SVbzde67ehddSoKf5uebOD1sYw8Ab/jD/9EIeWg99q4= +cloud.google.com/go/asset v1.18.1/go.mod h1:QXivw0mVqwrhZyuX6iqFbyfCdzYE9AFCJVG47Eh5dMM= cloud.google.com/go/assuredworkloads v1.11.5/go.mod h1:FKJ3g3ZvkL2D7qtqIGnDufFkHxwIpNM9vtmhvt+6wqk= +cloud.google.com/go/assuredworkloads v1.11.6/go.mod h1:1dlhWKocQorGYkspt+scx11kQCI9qVHOi1Au6Rw9srg= cloud.google.com/go/automl v1.13.5/go.mod h1:MDw3vLem3yh+SvmSgeYUmUKqyls6NzSumDm9OJ3xJ1Y= +cloud.google.com/go/automl v1.13.6/go.mod h1:/0VtkKis6KhFJuPzi45e0E+e9AdQE09SNieChjJqU18= cloud.google.com/go/baremetalsolution v1.2.4/go.mod h1:BHCmxgpevw9IEryE99HbYEfxXkAEA3hkMJbYYsHtIuY= +cloud.google.com/go/baremetalsolution v1.2.5/go.mod h1:CImy7oNMC/7vLV1Ig68Og6cgLWuVaghDrm+sAhYSSxA= cloud.google.com/go/batch v1.8.0/go.mod h1:k8V7f6VE2Suc0zUM4WtoibNrA6D3dqBpB+++e3vSGYc= +cloud.google.com/go/batch v1.8.3/go.mod h1:mnDskkuz1h+6i/ra8IMhTf8HwG8GOswSRKPJdAOgSbE= cloud.google.com/go/beyondcorp v1.0.4/go.mod h1:Gx8/Rk2MxrvWfn4WIhHIG1NV7IBfg14pTKv1+EArVcc= +cloud.google.com/go/beyondcorp v1.0.5/go.mod h1:lFRWb7i/w4QBFW3MbM/P9wX15eLjwri/HYvQnZuk4Fw= cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc= +cloud.google.com/go/bigquery v1.60.0/go.mod h1:Clwk2OeC0ZU5G5LDg7mo+h8U7KlAa5v06z5rptKdM3g= cloud.google.com/go/billing v1.18.2/go.mod h1:PPIwVsOOQ7xzbADCwNe8nvK776QpfrOAUkvKjCUcpSE= +cloud.google.com/go/billing v1.18.4/go.mod h1:hECVHwfls2hhA/wrNVAvZ48GQzMxjWkQRq65peAnxyc= cloud.google.com/go/binaryauthorization v1.8.1/go.mod h1:1HVRyBerREA/nhI7yLang4Zn7vfNVA3okoAR9qYQJAQ= +cloud.google.com/go/binaryauthorization v1.8.2/go.mod h1:/v3/F2kBR5QmZBnlqqzq9QNwse8OFk+8l1gGNUzjedw= cloud.google.com/go/certificatemanager v1.7.5/go.mod h1:uX+v7kWqy0Y3NG/ZhNvffh0kuqkKZIXdvlZRO7z0VtM= +cloud.google.com/go/certificatemanager v1.8.0/go.mod h1:5qq/D7PPlrMI+q9AJeLrSoFLX3eTkLc9MrcECKrWdIM= cloud.google.com/go/channel v1.17.5/go.mod h1:FlpaOSINDAXgEext0KMaBq/vwpLMkkPAw9b2mApQeHc= +cloud.google.com/go/channel v1.17.6/go.mod h1:fr0Oidb2mPfA0RNcV+JMSBv5rjpLHjy9zVM5PFq6Fm4= cloud.google.com/go/cloudbuild v1.15.1/go.mod h1:gIofXZSu+XD2Uy+qkOrGKEx45zd7s28u/k8f99qKals= +cloud.google.com/go/cloudbuild v1.16.0/go.mod h1:CCWnqxLxEdh8kpOK83s3HTNBTpoIFn/U9j8DehlUyyA= cloud.google.com/go/clouddms v1.7.4/go.mod h1:RdrVqoFG9RWI5AvZ81SxJ/xvxPdtcRhFotwdE79DieY= +cloud.google.com/go/clouddms v1.7.5/go.mod h1:O4GVvxKPxbXlVfxkoUIXi8UAwwIHoszYm32dJ8tgbvE= cloud.google.com/go/cloudtasks v1.12.6/go.mod h1:b7c7fe4+TJsFZfDyzO51F7cjq7HLUlRi/KZQLQjDsaY= +cloud.google.com/go/cloudtasks v1.12.7/go.mod h1:I6o/ggPK/RvvokBuUppsbmm4hrGouzFbf6fShIm0Pqc= cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI= +cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= +cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= +cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/contactcenterinsights v1.13.0/go.mod h1:ieq5d5EtHsu8vhe2y3amtZ+BE+AQwX5qAy7cpo0POsI= +cloud.google.com/go/contactcenterinsights v1.13.1/go.mod h1:/3Ji8Rr1GS6d+/MOwlXM2gZPSuvTKIFyf8OG+7Pe5r8= cloud.google.com/go/container v1.31.0/go.mod h1:7yABn5s3Iv3lmw7oMmyGbeV6tQj86njcTijkkGuvdZA= +cloud.google.com/go/container v1.35.0/go.mod h1:02fCocALhTHLw4zwqrRaFrztjoQd53yZWFq0nvr+hQo= cloud.google.com/go/containeranalysis v0.11.4/go.mod h1:cVZT7rXYBS9NG1rhQbWL9pWbXCKHWJPYraE8/FTSYPE= +cloud.google.com/go/containeranalysis v0.11.5/go.mod h1:DlgF5MaxAmGdq6F9wCUEp/JNx9lsr6QaQONFd4mxG8A= cloud.google.com/go/datacatalog v1.19.3/go.mod h1:ra8V3UAsciBpJKQ+z9Whkxzxv7jmQg1hfODr3N3YPJ4= +cloud.google.com/go/datacatalog v1.20.0/go.mod h1:fSHaKjIroFpmRrYlwz9XBB2gJBpXufpnxyAKaT4w6L0= cloud.google.com/go/dataflow v0.9.5/go.mod h1:udl6oi8pfUHnL0z6UN9Lf9chGqzDMVqcYTcZ1aPnCZQ= +cloud.google.com/go/dataflow v0.9.6/go.mod h1:nO0hYepRlPlulvAHCJ+YvRPLnL/bwUswIbhgemAt6eM= cloud.google.com/go/dataform v0.9.2/go.mod h1:S8cQUwPNWXo7m/g3DhWHsLBoufRNn9EgFrMgne2j7cI= +cloud.google.com/go/dataform v0.9.3/go.mod h1:c/TBr0tqx5UgBTmg3+5DZvLxX+Uy5hzckYZIngkuU/w= cloud.google.com/go/datafusion v1.7.5/go.mod h1:bYH53Oa5UiqahfbNK9YuYKteeD4RbQSNMx7JF7peGHc= +cloud.google.com/go/datafusion v1.7.6/go.mod h1:cDJfsWRYcaktcM1xfwkBOIccOaWJ5mG3zm95EaLtINA= cloud.google.com/go/datalabeling v0.8.5/go.mod h1:IABB2lxQnkdUbMnQaOl2prCOfms20mcPxDBm36lps+s= +cloud.google.com/go/datalabeling v0.8.6/go.mod h1:8gVcLufcZg0hzRnyMkf3UvcUen2Edo6abP6Rsz2jS6Q= cloud.google.com/go/dataplex v1.14.2/go.mod h1:0oGOSFlEKef1cQeAHXy4GZPB/Ife0fz/PxBf+ZymA2U= +cloud.google.com/go/dataplex v1.15.0/go.mod h1:R5rUQ3X18d6wcMraLOUIOTEULasL/1nvSrNF7C98eyg= cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataproc/v2 v2.4.0/go.mod h1:3B1Ht2aRB8VZIteGxQS/iNSJGzt9+CA0WGnDVMEm7Z4= +cloud.google.com/go/dataproc/v2 v2.4.1/go.mod h1:HrymsaRUG1FjK2G1sBRQrHMhgj5+ENUIAwRbL130D8o= cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM= +cloud.google.com/go/dataqna v0.8.6/go.mod h1:3u2zPv3VwMUNW06oTRcSWS3+dDuxF/0w5hEWUCsLepw= cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= cloud.google.com/go/datastream v1.10.4/go.mod h1:7kRxPdxZxhPg3MFeCSulmAJnil8NJGGvSNdn4p1sRZo= +cloud.google.com/go/datastream v1.10.5/go.mod h1:BmIPX19K+Pjho3+sR7Jtddmf+vluzLgaG7465xje/wg= cloud.google.com/go/deploy v1.17.1/go.mod h1:SXQyfsXrk0fBmgBHRzBjQbZhMfKZ3hMQBw5ym7MN/50= +cloud.google.com/go/deploy v1.17.2/go.mod h1:kKSAl1mab0Y27XlWGBrKNA5WOOrKo24KYzx2JRAfBL4= cloud.google.com/go/dialogflow v1.49.0/go.mod h1:dhVrXKETtdPlpPhE7+2/k4Z8FRNUp6kMV3EW3oz/fe0= +cloud.google.com/go/dialogflow v1.52.0/go.mod h1:mMh76X5D0Tg48PjGXaCveHpeKDnKz+dpwGln3WEN7DQ= cloud.google.com/go/dlp v1.11.2/go.mod h1:9Czi+8Y/FegpWzgSfkRlyz+jwW6Te9Rv26P3UfU/h/w= +cloud.google.com/go/dlp v1.12.1/go.mod h1:RBUw3yjNSVcFoU8L4ECuxAx0lo1MrusfA4y46bp9vLw= cloud.google.com/go/documentai v1.25.0/go.mod h1:ftLnzw5VcXkLItp6pw1mFic91tMRyfv6hHEY5br4KzY= +cloud.google.com/go/documentai v1.26.1/go.mod h1:ljZB6yyT/aKZc9tCd0WGtBxIMWu8ZCEO6UiNwirqLU0= cloud.google.com/go/domains v0.9.5/go.mod h1:dBzlxgepazdFhvG7u23XMhmMKBjrkoUNaw0A8AQB55Y= +cloud.google.com/go/domains v0.9.6/go.mod h1:hYaeMxsDZED5wuUwYHXf89+aXHJvh41+os8skywd8D4= cloud.google.com/go/edgecontainer v1.1.5/go.mod h1:rgcjrba3DEDEQAidT4yuzaKWTbkTI5zAMu3yy6ZWS0M= +cloud.google.com/go/edgecontainer v1.2.0/go.mod h1:bI2foS+2fRbzBmkIQtrxNzeVv3zZZy780PFF96CiVxA= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.6.6/go.mod h1:XbqHJGaiH0v2UvtuucfOzFXN+rpL/aU5BCZLn4DYl1Q= +cloud.google.com/go/essentialcontacts v1.6.7/go.mod h1:5577lqt2pvnx9n4zP+eJSSWL02KLmQvjJPYknHdAbZg= cloud.google.com/go/eventarc v1.13.4/go.mod h1:zV5sFVoAa9orc/52Q+OuYUG9xL2IIZTbbuTHC6JSY8s= +cloud.google.com/go/eventarc v1.13.5/go.mod h1:wrZcXnSOZk/AVbBYT5GpOa5QPuQFzSxiXKsKnynoPes= cloud.google.com/go/filestore v1.8.1/go.mod h1:MbN9KcaM47DRTIuLfQhJEsjaocVebNtNQhSLhKCF5GM= +cloud.google.com/go/filestore v1.8.2/go.mod h1:QU7EKJP/xmCtzIhxNVLfv/k1QBKHXTbbj9512kwUT1I= cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= cloud.google.com/go/functions v1.16.0/go.mod h1:nbNpfAG7SG7Duw/o1iZ6ohvL7mc6MapWQVpqtM29n8k= +cloud.google.com/go/functions v1.16.1/go.mod h1:WcQy3bwDw6KblOuj+khLyQbsi8aupUrZUrPEKTtVaSQ= cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= cloud.google.com/go/gkebackup v1.3.5/go.mod h1:KJ77KkNN7Wm1LdMopOelV6OodM01pMuK2/5Zt1t4Tvc= +cloud.google.com/go/gkebackup v1.4.0/go.mod h1:FpsE7Qcio7maQ5bPMvacN+qoXTPWrxHe4fm44RWa67U= cloud.google.com/go/gkeconnect v0.8.5/go.mod h1:LC/rS7+CuJ5fgIbXv8tCD/mdfnlAadTaUufgOkmijuk= +cloud.google.com/go/gkeconnect v0.8.6/go.mod h1:4/o9sXLLsMl2Rw2AyXjtVET0RMk4phdFJuBX45jRRHc= cloud.google.com/go/gkehub v0.14.5/go.mod h1:6bzqxM+a+vEH/h8W8ec4OJl4r36laxTs3A/fMNHJ0wA= +cloud.google.com/go/gkehub v0.14.6/go.mod h1:SD3/ihO+7/vStQEwYA1S/J9mouohy7BfhM/gGjAmJl0= cloud.google.com/go/gkemulticloud v1.1.1/go.mod h1:C+a4vcHlWeEIf45IB5FFR5XGjTeYhF83+AYIpTy4i2Q= +cloud.google.com/go/gkemulticloud v1.1.2/go.mod h1:QhdIrilhqieDJJzOyfMPBqcfDVntENYGwqSeX2ZuIDE= cloud.google.com/go/grafeas v0.3.4/go.mod h1:A5m316hcG+AulafjAbPKXBO/+I5itU4LOdKO2R/uDIc= cloud.google.com/go/gsuiteaddons v1.6.5/go.mod h1:Lo4P2IvO8uZ9W+RaC6s1JVxo42vgy+TX5a6hfBZ0ubs= +cloud.google.com/go/gsuiteaddons v1.6.6/go.mod h1:JmAp1/ojGgHtSe5d6ZPkOwJbYP7An7DRBkhSJ1aer8I= cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= cloud.google.com/go/iap v1.9.4/go.mod h1:vO4mSq0xNf/Pu6E5paORLASBwEmphXEjgCFg7aeNu1w= +cloud.google.com/go/iap v1.9.5/go.mod h1:4zaAOm66mId/50vqRF7ZPDeCjvHQJSVAXD/mkUWo4Zk= cloud.google.com/go/ids v1.4.5/go.mod h1:p0ZnyzjMWxww6d2DvMGnFwCsSxDJM666Iir1bK1UuBo= +cloud.google.com/go/ids v1.4.6/go.mod h1:EJ1554UwEEs8HCHVnXPGn21WouM0uFvoq8UvEEr2ng4= cloud.google.com/go/iot v1.7.5/go.mod h1:nq3/sqTz3HGaWJi1xNiX7F41ThOzpud67vwk0YsSsqs= +cloud.google.com/go/iot v1.7.6/go.mod h1:IMhFVfRGn5OqrDJ9Obu0rC5VIr2+SvSyUxQPHkXYuW0= cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= +cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs= cloud.google.com/go/language v1.12.3/go.mod h1:evFX9wECX6mksEva8RbRnr/4wi/vKGYnAJrTRXU8+f8= +cloud.google.com/go/language v1.12.4/go.mod h1:Us0INRv/CEbrk2s8IBZcHaZjSBmK+bRlX4FUYZrD4I8= cloud.google.com/go/lifesciences v0.9.5/go.mod h1:OdBm0n7C0Osh5yZB7j9BXyrMnTRGBJIZonUMxo5CzPw= +cloud.google.com/go/lifesciences v0.9.6/go.mod h1:BkNWYU0tPZbwpy76RE4biZajWFe6NvWwEAaIlNiKXdE= cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= +cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= cloud.google.com/go/managedidentities v1.6.5/go.mod h1:fkFI2PwwyRQbjLxlm5bQ8SjtObFMW3ChBGNqaMcgZjI= +cloud.google.com/go/managedidentities v1.6.6/go.mod h1:0+0qF22qx8o6eeaZ/Ku7HmHv9soBHD1piyNHgAP+c20= cloud.google.com/go/maps v1.6.4/go.mod h1:rhjqRy8NWmDJ53saCfsXQ0LKwBHfi6OSh5wkq6BaMhI= +cloud.google.com/go/maps v1.7.1/go.mod h1:fri+i4pO41ZUZ/Nrz3U9hNEtXsv5SROMFP2AwAHFSX8= cloud.google.com/go/mediatranslation v0.8.5/go.mod h1:y7kTHYIPCIfgyLbKncgqouXJtLsU+26hZhHEEy80fSs= +cloud.google.com/go/mediatranslation v0.8.6/go.mod h1:zI2ZvRRtrGimH572cwYtmq8t1elKbUGVVw4MAXIC4UQ= cloud.google.com/go/memcache v1.10.5/go.mod h1:/FcblbNd0FdMsx4natdj+2GWzTq+cjZvMa1I+9QsuMA= +cloud.google.com/go/memcache v1.10.6/go.mod h1:4elGf6MwGszZCM0Yopp15qmBoo+Y8M7wg7QRpSM8pzA= cloud.google.com/go/metastore v1.13.4/go.mod h1:FMv9bvPInEfX9Ac1cVcRXp8EBBQnBcqH6gz3KvJ9BAE= +cloud.google.com/go/metastore v1.13.5/go.mod h1:dmsJzIdQcJrpmRGhEaii3EhVq1JuhI0bxSBoy7A8hcQ= cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= +cloud.google.com/go/monitoring v1.18.1/go.mod h1:52hTzJ5XOUMRm7jYi7928aEdVxBEmGwA0EjNJXIBvt8= cloud.google.com/go/networkconnectivity v1.14.4/go.mod h1:PU12q++/IMnDJAB+3r+tJtuCXCfwfN+C6Niyj6ji1Po= +cloud.google.com/go/networkconnectivity v1.14.5/go.mod h1:Wy28mxRApI1uVwA9iHaYYxGNe74cVnSP311bCUJEpBc= cloud.google.com/go/networkmanagement v1.9.4/go.mod h1:daWJAl0KTFytFL7ar33I6R/oNBH8eEOX/rBNHrC/8TA= +cloud.google.com/go/networkmanagement v1.13.0/go.mod h1:LcwkOGJmWtjM4yZGKfN1kSoEj/OLGFpZEQefWofHFKI= cloud.google.com/go/networksecurity v0.9.5/go.mod h1:KNkjH/RsylSGyyZ8wXpue8xpCEK+bTtvof8SBfIhMG8= +cloud.google.com/go/networksecurity v0.9.6/go.mod h1:SZB02ji/2uittsqoAXu9PBqGG9nF9PuxPgtezQfihSA= cloud.google.com/go/notebooks v1.11.3/go.mod h1:0wQyI2dQC3AZyQqWnRsp+yA+kY4gC7ZIVP4Qg3AQcgo= +cloud.google.com/go/notebooks v1.11.4/go.mod h1:vtqPiCQMv++HOfQMzyE46f4auCB843rf20KEQW2zZKM= cloud.google.com/go/optimization v1.6.3/go.mod h1:8ve3svp3W6NFcAEFr4SfJxrldzhUl4VMUJmhrqVKtYA= +cloud.google.com/go/optimization v1.6.4/go.mod h1:AfXfr2vlBXCF9RPh/Jpj46FhXR5JiWlyHA0rGI5Eu5M= cloud.google.com/go/orchestration v1.8.5/go.mod h1:C1J7HesE96Ba8/hZ71ISTV2UAat0bwN+pi85ky38Yq8= +cloud.google.com/go/orchestration v1.9.1/go.mod h1:yLPB2q/tdlEheIiZS7DAPKHeXdf4qNTlKAJCp/2EzXA= cloud.google.com/go/orgpolicy v1.12.1/go.mod h1:aibX78RDl5pcK3jA8ysDQCFkVxLj3aOQqrbBaUL2V5I= +cloud.google.com/go/orgpolicy v1.12.2/go.mod h1:XycP+uWN8Fev47r1XibYjOgZod8SjXQtZGsO2I8KXX8= cloud.google.com/go/osconfig v1.12.5/go.mod h1:D9QFdxzfjgw3h/+ZaAb5NypM8bhOMqBzgmbhzWViiW8= +cloud.google.com/go/osconfig v1.12.6/go.mod h1:2dcXGl5qNbKo6Hjsnqbt5t6H2GX7UCAaPjF6BwDlFq8= cloud.google.com/go/oslogin v1.13.1/go.mod h1:vS8Sr/jR7QvPWpCjNqy6LYZr5Zs1e8ZGW/KPn9gmhws= +cloud.google.com/go/oslogin v1.13.2/go.mod h1:U8Euw2VeOEhJ/NE/0Q8xpInxi0J1oo2zdRNNVA/ba7U= cloud.google.com/go/phishingprotection v0.8.5/go.mod h1:g1smd68F7mF1hgQPuYn3z8HDbNre8L6Z0b7XMYFmX7I= +cloud.google.com/go/phishingprotection v0.8.6/go.mod h1:OSnaLSZryNaS80qVzArfi2/EoNWEeTSutTiWA/29xKU= cloud.google.com/go/policytroubleshooter v1.10.3/go.mod h1:+ZqG3agHT7WPb4EBIRqUv4OyIwRTZvsVDHZ8GlZaoxk= +cloud.google.com/go/policytroubleshooter v1.10.4/go.mod h1:kSp7PKn80ttbKt8SSjQ0Z/pYYug/PFapxSx2Pr7xjf0= cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd450J9yZoOECcQqJk= +cloud.google.com/go/privatecatalog v0.9.6/go.mod h1:BTwLqXfNzM6Tn4cTjzYj8avfw9+h/N68soYuTrYXL9I= cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= +cloud.google.com/go/pubsub v1.37.0/go.mod h1:YQOQr1uiUM092EXwKs56OPT650nwnawc+8/IjoUeGzQ= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise/v2 v2.9.2/go.mod h1:trwwGkfhCmp05Ll5MSJPXY7yvnO0p4v3orGANAFHAuU= +cloud.google.com/go/recaptchaenterprise/v2 v2.12.0/go.mod h1:4TohRUt9x4hzECD53xRFER+TJavgbep6riguPnsr4oQ= cloud.google.com/go/recommendationengine v0.8.5/go.mod h1:A38rIXHGFvoPvmy6pZLozr0g59NRNREz4cx7F58HAsQ= +cloud.google.com/go/recommendationengine v0.8.6/go.mod h1:ratALtVdAkofp0vDzpkL87zJcTymiQLc7fQyohRKWoA= cloud.google.com/go/recommender v1.12.1/go.mod h1:gf95SInWNND5aPas3yjwl0I572dtudMhMIG4ni8nr+0= +cloud.google.com/go/recommender v1.12.2/go.mod h1:9YizZzqpUtJelRv0pw2bfl3+3i5bTwL/FuAucj15WJc= cloud.google.com/go/redis v1.14.2/go.mod h1:g0Lu7RRRz46ENdFKQ2EcQZBAJ2PtJHJLuiiRuEXwyQw= +cloud.google.com/go/redis v1.14.3/go.mod h1:YtYX9QC98d3LEI9GUixwZ339Niw6w5xFcxLRruuFuss= cloud.google.com/go/resourcemanager v1.9.5/go.mod h1:hep6KjelHA+ToEjOfO3garMKi/CLYwTqeAw7YiEI9x8= +cloud.google.com/go/resourcemanager v1.9.6/go.mod h1:d+XUOGbxg6Aka3lmC4fDiserslux3d15uX08C6a0MBg= cloud.google.com/go/resourcesettings v1.6.5/go.mod h1:WBOIWZraXZOGAgoR4ukNj0o0HiSMO62H9RpFi9WjP9I= +cloud.google.com/go/resourcesettings v1.6.6/go.mod h1:t1+N03/gwNuKyOqpnACg/hWNL7ujT8mQYGqOzxOjFVE= cloud.google.com/go/retail v1.16.0/go.mod h1:LW7tllVveZo4ReWt68VnldZFWJRzsh9np+01J9dYWzE= +cloud.google.com/go/retail v1.16.1/go.mod h1:xzHOcNrzFB5aew1AjWhZAPnHF2oCGqt7hMmTlrzQqAs= cloud.google.com/go/run v1.3.4/go.mod h1:FGieuZvQ3tj1e9GnzXqrMABSuir38AJg5xhiYq+SF3o= +cloud.google.com/go/run v1.3.6/go.mod h1:/ou4d0u5CcK5/44Hbpd3wsBjNFXmn6YAWChu+XAKwSU= cloud.google.com/go/scheduler v1.10.6/go.mod h1:pe2pNCtJ+R01E06XCDOJs1XvAMbv28ZsQEbqknxGOuE= +cloud.google.com/go/scheduler v1.10.7/go.mod h1:AfKUtlPF0D2xtfWy+k6rQFaltcBeeoSOY7XKQkWs+1s= cloud.google.com/go/secretmanager v1.11.5/go.mod h1:eAGv+DaCHkeVyQi0BeXgAHOU0RdrMeZIASKc+S7VqH4= +cloud.google.com/go/secretmanager v1.12.0/go.mod h1:Y1Gne3Ag+fZ2TDTiJc8ZJCMFbi7k1rYT4Rw30GXfvlk= cloud.google.com/go/security v1.15.5/go.mod h1:KS6X2eG3ynWjqcIX976fuToN5juVkF6Ra6c7MPnldtc= +cloud.google.com/go/security v1.15.6/go.mod h1:UMEAGVBMqE6xZvkCR1FvUIeBEmGOCRIDwtwT357xmok= cloud.google.com/go/securitycenter v1.24.4/go.mod h1:PSccin+o1EMYKcFQzz9HMMnZ2r9+7jbc+LvPjXhpwcU= +cloud.google.com/go/securitycenter v1.28.0/go.mod h1:kmS8vAIwPbCIg7dDuiVKF/OTizYfuWe5f0IIW6NihN8= cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= cloud.google.com/go/servicedirectory v1.11.4/go.mod h1:Bz2T9t+/Ehg6x+Y7Ycq5xiShYLD96NfEsWNHyitj1qM= +cloud.google.com/go/servicedirectory v1.11.5/go.mod h1:hp2Ix2Qko7hIh5jaFWftbdwKXHQhYPijcGPpLgTVZvw= cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= cloud.google.com/go/shell v1.7.5/go.mod h1:hL2++7F47/IfpfTO53KYf1EC+F56k3ThfNEXd4zcuiE= +cloud.google.com/go/shell v1.7.6/go.mod h1:Ax+fG/h5TbwbnlhyzkgMeDK7KPfINYWE0V/tZUuuPXo= cloud.google.com/go/spanner v1.57.0/go.mod h1:aXQ5QDdhPRIqVhYmnkAdwPYvj/DRN0FguclhEWw+jOo= +cloud.google.com/go/spanner v1.60.0/go.mod h1:D2bOAeT/dC6zsZhXRIxbdYa5nQEYU3wYM/1KN3eg7Fs= cloud.google.com/go/speech v1.21.1/go.mod h1:E5GHZXYQlkqWQwY5xRSLHw2ci5NMQNG52FfMU1aZrIA= +cloud.google.com/go/speech v1.22.1/go.mod h1:s8C9OLTemdGb4FHX3imHIp5AanwKR4IhdSno0Cg1s7k= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY= +cloud.google.com/go/storage v1.39.1/go.mod h1:xK6xZmxZmo+fyP7+DEF6FhNc24/JAe95OLyOHCXFH1o= cloud.google.com/go/storagetransfer v1.10.4/go.mod h1:vef30rZKu5HSEf/x1tK3WfWrL0XVoUQN/EPDRGPzjZs= +cloud.google.com/go/storagetransfer v1.10.5/go.mod h1:086WXPZlWXLfql+/nlmcc8ZzFWvITqfSGUQyMdf5eBk= cloud.google.com/go/talent v1.6.6/go.mod h1:y/WQDKrhVz12WagoarpAIyKKMeKGKHWPoReZ0g8tseQ= +cloud.google.com/go/talent v1.6.7/go.mod h1:OLojlmmygm0wuTqi+UXKO0ZdLHsAedUfDgxDrkIWxTo= cloud.google.com/go/texttospeech v1.7.5/go.mod h1:tzpCuNWPwrNJnEa4Pu5taALuZL4QRRLcb+K9pbhXT6M= +cloud.google.com/go/texttospeech v1.7.6/go.mod h1:nhRJledkoE6/6VvEq/d0CX7nPnDwc/uzfaqePlmiPVE= cloud.google.com/go/tpu v1.6.5/go.mod h1:P9DFOEBIBhuEcZhXi+wPoVy/cji+0ICFi4TtTkMHSSs= +cloud.google.com/go/tpu v1.6.6/go.mod h1:T4gCNpT7SO28mMkCVJTWQ3OXAUY3YlScOqU4+5iX2B8= cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= +cloud.google.com/go/trace v1.10.6/go.mod h1:EABXagUjxGuKcZMy4pXyz0fJpE5Ghog3jzTxcEsVJS4= cloud.google.com/go/translate v1.10.1/go.mod h1:adGZcQNom/3ogU65N9UXHOnnSvjPwA/jKQUMnsYXOyk= +cloud.google.com/go/translate v1.10.2/go.mod h1:M4xIFGUwTrmuhyMMpJFZrBuSOhaX7Fhj4U1//mfv4BE= cloud.google.com/go/video v1.20.4/go.mod h1:LyUVjyW+Bwj7dh3UJnUGZfyqjEto9DnrvTe1f/+QrW0= +cloud.google.com/go/video v1.20.5/go.mod h1:tCaG+vfAM6jmkwHvz2M0WU3KhiXpmDbQy3tBryMo8I0= cloud.google.com/go/videointelligence v1.11.5/go.mod h1:/PkeQjpRponmOerPeJxNPuxvi12HlW7Em0lJO14FC3I= +cloud.google.com/go/videointelligence v1.11.6/go.mod h1:b6dd26k4jUM+9evzWxLK1QDwVvoOA1piEYiTDv3jF6w= cloud.google.com/go/vision/v2 v2.8.0/go.mod h1:ocqDiA2j97pvgogdyhoxiQp2ZkDCyr0HWpicywGGRhU= +cloud.google.com/go/vision/v2 v2.8.1/go.mod h1:0n3GzR+ZyRVDHTH5koELHFqIw3lXaFdLzlHUvlXNWig= cloud.google.com/go/vmmigration v1.7.5/go.mod h1:pkvO6huVnVWzkFioxSghZxIGcsstDvYiVCxQ9ZH3eYI= +cloud.google.com/go/vmmigration v1.7.6/go.mod h1:HpLc+cOfjHgW0u6jdwcGlOSbkeemIEwGiWKS+8Mqy1M= cloud.google.com/go/vmwareengine v1.1.1/go.mod h1:nMpdsIVkUrSaX8UvmnBhzVzG7PPvNYc5BszcvIVudYs= +cloud.google.com/go/vmwareengine v1.1.2/go.mod h1:7wZHC+0NM4TnQE8gUpW397KgwccH+fAnc4Lt5zB0T1k= cloud.google.com/go/vpcaccess v1.7.5/go.mod h1:slc5ZRvvjP78c2dnL7m4l4R9GwL3wDLcpIWz6P/ziig= +cloud.google.com/go/vpcaccess v1.7.6/go.mod h1:BV6tTobbojd2AhrEOBLfywFUJlFU63or5Qgd0XrFsCc= cloud.google.com/go/webrisk v1.9.5/go.mod h1:aako0Fzep1Q714cPEM5E+mtYX8/jsfegAuS8aivxy3U= +cloud.google.com/go/webrisk v1.9.6/go.mod h1:YzrDCXBOpnC64+GRRpSXPMQSvR8I4r5YO78y7A/T0Ac= cloud.google.com/go/websecurityscanner v1.6.5/go.mod h1:QR+DWaxAz2pWooylsBF854/Ijvuoa3FCyS1zBa1rAVQ= +cloud.google.com/go/websecurityscanner v1.6.6/go.mod h1:zjsc4h9nV1sUxuSMurR2v3gJwWKYorJ+Nanm+1/w6G0= cloud.google.com/go/workflows v1.12.4/go.mod h1:yQ7HUqOkdJK4duVtMeBCAOPiN1ZF1E9pAMX51vpwB/w= +cloud.google.com/go/workflows v1.12.5/go.mod h1:KbK5/Ef28G8MKLXcsvt/laH1Vka4CKeQj0I1/wEiByo= cosmossdk.io/api v0.7.2/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= cosmossdk.io/api v0.7.3/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= @@ -149,8 +266,10 @@ cosmossdk.io/tools/confix v0.1.0/go.mod h1:TdXKVYs4gEayav5wM+JHT+kTU2J7fozFNqoVa cosmossdk.io/x/tx v0.12.0/go.mod h1:qTth2coAGkwCwOCjqQ8EAQg+9udXNRzcnSbMgGKGEI0= cosmossdk.io/x/tx v0.13.0/go.mod h1:CpNQtmoqbXa33/DVxWQNx5Dcnbkv2xGUhL7tYQ5wUsY= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +firebase.google.com/go v3.12.0+incompatible/go.mod h1:xlah6XbEyW6tbfSklcfe5FHJIwjt8toICdV5Wh9ptHs= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/2opremio/pretty v0.2.2-0.20230601220618-e1d5758b2a95/go.mod h1:Gv4NIpY67KDahg+DtIG5/2Ok4l8vzYEekiirSCH+IGA= github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= github.com/Abirdcfly/dupword v0.0.11/go.mod h1:wH8mVGuf3CP5fsBTkfWwwwKTjDnVVCxtU8d8rgeVYXA= github.com/Antonboom/errname v0.1.9/go.mod h1:nLTcJzevREuAsgTbG85UsuiWpMpAqbKD1HNZ29OzE58= @@ -174,17 +293,22 @@ github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXY github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/Shopify/sarama v1.26.4/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU= github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/adjust/goautoneg v0.0.0-20150426214442-d788f35a0315/go.mod h1:4U522XvlkqOY2AVBUM7ISHODDb6tdB+KAXfGaBDsWts= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= @@ -194,16 +318,19 @@ github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HR github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= +github.com/araddon/gou v0.0.0-20190110011759-c797efecbb61/go.mod h1:ikc1XA58M+Rx7SEbf0bLJCfBkwayZ8T5jBo5FXK8Uz8= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/ashanbrown/forbidigo v1.5.1/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/avast/retry-go/v4 v4.5.1/go.mod h1:/sipNsvNB3RRuT5iNcb6h73nw3IBmXJ/H3XrCQYSOpc= +github.com/aws/aws-sdk-go v1.33.2/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.44.224/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= @@ -221,6 +348,7 @@ github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= @@ -243,10 +371,13 @@ github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtyd github.com/bufbuild/buf v1.15.1/go.mod h1:TQeGKam1QMfHy/xsSnnMpxN3JK5HBb6aNvZj4m52gkE= github.com/bufbuild/connect-go v1.5.2/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk= github.com/bufbuild/protocompile v0.5.1/go.mod h1:G5iLmavmF4NsYtpZFvE3B/zFch2GIY8+wjsYLR/lc40= +github.com/buger/goreplay v1.3.2/go.mod h1:EyAKHxJR6K6phd0NaoPETSDbJRB/ogIw3Y15UlSbVBM= github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= @@ -265,6 +396,7 @@ github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUK github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= @@ -295,6 +427,8 @@ github.com/cosmos/iavl v1.1.1/go.mod h1:jLeUvm6bGT1YutCaL2fIar/8vGUE8cPZvh/gXEWD github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creachadair/atomicfile v0.3.1/go.mod h1:mwfrkRxFKwpNAflYZzytbSwxvbK6fdGRRlp0KEQc0qU= github.com/creachadair/command v0.0.0-20220916173946-56a74cdd66b6/go.mod h1:jN7ZJM5YSVtD3SHmkAdN/cOC1dXiqg2Y9K5Sr5a8Nxw= +github.com/creachadair/jrpc2 v1.1.0/go.mod h1:5jN7MKwsm8qvgfTsTzLX3JIfidsAkZ1c8DZSQmp+g38= +github.com/creachadair/mds v0.0.1/go.mod h1:caBACU+n1Q/rZ252FTzfnG0/H+ZUi+UnIQtEOraMv/g= github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= @@ -309,6 +443,7 @@ github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYB github.com/denisenkom/go-mssqldb v0.12.0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= +github.com/djherbis/fscache v0.10.1/go.mod h1:yyPYtkNnnPXsW+81lAcQS6yab3G2CRfnPLotBvtbf0c= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= @@ -322,12 +457,15 @@ github.com/dop251/goja v0.0.0-20230605162241-28ee0ee714f3/go.mod h1:QMWlm50DNe14 github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emicklei/dot v1.4.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emicklei/dot v1.6.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= @@ -337,7 +475,7 @@ github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+ne github.com/fardream/go-bcs v0.2.1/go.mod h1:UsoxhIoe2GsVexX0s5NDLIChxeb/JUbjw7IWzzgF3Xk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -348,13 +486,17 @@ github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6Ytix github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsouza/fake-gcs-server v1.49.0/go.mod h1:FJYZxdHQk2nGxrczFjLbDv8h6SnYXxSxcnM14eeespA= +github.com/fsouza/slognil v0.4.0/go.mod h1:wsw8m+QX5kWJAQpq5NnOF2G+TzbF35Npb2xqHxgYdHM= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.7.4/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/getsentry/sentry-go v0.25.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= @@ -363,6 +505,7 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-critic/go-critic v0.7.0/go.mod h1:moYzd7GdVXE2C2hYTwd7h0CPcqlUeclsyBRwMa38v64= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= @@ -372,6 +515,7 @@ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmS github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= +github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -382,6 +526,7 @@ github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhO github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= @@ -396,9 +541,13 @@ github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJ github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= +github.com/gobuffalo/packd v1.0.2/go.mod h1:sUc61tDqGMXON80zpKGp92lDb86Km28jfvX7IAyxFT8= +github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= @@ -420,12 +569,14 @@ github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-containerregistry v0.13.0/go.mod h1:J9FQ+eSS4a1aC2GNZxvNpbWhgp0487v+cgiilB4FqDo= github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/go-querystring v0.0.0-20160401233042-9235644dd9e5/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gopacket v1.1.20-0.20210429153827-3eaba0894325/go.mod h1:riddUzxTSBpJXk3qBHtYr4qOhFhT6k/1c0E3qkQjQpA= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= github.com/google/pprof v0.0.0-20230228050547-1710fef4ab10/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= +github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -434,7 +585,9 @@ github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go v0.0.0-20161107002406-da06d194a00e/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK9YM6zKx4D2qucQU= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/gax-go/v2 v2.12.1/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= @@ -453,6 +606,7 @@ github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Rep github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= +github.com/guregu/null v4.0.0+incompatible/go.mod h1:ePGpQaN9cw0tj45IR5E5ehMvsFlLlQZAkkOXZurJ3NM= github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= github.com/hashicorp/consul/sdk v0.14.1/go.mod h1:vFt03juSzocLRFo59NkeQHHmQa6+g7oU0pfzdI1mUhg= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -470,6 +624,9 @@ github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/ github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= +github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= +github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= @@ -478,7 +635,6 @@ github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= @@ -490,6 +646,7 @@ github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5Uybo github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= @@ -508,6 +665,7 @@ github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+ github.com/junk1tm/musttag v0.5.0/go.mod h1:PcR7BA+oREQYvHwgjIDmw3exJeds5JzRcvEJTfjrA0M= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52/go.mod h1:qk1sX/IBgppQNcGCRoj90u6EGC056EBoIc1oEjCWla8= +github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= @@ -527,12 +685,15 @@ github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -544,11 +705,14 @@ github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dq github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/tagliatelle v0.4.0/go.mod h1:mNtTfrHy2haaBAw+VT7IBV6VXBThS7TCreYWbBcJ87I= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leodido/go-urn v1.2.2/go.mod h1:kUaIbLZWttglzwNuG0pgsh5vuV6u2YcGBYz1hIPjtOQ= github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linxGnu/grocksdb v1.7.15/go.mod h1:pY55D0o+r8yUYLq70QmhdudxYvoDb9F+9puf4m3/W+U= github.com/linxGnu/grocksdb v1.8.6/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/linxGnu/grocksdb v1.8.12/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= @@ -561,14 +725,20 @@ github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNf github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= +github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= +github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= +github.com/mattbaird/elastigo v0.0.0-20170123220020-2fe47fd29e4b/go.mod h1:5MWrJXKRQyhQdUCF+vu6U5c4nQpg70vW3eHaU0/AYbU= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= @@ -583,10 +753,15 @@ github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgS github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.70/go.mod h1:4yBA8v80xGA30cfM3fz0DKYMXunWl/AV/6tWEs9ryzo= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moricho/tparallel v0.3.0/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= @@ -595,6 +770,7 @@ github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1: github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= +github.com/nats-io/jwt/v2 v2.4.1/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= @@ -602,6 +778,7 @@ github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7 github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/near/borsh-go v0.3.1 h1:ukNbhJlPKxfua0/nIuMZhggSU8zvtRP/VyC25LLqPUA= +github.com/nelsam/hel/v2 v2.3.3/go.mod h1:1ZTGfU2PFTOd5mx22i5O0Lc2GY933lQ2wb/ggy+rL3w= github.com/nishanths/exhaustive v0.9.5/go.mod h1:IbwrGdVMizvDcIxPYGVdQn5BqWJaOwpCvg4RGb8r/TA= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nunnatsa/ginkgolinter v0.9.0/go.mod h1:FHaMLURXP7qImeH6bvxWJUpyH+2tuqe5j4rW1gxJRmI= @@ -609,7 +786,7 @@ github.com/oasisprotocol/curve25519-voi v0.0.0-20220708102147-0a8a51822cae/go.mo github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdMPGhM= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= @@ -624,6 +801,7 @@ github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZO github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/petermattis/goid v0.0.0-20221215004737-a150e88a970d/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/petermattis/goid v0.0.0-20230904192822-1876fd5063bc/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= @@ -631,6 +809,8 @@ github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7 github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= @@ -638,12 +818,14 @@ github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDj github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= +github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3/go.mod h1:q5NXNGzqj5uPnVuhGkZfmgHqNUhf15VLi6L9kW0VEc0= github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR1j20Aj5pB6+fw6Y9Ur7lMHpegTEjY1vc19hEZL40= github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= github.com/polyfloyd/go-errorlint v1.4.5/go.mod h1:sIZEbFoDOCnTYYZoVkjc4hTnM459tuWA9H/EkdXwsKk= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= @@ -653,6 +835,7 @@ github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3d github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= @@ -670,6 +853,7 @@ github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mo github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= @@ -678,10 +862,12 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rubenv/sql-migrate v1.5.2/go.mod h1:H38GW8Vqf8F0Su5XignRyaRcbXbJunSWxs+kmzlg0Is= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= @@ -690,6 +876,7 @@ github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28 github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.17.0/go.mod h1:SMtHTvdmsZMuY/bpZoqokSoChIrcJ/epOxZN58PbZDg= +github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= @@ -699,9 +886,10 @@ github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtm github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/securego/gosec/v2 v2.15.0/go.mod h1:VOjTrZOkUtSDt2QLSJmQBMWnvwiQPEjg0l+5juIqGk8= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v0.0.0-20161205080420-83532ca1c1ca/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= github.com/shirou/gopsutil/v3 v3.23.2/go.mod h1:gv0aQw33GLo3pG8SiWKiQrbDzbRY1K80RyZJ7V4Th1M= +github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= @@ -715,6 +903,7 @@ github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag07 github.com/spf13/afero v1.4.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= @@ -723,9 +912,11 @@ github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRM github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= github.com/spf13/viper v1.18.1/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= +github.com/stellar/throttled v2.2.3-0.20190823235211-89d75816f59d+incompatible/go.mod h1:7CJ23pXirXBJq45DqvO6clzTEGM/l1SfKrgrzLry8b4= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -748,6 +939,7 @@ github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e/go.mod h1:27bSVN github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/tyler-smith/go-bip39 v0.0.0-20180618194314-52158e4697b8/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= @@ -755,20 +947,20 @@ github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89 github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= +github.com/valyala/fasthttp v1.34.0/go.mod h1:epZA5N+7pY6ZaEKRmstzOuYJx9HI8DI1oaCGZpdH4h0= github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= github.com/vektra/mockery/v2 v2.23.1/go.mod h1:Zh3Kv1ckKs6FokhlVLcCu6UTyzfS3M8mpROz1lBNp+w= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= @@ -798,6 +990,7 @@ go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xC go.opentelemetry.io/otel/metric v1.23.0/go.mod h1:MqUW2X2a6Q8RN96E2/nqNoT+z9BSms20Jb7Bbp+HiTo= go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5UkggkflQwDScNUsk= @@ -811,6 +1004,7 @@ go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -886,6 +1080,8 @@ golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -894,6 +1090,7 @@ golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -908,6 +1105,7 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220325203850-36772127a21f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -979,6 +1177,9 @@ google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2Pr google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw= google.golang.org/api v0.164.0/go.mod h1:2OatzO7ZDQsoS7IFf3rvsE17/TldiU3F/zxFHeqUB5o= google.golang.org/api v0.166.0/go.mod h1:4FcBc686KFi7QI/U51/2GKKevfZMpM17sCdibqe/bSA= +google.golang.org/api v0.167.0/go.mod h1:4FcBc686KFi7QI/U51/2GKKevfZMpM17sCdibqe/bSA= +google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +google.golang.org/api v0.170.0/go.mod h1:/xql9M2btF85xac/VAm4PsLMTLVGUOpq4BE9R8jyNy8= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -991,6 +1192,7 @@ google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M= google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= @@ -999,7 +1201,13 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go. google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014/go.mod h1:rbHMSEDyoYX62nRVLOCc4Qt1HbsdytAYoVwgjiOhF3I= google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:PVreiBMirk8ypES6aw9d4p6iiBNSIfZEBqr3UGoAi2E= google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= +google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= +google.golang.org/genproto/googleapis/api v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/api v0.0.0-20240314234333-6e1732d8331c/go.mod h1:VQW3tUculP/D4B+xVCo+VgSq8As6wA9ZjHl//pmk+6s= +google.golang.org/genproto/googleapis/api v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:K4kfzHtI0kqWA79gecJarFtDn/Mls+GxQcg3Zox91Ac= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:om8Bj876Z0v9ei+RD1LnEWig7vpHQ371PUqsgjmLQEA= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240429193739-8cf5692501f6/go.mod h1:ULqtoQMxDLNRfW+pJbKA68wtIy1OiYjdIsJs3PMpzh8= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= @@ -1013,6 +1221,12 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240228201840-1f18d85a4ec2/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240311132316-a219d84964c2/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/grpc v0.0.0-20170208002647-2a6bf6142e96/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= @@ -1023,13 +1237,26 @@ google.golang.org/grpc v1.60.0/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/djherbis/atime.v1 v1.0.0/go.mod h1:hQIUStKmJfvf7xdh/wtK84qe+DsTV5LnA9lzxxtPpJ8= +gopkg.in/djherbis/stream.v1 v1.3.1/go.mod h1:aEV8CBVRmSpLamVJfM903Npic1IKmb2qS30VAZ+sssg= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= +gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= +gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= +gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tylerb/graceful.v1 v1.2.15/go.mod h1:yBhekWvR20ACXVObSSdD3u6S9DeSylanL2PAbAC/uJ8= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= diff --git a/test/chains/stellar/remotenet.go b/test/chains/stellar/remotenet.go index d60b0272..d0acb2fc 100644 --- a/test/chains/stellar/remotenet.go +++ b/test/chains/stellar/remotenet.go @@ -31,9 +31,6 @@ type StellarRemotenet struct { log *zap.Logger testName string cfg ibc.ChainConfig - numValidators int - numFullNodes int - keystorePath string scorePaths map[string]string IBCAddresses map[string]string `json:"addresses"` Wallets map[string]ibc.Wallet `json:"wallets"` @@ -250,9 +247,9 @@ func (sn *StellarRemotenet) SetupConnection(ctx context.Context, target chains.C func (sn *StellarRemotenet) SetupXCall(ctx context.Context) error { if sn.testconfig.Environment == "preconfigured" { testcase := ctx.Value("testcase").(string) - sn.IBCAddresses["xcall"] = "CASJ76AJJKK6BFMMB4DLLYV5J6OBTBIO25FDWXWZY5BIXFVCNK7XACNG" - sn.IBCAddresses["connection"] = "CBLG6CNVXWSCF7X5XXM6B5JZ2ULFIPV7KRENAIB2HB4FAKMGIMD63BJU" - sn.IBCAddresses[fmt.Sprintf("dapp-%s", testcase)] = "CA2QFEESKXOWQZJRQ7LUIGTDEEWNOLR4KRYL35GUWNRK5XYZ3FDP3L7W" + sn.IBCAddresses["xcall"] = "CAKBVQ2QLJWQ5AO4HPND3XEDLGCLDW7UV5WATLDLWBKP535EGDEVKSD4" + sn.IBCAddresses["connection"] = "CC4WN23OV5MRA5DKRBP5SZB6XUNXXWKNOUQ3TKTPCW3EM3KGIE54YANI" + sn.IBCAddresses[fmt.Sprintf("dapp-%s", testcase)] = "CA7VNLUTPQZEKAXJHXHCS2YJHPELODRZKB26MBQQISD4BPHG2PGAUPMM" return nil } xcall, err := sn.DeployContractRemote(ctx, sn.scorePaths["xcall"]) @@ -411,7 +408,7 @@ func (sn *StellarRemotenet) FindCallResponse(ctx context.Context, startHeight ui } func (sn *StellarRemotenet) FindEvent(ctx context.Context, startHeight uint64, contract, signature, sno string) (*EventResponseEvent, error) { - timeout := time.After(60 * time.Second) + timeout := time.After(120 * time.Second) ticker := time.NewTicker(2 * time.Second) defer ticker.Stop() for { @@ -544,3 +541,12 @@ func (sn *StellarRemotenet) ExecCallTxCommand(ctx context.Context, scoreAddress, command = sn.BinCommand(command...) return command } + +func (sn *StellarRemotenet) FindRollbackExecutedMessage(ctx context.Context, startHeight uint64, sno string) (string, error) { + event, err := sn.FindEvent(ctx, startHeight, "xcall", "RollbackExecuted", sno) + if err != nil { + return "", err + } + fsno := event.ValueDecoded["sn"].(uint64) + return strconv.FormatUint(fsno, 10), nil +} diff --git a/test/e2e/tests/xcall.go b/test/e2e/tests/xcall.go index d35b9a5b..753f0497 100644 --- a/test/e2e/tests/xcall.go +++ b/test/e2e/tests/xcall.go @@ -90,19 +90,19 @@ func testChains(ctx context.Context, createdChains []chains.Chain, x *XCallTestS }) x.T.Run("xcall test rollback chainB-chainA"+reverseChainFlowName, func(t *testing.T) { - fmt.Println("Sending rollback message from src to dst", chain.Config().Name, innerChain.Config().Name) + fmt.Println("Sending rollback message from src to dst", innerChain.Config().Name, chain.Config().Name) err := x.testRollback(ctx, t, innerChain, chain) assert.NoErrorf(t, err, "fail xCall rollback message chainB-chainA( %s) ::%v\n ", reverseChainFlowIdentifier, err) }) x.T.Run("xcall test rollback data chainB-chainA without rollback "+reverseChainFlowName, func(t *testing.T) { - fmt.Println("Sending rollback message from src to dst", chain.Config().Name, innerChain.Config().Name) + fmt.Println("Sending rollback message from src to dst", innerChain.Config().Name, chain.Config().Name) err := x.testRollbackDataWithoutRollback(ctx, t, innerChain, chain) assert.NoErrorf(t, err, "fail xCall rollback message chainB-chainA( %s) ::%v\n ", reverseChainFlowIdentifier, err) }) x.T.Run("xcall test rollback data reply data chainB-chainA without rollback "+reverseChainFlowName, func(t *testing.T) { - fmt.Println("Sending rollback message from src to dst", chain.Config().Name, innerChain.Config().Name) + fmt.Println("Sending rollback message from src to dst", innerChain.Config().Name, chain.Config().Name) err := x.testRollbackDataReplyWithoutRollback(ctx, t, innerChain, chain) assert.NoErrorf(t, err, "fail xCall rollback message chainB-chainA( %s) ::%v\n ", reverseChainFlowIdentifier, err) }) @@ -178,16 +178,17 @@ func (x *XCallTestSuite) testRollback(ctx context.Context, t *testing.T, chainA, if !isSuccess { return err } - if chainA.Config().Name != "sui" { //TODO: remove after all chains support auto rollback + //TODO: remove after all chains support auto rollback + if chainA.Config().Name == "sui" || chainA.Config().Name == "stellar" { + _, err = chainA.FindRollbackExecutedMessage(ctx, height, res.SerialNo) + assert.NoErrorf(t, err, "no rollback executed message found %v", err) + fmt.Println("Data Transfer Testing With Rollback from " + chainA.(ibc.Chain).Config().ChainID + " to " + chainB.(ibc.Chain).Config().ChainID + " with data " + msg + " and rollback:" + rollback + " PASSED") + } else { time.Sleep(3 * time.Second) ctx, err = chainA.ExecuteRollback(ctx, res.SerialNo) assert.NoErrorf(t, err, "error on excute rollback- %w", err) - rollbackEventFound := ctx.Value("IsRollbackEventFound") - assert.Equal(t, true, rollbackEventFound) - fmt.Println("Data Transfer Testing With Rollback from " + chainA.(ibc.Chain).Config().ChainID + " to " + chainB.(ibc.Chain).Config().ChainID + " with data " + msg + " and rollback:" + rollback + " PASSED") - } else { - _, err = chainA.FindRollbackExecutedMessage(ctx, height, res.SerialNo) - assert.NoErrorf(t, err, "no rollback executed message found %v", err) + rollbackExecutedEventFound := ctx.Value("IsRollbackEventFound") + assert.Equal(t, true, rollbackExecutedEventFound) fmt.Println("Data Transfer Testing With Rollback from " + chainA.(ibc.Chain).Config().ChainID + " to " + chainB.(ibc.Chain).Config().ChainID + " with data " + msg + " and rollback:" + rollback + " PASSED") } return err @@ -207,6 +208,10 @@ func (x *XCallTestSuite) testRollbackDataWithoutRollback(ctx context.Context, t } height, err := chainA.(ibc.Chain).Height(ctx) assert.NoErrorf(t, err, "error getting height %v", err) + if chainB.Config().Name == "stellar" { + //stellar a bit slow on devnet + time.Sleep(40 * time.Second) + } code, err := chainA.FindCallResponse(ctx, height, res.SerialNo) assert.NoErrorf(t, err, "no call response found %v", err) isSuccess = assert.Equal(t, "1", code) @@ -234,6 +239,10 @@ func (x *XCallTestSuite) testRollbackDataReplyWithoutRollback(ctx context.Contex } height, err := chainA.(ibc.Chain).Height(ctx) assert.NoErrorf(t, err, "error getting height %v", err) + if chainB.Config().Name == "stellar" { + //stellar a bit slow on devnet + time.Sleep(40 * time.Second) + } code, err := chainA.FindCallResponse(ctx, height, res.SerialNo) assert.NoErrorf(t, err, "no call response found %v", err) isSuccess = assert.Equal(t, "1", code) @@ -279,6 +288,9 @@ func (x *XCallTestSuite) testOneWayMessageWithSizeExpectingError(ctx context.Con result = assert.ObjectsAreEqual(strings.TrimSpace(subMsg), "MaxDataSizeExceeded") } else if strings.Contains(err.Error(), "MaxDataSizeExceeded") { result = true + } else if strings.Contains(err.Error(), "Contract, #5)") { + //stellar error + result = true } else { result = assert.ObjectsAreEqual(errors.New("UnknownFailure"), err) } From cbdd626c43322c3ed7ea2a9ef020be159628508d Mon Sep 17 00:00:00 2001 From: sherpalden Date: Fri, 6 Sep 2024 10:30:52 +0545 Subject: [PATCH 38/46] fix: add proper logs --- relayer/chains/steller/tx.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index a417746a..5055ccd6 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -125,7 +125,7 @@ func (p *Provider) sendCallTransaction(callArgs xdr.InvokeContractArgs) (*horizo } var sorobanTxnData xdr.SorobanTransactionData if err := xdr.SafeUnmarshalBase64(simres.TransactionDataXDR, &sorobanTxnData); err != nil { - p.log.Warn("tx result marshal failed", zap.Any("code", simtxe)) + p.log.Error("tx result unmarshal failed", zap.String("tx_envelope", simtxe), zap.String("tx_data", simres.TransactionDataXDR)) return nil, err } callOp.Ext = xdr.TransactionExt{ From 3826bf32f575e8a5d2039240d7bc8fa6346d3506 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Tue, 10 Sep 2024 16:46:45 +0545 Subject: [PATCH 39/46] fix: do not remove rm in docker --- Dockerfile | 2 +- relayer/chains/steller/tx.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0de33da1..34ec6313 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,7 +45,7 @@ RUN ln sh pwd && \ ln sh tar && \ ln sh tee && \ ln sh du && \ - rm ln rm + rm ln # Install chain binaries COPY --from=build-env /go/bin/centralized-relay /bin diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 5055ccd6..2a38f2c6 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -324,7 +324,7 @@ func (p *Provider) newMiscContractCallArgs(msg relayertypes.Message, params ...i }, } return &xdr.InvokeContractArgs{ - ContractAddress: *scXcallAddr, + ContractAddress: *scConnAddr, FunctionName: xdr.ScSymbol("set_admin"), Args: []xdr.ScVal{ adminAddressVal, From a03c0db32b7cdd19f22ca9da3b62efabd0253edf Mon Sep 17 00:00:00 2001 From: sherpalden Date: Thu, 12 Sep 2024 11:37:26 +0545 Subject: [PATCH 40/46] fix: skip callmessage and rollbackmessage events if not executor --- go.work.sum | 4 ++++ relayer/chains/steller/listener.go | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/go.work.sum b/go.work.sum index d48dc5a0..f553b639 100644 --- a/go.work.sum +++ b/go.work.sum @@ -639,6 +639,7 @@ github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= @@ -655,6 +656,8 @@ github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJys github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b h1:QrHweqAtyJ9EwCaGHBu1fghwxIPiopAHV06JlXrMHjk= github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b/go.mod h1:xxLb2ip6sSUts3g1irPVHyk/DGslwQsNOo9I7smJfNU= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.70/go.mod h1:4yBA8v80xGA30cfM3fz0DKYMXunWl/AV/6tWEs9ryzo= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/misko9/go-substrate-rpc-client/v4 v4.0.0-20230913220906-b988ea7da0c2 h1:G/cVeTAbB9S/6FSWWqpFV0v49hiuHLbJPu9hTZ0UR2A= @@ -840,6 +843,7 @@ github.com/spf13/viper v1.18.1/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMV github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/stellar/throttled v2.2.3-0.20190823235211-89d75816f59d+incompatible/go.mod h1:7CJ23pXirXBJq45DqvO6clzTEGM/l1SfKrgrzLry8b4= +github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/strangelove-ventures/cometbft-client v0.1.0/go.mod h1:QzThgjzvsGgUNVNpGPitmxOWMIhp6a0oqf80nCRNt/0= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index bcd2e80a..3697053c 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -124,7 +124,8 @@ func (p *Provider) parseMessagesFromEvent(ev types.Event) *relayertypes.Message eventType = relayerevents.RollbackMessage } } - if eventType == "" { + + if eventType == "" || p.shouldSkipEvent(eventType) { return nil } @@ -178,3 +179,11 @@ func (p *Provider) parseMessagesFromEvent(ev types.Event) *relayertypes.Message p.log.Info("Detected eventlog:", zap.Any("event", *msg)) return msg } + +func (p *Provider) shouldSkipEvent(eventType string) bool { + val, ok := p.cfg.Contracts[relayertypes.XcallContract] + if (!ok || val == "") && (eventType == relayerevents.CallMessage || eventType == relayerevents.RollbackMessage) { + return true + } + return false +} From b0395884685668f80a251c2e997a7fd6244edfa3 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Thu, 12 Sep 2024 13:04:19 +0545 Subject: [PATCH 41/46] fix: parse contract addresses in proper place only --- relayer/chains/steller/tx.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 2a38f2c6..b292752e 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -222,17 +222,13 @@ func (p *Provider) handleArchivalState(simResult *sorobanclient.TxSimulationResu } func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeContractArgs, error) { - scXcallAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.XcallContract]) - if err != nil { - return nil, err - } - scConnAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) - if err != nil { - return nil, err - } stellerMsg := types.StellerMsg{Message: msg} switch msg.EventType { case evtypes.EmitMessage: + scConnAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) + if err != nil { + return nil, err + } return &xdr.InvokeContractArgs{ ContractAddress: *scConnAddr, FunctionName: xdr.ScSymbol("recv_message"), @@ -243,6 +239,10 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon }, }, nil case evtypes.CallMessage: + scXcallAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.XcallContract]) + if err != nil { + return nil, err + } acc := xdr.MustAddressPtr(p.cfg.Address) return &xdr.InvokeContractArgs{ ContractAddress: *scXcallAddr, @@ -259,6 +259,10 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon }, }, nil case evtypes.RollbackMessage: + scXcallAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.XcallContract]) + if err != nil { + return nil, err + } return &xdr.InvokeContractArgs{ ContractAddress: *scXcallAddr, FunctionName: xdr.ScSymbol("execute_rollback"), From bb3c84a5c1072dc4ad0f260e54e8463742310d69 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Wed, 18 Sep 2024 11:52:30 +0545 Subject: [PATCH 42/46] fix: get event filter --- relayer/chains/steller/listener.go | 34 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/relayer/chains/steller/listener.go b/relayer/chains/steller/listener.go index 3697053c..8927fdaf 100644 --- a/relayer/chains/steller/listener.go +++ b/relayer/chains/steller/listener.go @@ -72,11 +72,7 @@ func (p *Provider) Listener(ctx context.Context, lastProcessedTx relayertypes.La } case <-reconnectCh: p.log.Info("Query started.", zap.Uint64("from-seq", startSeq)) - eventFilter := types.EventFilter{ - LedgerSeq: startSeq + 1, - ContractIds: []string{p.cfg.Contracts[relayertypes.ConnectionContract], p.cfg.Contracts[relayertypes.XcallContract]}, - Topics: []string{"Message", "CallMessage", "RollbackMessage"}, - } + eventFilter := p.getEventFilter(startSeq + 1) go p.client.StreamEvents(hzStreamCtx, eventFilter, eventChannel) } @@ -84,11 +80,7 @@ func (p *Provider) Listener(ctx context.Context, lastProcessedTx relayertypes.La } func (p *Provider) fetchLedgerMessages(ctx context.Context, ledgerSeq uint64) ([]*relayertypes.Message, error) { - eventFilter := types.EventFilter{ - LedgerSeq: ledgerSeq, - ContractIds: []string{p.cfg.Contracts[relayertypes.ConnectionContract], p.cfg.Contracts[relayertypes.XcallContract]}, - Topics: []string{"Message", "CallMessage", "RollbackMessage"}, - } + eventFilter := p.getEventFilter(ledgerSeq) events, err := p.client.FetchEvents(ctx, eventFilter) if err != nil { return nil, err @@ -125,7 +117,7 @@ func (p *Provider) parseMessagesFromEvent(ev types.Event) *relayertypes.Message } } - if eventType == "" || p.shouldSkipEvent(eventType) { + if eventType == "" { return nil } @@ -180,10 +172,20 @@ func (p *Provider) parseMessagesFromEvent(ev types.Event) *relayertypes.Message return msg } -func (p *Provider) shouldSkipEvent(eventType string) bool { - val, ok := p.cfg.Contracts[relayertypes.XcallContract] - if (!ok || val == "") && (eventType == relayerevents.CallMessage || eventType == relayerevents.RollbackMessage) { - return true +func (p *Provider) getEventFilter(ledgerSeq uint64) types.EventFilter { + contractIds := []string{p.cfg.Contracts[relayertypes.ConnectionContract]} + topics := []string{"Message"} + + addr, ok := p.cfg.Contracts[relayertypes.XcallContract] + isExecutor := ok && addr != "" + if isExecutor { + contractIds = append(contractIds, p.cfg.Contracts[relayertypes.XcallContract]) + topics = append(topics, []string{"CallMessage", "RollbackMessage"}...) + } + + return types.EventFilter{ + LedgerSeq: ledgerSeq, + ContractIds: contractIds, + Topics: topics, } - return false } From c9f41d44310c1ffb83bc09b2a1c447a736864c27 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Wed, 18 Sep 2024 12:58:29 +0545 Subject: [PATCH 43/46] fix: update example config and remove unused config --- example/configs/steller.json | 7 +++---- relayer/chains/steller/config.go | 2 -- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/example/configs/steller.json b/example/configs/steller.json index b9941fa2..2ebcac9e 100644 --- a/example/configs/steller.json +++ b/example/configs/steller.json @@ -1,8 +1,8 @@ { - "type": "steller", + "type": "stellar", "value": { - "chain-id": "testnet.steller", - "nid": "testnet.steller", + "chain-id": "testnet.stellar", + "nid": "testnet.stellar", "horizon-url": "https://horizon-testnet.stellar.org", "soroban-url": "https://soroban-testnet.stellar.org", "start-height": 0, @@ -12,7 +12,6 @@ "xcall": "CBD2YWKFJWNGD347TVKMFGQ6LSTPMVJ5QM5MLD62OLPKLMKIJWXJGK7O", "connection": "CBD2YWKFJWNGD347TVKMFGQ6LSTPMVJ5QM5MLD62OLPKLMKIJWXJGK7O" }, - "block-interval": "5s", "network-passphrase": "Test SDF Network ; September 2015" } } diff --git a/relayer/chains/steller/config.go b/relayer/chains/steller/config.go index c65ca433..9093a1cc 100644 --- a/relayer/chains/steller/config.go +++ b/relayer/chains/steller/config.go @@ -5,7 +5,6 @@ import ( "fmt" "net/http" "sync" - "time" "github.com/icon-project/centralized-relay/relayer/chains/steller/sorobanclient" "github.com/icon-project/centralized-relay/relayer/provider" @@ -24,7 +23,6 @@ type Config struct { NID string `json:"nid" yaml:"nid"` HomeDir string `json:"home-dir" yaml:"home-dir"` MaxInclusionFee uint64 `json:"max-inclusion-fee" yaml:"max-inclusion-fee"` // in stroop: the smallest unit of a lumen, one ten-millionth of a lumen (.0000001 XLM). - BlockInterval time.Duration `json:"block-interval" yaml:"block-interval"` NetworkPassphrase string `json:"network-passphrase" yaml:"network-passphrase"` StartHeight uint64 `json:"start-height" yaml:"start-height"` // would be of highest priority Disabled bool `json:"disabled" yaml:"disabled"` From d3eced7408098e32e28ef8f67ca16b7584504a21 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Wed, 18 Sep 2024 15:40:52 +0545 Subject: [PATCH 44/46] fix: fee issues --- relayer/chains/steller/tx.go | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index b292752e..2859929c 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -276,10 +276,6 @@ func (p *Provider) newContractCallArgs(msg relayertypes.Message) (*xdr.InvokeCon } func (p *Provider) newMiscContractCallArgs(msg relayertypes.Message, params ...interface{}) (*xdr.InvokeContractArgs, error) { - scXcallAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.XcallContract]) - if err != nil { - return nil, err - } scConnAddr, err := p.scContractAddr(p.cfg.Contracts[relayertypes.ConnectionContract]) if err != nil { return nil, err @@ -300,7 +296,7 @@ func (p *Provider) newMiscContractCallArgs(msg relayertypes.Message, params ...i Vec: &src, } return &xdr.InvokeContractArgs{ - ContractAddress: *scXcallAddr, + ContractAddress: *scConnAddr, FunctionName: xdr.ScSymbol("get_fee"), Args: []xdr.ScVal{ stellerMsg.ScvSrc(), @@ -339,14 +335,6 @@ func (p *Provider) newMiscContractCallArgs(msg relayertypes.Message, params ...i ContractAddress: *scConnAddr, FunctionName: xdr.ScSymbol("claim_fees"), }, nil - case evtypes.RevertMessage: - return &xdr.InvokeContractArgs{ - ContractAddress: *scXcallAddr, - FunctionName: xdr.ScSymbol("revert_message"), - Args: []xdr.ScVal{ - stellerMsg.ScvSn(), - }, - }, nil default: return nil, fmt.Errorf("invalid message type") } From fc3f036b46c0a9ca0f632dae68f3627c53fb991b Mon Sep 17 00:00:00 2001 From: sherpalden Date: Wed, 18 Sep 2024 16:12:29 +0545 Subject: [PATCH 45/46] fix: get fee not working --- relayer/chains/steller/tx.go | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/relayer/chains/steller/tx.go b/relayer/chains/steller/tx.go index 2859929c..a712d28a 100644 --- a/relayer/chains/steller/tx.go +++ b/relayer/chains/steller/tx.go @@ -285,23 +285,17 @@ func (p *Provider) newMiscContractCallArgs(msg relayertypes.Message, params ...i switch msg.EventType { case evtypes.GetFee: - rollBackVal := params[0].(bool) - rollbackParam := xdr.ScVal{ + includeResponseFee := params[0].(bool) + includeResponseFeeScVal := xdr.ScVal{ Type: xdr.ScValTypeScvBool, - B: &rollBackVal, - } - src := &xdr.ScVec{} - sources := xdr.ScVal{ - Type: xdr.ScValTypeScvVec, - Vec: &src, + B: &includeResponseFee, } return &xdr.InvokeContractArgs{ ContractAddress: *scConnAddr, FunctionName: xdr.ScSymbol("get_fee"), Args: []xdr.ScVal{ stellerMsg.ScvSrc(), - rollbackParam, - sources, + includeResponseFeeScVal, }, }, nil case evtypes.SetFee: From bd8f3a01f6e0eced6e831e3402461adef8c25f50 Mon Sep 17 00:00:00 2001 From: sherpalden Date: Wed, 18 Sep 2024 17:02:08 +0545 Subject: [PATCH 46/46] fix: update stellar config --- example/configs/steller.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/configs/steller.json b/example/configs/steller.json index 2ebcac9e..23b5ef06 100644 --- a/example/configs/steller.json +++ b/example/configs/steller.json @@ -7,7 +7,7 @@ "soroban-url": "https://soroban-testnet.stellar.org", "start-height": 0, "address": "GCQ5YPTO5ORNZ7WMADFAWP2D7NOJBZGDLWAUYNMSNLIHRNMSJXXFFWE3", - "max-inclusion-fee": 200, + "max-inclusion-fee": 100000, "contracts": { "xcall": "CBD2YWKFJWNGD347TVKMFGQ6LSTPMVJ5QM5MLD62OLPKLMKIJWXJGK7O", "connection": "CBD2YWKFJWNGD347TVKMFGQ6LSTPMVJ5QM5MLD62OLPKLMKIJWXJGK7O"