From 537168008c5f19f22dd2c7607ea2fbf43beb72a9 Mon Sep 17 00:00:00 2001 From: sojibimran Date: Fri, 3 Apr 2026 22:00:24 +0800 Subject: [PATCH] update payment ui and change api route path --- Dockerfile | 26 +- docker-compose.yaml | 5 +- src/controller/comm/order_controller.go | 11 +- src/controller/comm/pay_controller.go | 18 +- src/go.mod | 58 +- src/go.sum | 711 +++--------------------- src/middleware/check_sign.go | 2 +- src/model/mdb/orders_mdb.go | 1 + src/model/mdb/wallet_address_mdb.go | 1 + src/model/request/order_request.go | 7 +- src/model/response/pay_response.go | 8 +- src/model/service/pay_service.go | 10 +- src/model/service/sol_task.go | 233 ++++++++ src/model/service/sol_task_test.go | 45 ++ src/route/router.go | 54 +- src/static/images/arbitrum.png | Bin 0 -> 2038 bytes src/static/images/base.png | Bin 0 -> 597 bytes src/static/images/binance.png | Bin 0 -> 43788 bytes src/static/images/bitcoin.png | Bin 0 -> 2014 bytes src/static/images/bsc.png | Bin 0 -> 1768 bytes src/static/images/ethereum.png | Bin 0 -> 952 bytes src/static/images/hyperevm.png | Bin 0 -> 1702 bytes src/static/images/op.png | Bin 0 -> 1492 bytes src/static/images/plasma.png | Bin 0 -> 1540 bytes src/static/images/polygon.png | Bin 0 -> 1968 bytes src/static/images/solana.png | Bin 0 -> 1282 bytes src/static/images/tron.png | Bin 0 -> 1030 bytes src/static/index.html | 485 ++++++++-------- src/static/payment.css | 395 +++++++++++++ src/static/payment.js | 585 +++++++++++++++++++ src/static/reset.css | 44 -- 31 files changed, 1736 insertions(+), 963 deletions(-) create mode 100644 src/model/service/sol_task.go create mode 100644 src/model/service/sol_task_test.go create mode 100644 src/static/images/arbitrum.png create mode 100644 src/static/images/base.png create mode 100644 src/static/images/binance.png create mode 100644 src/static/images/bitcoin.png create mode 100644 src/static/images/bsc.png create mode 100644 src/static/images/ethereum.png create mode 100644 src/static/images/hyperevm.png create mode 100644 src/static/images/op.png create mode 100644 src/static/images/plasma.png create mode 100644 src/static/images/polygon.png create mode 100644 src/static/images/solana.png create mode 100644 src/static/images/tron.png create mode 100644 src/static/payment.css create mode 100644 src/static/payment.js delete mode 100644 src/static/reset.css diff --git a/Dockerfile b/Dockerfile index eca1c12..b2b1100 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,24 @@ FROM golang:alpine AS builder RUN apk add --no-cache --update git build-base -ENV CGO_ENABLED=1 -ARG VERSION=0.0.0-dev -ARG COMMIT=none -ARG DATE=unknown -WORKDIR /app -COPY ./src/go.mod ./src/go.sum ./ -RUN go mod download +ENV CGO_ENABLED=0 -COPY ./src . -RUN go build -ldflags "-s -w -X github.com/assimon/luuu/config.BuildVersion=${VERSION} -X github.com/assimon/luuu/config.BuildCommit=${COMMIT} -X github.com/assimon/luuu/config.BuildDate=${DATE}" \ - -o epusdt . +WORKDIR /app + +RUN git clone https://github.com/GMwalletApp/epusdt.git . + +WORKDIR /app/src +RUN go mod download +RUN go build -o /app/epusdt . FROM alpine:latest AS runner ENV TZ=Asia/Shanghai RUN apk --no-cache add ca-certificates tzdata WORKDIR /app -COPY --from=builder /app/static /app/static -COPY --from=builder /app/static /static +COPY --from=builder /app/src/static /app/static +COPY --from=builder /app/src/static /static COPY --from=builder /app/epusdt . -VOLUME /app/conf -ENTRYPOINT ["./epusdt" ,"http","start"] +VOLUME /app/conf +ENTRYPOINT ["./epusdt", "http", "start"] diff --git a/docker-compose.yaml b/docker-compose.yaml index c59d034..d811cb0 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,7 +1,6 @@ -version: "3" services: epusdt: - image: annona/epusdt:alpine + image: gmwalletapp/epusdt:alpine restart: always build: context: . @@ -9,4 +8,4 @@ services: volumes: - ./env:/app/.env ports: - - "8088:8000" \ No newline at end of file + - "8000:8000" diff --git a/src/controller/comm/order_controller.go b/src/controller/comm/order_controller.go index c4680af..f745711 100644 --- a/src/controller/comm/order_controller.go +++ b/src/controller/comm/order_controller.go @@ -7,19 +7,12 @@ import ( "github.com/labstack/echo/v4" ) -// LegecyCreateTransaction 创建交易 -func (c *BaseCommController) LegecyCreateTransaction(ctx echo.Context) (err error) { +// CreateTransaction 创建交易 +func (c *BaseCommController) CreateTransaction(ctx echo.Context) (err error) { req := new(request.CreateTransactionRequest) if err = ctx.Bind(req); err != nil { return c.FailJson(ctx, constant.ParamsMarshalErr) } - // 兼容旧版本插件:如果未传递 token 和 currency,使用默认值 - if req.Token == "" { - req.Token = "usdt" - } - if req.Currency == "" { - req.Currency = "cny" - } if err = c.ValidateStruct(ctx, req); err != nil { return c.FailJson(ctx, err) } diff --git a/src/controller/comm/pay_controller.go b/src/controller/comm/pay_controller.go index 5dd43bf..1bc9ebd 100644 --- a/src/controller/comm/pay_controller.go +++ b/src/controller/comm/pay_controller.go @@ -11,23 +11,31 @@ import ( "github.com/labstack/echo/v4" ) -// LegecyCheckoutCounter 收银台 -func (c *BaseCommController) LegecyCheckoutCounter(ctx echo.Context) (err error) { +// CheckoutCounter 收银台 +func (c *BaseCommController) CheckoutCounter(ctx echo.Context) (err error) { tradeId := ctx.Param("trade_id") resp, err := service.GetCheckoutCounterByTradeId(tradeId) if err != nil { + if err == service.ErrOrder { + tmpl, err := template.ParseFiles(filepath.Join(config.StaticFilePath, "index.html")) + if err != nil { + return ctx.String(http.StatusOK, err.Error()) + } + emptyResp := response.CheckoutCounterResponse{} + return tmpl.Execute(ctx.Response(), emptyResp) + } return ctx.String(http.StatusOK, err.Error()) } tmpl, err := template.ParseFiles(filepath.Join(config.StaticFilePath, "index.html")) if err != nil { return ctx.String(http.StatusOK, err.Error()) } - resp.Token = resp.ReceiveAddress // only for legacy checkout counter, token is the receive address + resp.Network = "TRON" return tmpl.Execute(ctx.Response(), resp) } -// LegecyCheckStatus 支付状态检测 -func (c *BaseCommController) LegecyCheckStatus(ctx echo.Context) (err error) { +// CheckStatus 支付状态检测 +func (c *BaseCommController) CheckStatus(ctx echo.Context) (err error) { tradeId := ctx.Param("trade_id") order, err := service.GetOrderInfoByTradeId(tradeId) if err != nil { diff --git a/src/go.mod b/src/go.mod index 2331914..97cd864 100644 --- a/src/go.mod +++ b/src/go.mod @@ -5,6 +5,7 @@ go 1.25.0 require ( github.com/btcsuite/btcutil v1.0.2 github.com/dromara/carbon/v2 v2.6.15 + github.com/gagliardetto/solana-go v1.16.0 github.com/go-resty/resty/v2 v2.11.0 github.com/gookit/color v1.5.0 github.com/gookit/goutil v0.4.6 @@ -17,10 +18,10 @@ require ( github.com/satori/go.uuid v1.2.0 github.com/shengdoushi/base58 v1.0.0 github.com/shopspring/decimal v1.3.1 - github.com/spf13/cobra v1.2.1 - github.com/spf13/viper v1.9.0 + github.com/spf13/cobra v1.9.1 + github.com/spf13/viper v1.20.1 github.com/tidwall/gjson v1.18.0 - go.uber.org/zap v1.17.0 + go.uber.org/zap v1.27.0 gopkg.in/telebot.v3 v3.0.0 gorm.io/driver/mysql v1.5.1 gorm.io/driver/postgres v1.5.2 @@ -29,52 +30,65 @@ require ( ) require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/BurntSushi/toml v1.6.0 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect + github.com/blendle/zapdriver v1.3.1 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/gagliardetto/binary v0.8.0 // indirect + github.com/gagliardetto/treeout v0.1.4 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/google/go-cmp v0.7.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gookit/filter v1.1.2 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgx/v5 v5.3.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/labstack/gommon v0.3.0 // indirect - github.com/magiconair/properties v1.8.5 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.4.2 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect - github.com/pelletier/go-toml v1.9.4 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/spf13/afero v1.6.0 // indirect + github.com/sagikazarmark/locafero v0.9.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.10.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.2.0 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/streamingfast/logging v0.0.0-20250404134358-92b15d2fbd2e // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/tidwall/match v1.2.0 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.1 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.14.0 // indirect - golang.org/x/net v0.17.0 // indirect + go.mongodb.org/mongo-driver v1.17.3 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/ratelimit v0.3.1 // indirect + golang.org/x/crypto v0.47.0 // indirect + golang.org/x/net v0.49.0 // indirect golang.org/x/sys v0.42.0 // indirect - golang.org/x/text v0.20.0 // indirect + golang.org/x/term v0.39.0 // indirect + golang.org/x/text v0.33.0 // indirect golang.org/x/time v0.14.0 // indirect - gopkg.in/ini.v1 v1.63.2 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect modernc.org/libc v1.70.0 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect diff --git a/src/go.sum b/src/go.sum index e62c8e7..24b5a7c 100644 --- a/src/go.sum +++ b/src/go.sum @@ -1,60 +1,15 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= +github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= +github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -65,19 +20,7 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -86,28 +29,21 @@ github.com/dromara/carbon/v2 v2.6.15 h1:3HuC3XcWczIHUTbg/f0CSVydtKEdM+P0GM1sdsbw github.com/dromara/carbon/v2 v2.6.15/go.mod h1:NGo3reeV5vhWCYWcSqbJRZm46MEwyfYI5EJRdVFoLJo= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gagliardetto/binary v0.8.0 h1:U9ahc45v9HW0d15LoN++vIXSJyqR/pWw8DDlhd7zvxg= +github.com/gagliardetto/binary v0.8.0/go.mod h1:2tfj51g5o9dnvsc+fL3Jxr22MuWzYXwx9wEoN0XQ7/c= +github.com/gagliardetto/solana-go v1.16.0 h1:lRPn/NxVmxzXw+vQ3AxH33jQIvj8avx2CKVFsvUhRsY= +github.com/gagliardetto/solana-go v1.16.0/go.mod h1:2n7osXNoDeUhq1r1lOgCMVkl90yYUVrV9FHGINBWPHU= +github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw= +github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -116,86 +52,19 @@ github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqx github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= @@ -207,45 +76,11 @@ github.com/gookit/goutil v0.4.6 h1:LSATnmIyR0rV4BMj3XyaKFYtX/HbRURnPVHt6Zb5ABs= github.com/gookit/goutil v0.4.6/go.mod h1:pq1eTibwb2wN96jrci0xy7xogWzzo9CihOQJEAvz4yQ= github.com/gookit/validate v1.3.1 h1:YoxBxG5H+WucKjfEo8X+QvYOzED7ue3Mfpq6jtpIbYs= github.com/gookit/validate v1.3.1/go.mod h1:mzcr3U5XtAlQVAgbW0wbmDGiuefU/MNuDkXFMBNb1ko= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -259,18 +94,14 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -284,42 +115,26 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/libtnb/sqlite v1.0.1 h1:H4kdU3LBOjdxfQy8s02/wG1rNmp8GMiqzgel0axewtI= github.com/libtnb/sqlite v1.0.1/go.mod h1:zuagCP0nvIJwr4e0kdzq9Yc2Pw5HlVOoLT6ZmzmjOes= -github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -327,6 +142,10 @@ 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/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 h1:mPMvm6X6tf4w8y7j9YIt6V9jfWhL6QlbEc7CCmeQlWk= +github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1/go.mod h1:ye2e/VUEtE2BHE+G/QcKkcLQVAEJoYRFj5VUOQatCRE= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= @@ -334,67 +153,57 @@ github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJm github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.9.0 h1:GbgQGNtTrEmddYDSAH9QLRyfAHY12md+8YFTqyMTC9k= +github.com/sagikazarmark/locafero v0.9.0/go.mod h1:UBUyz37V+EdMS3hDF3QWIiVr/2dPrx49OMO0Bn0hJqk= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shengdoushi/base58 v1.0.0 h1:tGe4o6TmdXFJWoI31VoSWvuaKxf0Px3gqa3sUWhAxBs= github.com/shengdoushi/base58 v1.0.0/go.mod h1:m5uIILfzcKMw6238iWAhP4l3s5+uXyF3+bJKUNhAL9I= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= +github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= -github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.9.0 h1:yR6EXjTp0y0cLN8OZg1CRZmOBdI88UcGkhgyJhu6nZk= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= +github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= +github.com/streamingfast/logging v0.0.0-20250404134358-92b15d2fbd2e h1:qGVGDR2/bXLyR498un1hvhDQPUJ/m14JBRTJz+c67Bc= +github.com/streamingfast/logging v0.0.0-20250404134358-92b15d2fbd2e/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= +github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= @@ -410,217 +219,80 @@ github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52 github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -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= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.mongodb.org/mongo-driver v1.17.3 h1:TQyXhnsWfWtgAhMtOgtYHMTkZIfBTpMTsMnd9ZBeHxQ= +go.mongodb.org/mongo-driver v1.17.3/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0= +go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= 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= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -638,82 +310,25 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= -golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= @@ -721,144 +336,13 @@ golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 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= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.63.2 h1:tGK/CyBg7SMzb60vP1M03vNZ3VDu3wGQJwn7Sxi9r3c= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/telebot.v3 v3.0.0 h1:UgHIiE/RdjoDi6nf4xACM7PU3TqiPVV9vvTydCEnrTo= @@ -866,7 +350,6 @@ gopkg.in/telebot.v3 v3.0.0/go.mod h1:7rExV8/0mDDNu9epSrDm/8j22KLaActH1Tbee6YjzWg gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -883,13 +366,6 @@ gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwy gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/ccgo/v4 v4.32.0 h1:hjG66bI/kqIPX1b2yT6fr/jt+QedtP2fqojG2VrFuVw= @@ -918,6 +394,3 @@ modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/src/middleware/check_sign.go b/src/middleware/check_sign.go index cc393f2..af562f9 100644 --- a/src/middleware/check_sign.go +++ b/src/middleware/check_sign.go @@ -11,7 +11,7 @@ import ( "github.com/labstack/echo/v4" ) -func LegecyCheckApiSign() echo.MiddlewareFunc { +func CheckApiSign() echo.MiddlewareFunc { return func(next echo.HandlerFunc) echo.HandlerFunc { return func(ctx echo.Context) error { params, err := ioutil.ReadAll(ctx.Request().Body) diff --git a/src/model/mdb/orders_mdb.go b/src/model/mdb/orders_mdb.go index 6ed6335..5d262f5 100644 --- a/src/model/mdb/orders_mdb.go +++ b/src/model/mdb/orders_mdb.go @@ -17,6 +17,7 @@ type Orders struct { ActualAmount float64 `gorm:"column:actual_amount" json:"actual_amount"` ReceiveAddress string `gorm:"column:receive_address" json:"receive_address"` Token string `gorm:"column:token" json:"token"` + Network string `gorm:"column:network" json:"network"` Status int `gorm:"column:status;default:1" json:"status"` NotifyUrl string `gorm:"column:notify_url" json:"notify_url"` RedirectUrl string `gorm:"column:redirect_url" json:"redirect_url"` diff --git a/src/model/mdb/wallet_address_mdb.go b/src/model/mdb/wallet_address_mdb.go index 84c84b4..bb56fae 100644 --- a/src/model/mdb/wallet_address_mdb.go +++ b/src/model/mdb/wallet_address_mdb.go @@ -6,6 +6,7 @@ const ( ) type WalletAddress struct { + Network string `gorm:"column:network;uniqueIndex:wallet_address_network_address_uindex" json:"network"` Address string `gorm:"column:address;uniqueIndex:wallet_address_address_uindex" json:"address"` Status int64 `gorm:"column:status;default:1" json:"status"` BaseModel diff --git a/src/model/request/order_request.go b/src/model/request/order_request.go index 1123ef2..f861088 100644 --- a/src/model/request/order_request.go +++ b/src/model/request/order_request.go @@ -5,8 +5,9 @@ import "github.com/gookit/validate" // CreateTransactionRequest 创建交易请求 type CreateTransactionRequest struct { OrderId string `json:"order_id" validate:"required|maxLen:32"` - Currency string `json:"currency" validate:"required"` - Token string `json:"token" validate:"required"` + Currency string `json:"currency" validate:"required"` // 法币 如:cny + Token string `json:"token" validate:"required"` // 币种 如:usdt + Network string `json:"network" validate:"required"` // 网络 如:TRON Amount float64 `json:"amount" validate:"required|isFloat|gt:0.01"` NotifyUrl string `json:"notify_url" validate:"required"` Signature string `json:"signature" validate:"required"` @@ -18,6 +19,7 @@ func (r CreateTransactionRequest) Translates() map[string]string { "OrderId": "订单号", "Currency": "货币", "Token": "币种", + "Network": "网络", "Amount": "支付金额", "NotifyUrl": "异步回调网址", "Signature": "签名", @@ -29,6 +31,7 @@ type OrderProcessingRequest struct { ReceiveAddress string Currency string Token string + Network string Amount float64 TradeId string BlockTransactionId string diff --git a/src/model/response/pay_response.go b/src/model/response/pay_response.go index 7aa8990..6db0429 100644 --- a/src/model/response/pay_response.go +++ b/src/model/response/pay_response.go @@ -2,11 +2,15 @@ package response type CheckoutCounterResponse struct { TradeId string `json:"trade_id"` // epusdt订单号 - ActualAmount float64 `json:"actual_amount"` // 订单实际需要支付的金额,保留4位小数 - ReceiveAddress string `json:"receive_address"` // 收款钱包地址 + Amount float64 `json:"amount"` // 订单金额,保留4位小数 法币金额 + ActualAmount float64 `json:"actual_amount"` // 订单实际需要支付的金额,保留4位小数 加密货币金额 Token string `json:"token"` // 所属币种 TRX USDT...... + Currency string `json:"currency"` // 法币币种 CNY USD ... + ReceiveAddress string `json:"receive_address"` // 收款钱包地址 + Network string `json:"network"` // 网络 TRON ETH ... ExpirationTime int64 `json:"expiration_time"` // 过期时间 时间戳 RedirectUrl string `json:"redirect_url"` + CreatedAt int64 `json:"created_at"` // 订单创建时间 时间戳 } type CheckStatusResponse struct { diff --git a/src/model/service/pay_service.go b/src/model/service/pay_service.go index 0be38f7..c1e54bf 100644 --- a/src/model/service/pay_service.go +++ b/src/model/service/pay_service.go @@ -9,6 +9,8 @@ import ( "github.com/assimon/luuu/model/response" ) +var ErrOrder = errors.New("不存在待支付订单或已过期") + // GetCheckoutCounterByTradeId returns checkout info for a pending order. func GetCheckoutCounterByTradeId(tradeId string) (*response.CheckoutCounterResponse, error) { orderInfo, err := data.GetOrderInfoByTradeId(tradeId) @@ -16,16 +18,20 @@ func GetCheckoutCounterByTradeId(tradeId string) (*response.CheckoutCounterRespo return nil, err } if orderInfo.ID <= 0 || orderInfo.Status != mdb.StatusWaitPay { - return nil, errors.New("不存在待支付订单或已过期") + return nil, ErrOrder } resp := &response.CheckoutCounterResponse{ TradeId: orderInfo.TradeId, + Amount: orderInfo.Amount, ActualAmount: orderInfo.ActualAmount, - ReceiveAddress: orderInfo.ReceiveAddress, Token: orderInfo.Token, + Currency: orderInfo.Currency, + ReceiveAddress: orderInfo.ReceiveAddress, + Network: orderInfo.Network, ExpirationTime: orderInfo.CreatedAt.AddMinutes(config.GetOrderExpirationTime()).TimestampMilli(), RedirectUrl: orderInfo.RedirectUrl, + CreatedAt: orderInfo.CreatedAt.TimestampMilli(), } return resp, nil } diff --git a/src/model/service/sol_task.go b/src/model/service/sol_task.go new file mode 100644 index 0000000..24c2e8f --- /dev/null +++ b/src/model/service/sol_task.go @@ -0,0 +1,233 @@ +package service + +import ( + "context" + "encoding/base64" + "encoding/binary" + "errors" + "fmt" + + "github.com/gagliardetto/solana-go" + "github.com/gagliardetto/solana-go/rpc" +) + +func SolCallBack(address string) {} + +const ( + // Mint token + USDT_Mint = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB" + USDC_Mint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" +) + +const ( + TokenProgramID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + Token2022ProgramID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" +) + +func FindATAAddress(owner, mint string) (string, error) { + ownerPubKey, err := solana.PublicKeyFromBase58(owner) + if err != nil { + return "", fmt.Errorf("invalid owner public key: %w", err) + } + + mintPubKey, err := solana.PublicKeyFromBase58(mint) + if err != nil { + return "", fmt.Errorf("invalid mint public key: %w", err) + } + + ata, _, err := solana.FindAssociatedTokenAddress(ownerPubKey, mintPubKey) + if err != nil { + return "", fmt.Errorf("find associated token address failed: %w", err) + } + + return ata.String(), nil +} + +const ( + InstructionTransfer = 3 + InstructionTransferChecked = 12 +) + +type TransferInfo struct { + ProgramID string + Type string + + Source string + Destination string + Mint string + Authority string + + Amount uint64 + Decimals *uint8 +} + +func isTokenProgram(programID solana.PublicKey) bool { + p := programID.String() + return p == TokenProgramID || p == Token2022ProgramID +} + +func DecodeTransfer(data []byte, accountKeys []solana.PublicKey, accountIndexes []uint16, programID solana.PublicKey) (*TransferInfo, error) { + if len(data) < 9 { + return nil, fmt.Errorf("invalid transfer data length: %d", len(data)) + } + + if data[0] != InstructionTransfer { + return nil, fmt.Errorf("not transfer instruction, got: %d", data[0]) + } + + if len(accountIndexes) < 3 { + return nil, fmt.Errorf("transfer accounts not enough: %d", len(accountIndexes)) + } + + amount := binary.LittleEndian.Uint64(data[1:9]) + + sourceIdx := accountIndexes[0] + destIdx := accountIndexes[1] + authIdx := accountIndexes[2] + + if int(sourceIdx) >= len(accountKeys) || int(destIdx) >= len(accountKeys) || int(authIdx) >= len(accountKeys) { + return nil, errors.New("account index out of range") + } + + info := &TransferInfo{ + ProgramID: programID.String(), + Type: "transfer", + Source: accountKeys[sourceIdx].String(), + Destination: accountKeys[destIdx].String(), + Authority: accountKeys[authIdx].String(), + Amount: amount, + } + + return info, nil +} + +type TransferCheckedInfo struct { + ProgramID string + Type string + + Source string + Destination string + Mint string + Authority string + + Amount uint64 + Decimals uint8 +} + +func DecodeTransferCheck(data []byte, accountKeys []solana.PublicKey, accountIndexes []uint16, programID solana.PublicKey) (*TransferInfo, error) { + if len(data) < 10 { + return nil, fmt.Errorf("invalid transferChecked data length: %d", len(data)) + } + + if data[0] != InstructionTransferChecked { + return nil, fmt.Errorf("not transferChecked instruction, got: %d", data[0]) + } + + if len(accountIndexes) < 4 { + return nil, fmt.Errorf("transferChecked accounts not enough: %d", len(accountIndexes)) + } + + amount := binary.LittleEndian.Uint64(data[1:9]) + decimals := uint8(data[9]) + + sourceIdx := accountIndexes[0] + mintIdx := accountIndexes[1] + destIdx := accountIndexes[2] + authIdx := accountIndexes[3] + + if int(sourceIdx) >= len(accountKeys) || + int(mintIdx) >= len(accountKeys) || + int(destIdx) >= len(accountKeys) || + int(authIdx) >= len(accountKeys) { + return nil, errors.New("account index out of range") + } + + info := &TransferInfo{ + ProgramID: programID.String(), + Type: "transferChecked", + Source: accountKeys[sourceIdx].String(), + Mint: accountKeys[mintIdx].String(), + Destination: accountKeys[destIdx].String(), + Authority: accountKeys[authIdx].String(), + Amount: amount, + Decimals: &decimals, + } + + return info, nil +} + +// ParseTransactionTransfers +func ParseTransactionTransfers(ctx context.Context, client *rpc.Client, sig string) ([]*TransferInfo, error) { + signature, err := solana.SignatureFromBase58(sig) + if err != nil { + return nil, fmt.Errorf("invalid signature: %w", err) + } + + tx, err := client.GetTransaction( + ctx, + signature, + &rpc.GetTransactionOpts{ + Encoding: solana.EncodingBase64, + Commitment: rpc.CommitmentConfirmed, + MaxSupportedTransactionVersion: func(v uint64) *uint64 { return &v }(0), + }, + ) + if err != nil { + return nil, fmt.Errorf("get transaction failed: %w", err) + } + if tx == nil { + return nil, errors.New("transaction not found") + } + + decodedTx, err := tx.Transaction.GetTransaction() + if err != nil { + return nil, fmt.Errorf("decode transaction failed: %w", err) + } + + msg := decodedTx.Message + accountKeys := msg.AccountKeys + results := make([]*TransferInfo, 0) + + for _, ix := range msg.Instructions { + if int(ix.ProgramIDIndex) >= len(accountKeys) { + continue + } + + programID := accountKeys[ix.ProgramIDIndex] + if !isTokenProgram(programID) { + continue + } + + data := ix.Data + if len(data) == 0 { + continue + } + + switch data[0] { + case InstructionTransfer: + info, err := DecodeTransfer(data, accountKeys, toUint16Slice(ix.Accounts), programID) + if err == nil { + results = append(results, info) + } + case InstructionTransferChecked: + info, err := DecodeTransferCheck(data, accountKeys, toUint16Slice(ix.Accounts), programID) + if err == nil { + results = append(results, info) + } + } + } + + return results, nil +} + +func toUint16Slice(in []uint16) []uint16 { + out := make([]uint16, len(in)) + for i, v := range in { + out[i] = uint16(v) + } + return out +} + +func DecodeBase64InstructionData(s string) ([]byte, error) { + return base64.StdEncoding.DecodeString(s) +} diff --git a/src/model/service/sol_task_test.go b/src/model/service/sol_task_test.go new file mode 100644 index 0000000..0557292 --- /dev/null +++ b/src/model/service/sol_task_test.go @@ -0,0 +1,45 @@ +package service + +import ( + "context" + "fmt" + "testing" + + "github.com/gagliardetto/solana-go/rpc" +) + +func TestParseSolTransaction(t *testing.T) { + client := rpc.New("https://api.mainnet-beta.solana.com") + sig := "" + + txInfo, err := ParseTransactionTransfers(context.Background(), client, sig) + if err != nil { + panic(err) + } + + for _, item := range txInfo { + fmt.Println("type =", item.Type) + fmt.Println("program =", item.ProgramID) + fmt.Println("from =", item.Source) + fmt.Println("to =", item.Destination) + fmt.Println("mint =", item.Mint) + fmt.Println("authority =", item.Authority) + fmt.Println("amount =", item.Amount) + if item.Decimals != nil { + fmt.Println("decimals =", *item.Decimals) + } + fmt.Println("-----") + } +} + +func TestFindATAAddress(t *testing.T) { + owner := "" + mint := "4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R" // ray token + + ata, err := FindATAAddress(owner, mint) + if err != nil { + panic(err) + } + + fmt.Println("ATA =", ata) +} diff --git a/src/route/router.go b/src/route/router.go index 517cc42..ce8e11b 100644 --- a/src/route/router.go +++ b/src/route/router.go @@ -1,6 +1,9 @@ package route import ( + "bytes" + "encoding/json" + "io" "net/http" "github.com/assimon/luuu/controller/comm" @@ -13,16 +16,45 @@ func RegisterRoute(e *echo.Echo) { e.Any("/", func(c echo.Context) error { return c.String(http.StatusOK, "hello epusdt, https://github.com/GMwalletApp/epusdt") }) - // ==== 支付相关===== - payRoute := e.Group("/legacy/pay") - // 收银台 - payRoute.GET("/checkout-counter/:trade_id", comm.Ctrl.LegecyCheckoutCounter) - // 状态检测 - payRoute.GET("/check-status/:trade_id", comm.Ctrl.LegecyCheckStatus) - apiV1Route := e.Group("/legacy/api/v1") - // ====订单相关==== - orderRoute := apiV1Route.Group("/order", middleware.LegecyCheckApiSign()) - // 创建订单 - orderRoute.POST("/create-transaction", comm.Ctrl.LegecyCreateTransaction) + payRoute := e.Group("/pay") + payRoute.GET("/checkout-counter/:trade_id", comm.Ctrl.CheckoutCounter) + payRoute.GET("/check-status/:trade_id", comm.Ctrl.CheckStatus) + + // payment routes + paymentRoute := e.Group("/payments") + + // for epusdt + epusdtV1 := paymentRoute.Group("/epusdt/v1") + epusdtV1.POST("/order/create-transaction", func(ctx echo.Context) error { + // add default token and currency for old plugin + + body := make(map[string]interface{}) + if err := ctx.Bind(&body); err != nil { + return comm.Ctrl.FailJson(ctx, err) + } + if _, ok := body["token"]; !ok { + body["token"] = "usdt" + } + if _, ok := body["currency"]; !ok { + body["currency"] = "cny" + } + if _, ok := body["network"]; !ok { + body["network"] = "TRON" + } + ctx.Set("request_body", body) + + jsonBytes, err := json.Marshal(body) + if err != nil { + return comm.Ctrl.FailJson(ctx, err) + } + ctx.Request().Body = io.NopCloser(bytes.NewBuffer(jsonBytes)) + + return comm.Ctrl.CreateTransaction(ctx) + }, middleware.CheckApiSign()) + + // gmpay v1 routes + gmpayV1 := paymentRoute.Group("/gmpay/v1") + gmpayV1.POST("/order/create-transaction", comm.Ctrl.CreateTransaction, middleware.CheckApiSign()) + } diff --git a/src/static/images/arbitrum.png b/src/static/images/arbitrum.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e2a44ca9b78f99ab06f49c014a62c5e9572fd9 GIT binary patch literal 2038 zcmVYAT)*ytaC|Jw3ZJW}% zN7zodxoe(n?JVGCM=K9l$8%~sey(KukwLWRSu3$tJK#ZS6LI5UX>rPPEKsB{HK%a+ zaF7{CW*Fw<|GMuDGY;AS-E;2zdGFnKfA`*Z-+dPelOV>Jjy^fWzhgk21Q;yC9zKV- zD7BU5+G(zxh9@LRYM6{pX%c{?#AT#h$A#@K1+`}_xZ#l?(L}TgSe_M&*hm$aPoa@M zHN^YK2;)x%CQuHzg#+@jqA)aFxPhVAsZS96xjbDXHlc0Y%8m zvWy<%B`jRJ9M6<*gP9^?a|~leRvh%&FmNfELQmi&A%Xp#Iz0;NI;}S=CKF2jx($WJkD;r}EYAJ0EFGf5<=Z@$f z@QMI1ff|Ng%15uZUNxlYwd8=C0N3GCN1Hf9Me#zdR^ih5Z^>gdnAc15$#jkk16TS0 zT7$=n)LE%;(^pohV7~G_40Gn;h3eNyp9U9AHaz#MM5`uDP9<=wJZfyw|1aJ!+&w)W zhxhD8$uE8e+ch)pNKO%;BnZ>xZn&*q!QS77k-<*flRX;`+?NB_b>AHS8ZR1!GKCDA zN_&T_7L?q7Kk9c?gX?ZOZ{s(lOytHWa54XhidLiL-~s3)_u!u2UhoDC}aQ1i-cDj>g>z@=L zoXyv)=xqBKPZh23c|^STz+oh1+)GwQVL1P3$Rl=4K#MqV&Ug}i-6pJB`TM}V+g($O zISUpcVX961E!g(rxtqeJXruFdWXZxnQoT~~CVsv24^XM(K>oZ_ zbC8OP3QNKy|@1zyt1(@F#hsv7bIsd2DdjN zs^x7kl@~nSWV%tV+-0KFhM;y1eB#Ge226d}vSF<+%ryS=RGaWL_nxeP%;p_*cNaYY z&#Yu9+607u-YP7Xh8Tt)ehRY16bkqZ2fnRU;bG+<*;%uEVWznkw!MZY{(SRg;|3jV zsDFDv5jSPQMc@a!RN>{V@mTy%O)6C|MX>&S9$eUX-l3MAU$qsI|DO%G2-8igBh=9eJ6{X#BW)(qQ)dJcZOhA5h)c=zhX`JM96YHx zh-_(~>P09cWK6+I^qoD4C65=uX?Md{Zm=&nY&xe~v1~uy%l3b5XM0ZfvS6B>{Sf=- z8+)0T8ZXX+mg`K4&R}UNvsiqcmBrU8EdG$frfsNaGc)dEaVHp4?`JIYeK)H+Yi9eq z?2PNSk9aThCwNTIy^NJ{kfUAK*=dtq0D8R&>$^HYW`+qcWfb@yRc|x>oIEx&doj~L z`8tbhU}OMs<1m{Z7Rj{Lm)O5Px3ES6-Ep#?HD9m^eI9By0(mqB+{-Gci753a52uYg z-oOX%AH$hbjRCpo=?@@Mr=_Eyys()u@YZQa)DPI`<$JcT5rz2=p`*`%sTvt8=IIcr zmg!wbrAj50Arui{O>mgwlIODeBhA8FP92?HOcOtsr7p-9oNk!U^Ud0+)v$70@8Bkqx+k$#rvvH zn~irDCn79-2<^11AUzB@`q-QLMB?7=>39u&F?}`@8-nLIH}~M@^OA6?bK|%Ao4ZK^kAfTEYm17w0sPn~Ad89m>Hsx6PKW%h>b&)Er+z4OkIqP)eA6*eT@lcrdlShoqm25NX)(r{M*oid(m+Q<6n7d0JV{R|3ay7JYRPJzM}7oyxFj*UUKH91AP-k5V0Z zW+_D9pXv9FTUkrmv^TT;ch<8YcXbQg(`MsKaL*MRH^Dt28wcQ?K*E7w;}qPJvT*|L z8ME;S-1ExD)k~G~ys$CXN-p1X!gZOX4VylKJD&0*R7Ks?TqLA7ue2nxJpb$OA`zo5 z0)5_a)^wsrhq_9T&}h6vk{r`DyFwt#xDfcDqYLwNkGztto5?)dELWBlWtLGG?TwUf z7-Iblp$Na3*F*$mpavb>s!U43gS87bpeh0%N(M01ZT7BuqF@Xh1eZuHP=y1p;pR_U j0&42zS#Yf9hQ0g%X5&7Q083iS00000NkvXXu0mjfbN2uu literal 0 HcmV?d00001 diff --git a/src/static/images/binance.png b/src/static/images/binance.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d690a5e9ef6621f033b4a4cf5f63f9d0d62f06 GIT binary patch literal 43788 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 literal 0 HcmV?d00001 diff --git a/src/static/images/bitcoin.png b/src/static/images/bitcoin.png new file mode 100644 index 0000000000000000000000000000000000000000..453d562b58fd6b9e3fc33d02c97ab4cacea51c23 GIT binary patch literal 2014 zcmV<42O;>0P)+Ov@FR+hblkneq{LX^wFZ*TL@Tz<`1ksV@;LUd7ic$$ggB8 z=`IWkhS0=y$mRu+TT#S(B7UNC`-QLgvTp>ev??FCdDI;%b&-u$*cuF5%xvJ(!+_B= zV5W@}s?naXC=rMzt!viO^u@&812==_jEXx8Dd3IoTm5ovyx4`70X4D|sEMuo$)|=O zwbOyv_M;$X$4QYm@R=*LCsLQlv{X{acCQqAuKla$2!zNMY&)}i#r@4y=T>PcLZc@I zvj||C?n!c11u(q~m_;C!Jn*~&shg|Rfy z9JLZ+>MF1e+aP)OK6+IqnWUCnbwSt>aL?`s=fM47b$pH#s|D;qlg=oZNaT_gcF#b9 zJ-Ri!wmMVQE;VuCCPso`z&&hR0vJi^4a7EY>=cytu7v8Tzfiy;1XKlk&9@-^SP{JG z5t4^Ntc6Jl&IEe%PW;E4T5e*utcZW#EqV=E5WsN}Xd_B<5Ly2NDh`_EwR8U=z$&;W ze-HUz#^?+qkCFCP9HMtnASDSQ#8UH8&3ka`>ezSKhOWr%;YH;|Uav#KR0iS916$N5 z^HQ;epFOB4YZGWZ0p7%EO-A{(bvb2kMV~av%kW4;5W)ANGJb{Ftwng1y{)Eqysnm9`S$s zhRas8a;qYU%2N^)zikhM+@i@u70tVP61;&I0Gd1e0M|3bf%EUp;9mHj(Tg}Di%fY2N>6P9Y+c$&76x^Tb!rLba+VKb!J)Ba znOnx!>g+S$iJgOo!J8d{>fs%bf1DJXzYLOf7|lRt_dM0{A*g#XlqR6foO8SxHkYrB z)H{m^J#{z2&VIn`1|45j<6Pi#LuwDkGDNr)Q2OT<@`R;WjZ|cC(Ryv9-^u*;X~ch6 z#`o;gWA2Mz%|!Zj6EK_P?`jF`%}+wK_W@l)xJxG~hLh(&RHFd16Ck4WEK>e%`GrXb z15um-9ue2IPyI@&!Rd?T7wuyM?!G(w<2#)~eM(WS&n*H=v{T%s0F!NGjjd!`o$Dd< zghS0?3AX(-iA!0U&>s;@lOU6|`J}h&C}eHsU<5oX`Kes!|$vA~Mw! zs!uNJK2W4v#325|V_+@*0;Lb-bDWxij45M&maBJ0?k@eKkM?|I%4&#QTC7MdPC9t+ z`K036>355NGMQoAQlz_FZq5e>T!cSYl`{0xUt-kdX@X51OA}@hA^b!>Q z+zq@mp{%cyQ_DkAg!-X4@#g$vU@}`1{NPGaP;D`&+MxQQRMU$=`r$#SjUET*Z(AVs z+o}pd>B+?aiG*$}v4k!fp{iG(LgZ(`GuD`^N4ysw=ryUI%DxrN)ugq~HJz^OtFbpo=U-GB!JObY_!rJZ~8Grk+`KGB#iS zB1(m@p_iLf@DxFKVHTjJL%B~8Doh|SEj2`Eii$UzOzh7+F!;SjU+7B@d(W*JbFY=# zWkv>rk)Ii%`mI3mI_><@C`6!(EZwEnrxhGxhLX! w2bS|LPF$LBUpxN3^YqRGlP92Yz`f!1F)XQTHl#LUga7~l07*qoM6N<$f)n1>c>n+a literal 0 HcmV?d00001 diff --git a/src/static/images/bsc.png b/src/static/images/bsc.png new file mode 100644 index 0000000000000000000000000000000000000000..f066ab98718ec2f44d3ce5e8133c3098993cc407 GIT binary patch literal 1768 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 A)c^nh literal 0 HcmV?d00001 diff --git a/src/static/index.html b/src/static/index.html index 7e5aab3..50d6ffd 100644 --- a/src/static/index.html +++ b/src/static/index.html @@ -1,244 +1,271 @@ - - + - - - - Epusdt - 优雅的usdt支付中间件 - - + + + + + - -
- -
- 订单编号:{{.TradeId}} -
-
当前USDT支付区块网络协议为TRC20
-
!!到账金额需要与下方显示的金额一致,否则系統无法确认!!
-
尝试点击钱包地址或金额可直接复制👇
-
-

{{.ActualAmount}} - USDT

-

- {{.Token}} -

-
+ + -
-
-
- 00 - : - 00 - : - 00 +
+ + +
+
+ logo + GM Pay +
+
+ +
+
+ EN +
-
- - - +
+
🇺🇸  English
+
🇨🇳  中文
+
🇯🇵  日本語
+
🇰🇷  한국어
+
🇭🇰  繁體中文
+
🇷🇺  Русский
+
+
+ + +
+
+ + +
+

Amount to pay

+
+ -- + +
+
--
+
+ + + + + +
+
+
+ + +
+
+
+
+ + +
+ +
+

Scan or copy address to pay

+
+ + + + + +
+ +
+
+
+ +

--:--

+
+
+
+
+
+
+ + + + +
+ +
+
+

Amount to pay

+

--

+
+ + + +
+ +
+ +
+
+

Payment address

+

--

+
+ + + +
+
+ + + + + +
+ + Checking blockchain +
+ +
+
+ +
+
+
+ + +
+
+ +
+

Payment Successful

+

Redirecting…

+ +
+ + +
+
+ +
+

Payment Expired

+

Please initiate a new payment

+ +
+ + +
+
+ +
+

Connection Timeout

+

Unable to connect to the payment server

+
+ + +
+
+ + +
+
+ +
+

Order Not Found

+

The order does not exist or has already expired

+
+ +
-
+ + + + +
+ + +
Copied
+ + + + - - - - - diff --git a/src/static/payment.css b/src/static/payment.css new file mode 100644 index 0000000..67e1b4b --- /dev/null +++ b/src/static/payment.css @@ -0,0 +1,395 @@ +/* ============================================= + iOS 26 Liquid Glass Design System + ============================================= */ + +/* ---------- CSS Variables ---------- */ +:root, [data-theme="light"] { + --background: #f2f2f7; + --foreground: #1c1c1e; + --card: rgba(255,255,255,0.72); + --card-foreground: #1c1c1e; + --popover: rgba(255,255,255,0.88); + --popover-foreground:#1c1c1e; + --primary: #ffffff; + --primary-foreground:#1c1c1e; + --primary-hover: #e5e5ea; + --secondary: rgba(120,120,128,0.12); + --muted: rgba(120,120,128,0.08); + --muted-foreground: #8e8e93; + --accent: rgba(255,255,255,0.12); + --accent-foreground: #1c1c1e; + --border: rgba(60,60,67,0.12); + --border-hover: rgba(60,60,67,0.22); + --success: #34c759; + --warning: #ff9500; + --destructive: #ff3b30; + + --glass-bg: rgba(255,255,255,0.65); + --glass-border: rgba(255,255,255,0.8); + --glass-shadow: 0 8px 40px rgba(0,0,0,.10), 0 1.5px 0 rgba(255,255,255,.9) inset; + --card-shadow: 0 4px 24px rgba(0,0,0,.08); + --popover-shadow: 0 12px 40px rgba(0,0,0,.14); + + --blob-1: rgba(200,200,200,0.18); + --blob-2: rgba(52,199,89,0.14); + --blob-3: rgba(255,149,0,0.10); +} + +[data-theme="dark"] { + --background: #000000; + --foreground: #f5f5f7; + --card: rgba(28,28,30,0.82); + --card-foreground: #f5f5f7; + --popover: rgba(44,44,46,0.92); + --popover-foreground:#e5e5ea; + --primary: #ffffff; + --primary-foreground:#1c1c1e; + --primary-hover: #e5e5ea; + --secondary: rgba(120,120,128,0.18); + --muted: rgba(120,120,128,0.12); + --muted-foreground: #636366; + --accent: rgba(255,255,255,0.15); + --accent-foreground: #ffffff; + --border: rgba(255,255,255,0.1); + --border-hover: rgba(255,255,255,0.18); + --success: #30d158; + --warning: #ff9f0a; + --destructive: #ff453a; + + --glass-bg: rgba(28,28,30,0.75); + --glass-border: rgba(255,255,255,0.10); + --glass-shadow: 0 8px 40px rgba(0,0,0,.55), 0 1px 0 rgba(255,255,255,.06) inset; + --card-shadow: 0 4px 32px rgba(0,0,0,.55); + --popover-shadow: 0 12px 40px rgba(0,0,0,.5); + + --blob-1: rgba(255,255,255,0.14); + --blob-2: rgba(48,209,88,0.10); + --blob-3: rgba(255,159,10,0.08); +} + +/* ---------- Ambient blobs ---------- */ +.blob { + position: absolute; + border-radius: 50%; + filter: blur(80px); + animation: blob-drift 18s ease-in-out infinite alternate; +} +.blob-1 { + width: 420px; height: 420px; + background: var(--blob-1); + top: -120px; left: -100px; + animation-delay: 0s; +} +.blob-2 { + width: 340px; height: 340px; + background: var(--blob-2); + bottom: -80px; right: -60px; + animation-delay: -6s; +} +.blob-3 { + width: 260px; height: 260px; + background: var(--blob-3); + top: 45%; left: 55%; + animation-delay: -12s; +} +@keyframes blob-drift { + 0% { transform: translate(0,0) scale(1); } + 50% { transform: translate(30px,-20px) scale(1.06); } + 100% { transform: translate(-20px,30px) scale(0.96); } +} + +/* ---------- Liquid Glass Card ---------- */ +.glass-card { + background: var(--glass-bg); + -webkit-backdrop-filter: blur(28px) saturate(1.6); + backdrop-filter: blur(28px) saturate(1.6); + border: 1px solid var(--glass-border); + border-radius: 22px; + box-shadow: var(--glass-shadow); + transition: background 0.3s, border-color 0.3s, box-shadow 0.3s; +} + +/* ---------- Flippable Status Card ---------- */ +.status-card { + position: relative; + perspective: 1600px; + transition: height 0.38s cubic-bezier(.22,1,.36,1); +} +.status-card-inner { + position: relative; + width: 100%; + transform-style: preserve-3d; + transition: transform 0.82s cubic-bezier(.22,.9,.24,1); +} +.status-card.is-flipped .status-card-inner { + transform: rotateY(180deg); +} +.status-face { + position: absolute; + inset: 0; + width: 100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transform-style: preserve-3d; +} +.status-face-front { + z-index: 2; +} +.status-face-back { + transform: rotateY(180deg); +} +.state-panel-shell { + padding-top: 2px; +} +.state-screen { + display: none; +} +.state-screen.is-active { + display: flex; +} + +/* ---------- Timer ---------- */ +.timer-ring-track { + stroke: var(--border); + transition: stroke .3s; +} +.timer-ring-progress { + transform: rotate(-90deg); + transform-origin: 50% 50%; + transition: stroke-dashoffset 1s linear, stroke .5s; +} +.timer-icon { + color: var(--muted-foreground); +} + +/* ---------- QR wrapper ---------- */ +.qr-wrapper { + background: #ffffff; + border-radius: 18px; + padding: 14px; + box-shadow: 0 2px 16px rgba(0,0,0,.12), 0 0 0 1px rgba(0,0,0,.04); + display: inline-block; +} + +/* ---------- iOS Pill button ---------- */ +.ios-pill { + background: var(--glass-bg); + -webkit-backdrop-filter: blur(16px) saturate(1.4); + backdrop-filter: blur(16px) saturate(1.4); + border: 1px solid var(--glass-border); + border-radius: 99px; + padding: 6px 13px; + color: var(--card-foreground); + transition: background 0.15s, opacity 0.15s; +} +.ios-pill:hover { opacity: 0.82; } +.ios-pill:active { opacity: 0.6; } +.ios-pill.w-9 { padding: 0; justify-content: center; } + +/* ---------- iOS Rows ---------- */ +.ios-row { + display: flex; + align-items: center; + padding: 14px 16px; + transition: background 0.12s; +} +.ios-row:active { background: var(--muted); } + +/* ---------- Icon button ---------- */ +.ios-icon-btn { + display: flex; + align-items: center; + justify-content: center; + width: 32px; height: 32px; + border-radius: 10px; + color: var(--muted-foreground); + background: var(--secondary); + transition: background 0.15s, color 0.15s; + flex-shrink: 0; +} +.ios-icon-btn:hover { background: var(--accent); color: var(--primary); } + +/* ---------- Primary CTA button ---------- */ +.ios-btn-primary { + display: flex; + align-items: center; + justify-content: center; + background: var(--primary); + color: var(--primary-foreground); + border: none; + border-radius: 16px; + padding: 16px 24px; + font-size: 15px; + font-weight: 600; + letter-spacing: -0.2px; + cursor: pointer; + transition: background 0.15s, transform 0.1s, opacity 0.15s; + box-shadow: 0 4px 18px rgba(0,0,0,0.12), 0 1px 0 rgba(255,255,255,.2) inset; +} +[data-theme="dark"] .ios-btn-primary { + box-shadow: 0 4px 18px rgba(255,255,255,0.18), 0 1px 0 rgba(255,255,255,.12) inset; +} +.ios-btn-primary:hover { background: var(--primary-hover); } +.ios-btn-primary:active { transform: scale(0.97); opacity: 0.9; } +.ios-btn-primary:disabled { opacity: 0.45; cursor: not-allowed; transform: none; } + +/* ---------- Secondary button ---------- */ +.ios-btn-secondary { + display: inline-flex; + align-items: center; + justify-content: center; + background: var(--secondary); + color: var(--card-foreground); + border: 1px solid var(--border); + border-radius: 13px; + padding: 11px 28px; + font-size: 15px; + font-weight: 500; + cursor: pointer; + transition: background 0.15s, opacity 0.15s; +} +.ios-btn-secondary:hover { background: var(--accent); } +.ios-btn-secondary:active { opacity: 0.7; } + +/* ---------- State icon circle ---------- */ +.ios-state-icon { + width: 76px; height: 76px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto; +} + +/* ---------- Context Menu ---------- */ +.ios-menu { + background: var(--popover); + -webkit-backdrop-filter: blur(30px) saturate(1.8); + backdrop-filter: blur(30px) saturate(1.8); + border: 1px solid var(--glass-border); + border-radius: 16px; + box-shadow: var(--popover-shadow); + overflow: hidden; +} +.ios-menu.is-open { + opacity: 1; + transform: translateY(0); + pointer-events: all; +} +.ios-menu-item { + display: flex; + align-items: center; + gap: 10px; + padding: 11px 15px; + font-size: 14px; + font-weight: 500; + color: var(--card-foreground); + cursor: pointer; + transition: background 0.1s; +} +.ios-menu-item:hover { background: var(--accent); } +.ios-menu-item.is-selected { color: var(--primary); font-weight: 600; } +.ios-menu-item + .ios-menu-item { border-top: 1px solid var(--border); } + +/* ---------- Select states ---------- */ +.select-trigger.is-open { opacity: 0.8; } +.select-trigger.is-open .select-chevron { transform: rotate(180deg); } + +/* ---------- Toast ---------- */ +#toast { + position: fixed; + bottom: 36px; + left: 50%; + transform: translateX(-50%) translateY(12px); + background: rgba(28,28,30,0.88); + -webkit-backdrop-filter: blur(20px); + backdrop-filter: blur(20px); + color: #fff; + font-size: 13px; + font-weight: 500; + padding: 10px 20px; + border-radius: 20px; + border: 1px solid rgba(255,255,255,0.12); + box-shadow: 0 4px 20px rgba(0,0,0,.3); + opacity: 0; + pointer-events: none; + transition: opacity 0.22s, transform 0.22s; + z-index: 9999; + white-space: nowrap; +} +[data-theme="light"] #toast { + background: rgba(44,44,46,0.9); +} + +/* ---------- Animations ---------- */ +@keyframes state-in { + from { opacity: 0; transform: translateY(12px) scale(0.96); } + to { opacity: 1; transform: translateY(0) scale(1); } +} + +/* ---------- View Transition ---------- */ +::view-transition-old(root), +::view-transition-new(root) { + animation: none; + mix-blend-mode: normal; +} +::view-transition-old(root) { z-index: 1; } +::view-transition-new(root) { z-index: 9; } + +/* ---------- Debug toolbar ---------- */ +#debug-bar { + position: fixed; bottom: 20px; right: 20px; z-index: 9999; + display: flex; flex-direction: column; align-items: flex-end; gap: 8px; +} +#debug-toggle { + width: 36px; height: 36px; border-radius: 50%; border: none; + background: #7c3aed; color: #fff; cursor: pointer; + display: flex; align-items: center; justify-content: center; + box-shadow: 0 2px 12px rgba(124,58,237,.5); + transition: background .15s, transform .1s; +} +#debug-toggle:hover { background: #6d28d9; } +#debug-toggle:active { transform: scale(.92); } +#debug-panel { + display: none; flex-direction: column; gap: 5px; + background: rgba(15,15,20,.92); + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + border: 1px solid rgba(124,58,237,.35); border-radius: 14px; + padding: 12px; min-width: 150px; + box-shadow: 0 8px 32px rgba(0,0,0,.5); +} +#debug-panel.is-open { display: flex; } +.debug-label { + font-size: 10px; font-weight: 700; color: #a78bfa; + letter-spacing: .12em; text-transform: uppercase; + margin-bottom: 4px; padding-bottom: 6px; + border-bottom: 1px solid rgba(255,255,255,.08); +} +.debug-btn { + background: rgba(255,255,255,.07); color: #d1d5db; + border: 1px solid rgba(255,255,255,.1); border-radius: 8px; + padding: 6px 10px; font-size: 12px; font-weight: 500; + cursor: pointer; text-align: left; font-family: inherit; + transition: background .12s, color .12s; +} +.debug-btn:hover { background: rgba(255,255,255,.14); color: #fff; } +.debug-btn--reset:hover { border-color: #60a5fa; color: #93c5fd; } +.debug-btn--success:hover { border-color: #34d399; color: #6ee7b7; } +.debug-btn--expired:hover { border-color: #f87171; color: #fca5a5; } +.debug-btn--timeout:hover { border-color: #fb923c; color: #fdba74; } +.debug-btn--urgent:hover { border-color: #facc15; color: #fde68a; } +.debug-btn--not-found { + background: rgba(142,142,147,.15); + color: #8e8e93; +} + +@media (prefers-reduced-motion: reduce) { + .status-card, + .status-card-inner, + .status-face, + .timer-ring-progress { + transition-duration: 0.01ms !important; + animation-duration: 0.01ms !important; + } +} diff --git a/src/static/payment.js b/src/static/payment.js new file mode 100644 index 0000000..8e2b252 --- /dev/null +++ b/src/static/payment.js @@ -0,0 +1,585 @@ + + +// DOM helpers +const $ = (id) => document.getElementById(id); +const $$ = (sel) => document.querySelectorAll(sel); + +// ---- Network Tag ---- +const _CHAIN_PRESETS = { + Ethereum: { bg: 'hsla(0,0%,55%,0.25)', color: 'hsla(0,0%,55%,1)', icon: 'ethereum' }, + Solana: { bg: 'hsla(256,85%,65%,0.25)', color: 'hsla(256,85%,65%,1)', icon: 'solana' }, + BSC: { bg: 'hsla(46,91%,49%,0.25)', color: 'hsla(46,91%,49%,1)', icon: 'bsc' }, + Arbitrum: { bg: 'hsla(202,100%,54%,0.25)', color: 'hsla(202,100%,54%,1)', icon: 'arbitrum' }, + TRON: { bg: 'hsla(350,100%,47%,0.20)', color: 'hsla(350,100%,47%,1)', icon: 'tron' }, + Polygon: { bg: 'hsla(263,73%,56%,0.25)', color: 'hsla(263,73%,56%,1)', icon: 'polygon' }, + Base: { bg: 'hsla(240,100%,61%,0.25)', color: 'hsla(240,100%,61%,1)', icon: 'base' }, + OP: { bg: 'hsla(353,99%,51%,0.25)', color: 'hsla(353,99%,51%,1)', icon: 'op' }, + HyperEVM: { bg: 'hsla(166,94%,79%,0.20)', color: 'hsla(166,94%,79%,1)', icon: 'hyperevm' }, + Plasma: { bg: 'hsla(166,64%,32%,0.25)', color: 'hsla(166,64%,32%,1)', icon: 'plasma' }, + Bitcoin: { bg: 'hsla(33,93%,54%,0.20)', color: 'hsla(33,93%,54%,1)', icon: 'bitcoin' }, + Binance: { bg: 'hsla(46,91%,49%,0.24)', color: 'hsla(46,91%,49%,1)', icon: 'binance' }, +}; +const _CHAIN_ALIASES = { + evm:'Ethereum', eth:'Ethereum', ethereum:'Ethereum', + bsc:'BSC', bnb:'BSC', + arbitrum:'Arbitrum', arb:'Arbitrum', + sol:'Solana', solana:'Solana', + tron:'TRON', trx:'TRON', + polygon:'Polygon', matic:'Polygon', pol:'Polygon', + base:'Base', + op:'OP', optimism:'OP', + hyperevm:'HyperEVM', hyperliquid:'HyperEVM', hype:'HyperEVM', + plasma:'Plasma', xpl:'Plasma', + bitcoin:'Bitcoin', btc:'Bitcoin', + binance:'Binance', bnb_chain:'Binance', +}; +function _resolveChain(name) { + if (!name) return null; + const k = name.trim().toLowerCase(); + const canonical = _CHAIN_ALIASES[k] || Object.keys(_CHAIN_PRESETS).find(c => c.toLowerCase() === k); + return canonical ? { label: canonical, ..._CHAIN_PRESETS[canonical] } : null; +} +function networkTag(network) { + const chain = _resolveChain(network); + if (!chain) return `${network}`; + return `${chain.label}`; +} + +// Initialize Lucide icons +if (typeof lucide !== 'undefined') lucide.createIcons(); + +// Theme +let currentTheme = localStorage.getItem('theme') || 'dark'; +applyTheme(currentTheme); + +function applyTheme(t) { + currentTheme = t; + document.documentElement.setAttribute('data-theme', t); + localStorage.setItem('theme', t); + $('icon-moon').style.display = t === 'light' ? 'block' : 'none'; + $('icon-sun').style.display = t === 'dark' ? 'block' : 'none'; +} + +function toggleTheme(e) { + const next = currentTheme === 'light' ? 'dark' : 'light'; + if (!document.startViewTransition) { applyTheme(next); return; } + const x = e ? e.clientX : window.innerWidth / 2; + const y = e ? e.clientY : window.innerHeight / 2; + const r = Math.hypot(Math.max(x, window.innerWidth - x), Math.max(y, window.innerHeight - y)); + const transition = document.startViewTransition(() => applyTheme(next)); + transition.ready.then(() => { + const clip = [`circle(0px at ${x}px ${y}px)`, `circle(${r}px at ${x}px ${y}px)`]; + document.documentElement.animate( + { clipPath: clip }, + { duration: 420, easing: 'ease-in-out', pseudoElement: '::view-transition-new(root)' } + ); + }); +} + +// i18n +const LANGS = { + en: { + scan_title: 'Scan or copy address to pay', + amount_to_pay: 'Amount to pay', + payment_address: 'Payment address', + i_have_transferred: 'I have transferred', + checking_blockchain: 'Checking blockchain…', + expires: 'Expires', + copied: 'Copied to clipboard', + verifying: 'Verifying…', + payment_success: 'Payment Successful', + redirecting: 'Redirecting…', + payment_expired: 'Payment Expired', + expired_sub: 'Please initiate a new payment', + order_id: 'Order ID', + order_amount: 'Order amount', + network_timeout: 'Connection Timeout', + timeout_sub: 'Unable to connect to the payment server', + retry: 'Retry', + back: 'Back', + order_not_found: 'Order Not Found', + not_found_sub: 'The order does not exist or has already expired', + }, + zh: { + scan_title: '扫码或复制地址付款', + amount_to_pay: '付款金额', + payment_address: '付款地址', + i_have_transferred: '我已转账', + checking_blockchain: '链上核验中…', + expires: '到期时间', + copied: '已复制到剪贴板', + verifying: '核验中…', + payment_success: '支付成功', + redirecting: '正在跳转…', + payment_expired: '支付已过期', + expired_sub: '请重新发起支付', + order_id: '订单 ID', + order_amount: '订单金额', + network_timeout: '连接超时', + timeout_sub: '无法连接至支付服务器', + retry: '重试', + back: '返回', + order_not_found: '订单不存在', + not_found_sub: '待支付订单不存在或已过期', + }, + ja: { + scan_title: 'アドレスをスキャンまたはコピーして支払う', + amount_to_pay: '支払い金額', + payment_address: '支払いアドレス', + i_have_transferred: '送金しました', + checking_blockchain: 'ブロックチェーン確認中…', + expires: '有効期限', + copied: 'コピーしました', + verifying: '確認中…', + payment_success: '支払い完了', + redirecting: 'リダイレクト中…', + payment_expired: '支払い期限切れ', + expired_sub: '新しい支払いを開始してください', + order_id: '注文 ID', + order_amount: '注文金額', + network_timeout: '接続タイムアウト', + timeout_sub: '支払いサーバーに接続できません', + retry: '再試行', + back: '戻る', + order_not_found: '注文が見つかりません', + not_found_sub: '注文が存在しないか、すでに期限切れです', + }, + ko: { + scan_title: '주소를 스캔하거나 복사하여 결제', + amount_to_pay: '결제 금액', + payment_address: '결제 주소', + i_have_transferred: '이체 완료', + checking_blockchain: '블록체인 확인 중…', + expires: '만료 시간', + copied: '복사됨', + verifying: '확인 중…', + payment_success: '결제 성공', + redirecting: '리다이렉트 중…', + payment_expired: '결제 만료', + expired_sub: '새로운 결제를 시작하세요', + order_id: '주문 ID', + order_amount: '주문 금액', + network_timeout: '연결 시간 초과', + timeout_sub: '결제 서버에 연결할 수 없습니다', + retry: '다시 시도', + back: '돌아가기', + order_not_found: '주문 없음', + not_found_sub: '주문이 존재하지 않거나 이미 만료되었습니다', + }, + 'zh-hk': { + scan_title: '掃碼或複製地址付款', + amount_to_pay: '付款金額', + payment_address: '付款地址', + i_have_transferred: '我已轉帳', + checking_blockchain: '鏈上核驗中…', + expires: '到期時間', + copied: '已複製到剪貼簿', + verifying: '核驗中…', + payment_success: '支付成功', + redirecting: '正在跳轉…', + payment_expired: '支付已過期', + expired_sub: '請重新發起支付', + order_id: '訂單 ID', + order_amount: '訂單金額', + network_timeout: '連線逾時', + timeout_sub: '無法連線至支付伺服器', + retry: '重試', + back: '返回', + order_not_found: '訂單不存在', + not_found_sub: '待支付訂單不存在或已過期', + }, + ru: { + scan_title: 'Отсканируйте или скопируйте адрес для оплаты', + amount_to_pay: 'Сумма к оплате', + payment_address: 'Адрес для оплаты', + i_have_transferred: 'Я перевёл', + checking_blockchain: 'Проверка блокчейна…', + expires: 'Истекает', + copied: 'Скопировано', + verifying: 'Проверка…', + payment_success: 'Оплата прошла успешно', + redirecting: 'Перенаправление…', + payment_expired: 'Срок оплаты истёк', + expired_sub: 'Пожалуйста, создайте новый платёж', + order_id: 'Заказ ID', + order_amount: 'Сумма заказа', + network_timeout: 'Тайм-аут подключения', + timeout_sub: 'Не удалось подключиться к серверу', + retry: 'Повторить', + back: 'Назад', + order_not_found: 'Заказ не найден', + not_found_sub: 'Заказ не существует или уже истёк', + }, +}; + +const LANG_LABELS = { en: 'EN', zh: '中文', 'zh-hk': '繁體', ja: '日本語', ko: '한국어', ru: 'RU' }; +const SUPPORTED_LANGS = Object.keys(LANGS); // ['en','zh','ja','ko','zh-hk','ru'] +let currentLang = 'en'; +const t = (key) => LANGS[currentLang]?.[key] ?? key; + +function detectLang() { + const saved = localStorage.getItem('lang'); + if (saved && SUPPORTED_LANGS.includes(saved)) return saved; + for (const nav of (navigator.languages || [navigator.language])) { + const lc = nav.toLowerCase(); + if (lc.startsWith('zh-hk') || lc.startsWith('zh-tw') || lc.startsWith('zh-mo')) return 'zh-hk'; + if (lc.startsWith('zh')) return 'zh'; + if (lc.startsWith('ja')) return 'ja'; + if (lc.startsWith('ko')) return 'ko'; + if (lc.startsWith('ru')) return 'ru'; + if (lc.startsWith('en')) return 'en'; + } + return 'en'; +} + +function setLang(lang) { + currentLang = lang; + localStorage.setItem('lang', lang); + $$('[data-i18n]').forEach(el => { + const v = t(el.dataset.i18n); + if (v) el.textContent = v; + }); + $('lang-label').textContent = LANG_LABELS[lang]; + $$('#dd-lang-menu .select-option').forEach(o => + o.classList.toggle('is-selected', o.dataset.lang === lang)); + closeAllSelects(); + if (ORDER.tradeId) { renderOrderId(); } + if (ORDER.amount && !ORDER.amount.startsWith('{{')) { + renderRow('display-fiat', t('order_amount'), `${ORDER.amount} ${ORDER.currency || ''}`); + } + requestAnimationFrame(syncStatusCardHeight); +} + +// Select dropdown +function toggleSelect(id) { + const wrap = $(id); + const trigger = wrap.querySelector('.select-trigger'); + const menu = wrap.querySelector('.select-menu'); + const wasOpen = menu.classList.contains('is-open'); + closeAllSelects(); + if (!wasOpen) { + menu.classList.add('is-open'); + trigger.classList.add('is-open'); + } +} + +function closeAllSelects() { + $$('.select-menu.is-open').forEach(m => { + m.classList.remove('is-open'); + m.closest('.select-wrap').querySelector('.select-trigger').classList.remove('is-open'); + }); +} + +document.addEventListener('click', (e) => { + if (!e.target.closest('.select-wrap')) closeAllSelects(); +}); + +// Clipboard fallback (used when ClipboardJS is unavailable) +const CHECK_ICON = ''; + +function showToast() { + const el = $('toast'); + el.textContent = t('copied'); + el.style.opacity = '1'; + el.style.transform = 'translateX(-50%) translateY(0)'; + clearTimeout(el._tid); + el._tid = setTimeout(() => { + el.style.opacity = '0'; + el.style.transform = 'translateX(-50%) translateY(10px)'; + }, 2000); +} + +function flashCheck(btnId) { + const btn = $(btnId); + if (!btn) return; + const orig = btn.innerHTML; + btn.innerHTML = CHECK_ICON; + lucide.createIcons({ nodes: [btn] }); + setTimeout(() => { btn.innerHTML = orig; lucide.createIcons({ nodes: [btn] }); }, 1800); +} + +// Transfer button +function handleTransfer() { + const btn = $('btn-transferred'); + const span = btn.querySelector('span'); + span.textContent = t('verifying'); + btn.disabled = true; + _pollErrors = 0; + _pollStopped = false; + clearTimeout(_pollTimer); + checkOrderStatus(); + setTimeout(() => { + span.textContent = t('i_have_transferred'); + btn.disabled = false; + }, 4000); +} + +// Order +function truncateAddr(addr) { + return addr.length > 10 ? `${addr.slice(0, 4)}...${addr.slice(-6)}` : addr; +} + +function formatAddr(addr) { + if (!addr || addr.length <= 10) return addr; + const pre = addr.slice(0, 4); + const mid = addr.slice(4, -6); + const suf = addr.slice(-6); + return `${pre}${mid}${suf}`; +} + +function renderRow(id, label, value) { + const el = $(id); + if (el) el.innerHTML = `${label}${value}`; +} + +function renderOrderId() { + if (ORDER.tradeId && !ORDER.tradeId.startsWith('{{')) { + renderRow('display-order-id', t('order_id'), ORDER.tradeId); + } +} + +function initOrder() { + if (!ORDER.tradeId || ORDER.tradeId.startsWith('{{')) { + showNotFound(); + return; + } + + $('display-amount').textContent = `${ORDER.actualAmount} ${ORDER.token}`; + $('field-amount').textContent = `${ORDER.actualAmount} ${ORDER.token}`; + $('field-address').innerHTML = formatAddr(ORDER.receiveAddress); + if (ORDER.amount && !ORDER.amount.startsWith('{{')) { + renderRow('display-fiat', t('order_amount'), `${ORDER.amount} ${ORDER.currency || ''}`); + } + $('display-network').innerHTML = networkTag(ORDER.network); + renderOrderId(); + + new QRCode($('qrcode'), { + text: ORDER.receiveAddress, + width: 176, + height: 176, + colorDark: '#111111', + colorLight: '#ffffff', + correctLevel: QRCode.CorrectLevel.M, + }); + + initCountdown(); + checkOrderStatus(); + initClipboard(); +} + +// Clipboard +let _clipboard = null; + +function initClipboard() { + const targets = [ + { id: 'copy-amt-box', text: ORDER.actualAmount, iconId: 'btn-copy-amt2' }, + { id: 'copy-addr-box', text: ORDER.receiveAddress, iconId: 'btn-copy-addr' }, + { id: 'btn-copy-amount', text: ORDER.actualAmount, iconId: 'btn-copy-amount' }, + ]; + + if (typeof ClipboardJS !== 'undefined') { + targets.forEach(({ id, text }) => { + const el = $(id); + if (el) el.setAttribute('data-clipboard-text', text); + }); + if (_clipboard) _clipboard.destroy(); + _clipboard = new ClipboardJS(targets.map(c => '#' + c.id).join(', ')); + _clipboard.on('success', e => { + e.clearSelection(); + const tgt = targets.find(c => c.id === e.trigger.id); + showToast(); + if (tgt) flashCheck(tgt.iconId); + }); + } +} +// Countdown color interpolation (green → orange → red by ratio) +function lerpColor(a, b, t) { + return `rgb(${Math.round(a[0]+(b[0]-a[0])*t)},${Math.round(a[1]+(b[1]-a[1])*t)},${Math.round(a[2]+(b[2]-a[2])*t)})`; +} +function ratioColor(ratio) { + if (ratio >= 0.5) return '#22c55e'; + if (ratio >= 0.2) return lerpColor([34,197,94], [249,115,22], (0.5 - ratio) / 0.3); + return lerpColor([249,115,22], [239,68,68], (0.2 - ratio) / 0.2); +} + +const CIRCUMFERENCE = 2 * Math.PI * 20; // r=20 in iOS SVG ring +let countdownInterval = null; +let totalSeconds = 0; +let _expiresAt = null; + +const pad = (n) => String(n).padStart(2, '0'); + +function initCountdown() { + const parseTime = (raw) => new Date(/^\d+$/.test(String(raw)) ? Number(raw) : raw); + _expiresAt = parseTime(ORDER.expirationTime); + const remaining = Math.max(0, Math.round((_expiresAt - Date.now()) / 1000)); + if (remaining <= 0) { showExpired(); return; } + // 用 createdAt 和 expirationTime 推算总有效时长,否则默认 600 秒 + const created = parseTime(ORDER.createdAt); + totalSeconds = (!isNaN(created.getTime()) && !isNaN(_expiresAt.getTime())) + ? Math.max(1, Math.round((_expiresAt - created) / 1000)) + : 600; + $('ring').style.strokeDasharray = CIRCUMFERENCE; + // 让初始渲染就从 remaining-1 开始,避免视觉上停顿一秒 + _expiresAt = new Date(_expiresAt.getTime() - 1000); + tickCountdown(); + countdownInterval = setInterval(tickCountdown, 1000); +} + +function tickCountdown() { + const remaining = Math.max(0, Math.round((_expiresAt - Date.now()) / 1000)); + const h = Math.floor(remaining / 3600); + const m = Math.floor((remaining % 3600) / 60); + const s = remaining % 60; + + const timeStr = h > 0 + ? `${pad(h)}:${pad(m)}:${pad(s)}` + : `${pad(m)}:${pad(s)}`; + + $('countdown').textContent = timeStr; + const inlineEl = $('countdown-inline'); + + const color = ratioColor(totalSeconds > 0 ? remaining / totalSeconds : 0); + if (inlineEl) { inlineEl.textContent = timeStr; inlineEl.style.color = color; } + + $('ring').style.strokeDashoffset = CIRCUMFERENCE * (1 - (totalSeconds > 0 ? remaining / totalSeconds : 0)); + + $('countdown').style.color = color; + $('ring').style.stroke = color; + + if (remaining <= 0) { + clearInterval(countdownInterval); + showExpired(); + } +} + +// Polling +let _pollTimer = null; +let _pollStopped = false; +let _pollErrors = 0; +const MAX_POLL_ERRORS = 5; + +function checkOrderStatus() { + if (_pollStopped || !ORDER.tradeId || ORDER.tradeId.startsWith('{{')) return; + + fetch(`/pay/check-status/${encodeURIComponent(ORDER.tradeId)}`, { + headers: { Accept: 'application/json' }, + signal: AbortSignal.timeout(8000), + }) + .then(res => { + if (!res.ok) throw new Error(`HTTP ${res.status}`); + return res.json(); + }) + .then(({ data }) => { + _pollErrors = 0; + if (data?.status === 2) onPaymentSuccess(); + else if (data?.status === 3) showExpired(); + else scheduleNextPoll(); + }) + .catch(() => { + if (++_pollErrors >= MAX_POLL_ERRORS) showTimeout(); + else scheduleNextPoll(); + }); +} + +const scheduleNextPoll = () => { + if (!_pollStopped) _pollTimer = setTimeout(checkOrderStatus, 5000); +}; + +function stopPolling() { + _pollStopped = true; + clearTimeout(_pollTimer); +} + +// State panels +const SCREENS = ['screen-success', 'screen-expired', 'screen-timeout', 'screen-not-found']; + +function syncStatusCardHeight() { + const card = $('status-card'); + const inner = card?.querySelector('.status-card-inner'); + if (!card || !inner) return; + + const activeFace = card.classList.contains('is-flipped') + ? card.querySelector('.status-face-back') + : card.querySelector('.status-face-front'); + + const nextHeight = activeFace?.scrollHeight || 0; + if (nextHeight > 0) { + card.style.height = `${nextHeight}px`; + inner.style.height = `${nextHeight}px`; + } +} + +function setActiveScreen(state) { + SCREENS.forEach(id => $(id).classList.toggle('is-active', id === `screen-${state}`)); +} + +function flipToState(state) { + setActiveScreen(state); + $('status-card').classList.add('is-flipped'); + requestAnimationFrame(syncStatusCardHeight); +} + +function showStatePanel(state) { + $('order-info').style.display = state === 'not-found' ? 'none' : ''; + flipToState(state); +} + +function goBack() { + if (document.referrer) { + window.location.href = document.referrer; + } else if (ORDER.redirectUrl && !ORDER.redirectUrl.startsWith('{{')) { + window.location.href = ORDER.redirectUrl; + } else { + history.back(); + } +} + +function hideStatePanel() { + $('status-card').classList.remove('is-flipped'); + $('order-info').style.display = ''; + requestAnimationFrame(syncStatusCardHeight); +} + +function onPaymentSuccess() { + stopPolling(); + clearInterval(countdownInterval); + showStatePanel('success'); + if (ORDER.redirectUrl && !ORDER.redirectUrl.startsWith('{{')) { + setTimeout(() => { window.location.href = ORDER.redirectUrl; }, 3000); + } +} + +function showExpired() { + stopPolling(); + clearInterval(countdownInterval); + $('btn-transferred').disabled = true; + showStatePanel('expired'); +} + +function showTimeout() { + stopPolling(); + showStatePanel('timeout'); +} + +function showNotFound() { + stopPolling(); + clearInterval(countdownInterval); + $('btn-transferred').disabled = true; + showStatePanel('not-found'); +} + +function retryPolling() { + _pollErrors = 0; + _pollStopped = false; + hideStatePanel(); + checkOrderStatus(); +} + +document.addEventListener('DOMContentLoaded', () => { + setLang(detectLang()); + initOrder(); + syncStatusCardHeight(); + window.addEventListener('resize', syncStatusCardHeight); +}); + diff --git a/src/static/reset.css b/src/static/reset.css deleted file mode 100644 index 9b99f95..0000000 --- a/src/static/reset.css +++ /dev/null @@ -1,44 +0,0 @@ -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block; -} -body { - line-height: 1; - background-color: #fafbfc; -} -ol, ul { - list-style: none; -} -blockquote, q { - quotes: none; -} -blockquote:before, blockquote:after, -q:before, q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; -}