diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index d8aee6f2f..139064f6a 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.21 - name: Build and Test run: make @@ -38,7 +38,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.21 - name: Build Docker image run: make docker @@ -117,7 +117,7 @@ jobs: - stack-type: ethereum blockchain-connector: ethconnect - test-suite: TestEthereumGatewayE2ESuite + test-suite: TestEthereumGatewayLegacyEthE2ESuite database-type: sqlite3 token-provider: erc1155 multiparty-enabled: false @@ -130,7 +130,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: 1.21 - name: Download Docker image uses: actions/download-artifact@v3 diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 9fc22ca09..8d3252bde 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -54,7 +54,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.18 + go-version: 1.21 - name: Update manifest to latest commit for every service run: ./manifestgen.sh head @@ -91,7 +91,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: 1.18 + go-version: 1.21 - name: Update manifest to latest commit for every service run: ./manifestgen.sh head diff --git a/.golangci.yml b/.golangci.yml index 4d4f59635..e5221806b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -3,6 +3,7 @@ run: skip-dirs: - "mocks" - "ffconfig" + - "test/e2e" linters-settings: golint: {} gocritic: diff --git a/Dockerfile b/Dockerfile index e3ec75459..18cb31121 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,6 +37,14 @@ RUN apk add jq \ && cd ../build/contracts \ && mv combined.json Firefly.json +FROM alpine:3.19 AS SBOM +WORKDIR / +ADD . /SBOM +RUN apk add --no-cache curl +RUN curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.48.3 +RUN trivy fs --format spdx-json --output /sbom.spdx.json /SBOM +RUN trivy sbom /sbom.spdx.json --severity UNKNOWN,HIGH,CRITICAL --exit-code 1 + FROM $BASE_TAG ARG UI_TAG ARG UI_RELEASE @@ -52,5 +60,6 @@ COPY --from=fabric-builder /firefly/smart_contracts/fabric/firefly-go/firefly_fa ENV UI_RELEASE https://github.com/hyperledger/firefly-ui/releases/download/$UI_TAG/$UI_RELEASE.tgz RUN mkdir /firefly/frontend \ && curl -sLo - $UI_RELEASE | tar -C /firefly/frontend -zxvf - +COPY --from=SBOM /sbom.spdx.json /sbom.spdx.json RUN ln -s /firefly/firefly /usr/bin/firefly -ENTRYPOINT [ "firefly" ] +ENTRYPOINT [ "firefly" ] \ No newline at end of file diff --git a/Makefile b/Makefile index f675bc5a5..dc8f69c08 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ lint: ${LINT} ${MOCKERY}: $(VGO) install github.com/vektra/mockery/v2@latest ${LINT}: - $(VGO) install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.47.3 + $(VGO) install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.54.0 ffcommon: $(eval WSCLIENT_PATH := $(shell $(VGO) list -f '{{.Dir}}' github.com/hyperledger/firefly-common/pkg/wsclient)) @@ -79,6 +79,7 @@ $(eval $(call makemock, internal/operations, Manager, operat $(eval $(call makemock, internal/multiparty, Manager, multipartymocks)) $(eval $(call makemock, internal/apiserver, FFISwaggerGen, apiservermocks)) $(eval $(call makemock, internal/apiserver, Server, apiservermocks)) +$(eval $(call makemock, internal/events/websockets, WebSocketsNamespaced, websocketsmocks)) firefly-nocgo: ${GOFILES} CGO_ENABLED=0 $(VGO) build -o ${BINARY_NAME}-nocgo -ldflags "-X main.buildDate=$(DATE) -X main.buildVersion=$(BUILD_VERSION) -X 'github.com/hyperledger/firefly/cmd.BuildVersionOverride=$(BUILD_VERSION)' -X 'github.com/hyperledger/firefly/cmd.BuildDate=$(DATE)' -X 'github.com/hyperledger/firefly/cmd.BuildCommit=$(GIT_REF)'" -tags=prod -tags=prod -v diff --git a/README.md b/README.md index 341b26f51..3e9e9d937 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ Other repositories you might be interested in containing those microservice comp - Permissioned Ethereum connector - https://github.com/hyperledger/firefly-ethconnect - Private/permissioned: Hyperledger Besu / Quorum - Hyperledger Fabric connector - https://github.com/hyperledger/firefly-fabconnect +- Tezos connector - https://github.com/hyperledger/firefly-tezosconnect - Corda connector starter: https://github.com/hyperledger/firefly-cordaconnect - CorDapp specific customization is required @@ -245,10 +246,10 @@ Plugins: Each plugin comprises a Go shim, plus a remote agent microservice runti │ │ interface │ * Standardized operations, and custom on-chain coupling │ └─────┬─────────┘ │ │ - │ ├─────────────────────┬───────────────────┐ - │ ┌─────┴─────────┐ ┌───────┴───────┐ ┌───────┴────────┐ - │ │ ethereum │ │ fabric │ │ corda/cordapps │ - │ └─────┬─────────┘ └───────────────┘ └────────────────┘ + │ ├─────────────────────┬───────────────────┬-───────────────────┐ + │ ┌─────┴─────────┐ ┌───────┴───────┐ ┌───────┴────────┐ ┌───────┴────────┐ + │ │ ethereum │ │ fabric │ │ corda/cordapps │ │ tezos │ + │ └─────┬─────────┘ └───────────────┘ └────────────────┘ └────────────────┘ │ [REST/WebSockets] │ ┌─────┴────────────────────┐ ┌────────────────────────┐ ┌─ │ │ transaction manager [Tm] ├───┤ Connector API [ffcapi] ├───┤ Simple framework for building blockchain connectors diff --git a/docker_build.sh b/docker_build.sh index 1a8014a5c..8d1faccca 100755 --- a/docker_build.sh +++ b/docker_build.sh @@ -16,9 +16,15 @@ # See the License for the specific language governing permissions and # limitations under the License. +handle_error() { + docker buildx rm firefly --keep-state + exit 1 +} +trap handle_error ERR + echo $@ - if [[ ! -x `which jq` ]]; then echo "Please install \"jq\" to continue"; exit 1; fi +if [[ ! -x `which jq` ]]; then echo "Please install \"jq\" to continue"; exit 1; fi FIREFLY_BUILDER_TAG=$(cat manifest.json | jq -r '.build."firefly-builder".image') FABRIC_BUILDER_TAG=$(cat manifest.json | jq -r '.build."fabric-builder".image') @@ -52,4 +58,3 @@ docker buildx build \ --build-arg GIT_REF=$GIT_REF \ $@ \ . -docker buildx rm firefly --keep-state diff --git a/docs/Gemfile b/docs/Gemfile index 0dc4724a6..a1b0226ed 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -9,4 +9,4 @@ group :jekyll_plugins do gem "jekyll-multiple-languages-plugin" gem "html-proofer" gem "webrick" -end \ No newline at end of file +end diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 48ad7373e..e3793ec03 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -1,43 +1,53 @@ GEM remote: https://rubygems.org/ specs: - activesupport (6.0.6) + activesupport (7.1.3) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2, >= 2.2.2) - addressable (2.8.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) + base64 (0.2.0) + bigdecimal (3.1.6) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.11.1) colorator (1.1.0) - commonmarker (0.23.5) - concurrent-ruby (1.1.10) - dnsruby (1.61.9) - simpleidn (~> 0.1) + commonmarker (0.23.10) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) + dnsruby (1.70.0) + simpleidn (~> 0.2.1) + drb (2.2.0) + ruby2_keywords em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) - ethon (0.15.0) + ethon (0.16.0) ffi (>= 1.15.0) eventmachine (1.2.7) - execjs (2.8.1) - faraday (2.5.2) + execjs (2.9.1) + faraday (2.8.1) + base64 faraday-net_http (>= 2.0, < 3.1) ruby2_keywords (>= 0.0.4) - faraday-net_http (3.0.0) - ffi (1.15.5) + faraday-net_http (3.0.2) + ffi (1.16.3) forwardable-extended (2.6.0) gemoji (3.0.1) - github-pages (227) + github-pages (228) github-pages-health-check (= 1.17.9) - jekyll (= 3.9.2) + jekyll (= 3.9.3) jekyll-avatar (= 0.7.0) jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.2.0) + jekyll-commonmark-ghpages (= 0.4.0) jekyll-default-layout (= 0.1.4) jekyll-feed (= 0.15.1) jekyll-gist (= 1.5.0) @@ -71,7 +81,7 @@ GEM jemoji (= 0.12.0) kramdown (= 2.3.2) kramdown-parser-gfm (= 1.1.0) - liquid (= 4.0.3) + liquid (= 4.0.4) mercenary (~> 0.3) minima (= 2.5.1) nokogiri (>= 1.13.6, < 2.0) @@ -83,10 +93,10 @@ GEM octokit (~> 4.0) public_suffix (>= 3.0, < 5.0) typhoeus (~> 1.3) - html-pipeline (2.14.2) + html-pipeline (2.14.3) activesupport (>= 2) nokogiri (>= 1.4) - html-proofer (4.4.0) + html-proofer (4.4.3) addressable (~> 2.3) mercenary (~> 0.3) nokogiri (~> 1.13) @@ -96,13 +106,13 @@ GEM yell (~> 2.0) zeitwerk (~> 2.5) http_parser.rb (0.8.0) - i18n (0.9.5) + i18n (1.14.1) concurrent-ruby (~> 1.0) - jekyll (3.9.2) + jekyll (3.9.3) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) - i18n (~> 0.7) + i18n (>= 0.7, < 2) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 2.0) kramdown (>= 1.17, < 3) @@ -118,11 +128,11 @@ GEM coffee-script-source (~> 1.11.1) jekyll-commonmark (1.4.0) commonmarker (~> 0.22) - jekyll-commonmark-ghpages (0.2.0) - commonmarker (~> 0.23.4) + jekyll-commonmark-ghpages (0.4.0) + commonmarker (~> 0.23.7) jekyll (~> 3.9.0) jekyll-commonmark (~> 1.4.0) - rouge (>= 2.0, < 4.0) + rouge (>= 2.0, < 5.0) jekyll-default-layout (0.1.4) jekyll (~> 3.0) jekyll-feed (0.15.1) @@ -212,35 +222,32 @@ GEM rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - liquid (4.0.3) - listen (3.7.1) + liquid (4.0.4) + listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) - mini_portile2 (2.8.1) minima (2.5.1) jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - minitest (5.16.3) - nokogiri (1.13.8) - mini_portile2 (~> 2.8.0) - racc (~> 1.4) - nokogiri (1.13.8-arm64-darwin) + minitest (5.21.2) + mutex_m (0.2.0) + nokogiri (1.15.5-arm64-darwin) racc (~> 1.4) octokit (4.25.1) faraday (>= 1, < 3) sawyer (~> 0.9) - parallel (1.22.1) + parallel (1.24.0) pathutil (0.16.2) forwardable-extended (~> 2.6) public_suffix (4.0.7) - racc (1.6.0) + racc (1.7.3) rainbow (3.1.1) rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - rexml (3.2.5) + rexml (3.2.6) rouge (3.26.0) ruby2_keywords (0.0.5) rubyzip (2.3.2) @@ -257,22 +264,20 @@ GEM unf (~> 0.1.4) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - typhoeus (1.4.0) + typhoeus (1.4.1) ethon (>= 0.9.0) - tzinfo (1.2.10) - thread_safe (~> 0.1) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) unf (0.1.4) unf_ext - unf_ext (0.0.8.2) + unf_ext (0.0.9.1) unicode-display_width (1.8.0) - webrick (1.7.0) + webrick (1.8.1) yell (2.2.2) - zeitwerk (2.6.0) + zeitwerk (2.6.12) PLATFORMS arm64-darwin-21 - ruby DEPENDENCIES github-pages @@ -281,4 +286,4 @@ DEPENDENCIES webrick BUNDLED WITH - 2.3.14 \ No newline at end of file + 2.3.14 diff --git a/docs/_i18n/en.yml b/docs/_i18n/en.yml index 371beabf8..501860cc6 100644 --- a/docs/_i18n/en.yml +++ b/docs/_i18n/en.yml @@ -58,3 +58,4 @@ pages: xdc_testnet: XDC Testnet zksync_testnet: zkSync Testnet rotate_dx_certs: Rotate Data Exchange Certificates + tezos_testnet: Tezos Testnet diff --git a/docs/architecture/ping_pong_txflow.md b/docs/architecture/ping_pong_txflow.md index 2470150cf..3660b46e8 100644 --- a/docs/architecture/ping_pong_txflow.md +++ b/docs/architecture/ping_pong_txflow.md @@ -67,7 +67,7 @@ This is deliberately a simple flow, and all kinds of additional layers might wel ## Authorize & Transfer Data (Member 1) -- Inpsect the request data +- Inspect the request data - Retrieve data asset by hash - Send the private data in a private message - No blockchain in this flow diff --git a/docs/contributors/dev_environment_setup.md b/docs/contributors/dev_environment_setup.md index 350ab9558..254496bcc 100644 --- a/docs/contributors/dev_environment_setup.md +++ b/docs/contributors/dev_environment_setup.md @@ -23,7 +23,7 @@ This guide will walk you through setting up your machine for contributing to Fir You will need a few prerequisites set up on your machine before you can build FireFly from source. We recommend doing development on macOS, Linux, or WSL 2.0. -- [Go 1.18](https://golang.org/dl/) +- [Go 1.21](https://golang.org/dl/) - make - GCC - openssl diff --git a/docs/reference/config.md b/docs/reference/config.md index 5e248953e..da6f7387a 100644 --- a/docs/reference/config.md +++ b/docs/reference/config.md @@ -224,7 +224,7 @@ nav_order: 2 |Key|Description|Type|Default Value| |---|-----------|----|-------------| |batchSize|The maximum number of records to read from the DB before performing an aggregation run|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`200` -|batchTimeout|How long to wait for new events to arrive before performing aggregation on a page of events|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` +|batchTimeout|How long to wait for new events to arrive before performing aggregation on a page of events|[`time.Duration`](https://pkg.go.dev/time#Duration)|`0ms` |firstEvent|The first event the aggregator should process, if no previous offest is stored in the DB. Valid options are `oldest` or `newest`|`string`|`oldest` |pollTimeout|The time to wait without a notification of new events, before trying a select on the table|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` |rewindQueryLimit|Safety limit on the maximum number of records to search when performing queries to search for rewinds|`int`|`1000` @@ -249,7 +249,7 @@ nav_order: 2 |Key|Description|Type|Default Value| |---|-----------|----|-------------| -|batchTimeout|A short time to wait for new events to arrive before re-polling for new events|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` +|batchTimeout|A short time to wait for new events to arrive before re-polling for new events|[`time.Duration`](https://pkg.go.dev/time#Duration)|`0ms` |bufferLength|The number of events + attachments an individual dispatcher should hold in memory ready for delivery to the subscription|`int`|`5` |pollTimeout|The time to wait without a notification of new events, before trying a select on the table|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -301,6 +301,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -312,6 +313,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -359,6 +361,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -435,6 +438,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -504,6 +508,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -625,6 +630,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -636,6 +642,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -689,6 +696,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -700,6 +708,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -712,6 +721,7 @@ nav_order: 2 |initialConnectAttempts|The number of attempts FireFly will make to connect to the WebSocket when starting up, before failing|`int`|`5` |path|The WebSocket sever URL to which FireFly should connect|WebSocket URL `string`|`` |readBufferSize|The size in bytes of the read buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` +|url|URL to use for WebSocket - overrides url one level up (in the HTTP config)|`string`|`` |writeBufferSize|The size in bytes of the write buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` ## plugins.blockchain[].ethereum.fftm @@ -748,6 +758,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -759,6 +770,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -813,6 +825,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -824,6 +837,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -836,6 +850,7 @@ nav_order: 2 |initialConnectAttempts|The number of attempts FireFly will make to connect to the WebSocket when starting up, before failing|`int`|`5` |path|The WebSocket sever URL to which FireFly should connect|WebSocket URL `string`|`` |readBufferSize|The size in bytes of the read buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` +|url|URL to use for WebSocket - overrides url one level up (in the HTTP config)|`string`|`` |writeBufferSize|The size in bytes of the write buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` ## plugins.blockchain[].tezos.addressResolver @@ -878,6 +893,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -889,6 +905,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -940,6 +957,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -951,6 +969,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -963,6 +982,7 @@ nav_order: 2 |initialConnectAttempts|The number of attempts FireFly will make to connect to the WebSocket when starting up, before failing|`int`|`5` |path|The WebSocket sever URL to which FireFly should connect|WebSocket URL `string`|`` |readBufferSize|The size in bytes of the read buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` +|url|URL to use for WebSocket - overrides url one level up (in the HTTP config)|`string`|`` |writeBufferSize|The size in bytes of the write buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` ## plugins.database[] @@ -1066,6 +1086,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -1077,6 +1098,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -1089,6 +1111,7 @@ nav_order: 2 |initialConnectAttempts|The number of attempts FireFly will make to connect to the WebSocket when starting up, before failing|`int`|`5` |path|The WebSocket sever URL to which FireFly should connect|WebSocket URL `string`|`` |readBufferSize|The size in bytes of the read buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` +|url|URL to use for WebSocket - overrides url one level up (in the HTTP config)|`string`|`` |writeBufferSize|The size in bytes of the write buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` ## plugins.identity[] @@ -1139,6 +1162,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -1150,6 +1174,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -1187,6 +1212,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -1198,6 +1224,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -1260,6 +1287,7 @@ nav_order: 2 |---|-----------|----|-------------| |count|The maximum number of times to retry|`int`|`5` |enabled|Enables retries|`boolean`|`false` +|errorStatusCodeRegex|The regex that the error response status code must match to trigger retry|`string`|`` |initWaitTime|The initial retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`250ms` |maxWaitTime|The maximum retry delay|[`time.Duration`](https://pkg.go.dev/time#Duration)|`30s` @@ -1271,6 +1299,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -1283,6 +1312,7 @@ nav_order: 2 |initialConnectAttempts|The number of attempts FireFly will make to connect to the WebSocket when starting up, before failing|`int`|`5` |path|The WebSocket sever URL to which FireFly should connect|WebSocket URL `string`|`` |readBufferSize|The size in bytes of the read buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` +|url|URL to use for WebSocket - overrides url one level up (in the HTTP config)|`string`|`` |writeBufferSize|The size in bytes of the write buffer for the WebSocket connection|[`BytesSize`](https://pkg.go.dev/github.com/docker/go-units#BytesSize)|`16Kb` ## privatemessaging.batch @@ -1334,6 +1364,7 @@ nav_order: 2 |certFile|The path to the certificate file for TLS on this API|`string`|`` |clientAuth|Enables or disables client auth for TLS on this API|`string`|`` |enabled|Enables or disables TLS on this API|`boolean`|`false` +|insecureSkipHostVerify|When to true in unit test development environments to disable TLS verification. Use with extreme caution|`boolean`|`` |keyFile|The path to the private key file for TLS on this API|`string`|`` |requiredDNAttributes|A set of required subject DN attributes. Each entry is a regular expression, and the subject certificate must have a matching attribute of the specified type (CN, C, O, OU, ST, L, STREET, POSTALCODE, SERIALNUMBER are valid attributes)|`map[string]string`|`` @@ -1356,7 +1387,14 @@ nav_order: 2 |Key|Description|Type|Default Value| |---|-----------|----|-------------| -|batchSize|Default read ahead to enable for subscriptions that do not explicitly configure readahead|`int`|`0` +|batchSize|Default read ahead to enable for subscriptions that do not explicitly configure readahead|`int`|`50` +|batchTimeout|Default batch timeout|`int`|`50ms` + +## subscription.events + +|Key|Description|Type|Default Value| +|---|-----------|----|-------------| +|maxScanLength|The maximum number of events a search for historical events matching a subscription will index from the database|`int`|`1000` ## subscription.retry diff --git a/docs/reference/firefly_interface_format.md b/docs/reference/firefly_interface_format.md index 4d3eb12f1..64b6064c9 100644 --- a/docs/reference/firefly_interface_format.md +++ b/docs/reference/firefly_interface_format.md @@ -95,6 +95,7 @@ The type field here is the JSON input type when making a request to FireFly to i ### Schema details + The details field is quite important in some cases. Because the `details` field is passed to the blockchain plugin, it is used to encapsulate blockchain specific type information about a particular field. Additionally, because each blockchain plugin can add rules to the list of schema requirements above, a blockchain plugin can enforce that certain fields are always present within the `details` field. For example, the Ethereum plugin always needs to know what Solidity type the field is. It also defines several optional fields. A full Ethereum details field may look like: diff --git a/docs/reference/types/subscription.md b/docs/reference/types/subscription.md index 6ee7b937f..584fb45c5 100644 --- a/docs/reference/types/subscription.md +++ b/docs/reference/types/subscription.md @@ -105,7 +105,7 @@ nav_order: 3 | `firstEvent` | Whether your application would like to receive events from the 'oldest' event emitted by your FireFly node (from the beginning of time), or the 'newest' event (from now), or a specific event sequence. Default is 'newest' | `SubOptsFirstEvent` | | `readAhead` | The number of events to stream ahead to your application, while waiting for confirmation of consumption of those events. At least once delivery semantics are used in FireFly, so if your application crashes/reconnects this is the maximum number of events you would expect to be redelivered after it restarts | `uint16` | | `withData` | Whether message events delivered over the subscription, should be packaged with the full data of those messages in-line as part of the event JSON payload. Or if the application should make separate REST calls to download that data. May not be supported on some transports. | `bool` | -| `batch` | Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event in the batch. Commonly used with Webhooks to allow events to be delivered and acknowledged in batches. | `bool` | +| `batch` | Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event in the batch, allowing client-side optimizations when processing the events in a group. Available for both Webhooks and WebSockets. | `bool` | | `batchTimeout` | When batching is enabled, the optional timeout to send events even when the batch hasn't filled. | `string` | | `fastack` | Webhooks only: When true the event will be acknowledged before the webhook is invoked, allowing parallel invocations | `bool` | | `url` | Webhooks only: HTTP url to invoke. Can be relative if a base URL is set in the webhook plugin config | `string` | diff --git a/docs/reference/types/wsack.md b/docs/reference/types/wsack.md index 5b2385331..fc44ff2f0 100644 --- a/docs/reference/types/wsack.md +++ b/docs/reference/types/wsack.md @@ -37,7 +37,7 @@ nav_order: 24 | Field Name | Description | Type | |------------|-------------|------| -| `type` | WSActionBase.type | `FFEnum`:
`"start"`
`"ack"`
`"protocol_error"` | +| `type` | WSActionBase.type | `FFEnum`:
`"start"`
`"ack"`
`"protocol_error"`
`"event_batch"` | | `id` | WSAck.id | [`UUID`](simpletypes#uuid) | | `subscription` | WSAck.subscription | [`SubscriptionRef`](#subscriptionref) | diff --git a/docs/reference/types/wserror.md b/docs/reference/types/wserror.md index e7052b0a1..ed2cb06e1 100644 --- a/docs/reference/types/wserror.md +++ b/docs/reference/types/wserror.md @@ -33,6 +33,6 @@ nav_order: 25 | Field Name | Description | Type | |------------|-------------|------| -| `type` | WSAck.type | `FFEnum`:
`"start"`
`"ack"`
`"protocol_error"` | +| `type` | WSAck.type | `FFEnum`:
`"start"`
`"ack"`
`"protocol_error"`
`"event_batch"` | | `error` | WSAck.error | `string` | diff --git a/docs/reference/types/wsstart.md b/docs/reference/types/wsstart.md index 3c606a79b..3b854027e 100644 --- a/docs/reference/types/wsstart.md +++ b/docs/reference/types/wsstart.md @@ -42,7 +42,7 @@ nav_order: 23 | Field Name | Description | Type | |------------|-------------|------| -| `type` | WSActionBase.type | `FFEnum`:
`"start"`
`"ack"`
`"protocol_error"` | +| `type` | WSActionBase.type | `FFEnum`:
`"start"`
`"ack"`
`"protocol_error"`
`"event_batch"` | | `autoack` | WSStart.autoack | `bool` | | `namespace` | WSStart.namespace | `string` | | `name` | WSStart.name | `string` | @@ -96,7 +96,7 @@ nav_order: 23 | `firstEvent` | Whether your application would like to receive events from the 'oldest' event emitted by your FireFly node (from the beginning of time), or the 'newest' event (from now), or a specific event sequence. Default is 'newest' | `SubOptsFirstEvent` | | `readAhead` | The number of events to stream ahead to your application, while waiting for confirmation of consumption of those events. At least once delivery semantics are used in FireFly, so if your application crashes/reconnects this is the maximum number of events you would expect to be redelivered after it restarts | `uint16` | | `withData` | Whether message events delivered over the subscription, should be packaged with the full data of those messages in-line as part of the event JSON payload. Or if the application should make separate REST calls to download that data. May not be supported on some transports. | `bool` | -| `batch` | Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event in the batch. Commonly used with Webhooks to allow events to be delivered and acknowledged in batches. | `bool` | +| `batch` | Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event in the batch, allowing client-side optimizations when processing the events in a group. Available for both Webhooks and WebSockets. | `bool` | | `batchTimeout` | When batching is enabled, the optional timeout to send events even when the batch hasn't filled. | `string` | | `fastack` | Webhooks only: When true the event will be acknowledged before the webhook is invoked, allowing parallel invocations | `bool` | | `url` | Webhooks only: HTTP url to invoke. Can be relative if a base URL is set in the webhook plugin config | `string` | diff --git a/docs/swagger/swagger.yaml b/docs/swagger/swagger.yaml index cecfa3018..6d8cac125 100644 --- a/docs/swagger/swagger.yaml +++ b/docs/swagger/swagger.yaml @@ -442,6 +442,192 @@ paths: description: "" tags: - Default Namespace + put: + description: The ID of the contract API + operationId: putContractAPI + parameters: + - description: The name of the contract API + in: path + name: id + required: true + schema: + example: id + type: string + - description: When true the HTTP request blocks until the message is confirmed + in: query + name: confirm + schema: + example: "true" + type: string + - description: Server-side request timeout (milliseconds, or set a custom suffix + like 10s) + in: header + name: Request-Timeout + schema: + default: 2m0s + type: string + requestBody: + content: + application/json: + schema: + properties: + interface: + description: Reference to the FireFly Interface definition associated + with the contract API + properties: + id: + description: The UUID of the FireFly interface + format: uuid + type: string + name: + description: The name of the FireFly interface + type: string + version: + description: The version of the FireFly interface + type: string + type: object + location: + description: If this API is tied to an individual instance of a + smart contract, this field can include a blockchain specific contract + identifier. For example an Ethereum contract address, or a Fabric + chaincode name and channel + name: + description: The name that is used in the URL to access the API + type: string + networkName: + description: The published name of the API within the multiparty + network + type: string + type: object + responses: + "200": + content: + application/json: + schema: + properties: + id: + description: The UUID of the contract API + format: uuid + type: string + interface: + description: Reference to the FireFly Interface definition associated + with the contract API + properties: + id: + description: The UUID of the FireFly interface + format: uuid + type: string + name: + description: The name of the FireFly interface + type: string + version: + description: The version of the FireFly interface + type: string + type: object + location: + description: If this API is tied to an individual instance of + a smart contract, this field can include a blockchain specific + contract identifier. For example an Ethereum contract address, + or a Fabric chaincode name and channel + message: + description: The UUID of the broadcast message that was used to + publish this API to the network + format: uuid + type: string + name: + description: The name that is used in the URL to access the API + type: string + namespace: + description: The namespace of the contract API + type: string + networkName: + description: The published name of the API within the multiparty + network + type: string + published: + description: Indicates if the API is published to other members + of the multiparty network + type: boolean + urls: + description: The URLs to use to access the API + properties: + openapi: + description: The URL to download the OpenAPI v3 (Swagger) + description for the API generated in JSON or YAML format + type: string + ui: + description: The URL to use in a web browser to access the + SwaggerUI explorer/exerciser for the API + type: string + type: object + type: object + description: Success + "202": + content: + application/json: + schema: + properties: + id: + description: The UUID of the contract API + format: uuid + type: string + interface: + description: Reference to the FireFly Interface definition associated + with the contract API + properties: + id: + description: The UUID of the FireFly interface + format: uuid + type: string + name: + description: The name of the FireFly interface + type: string + version: + description: The version of the FireFly interface + type: string + type: object + location: + description: If this API is tied to an individual instance of + a smart contract, this field can include a blockchain specific + contract identifier. For example an Ethereum contract address, + or a Fabric chaincode name and channel + message: + description: The UUID of the broadcast message that was used to + publish this API to the network + format: uuid + type: string + name: + description: The name that is used in the URL to access the API + type: string + namespace: + description: The namespace of the contract API + type: string + networkName: + description: The published name of the API within the multiparty + network + type: string + published: + description: Indicates if the API is published to other members + of the multiparty network + type: boolean + urls: + description: The URLs to use to access the API + properties: + openapi: + description: The URL to download the OpenAPI v3 (Swagger) + description for the API generated in JSON or YAML format + type: string + ui: + description: The URL to use in a web browser to access the + SwaggerUI explorer/exerciser for the API + type: string + type: object + type: object + description: Success + default: + description: "" + tags: + - Default Namespace /apis/{apiName}/interface: get: description: Gets a contract interface for a contract API @@ -2160,193 +2346,6 @@ paths: description: "" tags: - Default Namespace - /apis/{id}: - put: - description: The ID of the contract API - operationId: putContractAPI - parameters: - - description: The name of the contract API - in: path - name: id - required: true - schema: - example: id - type: string - - description: When true the HTTP request blocks until the message is confirmed - in: query - name: confirm - schema: - example: "true" - type: string - - description: Server-side request timeout (milliseconds, or set a custom suffix - like 10s) - in: header - name: Request-Timeout - schema: - default: 2m0s - type: string - requestBody: - content: - application/json: - schema: - properties: - interface: - description: Reference to the FireFly Interface definition associated - with the contract API - properties: - id: - description: The UUID of the FireFly interface - format: uuid - type: string - name: - description: The name of the FireFly interface - type: string - version: - description: The version of the FireFly interface - type: string - type: object - location: - description: If this API is tied to an individual instance of a - smart contract, this field can include a blockchain specific contract - identifier. For example an Ethereum contract address, or a Fabric - chaincode name and channel - name: - description: The name that is used in the URL to access the API - type: string - networkName: - description: The published name of the API within the multiparty - network - type: string - type: object - responses: - "200": - content: - application/json: - schema: - properties: - id: - description: The UUID of the contract API - format: uuid - type: string - interface: - description: Reference to the FireFly Interface definition associated - with the contract API - properties: - id: - description: The UUID of the FireFly interface - format: uuid - type: string - name: - description: The name of the FireFly interface - type: string - version: - description: The version of the FireFly interface - type: string - type: object - location: - description: If this API is tied to an individual instance of - a smart contract, this field can include a blockchain specific - contract identifier. For example an Ethereum contract address, - or a Fabric chaincode name and channel - message: - description: The UUID of the broadcast message that was used to - publish this API to the network - format: uuid - type: string - name: - description: The name that is used in the URL to access the API - type: string - namespace: - description: The namespace of the contract API - type: string - networkName: - description: The published name of the API within the multiparty - network - type: string - published: - description: Indicates if the API is published to other members - of the multiparty network - type: boolean - urls: - description: The URLs to use to access the API - properties: - openapi: - description: The URL to download the OpenAPI v3 (Swagger) - description for the API generated in JSON or YAML format - type: string - ui: - description: The URL to use in a web browser to access the - SwaggerUI explorer/exerciser for the API - type: string - type: object - type: object - description: Success - "202": - content: - application/json: - schema: - properties: - id: - description: The UUID of the contract API - format: uuid - type: string - interface: - description: Reference to the FireFly Interface definition associated - with the contract API - properties: - id: - description: The UUID of the FireFly interface - format: uuid - type: string - name: - description: The name of the FireFly interface - type: string - version: - description: The version of the FireFly interface - type: string - type: object - location: - description: If this API is tied to an individual instance of - a smart contract, this field can include a blockchain specific - contract identifier. For example an Ethereum contract address, - or a Fabric chaincode name and channel - message: - description: The UUID of the broadcast message that was used to - publish this API to the network - format: uuid - type: string - name: - description: The name that is used in the URL to access the API - type: string - namespace: - description: The namespace of the contract API - type: string - networkName: - description: The published name of the API within the multiparty - network - type: string - published: - description: Indicates if the API is published to other members - of the multiparty network - type: boolean - urls: - description: The URLs to use to access the API - properties: - openapi: - description: The URL to download the OpenAPI v3 (Swagger) - description for the API generated in JSON or YAML format - type: string - ui: - description: The URL to use in a web browser to access the - SwaggerUI explorer/exerciser for the API - type: string - type: object - type: object - description: Success - default: - description: "" - tags: - - Default Namespace /batches: get: description: Gets a list of message batches @@ -9278,132 +9277,6 @@ paths: tags: - Default Namespace /identities/{did}: - get: - description: Gets an identity by its DID - operationId: getIdentityByDID - parameters: - - description: The identity DID - in: path - name: did - required: true - schema: - type: string - - description: When set, the API will return the verifier for this identity - in: query - name: fetchverifiers - schema: - example: "true" - type: string - - description: Server-side request timeout (milliseconds, or set a custom suffix - like 10s) - in: header - name: Request-Timeout - schema: - default: 2m0s - type: string - responses: - "200": - content: - application/json: - schema: - properties: - created: - description: The creation time of the identity - format: date-time - type: string - description: - description: A description of the identity. Part of the updatable - profile information of an identity - type: string - did: - description: The DID of the identity. Unique across namespaces - within a FireFly network - type: string - id: - description: The UUID of the identity - format: uuid - type: string - messages: - description: References to the broadcast messages that established - this identity and proved ownership of the associated verifiers - (keys) - properties: - claim: - description: The UUID of claim message - format: uuid - type: string - update: - description: The UUID of the most recently applied update - message. Unset if no updates have been confirmed - format: uuid - type: string - verification: - description: The UUID of claim message. Unset for root organization - identities - format: uuid - type: string - type: object - name: - description: The name of the identity. The name must be unique - within the type and namespace - type: string - namespace: - description: The namespace of the identity. Organization and node - identities are always defined in the ff_system namespace - type: string - parent: - description: The UUID of the parent identity. Unset for root organization - identities - format: uuid - type: string - profile: - additionalProperties: - description: A set of metadata for the identity. Part of the - updatable profile information of an identity - description: A set of metadata for the identity. Part of the updatable - profile information of an identity - type: object - type: - description: The type of the identity - enum: - - org - - node - - custom - type: string - updated: - description: The last update time of the identity profile - format: date-time - type: string - verifiers: - description: The verifiers, such as blockchain signing keys, that - have been bound to this identity and can be used to prove data - orignates from that identity - items: - description: The verifiers, such as blockchain signing keys, - that have been bound to this identity and can be used to prove - data orignates from that identity - properties: - type: - description: The type of the verifier - enum: - - ethereum_address - - tezos_address - - fabric_msp_id - - dx_peer_id - type: string - value: - description: The verifier string, such as an Ethereum address, - or Fabric MSP identifier - type: string - type: object - type: array - type: object - description: Success - default: - description: "" - tags: - - Default Namespace - /identities/{iid}: get: description: Gets an identity by its ID operationId: getIdentityByID @@ -12780,6 +12653,199 @@ paths: description: "" tags: - Non-Default Namespace + put: + description: The ID of the contract API + operationId: putContractAPINamespace + parameters: + - description: The name of the contract API + in: path + name: id + required: true + schema: + example: id + type: string + - description: The namespace which scopes this request + in: path + name: ns + required: true + schema: + example: default + type: string + - description: When true the HTTP request blocks until the message is confirmed + in: query + name: confirm + schema: + example: "true" + type: string + - description: Server-side request timeout (milliseconds, or set a custom suffix + like 10s) + in: header + name: Request-Timeout + schema: + default: 2m0s + type: string + requestBody: + content: + application/json: + schema: + properties: + interface: + description: Reference to the FireFly Interface definition associated + with the contract API + properties: + id: + description: The UUID of the FireFly interface + format: uuid + type: string + name: + description: The name of the FireFly interface + type: string + version: + description: The version of the FireFly interface + type: string + type: object + location: + description: If this API is tied to an individual instance of a + smart contract, this field can include a blockchain specific contract + identifier. For example an Ethereum contract address, or a Fabric + chaincode name and channel + name: + description: The name that is used in the URL to access the API + type: string + networkName: + description: The published name of the API within the multiparty + network + type: string + type: object + responses: + "200": + content: + application/json: + schema: + properties: + id: + description: The UUID of the contract API + format: uuid + type: string + interface: + description: Reference to the FireFly Interface definition associated + with the contract API + properties: + id: + description: The UUID of the FireFly interface + format: uuid + type: string + name: + description: The name of the FireFly interface + type: string + version: + description: The version of the FireFly interface + type: string + type: object + location: + description: If this API is tied to an individual instance of + a smart contract, this field can include a blockchain specific + contract identifier. For example an Ethereum contract address, + or a Fabric chaincode name and channel + message: + description: The UUID of the broadcast message that was used to + publish this API to the network + format: uuid + type: string + name: + description: The name that is used in the URL to access the API + type: string + namespace: + description: The namespace of the contract API + type: string + networkName: + description: The published name of the API within the multiparty + network + type: string + published: + description: Indicates if the API is published to other members + of the multiparty network + type: boolean + urls: + description: The URLs to use to access the API + properties: + openapi: + description: The URL to download the OpenAPI v3 (Swagger) + description for the API generated in JSON or YAML format + type: string + ui: + description: The URL to use in a web browser to access the + SwaggerUI explorer/exerciser for the API + type: string + type: object + type: object + description: Success + "202": + content: + application/json: + schema: + properties: + id: + description: The UUID of the contract API + format: uuid + type: string + interface: + description: Reference to the FireFly Interface definition associated + with the contract API + properties: + id: + description: The UUID of the FireFly interface + format: uuid + type: string + name: + description: The name of the FireFly interface + type: string + version: + description: The version of the FireFly interface + type: string + type: object + location: + description: If this API is tied to an individual instance of + a smart contract, this field can include a blockchain specific + contract identifier. For example an Ethereum contract address, + or a Fabric chaincode name and channel + message: + description: The UUID of the broadcast message that was used to + publish this API to the network + format: uuid + type: string + name: + description: The name that is used in the URL to access the API + type: string + namespace: + description: The namespace of the contract API + type: string + networkName: + description: The published name of the API within the multiparty + network + type: string + published: + description: Indicates if the API is published to other members + of the multiparty network + type: boolean + urls: + description: The URLs to use to access the API + properties: + openapi: + description: The URL to download the OpenAPI v3 (Swagger) + description for the API generated in JSON or YAML format + type: string + ui: + description: The URL to use in a web browser to access the + SwaggerUI explorer/exerciser for the API + type: string + type: object + type: object + description: Success + default: + description: "" + tags: + - Non-Default Namespace /namespaces/{ns}/apis/{apiName}/interface: get: description: Gets a contract interface for a contract API @@ -14974,200 +15040,6 @@ paths: description: "" tags: - Non-Default Namespace - /namespaces/{ns}/apis/{id}: - put: - description: The ID of the contract API - operationId: putContractAPINamespace - parameters: - - description: The name of the contract API - in: path - name: id - required: true - schema: - example: id - type: string - - description: The namespace which scopes this request - in: path - name: ns - required: true - schema: - example: default - type: string - - description: When true the HTTP request blocks until the message is confirmed - in: query - name: confirm - schema: - example: "true" - type: string - - description: Server-side request timeout (milliseconds, or set a custom suffix - like 10s) - in: header - name: Request-Timeout - schema: - default: 2m0s - type: string - requestBody: - content: - application/json: - schema: - properties: - interface: - description: Reference to the FireFly Interface definition associated - with the contract API - properties: - id: - description: The UUID of the FireFly interface - format: uuid - type: string - name: - description: The name of the FireFly interface - type: string - version: - description: The version of the FireFly interface - type: string - type: object - location: - description: If this API is tied to an individual instance of a - smart contract, this field can include a blockchain specific contract - identifier. For example an Ethereum contract address, or a Fabric - chaincode name and channel - name: - description: The name that is used in the URL to access the API - type: string - networkName: - description: The published name of the API within the multiparty - network - type: string - type: object - responses: - "200": - content: - application/json: - schema: - properties: - id: - description: The UUID of the contract API - format: uuid - type: string - interface: - description: Reference to the FireFly Interface definition associated - with the contract API - properties: - id: - description: The UUID of the FireFly interface - format: uuid - type: string - name: - description: The name of the FireFly interface - type: string - version: - description: The version of the FireFly interface - type: string - type: object - location: - description: If this API is tied to an individual instance of - a smart contract, this field can include a blockchain specific - contract identifier. For example an Ethereum contract address, - or a Fabric chaincode name and channel - message: - description: The UUID of the broadcast message that was used to - publish this API to the network - format: uuid - type: string - name: - description: The name that is used in the URL to access the API - type: string - namespace: - description: The namespace of the contract API - type: string - networkName: - description: The published name of the API within the multiparty - network - type: string - published: - description: Indicates if the API is published to other members - of the multiparty network - type: boolean - urls: - description: The URLs to use to access the API - properties: - openapi: - description: The URL to download the OpenAPI v3 (Swagger) - description for the API generated in JSON or YAML format - type: string - ui: - description: The URL to use in a web browser to access the - SwaggerUI explorer/exerciser for the API - type: string - type: object - type: object - description: Success - "202": - content: - application/json: - schema: - properties: - id: - description: The UUID of the contract API - format: uuid - type: string - interface: - description: Reference to the FireFly Interface definition associated - with the contract API - properties: - id: - description: The UUID of the FireFly interface - format: uuid - type: string - name: - description: The name of the FireFly interface - type: string - version: - description: The version of the FireFly interface - type: string - type: object - location: - description: If this API is tied to an individual instance of - a smart contract, this field can include a blockchain specific - contract identifier. For example an Ethereum contract address, - or a Fabric chaincode name and channel - message: - description: The UUID of the broadcast message that was used to - publish this API to the network - format: uuid - type: string - name: - description: The name that is used in the URL to access the API - type: string - namespace: - description: The namespace of the contract API - type: string - networkName: - description: The published name of the API within the multiparty - network - type: string - published: - description: Indicates if the API is published to other members - of the multiparty network - type: boolean - urls: - description: The URLs to use to access the API - properties: - openapi: - description: The URL to download the OpenAPI v3 (Swagger) - description for the API generated in JSON or YAML format - type: string - ui: - description: The URL to use in a web browser to access the - SwaggerUI explorer/exerciser for the API - type: string - type: object - type: object - description: Success - default: - description: "" - tags: - - Non-Default Namespace /namespaces/{ns}/batches: get: description: Gets a list of message batches @@ -22512,14 +22384,15 @@ paths: - Non-Default Namespace /namespaces/{ns}/identities/{did}: get: - description: Gets an identity by its DID - operationId: getIdentityByDIDNamespace + description: Gets an identity by its ID + operationId: getIdentityByIDNamespace parameters: - - description: The identity DID + - description: The identity ID, which is a UUID generated by FireFly in: path - name: did + name: iid required: true schema: + example: id type: string - description: The namespace which scopes this request in: path @@ -22614,46 +22487,21 @@ paths: description: The last update time of the identity profile format: date-time type: string - verifiers: - description: The verifiers, such as blockchain signing keys, that - have been bound to this identity and can be used to prove data - orignates from that identity - items: - description: The verifiers, such as blockchain signing keys, - that have been bound to this identity and can be used to prove - data orignates from that identity - properties: - type: - description: The type of the verifier - enum: - - ethereum_address - - tezos_address - - fabric_msp_id - - dx_peer_id - type: string - value: - description: The verifier string, such as an Ethereum address, - or Fabric MSP identifier - type: string - type: object - type: array type: object description: Success default: description: "" tags: - Non-Default Namespace - /namespaces/{ns}/identities/{iid}: - get: - description: Gets an identity by its ID - operationId: getIdentityByIDNamespace + patch: + description: Updates an identity + operationId: patchUpdateIdentityNamespace parameters: - description: The identity ID, which is a UUID generated by FireFly in: path name: iid required: true schema: - example: id type: string - description: The namespace which scopes this request in: path @@ -22662,11 +22510,10 @@ paths: schema: example: default type: string - - description: When set, the API will return the verifier for this identity + - description: When true the HTTP request blocks until the message is confirmed in: query - name: fetchverifiers + name: confirm schema: - example: "true" type: string - description: Server-side request timeout (milliseconds, or set a custom suffix like 10s) @@ -22675,6 +22522,23 @@ paths: schema: default: 2m0s type: string + requestBody: + content: + application/json: + schema: + properties: + description: + description: A description of the identity. Part of the updatable + profile information of an identity + type: string + profile: + additionalProperties: + description: A set of metadata for the identity. Part of the updatable + profile information of an identity + description: A set of metadata for the identity. Part of the updatable + profile information of an identity + type: object + type: object responses: "200": content: @@ -22750,132 +22614,7 @@ paths: type: string type: object description: Success - default: - description: "" - tags: - - Non-Default Namespace - patch: - description: Updates an identity - operationId: patchUpdateIdentityNamespace - parameters: - - description: The identity ID, which is a UUID generated by FireFly - in: path - name: iid - required: true - schema: - type: string - - description: The namespace which scopes this request - in: path - name: ns - required: true - schema: - example: default - type: string - - description: When true the HTTP request blocks until the message is confirmed - in: query - name: confirm - schema: - type: string - - description: Server-side request timeout (milliseconds, or set a custom suffix - like 10s) - in: header - name: Request-Timeout - schema: - default: 2m0s - type: string - requestBody: - content: - application/json: - schema: - properties: - description: - description: A description of the identity. Part of the updatable - profile information of an identity - type: string - profile: - additionalProperties: - description: A set of metadata for the identity. Part of the updatable - profile information of an identity - description: A set of metadata for the identity. Part of the updatable - profile information of an identity - type: object - type: object - responses: - "200": - content: - application/json: - schema: - properties: - created: - description: The creation time of the identity - format: date-time - type: string - description: - description: A description of the identity. Part of the updatable - profile information of an identity - type: string - did: - description: The DID of the identity. Unique across namespaces - within a FireFly network - type: string - id: - description: The UUID of the identity - format: uuid - type: string - messages: - description: References to the broadcast messages that established - this identity and proved ownership of the associated verifiers - (keys) - properties: - claim: - description: The UUID of claim message - format: uuid - type: string - update: - description: The UUID of the most recently applied update - message. Unset if no updates have been confirmed - format: uuid - type: string - verification: - description: The UUID of claim message. Unset for root organization - identities - format: uuid - type: string - type: object - name: - description: The name of the identity. The name must be unique - within the type and namespace - type: string - namespace: - description: The namespace of the identity. Organization and node - identities are always defined in the ff_system namespace - type: string - parent: - description: The UUID of the parent identity. Unset for root organization - identities - format: uuid - type: string - profile: - additionalProperties: - description: A set of metadata for the identity. Part of the - updatable profile information of an identity - description: A set of metadata for the identity. Part of the updatable - profile information of an identity - type: object - type: - description: The type of the identity - enum: - - org - - node - - custom - type: string - updated: - description: The last update time of the identity profile - format: date-time - type: string - type: object - description: Success - "202": + "202": content: application/json: schema: @@ -27598,6 +27337,9 @@ paths: description: The time the operation was created format: date-time type: string + detail: + description: Additional detailed information about an operation + provided by the connector error: description: Any error reported back from the plugin for this operation @@ -28575,8 +28317,9 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is - a single event in the batch. Commonly used with Webhooks - to allow events to be delivered and acknowledged in batches. + a single event in the batch, allowing client-side optimizations + when processing the events in a group. Available for both + Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -28864,8 +28607,8 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event - in the batch. Commonly used with Webhooks to allow events - to be delivered and acknowledged in batches. + in the batch, allowing client-side optimizations when processing + the events in a group. Available for both Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -29134,8 +28877,9 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a - single event in the batch. Commonly used with Webhooks to - allow events to be delivered and acknowledged in batches. + single event in the batch, allowing client-side optimizations + when processing the events in a group. Available for both + Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -29419,8 +29163,8 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event - in the batch. Commonly used with Webhooks to allow events - to be delivered and acknowledged in batches. + in the batch, allowing client-side optimizations when processing + the events in a group. Available for both Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -29689,8 +29433,9 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a - single event in the batch. Commonly used with Webhooks to - allow events to be delivered and acknowledged in batches. + single event in the batch, allowing client-side optimizations + when processing the events in a group. Available for both + Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -30036,8 +29781,9 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a - single event in the batch. Commonly used with Webhooks to - allow events to be delivered and acknowledged in batches. + single event in the batch, allowing client-side optimizations + when processing the events in a group. Available for both + Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -30208,6 +29954,206 @@ paths: description: "" tags: - Non-Default Namespace + /namespaces/{ns}/subscriptions/{subid}/events: + get: + description: Gets a collection of events filtered by the subscription for further + filtering + operationId: getSubscriptionEventsFilteredNamespace + parameters: + - description: The subscription ID + in: path + name: subid + required: true + schema: + type: string + - description: The namespace which scopes this request + in: path + name: ns + required: true + schema: + example: default + type: string + - description: The sequence ID in the raw event stream to start indexing through + events from. Leave blank to start indexing from the most recent events + in: query + name: startsequence + schema: + type: string + - description: The sequence ID in the raw event stream to stop indexing through + events at. Leave blank to start indexing from the most recent events + in: query + name: endsequence + schema: + type: string + - description: Server-side request timeout (milliseconds, or set a custom suffix + like 10s) + in: header + name: Request-Timeout + schema: + default: 2m0s + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: correlator + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: created + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: id + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: reference + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: sequence + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: topic + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: tx + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: type + schema: + type: string + - description: Sort field. For multi-field sort use comma separated values (or + multiple query values) with '-' prefix for descending + in: query + name: sort + schema: + type: string + - description: Ascending sort order (overrides all fields in a multi-field sort) + in: query + name: ascending + schema: + type: string + - description: Descending sort order (overrides all fields in a multi-field + sort) + in: query + name: descending + schema: + type: string + - description: 'The number of records to skip (max: 1,000). Unsuitable for bulk + operations' + in: query + name: skip + schema: + type: string + - description: 'The maximum number of records to return (max: 1,000)' + in: query + name: limit + schema: + example: "25" + type: string + - description: Return a total count as well as items (adds extra database processing) + in: query + name: count + schema: + type: string + responses: + "200": + content: + application/json: + schema: + items: + properties: + correlator: + description: For message events, this is the 'header.cid' field + from the referenced message. For certain other event types, + a secondary object is referenced such as a token pool + format: uuid + type: string + created: + description: The time the event was emitted. Not guaranteed + to be unique, or to increase between events in the same order + as the final sequence events are delivered to your application. + As such, the 'sequence' field should be used instead of the + 'created' field for querying events in the exact order they + are delivered to applications + format: date-time + type: string + id: + description: The UUID assigned to this event by your local FireFly + node + format: uuid + type: string + namespace: + description: The namespace of the event. Your application must + subscribe to events within a namespace + type: string + reference: + description: The UUID of an resource that is the subject of + this event. The event type determines what type of resource + is referenced, and whether this field might be unset + format: uuid + type: string + sequence: + description: A sequence indicating the order in which events + are delivered to your application. Assure to be unique per + event in your local FireFly database (unlike the created timestamp) + format: int64 + type: integer + topic: + description: A stream of information this event relates to. + For message confirmation events, a separate event is emitted + for each topic in the message. For blockchain events, the + listener specifies the topic. Rules exist for how the topic + is set for other event types + type: string + tx: + description: The UUID of a transaction that is event is part + of. Not all events are part of a transaction + format: uuid + type: string + type: + description: All interesting activity in FireFly is emitted + as a FireFly event, of a given type. The 'type' combined with + the 'reference' can be used to determine how to process the + event within your application + enum: + - transaction_submitted + - message_confirmed + - message_rejected + - datatype_confirmed + - identity_confirmed + - identity_updated + - token_pool_confirmed + - token_pool_op_failed + - token_transfer_confirmed + - token_transfer_op_failed + - token_approval_confirmed + - token_approval_op_failed + - contract_interface_confirmed + - contract_api_confirmed + - blockchain_event_received + - blockchain_invoke_op_succeeded + - blockchain_invoke_op_failed + - blockchain_contract_deploy_op_succeeded + - blockchain_contract_deploy_op_failed + type: string + type: object + type: array + description: Success + default: + description: "" + tags: + - Non-Default Namespace /namespaces/{ns}/tokens/accounts: get: description: Gets a list of token accounts @@ -36580,6 +36526,9 @@ paths: description: The time the operation was created format: date-time type: string + detail: + description: Additional detailed information about an operation + provided by the connector error: description: Any error reported back from the plugin for this operation @@ -37515,8 +37464,9 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is - a single event in the batch. Commonly used with Webhooks - to allow events to be delivered and acknowledged in batches. + a single event in the batch, allowing client-side optimizations + when processing the events in a group. Available for both + Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -37797,8 +37747,8 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event - in the batch. Commonly used with Webhooks to allow events - to be delivered and acknowledged in batches. + in the batch, allowing client-side optimizations when processing + the events in a group. Available for both Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -38067,8 +38017,9 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a - single event in the batch. Commonly used with Webhooks to - allow events to be delivered and acknowledged in batches. + single event in the batch, allowing client-side optimizations + when processing the events in a group. Available for both + Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -38345,8 +38296,8 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event - in the batch. Commonly used with Webhooks to allow events - to be delivered and acknowledged in batches. + in the batch, allowing client-side optimizations when processing + the events in a group. Available for both Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -38615,8 +38566,9 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a - single event in the batch. Commonly used with Webhooks to - allow events to be delivered and acknowledged in batches. + single event in the batch, allowing client-side optimizations + when processing the events in a group. Available for both + Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -38948,8 +38900,9 @@ paths: description: Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a - single event in the batch. Commonly used with Webhooks to - allow events to be delivered and acknowledged in batches. + single event in the batch, allowing client-side optimizations + when processing the events in a group. Available for both + Webhooks and WebSockets. type: boolean batchTimeout: description: When batching is enabled, the optional timeout @@ -39120,6 +39073,199 @@ paths: description: "" tags: - Default Namespace + /subscriptions/{subid}/events: + get: + description: Gets a collection of events filtered by the subscription for further + filtering + operationId: getSubscriptionEventsFiltered + parameters: + - description: The subscription ID + in: path + name: subid + required: true + schema: + type: string + - description: The sequence ID in the raw event stream to start indexing through + events from. Leave blank to start indexing from the most recent events + in: query + name: startsequence + schema: + type: string + - description: The sequence ID in the raw event stream to stop indexing through + events at. Leave blank to start indexing from the most recent events + in: query + name: endsequence + schema: + type: string + - description: Server-side request timeout (milliseconds, or set a custom suffix + like 10s) + in: header + name: Request-Timeout + schema: + default: 2m0s + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: correlator + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: created + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: id + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: reference + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: sequence + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: topic + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: tx + schema: + type: string + - description: 'Data filter field. Prefixes supported: > >= < <= @ ^ ! !@ !^' + in: query + name: type + schema: + type: string + - description: Sort field. For multi-field sort use comma separated values (or + multiple query values) with '-' prefix for descending + in: query + name: sort + schema: + type: string + - description: Ascending sort order (overrides all fields in a multi-field sort) + in: query + name: ascending + schema: + type: string + - description: Descending sort order (overrides all fields in a multi-field + sort) + in: query + name: descending + schema: + type: string + - description: 'The number of records to skip (max: 1,000). Unsuitable for bulk + operations' + in: query + name: skip + schema: + type: string + - description: 'The maximum number of records to return (max: 1,000)' + in: query + name: limit + schema: + example: "25" + type: string + - description: Return a total count as well as items (adds extra database processing) + in: query + name: count + schema: + type: string + responses: + "200": + content: + application/json: + schema: + items: + properties: + correlator: + description: For message events, this is the 'header.cid' field + from the referenced message. For certain other event types, + a secondary object is referenced such as a token pool + format: uuid + type: string + created: + description: The time the event was emitted. Not guaranteed + to be unique, or to increase between events in the same order + as the final sequence events are delivered to your application. + As such, the 'sequence' field should be used instead of the + 'created' field for querying events in the exact order they + are delivered to applications + format: date-time + type: string + id: + description: The UUID assigned to this event by your local FireFly + node + format: uuid + type: string + namespace: + description: The namespace of the event. Your application must + subscribe to events within a namespace + type: string + reference: + description: The UUID of an resource that is the subject of + this event. The event type determines what type of resource + is referenced, and whether this field might be unset + format: uuid + type: string + sequence: + description: A sequence indicating the order in which events + are delivered to your application. Assure to be unique per + event in your local FireFly database (unlike the created timestamp) + format: int64 + type: integer + topic: + description: A stream of information this event relates to. + For message confirmation events, a separate event is emitted + for each topic in the message. For blockchain events, the + listener specifies the topic. Rules exist for how the topic + is set for other event types + type: string + tx: + description: The UUID of a transaction that is event is part + of. Not all events are part of a transaction + format: uuid + type: string + type: + description: All interesting activity in FireFly is emitted + as a FireFly event, of a given type. The 'type' combined with + the 'reference' can be used to determine how to process the + event within your application + enum: + - transaction_submitted + - message_confirmed + - message_rejected + - datatype_confirmed + - identity_confirmed + - identity_updated + - token_pool_confirmed + - token_pool_op_failed + - token_transfer_confirmed + - token_transfer_op_failed + - token_approval_confirmed + - token_approval_op_failed + - contract_interface_confirmed + - contract_api_confirmed + - blockchain_event_received + - blockchain_invoke_op_succeeded + - blockchain_invoke_op_failed + - blockchain_contract_deploy_op_succeeded + - blockchain_contract_deploy_op_failed + type: string + type: object + type: array + description: Success + default: + description: "" + tags: + - Default Namespace /tokens/accounts: get: description: Gets a list of token accounts diff --git a/docs/tutorials/chains/images/tezos_explorer.png b/docs/tutorials/chains/images/tezos_explorer.png new file mode 100644 index 000000000..ec418f006 Binary files /dev/null and b/docs/tutorials/chains/images/tezos_explorer.png differ diff --git a/docs/tutorials/chains/images/tezos_faucet.png b/docs/tutorials/chains/images/tezos_faucet.png new file mode 100644 index 000000000..99eed3315 Binary files /dev/null and b/docs/tutorials/chains/images/tezos_faucet.png differ diff --git a/docs/tutorials/chains/tezos_testnet.md b/docs/tutorials/chains/tezos_testnet.md new file mode 100644 index 000000000..02ae39f9c --- /dev/null +++ b/docs/tutorials/chains/tezos_testnet.md @@ -0,0 +1,101 @@ +--- +layout: i18n_page +title: pages.tezos_testnet +parent: pages.chains +grand_parent: pages.tutorials +nav_order: 6 +--- + +# {%t pages.tezos_testnet %} +{: .no_toc } + +1. TOC +{:toc} + +--- + +This guide will walk you through the steps to create a local FireFly development environment and connect it to the public Tezos Ghostnet testnet. + +## Previous steps: Install the FireFly CLI + +If you haven't set up the FireFly CLI already, please go back to the Getting Started guide and read the section on how to [Install the FireFly CLI](../../gettingstarted/firefly_cli.md). + +[← ① Install the FireFly CLI](../../gettingstarted/firefly_cli.md){: .btn .btn-purple .mb-5} + +## Set up the transaction signing service + +[Signatory](https://signatory.io/) service allows to work with many different key-management systems.\ +By default, FF uses [local signing](https://signatory.io/docs/file_based) option.\ +However, it is also possible to configure the transaction signing service using key management systems such as: AWS/Google/Azure KMS, HCP Vault, etc. +> **NOTE**: The default option is not secure and is mainly used for development and demo purposes. Therefore, for the production, use the selected KMS.\ +The full list can be found [here](https://github.com/ecadlabs/signatory#backend-kmshsm-support-status). + +## Creating a new stack + +To create a local FireFly development stack and connect it to the Tezos Ghostnet testnet, we will use command line flags to customize the following settings: + +- Create a new Tezos based stack named `tezos` with `1` member +- Disable `multiparty` mode. We are going to be using this FireFly node as a Web3 gateway, and we don't need to communicate with a consortium here +- See the list of Tezos [public RPC nodes](https://tezostaquito.io/docs/rpc_nodes/) and select an HTTPS RPC node. + +To do this, run the following command: + +``` +ff init tezos dev 1 \ + --multiparty=false \ + --remote-node-url +``` + +> **NOTE**: The public RPC nodes may have limitations or may not support all FF required RPC endpoints. Therefore it's not recommended to use ones for production and you may need to run own node or use third-party vendors. + +## Start the stack + +Now you should be able to start your stack by running: + +``` +ff start dev +``` + +After some time it should print out the following: + +``` +Web UI for member '0': http://127.0.0.1:5000/ui +Sandbox UI for member '0': http://127.0.0.1:5109 + + +To see logs for your stack run: + +ff logs dev +``` + +## Get some XTZ + +At this point you should have a working FireFly stack, talking to a public chain. However, you won't be able to run any transactions just yet, because you don't have any way to pay transaction fee. A testnet faucet can give us some XTZ, the native token for Tezos. + +First, you need to get an account address, which was created during [signer set up](#signatory) step.\ +To check that, you can run: +``` +ff accounts list dev +[ + { + "address": "tz1cuFw1E2Mn2bVS8q8d7QoCb6FXC18JivSp", + "privateKey": "..." + } +] +``` + + +After that, go to [Tezos Ghostnet Faucet](https://faucet.ghostnet.teztnets.xyz/) and paste the address in the form and click the **Request** button. + +![Tezos Faucet](images/tezos_faucet.png) + +### Confirm the transaction on TzStats +You should be able to go lookup your account on [TzStats for the Ghostnet testnet](https://ghost.tzstats.com/) and see that you now have a balance of 100 XTZ (or 2001 XTZ accordingly). Simply paste in your account address to search for it. + +On the **Transfers** tab from you account page you will see the actual transfer of the XTZ from the faucet. + +![TzStats](images/tezos_explorer.png) + +## Use the public testnet + +Now that you have everything set up, you can follow one of the other FireFly guides such as [Custom Smart Contracts](../custom_contracts/tezos.md). For detailed instructions on deploying a custom smart contract to Tezos, please see the [Tezos docs](https://docs.tezos.com/smart-contracts/deploying) for instructions using various tools. \ No newline at end of file diff --git a/docs/tutorials/custom_contracts/images/simple_storage_swagger.png b/docs/tutorials/custom_contracts/images/simple_storage_swagger.png new file mode 100644 index 000000000..1d49237f2 Binary files /dev/null and b/docs/tutorials/custom_contracts/images/simple_storage_swagger.png differ diff --git a/docs/tutorials/custom_contracts/images/tezos_contract_deployment.png b/docs/tutorials/custom_contracts/images/tezos_contract_deployment.png new file mode 100644 index 000000000..5f17421e4 Binary files /dev/null and b/docs/tutorials/custom_contracts/images/tezos_contract_deployment.png differ diff --git a/docs/tutorials/custom_contracts/images/tezos_contract_deployment2.png b/docs/tutorials/custom_contracts/images/tezos_contract_deployment2.png new file mode 100644 index 000000000..8b84d1794 Binary files /dev/null and b/docs/tutorials/custom_contracts/images/tezos_contract_deployment2.png differ diff --git a/docs/tutorials/custom_contracts/pinning.md b/docs/tutorials/custom_contracts/pinning.md index 8628b2662..2f263e553 100644 --- a/docs/tutorials/custom_contracts/pinning.md +++ b/docs/tutorials/custom_contracts/pinning.md @@ -3,7 +3,7 @@ layout: default title: Pinning Data parent: pages.custom_smart_contracts grand_parent: pages.tutorials -nav_order: 3 +nav_order: 4 --- # Pin off-chain data to a custom blockchain transaction diff --git a/docs/tutorials/custom_contracts/tezos.md b/docs/tutorials/custom_contracts/tezos.md new file mode 100644 index 000000000..bef4e0c23 --- /dev/null +++ b/docs/tutorials/custom_contracts/tezos.md @@ -0,0 +1,692 @@ +--- +layout: default +title: Tezos +parent: pages.custom_smart_contracts +grand_parent: pages.tutorials +nav_order: 3 +--- + +# Work with Tezos smart contracts + +{: .no_toc } +This guide describes the steps to deploy a smart contract to a Tezos blockchain and use FireFly to interact with it in order to submit transactions, query for states and listening for events. + +## Table of contents +{: .no_toc .text-delta } + +1. TOC +{:toc} + +--- + +## Smart Contract Languages + +Smart contracts on Tezos can be programmed using familiar, developer-friendly languages. All features available on Tezos can be written in any of the high-level languages used to write smart contracts, such as Archetype, LIGO, and SmartPy. These languages all compile down to [Michelton](https://tezos.gitlab.io/active/michelson.html) and you can switch between languages based on your preferences and projects. + +> **NOTE:** For this tutorial we are going to use [SmartPy](https://smartpy.io/) for building Tezos smart contracts utilizing the broadly adopted Python language. + +## Example smart contract + +First let's look at a simple contract smart contract called `SimpleStorage`, which we will be using on a Tezos blockchain. Here we have one state variable called 'storedValue' and initialized with the value 12. During initialization the type of the variable was defined as 'int'. You can see more at [SmartPy types](https://smartpy.io/manual/syntax/integers-and-mutez). And then we added a simple test, which set the storage value to 15 and checks that the value was changed as expected. + +> **NOTE:** Smart contract's tests (marked with `@sp.add_test` annotation) are used to verify the validity of contract entrypoints and do not affect the state of the contract during deployment. + +Here is the source for this contract: + +```smarty +import smartpy as sp + +@sp.module +def main(): + # Declares a new contract + class SimpleStorage(sp.Contract): + # Storage. Persists in between transactions + def __init__(self, value): + self.data.x = value + + # Allows the stored integer to be changed + @sp.entrypoint + def set(self, params): + self.data.x = params.value + + # Returns the currently stored integer + @sp.onchain_view() + def get(self): + return self.data.x + +@sp.add_test(name="SimpleStorage") +def test(): + # Initialize the contract + c = main.SimpleStorage(12) + + # Create a test scenario and run some test cases + scenario = sp.test_scenario(main) + scenario.h1("SimpleStorage") + scenario += c + c.set(value=15) + scenario.verify(c.data.x == 15) + scenario.verify(scenario.compute(c.get()) == 15) +``` + +## Contract deployment + +To deploy the contract, we will use [SmartPy IDE](https://smartpy.io/ide). +1. Open an IDE; +2. Paste the contract code; +3. Click "Run code" button; +4. Then you will see "Deploy Michelson Contract" button, click on that; +5. Choose the Ghostnet network; +6. Select an account, which you're going to use to deploy the contract; +7. Click "Estimate Cost From RPC" button; +8. Click "Deploy Contract" button; + +![ContractDeployment](images/tezos_contract_deployment.png) +![ContractDeployment2](images/tezos_contract_deployment2.png) + +Here we can see that our new contract address is `KT1ED4gj2xZnp8318yxa5NpvyvW15pqe4yFg`. This is the address that we will reference in the rest of this guide. + +## The FireFly Interface Format + +As we know from the previous section - smart contracts on the Tezos blockchain are using the domain-specific, stack-based programming language called [Michelson](https://tezos.gitlab.io/active/michelson.html). It is a key component of the Tezos platform and plays a fundamental role in defining the behavior of smart contracts and facilitating their execution. +This language is very efficient but also a bit tricky and challenging for learning, so in order to teach FireFly how to interact with the smart contract, we will be using [FireFly Interface (FFI)](../../reference/firefly_interface_format.md) to define the contract inteface which later will be encoded to Michelson. + +### Schema details + +The `details` field is used to encapsulate blockchain specific type information about a specific field. (More details at [schema details](../../reference/firefly_interface_format.md#schema-details)) + +#### Supported Tezos types + +- nat +- integer +- string +- address +- bytes +- boolean +- variant +- list +- struct +- map + +#### Internal type vs Internal schema + +internalType is a field which is used to describe tezos primitive types + +``` json +{ + "details": { + "type": "address", + "internalType": "address" + } +} +``` + +internalSchema in turn is used to describe more complex tezos types as list, struct or variant + +Struct example: + +``` json +{ + "details": { + "type": "schema", + "internalSchema": { + "type": "struct", + "args": [ + { + "name": "metadata", + "type": "bytes" + }, + { + "name": "token_id", + "type": "nat" + } + ] + } + } +} +``` + +List example: + +``` json +{ + "details": { + "type": "schema", + "internalSchema": { + "type": "struct", + "args": [ + { + "name": "metadata", + "type": "bytes" + }, + { + "name": "token_id", + "type": "nat" + } + ] + } + } +} +``` + +Variant example: + +``` json +{ + "details": { + "type": "schema", + "internalSchema": { + "type": "variant", + "variants": [ + "add_operator", + "remove_operator" + ], + "args": [ + { + "type": "struct", + "args": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "operator", + "type": "address" + }, + { + "name": "token_id", + "type": "nat" + } + ] + } + ] + } + } +} +``` + +Map example: + +``` json +{ + "details": { + "type": "schema", + "internalSchema": { + "type": "map", + "args": [ + { + "name": "key", + "type": "integer" + }, + { + "name": "value", + "type": "string" + } + ] + } + } +} +``` + +#### Options + +Option type is used to indicate a value as optional (see more at [smartpy options](https://smartpy.io/manual/syntax/options-and-variants#options)) + +``` json +{ + "details": { + "type": "string", + "internalType": "string", + "kind": "option" + } +} +``` + +### FA2 example + +The following FFI sample demonstrates the specification for the widely used FA2 (analogue of ERC721 for EVM) smart contract: + +```json +{ + "namespace": "default", + "name": "fa2", + "version": "v1.0.0", + "description": "", + "methods": [ + { + "name": "burn", + "pathname": "", + "description": "", + "params": [ + { + "name": "token_ids", + "schema": { + "type": "array", + "details": { + "type": "nat", + "internalType": "nat" + } + } + } + ], + "returns": [] + }, + { + "name": "destroy", + "pathname": "", + "description": "", + "params": [], + "returns": [] + }, + { + "name": "mint", + "pathname": "", + "description": "", + "params": [ + { + "name": "owner", + "schema": { + "type": "string", + "details": { + "type": "address", + "internalType": "address" + } + } + }, + { + "name": "requests", + "schema": { + "type": "array", + "details": { + "type": "schema", + "internalSchema": { + "type": "struct", + "args": [ + { + "name": "metadata", + "type": "bytes" + }, + { + "name": "token_id", + "type": "nat" + } + ] + } + } + } + } + ], + "returns": [] + }, + { + "name": "pause", + "pathname": "", + "description": "", + "params": [ + { + "name": "pause", + "schema": { + "type": "boolean", + "details": { + "type": "boolean", + "internalType": "boolean" + } + } + } + ], + "returns": [] + }, + { + "name": "select", + "pathname": "", + "description": "", + "params": [ + { + "name": "batch", + "schema": { + "type": "array", + "details": { + "type": "schema", + "internalSchema": { + "type": "struct", + "args": [ + { + "name": "token_id", + "type": "nat" + }, + { + "name": "recipient", + "type": "address" + }, + { + "name": "token_id_start", + "type": "nat" + }, + { + "name": "token_id_end", + "type": "nat" + } + ] + } + } + } + } + ], + "returns": [] + }, + { + "name": "transfer", + "pathname": "", + "description": "", + "params": [ + { + "name": "batch", + "schema": { + "type": "array", + "details": { + "type": "schema", + "internalSchema": { + "type": "struct", + "args": [ + { + "name": "from_", + "type": "address" + }, + { + "name": "txs", + "type": "list", + "args": [ + { + "type": "struct", + "args": [ + { + "name": "to_", + "type": "address" + }, + { + "name": "token_id", + "type": "nat" + }, + { + "name": "amount", + "type": "nat" + } + ] + } + ] + } + ] + } + } + } + } + ], + "returns": [] + }, + { + "name": "update_admin", + "pathname": "", + "description": "", + "params": [ + { + "name": "admin", + "schema": { + "type": "string", + "details": { + "type": "address", + "internalType": "address" + } + } + } + ], + "returns": [] + }, + { + "name": "update_operators", + "pathname": "", + "description": "", + "params": [ + { + "name": "requests", + "schema": { + "type": "array", + "details": { + "type": "schema", + "internalSchema": { + "type": "variant", + "variants": [ + "add_operator", + "remove_operator" + ], + "args": [ + { + "type": "struct", + "args": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "operator", + "type": "address" + }, + { + "name": "token_id", + "type": "nat" + } + ] + } + ] + } + } + } + } + ], + "returns": [] + } + ], + "events": [] +} +``` + + +## Broadcast the contract interface + +Now that we have a FireFly Interface representation of our smart contract, we want to broadcast that to the entire network. This broadcast will be pinned to the blockchain, so we can always refer to this specific name and version, and everyone in the network will know exactly which contract interface we are talking about. + +We will use the FFI JSON constructed above and `POST` that to the `/contracts/interfaces` API endpoint. + +### Request + +`POST` `http://localhost:5000/api/v1/namespaces/default/contracts/interfaces` + +```json +{ + "namespace": "default", + "name": "simplestorage", + "version": "v1.0.0", + "description": "", + "methods": [ + { + "name": "set", + "pathname": "", + "description": "", + "params": [ + { + "name": "newValue", + "schema": { + "type": "integer", + "details": { + "type": "integer", + "internalType": "integer" + } + } + } + ], + "returns": [] + }, + { + "name": "get", + "pathname": "", + "description": "", + "params": [], + "returns": [] + } + ], + "events": [] +} +``` + +### Response + +```json +{ + "id": "f9e34787-e634-46cd-af47-b52c537404ff", + "namespace": "default", + "name": "simplestorage", + "description": "", + "version": "v1.0.0", + "methods": [ + { + "id": "78f13a7f-7b85-47c3-bf51-346a9858c027", + "interface": "f9e34787-e634-46cd-af47-b52c537404ff", + "name": "set", + "namespace": "default", + "pathname": "set", + "description": "", + "params": [ + { + "name": "newValue", + "schema": { + "type": "integer", + "details": { + "type": "integer", + "internalType": "integer" + } + } + } + ], + "returns": [] + }, + { + "id": "ee864e25-c3f7-42d3-aefd-a82f753e9002", + "interface": "f9e34787-e634-46cd-af47-b52c537404ff", + "name": "get", + "namespace": "tezos", + "pathname": "get", + "description": "", + "params": [], + "returns": [] + } + ] +} +``` + +> **NOTE**: We can broadcast this contract interface conveniently with the help of FireFly Sandbox running at `http://127.0.0.1:5108` +* Go to the `Contracts Section` +* Click on `Define a Contract Interface` +* Select `FFI - FireFly Interface` in the `Interface Fromat` dropdown +* Copy the `FFI JSON` crafted by you into the `Schema` Field +* Click on `Run` + +## Create an HTTP API for the contract + +Now comes the fun part where we see some of the powerful, developer-friendly features of FireFly. The next thing we're going to do is tell FireFly to build an HTTP API for this smart contract, complete with an OpenAPI Specification and Swagger UI. As part of this, we'll also tell FireFly where the contract is on the blockchain. + +Like the interface broadcast above, this will also generate a broadcast which will be pinned to the blockchain so all the members of the network will be aware of and able to interact with this API. + +We need to copy the `id` field we got in the response from the previous step to the `interface.id` field in the request body below. We will also pick a name that will be part of the URL for our HTTP API, so be sure to pick a name that is URL friendly. In this case we'll call it `simple-storage`. Lastly, in the `location.address` field, we're telling FireFly where an instance of the contract is deployed on-chain. + +> **NOTE**: The `location` field is optional here, but if it is omitted, it will be required in every request to invoke or query the contract. This can be useful if you have multiple instances of the same contract deployed to different addresses. + +### Request + +`POST` `http://localhost:5000/api/v1/namespaces/default/apis` + +```json +{ + "name": "simple-storage", + "interface": { + "id": "f9e34787-e634-46cd-af47-b52c537404ff" + }, + "location": { + "address": "KT1ED4gj2xZnp8318yxa5NpvyvW15pqe4yFg" + } +} +``` + +### Response + +```json +{ + "id": "af09de97-741d-4f61-8d30-4db5e7460f76", + "namespace": "default", + "interface": { + "id": "f9e34787-e634-46cd-af47-b52c537404ff" + }, + "location": { + "address": "KT1ED4gj2xZnp8318yxa5NpvyvW15pqe4yFg" + }, + "name": "simple-storage", + "urls": { + "openapi": "http://127.0.0.1:5000/api/v1/namespaces/default/apis/simple-storage/api/swagger.json", + "ui": "http://127.0.0.1:5000/api/v1/namespaces/default/apis/simple-storage/api" + } +} +``` + +## View OpenAPI spec for the contract + +You'll notice in the response body that there are a couple of URLs near the bottom. If you navigate to the one labeled `ui` in your browser, you should see the Swagger UI for your smart contract. + +![Swagger UI](images/simple_storage_swagger.png "Swagger UI") + +## Invoke the smart contract + +Now that we've got everything set up, it's time to use our smart contract! We're going to make a `POST` request to the `invoke/set` endpoint to set the integer value on-chain. Let's set it to the value of `3` right now. + +### Request + +`POST` `http://localhost:5000/api/v1/namespaces/default/apis/simple-storage/invoke/set` + +```json +{ + "input": { + "newValue": 3 + } +} +``` + +### Response + +```json +{ + "id": "87c7ee1b-33d1-46e2-b3f5-8566c14367cf", + "type": "blockchain_invoke", + "status": "Pending", + "..." +} +``` + +You'll notice that we got an ID back with status `Pending`, and that's expected due to the asynchronous programming model of working with smart contracts in FireFly. To see what the value is now, we can query the smart contract. + +## Query the current value + +To make a read-only request to the blockchain to check the current value of the stored integer, we can make a `POST` to the `query/get` endpoint. + +### Request + +`POST` `http://localhost:5000/api/v1/namespaces/default/apis/simple-storage/query/get` + +```json +{} +``` + +### Response + +```json +{ + "3" +} +``` + +> **NOTE:** Some contracts may have queries that require input parameters. That's why the query endpoint is a `POST`, rather than a `GET` so that parameters can be passed as JSON in the request body. This particular function does not have any parameters, so we just pass an empty JSON object. diff --git a/go.mod b/go.mod index 280d43e10..9772aec3c 100644 --- a/go.mod +++ b/go.mod @@ -1,35 +1,35 @@ module github.com/hyperledger/firefly -go 1.19 +go 1.21 require ( blockwatch.cc/tzgo v1.17.1 - github.com/DATA-DOG/go-sqlmock v1.5.0 - github.com/Masterminds/squirrel v1.5.3 + github.com/DATA-DOG/go-sqlmock v1.5.2 + github.com/Masterminds/squirrel v1.5.4 github.com/aidarkhanov/nanoid v1.0.8 github.com/blang/semver/v4 v4.0.0 github.com/docker/go-units v0.5.0 - github.com/getkin/kin-openapi v0.116.0 + github.com/getkin/kin-openapi v0.122.0 github.com/ghodss/yaml v1.0.0 - github.com/go-resty/resty/v2 v2.7.0 - github.com/golang-migrate/migrate/v4 v4.15.2 - github.com/gorilla/mux v1.8.0 - github.com/gorilla/websocket v1.5.0 - github.com/hyperledger/firefly-common v1.3.1-0.20230912221149-2b028031e84a - github.com/hyperledger/firefly-signer v1.1.8 + github.com/go-resty/resty/v2 v2.11.0 + github.com/golang-migrate/migrate/v4 v4.17.0 + github.com/gorilla/mux v1.8.1 + github.com/gorilla/websocket v1.5.1 + github.com/hyperledger/firefly-common v1.4.5 + github.com/hyperledger/firefly-signer v1.1.12 github.com/jarcoal/httpmock v1.2.0 - github.com/lib/pq v1.10.7 - github.com/mattn/go-sqlite3 v1.14.16 - github.com/prometheus/client_golang v1.14.0 + github.com/lib/pq v1.10.9 + github.com/mattn/go-sqlite3 v1.14.19 + github.com/prometheus/client_golang v1.18.0 github.com/qeesung/image2ascii v1.0.1 - github.com/santhosh-tekuri/jsonschema/v5 v5.1.1 - github.com/sirupsen/logrus v1.9.0 - github.com/spf13/cobra v1.6.1 - github.com/spf13/viper v1.14.0 - github.com/stretchr/testify v1.8.1 + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 + github.com/sirupsen/logrus v1.9.3 + github.com/spf13/cobra v1.8.0 + github.com/spf13/viper v1.18.2 + github.com/stretchr/testify v1.8.4 gitlab.com/hfuss/mux-prometheus v0.0.5 - golang.org/x/net v0.10.0 - golang.org/x/text v0.10.0 + golang.org/x/net v0.20.0 + golang.org/x/text v0.14.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -37,15 +37,14 @@ require ( github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/echa/log v1.2.4 // indirect github.com/fatih/color v1.15.0 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/swag v0.22.3 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-openapi/jsonpointer v0.20.2 // indirect + github.com/go-openapi/swag v0.22.7 // indirect + github.com/google/uuid v1.5.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -58,35 +57,39 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/perimeterx/marshmallow v1.1.4 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect - github.com/rs/cors v1.8.3 // indirect - github.com/spf13/afero v1.9.3 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/rs/cors v1.10.1 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/subosito/gotenv v1.4.1 // indirect + github.com/stretchr/objx v0.5.1 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/wayneashleyberry/terminal-dimensions v1.1.0 // indirect github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect - go.uber.org/atomic v1.10.0 // indirect - golang.org/x/crypto v0.10.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/term v0.9.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/exp v0.0.0-20240110193028-0dcbfd608b1e // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index c5c653a63..5ccd47941 100644 --- a/go.sum +++ b/go.sum @@ -1,2001 +1,299 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= blockwatch.cc/tzgo v1.17.1 h1:00xwa5MS8DAO6ddtTRAw/VdfEdGZHgUadjtOeFDLgjY= blockwatch.cc/tzgo v1.17.1/go.mod h1:tTgPzOH1pMhQod2sh2/jjOLabdCQegb8FZG23+fv1XE= -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.44.3/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.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -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 v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -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/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/spanner v1.28.0/go.mod h1:7m6mtQZn/hMbMfx62ct5EWrGND4DNqkXyrmBPRS+OJo= -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= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= -github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/adal v0.9.16/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -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/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= -github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= -github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= +github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= +github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/aidarkhanov/nanoid v1.0.8 h1:yxyJkgsEDFXP7+97vc6JevMcjyb03Zw+/9fqhlVXBXA= github.com/aidarkhanov/nanoid v1.0.8/go.mod h1:vadfZHT+m4uDhttg0yY4wW3GKtl2T6i4d2Age+45pYk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/arrow v0.0.0-20210818145353-234c94e4ce64/go.mod h1:2qMFB56yOP3KzkB3PbYZ4AlUFg3a88F67TIx5lB/WwY= -github.com/apache/arrow/go/arrow v0.0.0-20211013220434-5962184e7a30/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -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/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v1.8.0/go.mod h1:xEFuWz+3TYdlPRuo+CqATbeDWIWyaT5uAPwPaWtgse0= -github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2/config v1.6.0/go.mod h1:TNtBVmka80lRPk5+S9ZqVfFszOQAGJJ9KbT3EM3CHNU= -github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= -github.com/aws/aws-sdk-go-v2/credentials v1.3.2/go.mod h1:PACKuTJdt6AlXvEq8rFI4eDmoqDFC5DpVKQbWysaDgM= -github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.4.0/go.mod h1:Mj/U8OpDbcVcoctrYwA2bak8k/HFPdcLzI/vaiXMwuM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0/go.mod h1:gqlclDEZp4aqJOancXK6TN24aKhT0W0Ae9MHk3wzTMM= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.4.0/go.mod h1:eHwXu2+uE/T6gpnYWwBwqoeqRf9IXyCcolyOWDRAErQ= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.5.4/go.mod h1:Ex7XQmbFmgFHrjUX6TN3mApKW5Hglyga+F7wZHTtYhA= -github.com/aws/aws-sdk-go-v2/internal/ini v1.2.0/go.mod h1:Q5jATQc+f1MfZp3PDMhn6ry18hGvE0i8yvbXoKbnZaE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4/go.mod h1:ZcBrrI3zBKlhGFNYWvju0I3TR93I7YIgAfy82Fh4lcQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.2.2/go.mod h1:EASdTcM1lGhUe1/p4gkojHwlGJkeoRjjr1sRCzup3Is= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0/go.mod h1:v8ygadNyATSm6elwJ/4gzJwcFhri9RqS8skgHKiwXPU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.2/go.mod h1:NXmNI41bdEsJMrD0v9rUvbGCB5GwdBEpKvUvIY3vTFg= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.5.2/go.mod h1:QuL2Ym8BkrLmN4lUofXYq6000/i5jPjosCNK//t6gak= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.2/go.mod h1:np7TMuJNT83O0oDOSF8i4dF3dvGqA6hPYYo6YYkzgRA= -github.com/aws/aws-sdk-go-v2/service/s3 v1.12.0/go.mod h1:6J++A5xpo7QDsIeSqPK4UHqMSyPOCopa+zKtqAMhqVQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.16.1/go.mod h1:CQe/KvWV1AqRc65KqeJjrLzr5X2ijnFTTVzJW0VBRCI= -github.com/aws/aws-sdk-go-v2/service/sso v1.3.2/go.mod h1:J21I6kF+d/6XHVk7kp/cx9YVD2TMD2TbLwtRGVcinXo= -github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+IkPchKS7p7c2YPKwHmBOk= -github.com/aws/aws-sdk-go-v2/service/sts v1.6.1/go.mod h1:hLZ/AnkIKHLuPGjEiyghNEdvJ2PP0MgOxcmv9EBJ4xs= -github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= -github.com/aws/smithy-go v1.7.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -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/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= -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/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= -github.com/containerd/containerd v1.6.1 h1:oa2uY0/0G+JX4X7hpGCYvkp9FjUancz56kSNnb1sG3o= -github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dhui/dktest v0.3.10 h1:0frpeeoM9pHouHjhLeZDuDTJ0PqjDTrycaHaMmkJAo8= -github.com/dhui/dktest v0.3.10/go.mod h1:h5Enh0nG3Qbo9WjNFRrwmKUaePEBhXMOygbz3Ww7Sz0= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.13+incompatible h1:5s7uxnKZG+b8hYWlPYUi6x1Sjpq2MSt96d15eLZeHyw= -github.com/docker/docker v20.10.13+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/dhui/dktest v0.4.0 h1:z05UmuXZHO/bgj/ds2bGMBu8FI4WA+Ag/m3ghL+om7M= +github.com/dhui/dktest v0.4.0/go.mod h1:v/Dbz1LgCBOi2Uki2nUqLBGa83hWBGFMu5MrgMDCc78= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/echa/bson v0.0.0-20220430141917-c0fbdf7f8b79 h1:J+/tX7s5mN1aoeQi2ySzix7+zyEhnymkudOxn7VMze4= +github.com/echa/bson v0.0.0-20220430141917-c0fbdf7f8b79/go.mod h1:Ih8Pfj34Z/kOmaLua+KtFWFK3AviGsH5siipj6Gmoa8= github.com/echa/log v1.2.4 h1:+3+WEqutIBUbASYnuk9zz6HKlm6o8WsFxlOMbA3BcAA= github.com/echa/log v1.2.4/go.mod h1:KYs5YtFCgL4yHBBqhPmTBhz5ETI1A8q+qbiDPPF1MiM= -github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -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/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -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.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= -github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getkin/kin-openapi v0.116.0 h1:o986hwgMzR972JzOG5j6+WTwWqllZLs1EJKMKCivs2E= -github.com/getkin/kin-openapi v0.116.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +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.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/getkin/kin-openapi v0.122.0 h1:WB9Jbl0Hp/T79/JF9xlSW5Kl9uYdk/AWD0yAd9HOM10= +github.com/getkin/kin-openapi v0.122.0/go.mod h1:PCWw/lfBrJY4HcdqE3jj+QFkaFK8ABoqo7PvqVhXXqw= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/swag v0.22.7 h1:JWrc1uc/P9cSomxfnsFSVWoE1FW6bNbrVPmpQYpCcR8= +github.com/go-openapi/swag v0.22.7/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0= +github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= +github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-migrate/migrate/v4 v4.15.2 h1:vU+M05vs6jWHKDdmE1Ecwj0BznygFc4QsdRe2E/L7kc= -github.com/golang-migrate/migrate/v4 v4.15.2/go.mod h1:f2toGLkYqD3JH+Todi4aZ2ZdbeUNx4sIwiOK96rE9Lw= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/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.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -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/golang-migrate/migrate/v4 v4.17.0 h1:rd40H3QXU0AA4IoLllFcEAEo9dYKRHYND2gB4p7xcaU= +github.com/golang-migrate/migrate/v4 v4.17.0/go.mod h1:+Cp2mtLP4/aXDTKb9wmXYitdrNx2HGs45rbWAo6OsKM= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.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-20201218002935-b9804c9f04c2/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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/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/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.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-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 v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/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/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 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/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hyperledger/firefly-common v1.3.1-0.20230912221149-2b028031e84a h1:8p7OEhIo+nsWkM27zrTF6cQo4nSGbtMfwwgVijwMCag= -github.com/hyperledger/firefly-common v1.3.1-0.20230912221149-2b028031e84a/go.mod h1:17lOH4YufiPy82LpKm8fPa/YXJ0pUyq01zK1CmklJwM= -github.com/hyperledger/firefly-signer v1.1.8 h1:XyJjZXesih2dWYG31m5ZYt4irH7/PdkRutMPld7AqKE= -github.com/hyperledger/firefly-signer v1.1.8/go.mod h1:vNbbROziwqkOmO0b+9ky3devjcFg0JIkR2M1KG7seTQ= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/hyperledger/firefly-common v1.4.5 h1:tvuO2IiET8Jhp/T0yVvL0k3hPnUXe2clEXB3l6fs+BA= +github.com/hyperledger/firefly-common v1.4.5/go.mod h1:jkErZdQmC9fsAJZQO427tURdwB9iiW+NMUZSqS3eBIE= +github.com/hyperledger/firefly-signer v1.1.12 h1:wv1cq4HV60G2MQdmIEkYkywoxUSkaH0ss95Nn3ohdEk= +github.com/hyperledger/firefly-signer v1.1.12/go.mod h1:4MW7bcTqPsS7SKwANJZRL030cJRsHcpB/a+06wUROvc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= -github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= -github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgerrcode v0.0.0-20201024163028-a0d42d470451/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.7/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= -github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= -github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= -github.com/jackc/pgtype v1.6.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= -github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= -github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= -github.com/jackc/pgx/v4 v4.10.1/go.mod h1:QlrWebbs3kqEZPHCTGyxecvzG6tvIsYu+A5b1raylkA= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jarcoal/httpmock v1.2.0 h1:gSvTxxFR/MEMfsGrvRbdfpRUMBStovlSRLw0Ep1bwwc= github.com/jarcoal/httpmock v1.2.0/go.mod h1:oCoTsnAz4+UoOUIf5lJOWV2QQIW5UoeUI6aM2YnWAZk= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.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/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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/karlseguin/ccache v2.0.3+incompatible h1:j68C9tWOROiOLWTS/kCGg9IcJG+ACqn5+0+t8Oh83UU= github.com/karlseguin/ccache v2.0.3+incompatible/go.mod h1:CM9tNPzT6EdRh14+jiW8mEF9mkNZuuE51qmgGYUB93w= github.com/karlseguin/expect v1.0.8 h1:Bb0H6IgBWQpadY25UDNkYPDB9ITqK1xnSoZfAq362fw= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -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.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/karlseguin/expect v1.0.8/go.mod h1:lXdI8iGiQhmzpnnmU/EGA60vqKs8NbRNFnhhrJGoD5g= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/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.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +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.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI= +github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/maxatome/go-testdeep v1.11.0 h1:Tgh5efyCYyJFGUYiT0qxBSIDeXw0F5zSoatlou685kk= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= +github.com/maxatome/go-testdeep v1.11.0/go.mod h1:011SgQ6efzZYAen6fDn4BqQ+lUR72ysdyKe7Dyogw70= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/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 v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7rsPrGmQRjrEaVpiY= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/perimeterx/marshmallow v1.1.4 h1:pZLDH9RjlLGGorbXhcaQLhfuV0pFMNfPO55FuFkxqLw= -github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/qeesung/image2ascii v1.0.1 h1:Fe5zTnX/v/qNC3OC4P/cfASOXS501Xyw2UUcgrLgtp4= github.com/qeesung/image2ascii v1.0.1/go.mod h1:kZKhyX0h2g/YXa/zdJR3JnLnJ8avHjZ3LrvEKSYyAyU= -github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/santhosh-tekuri/jsonschema/v5 v5.1.1 h1:lEOLY2vyGIqKWUI9nzsOJRV3mb3WC9dXYORsLEUcoeY= -github.com/santhosh-tekuri/jsonschema/v5 v5.1.1/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/snowflakedb/gosnowflake v1.6.3/go.mod h1:6hLajn6yxuJ4xUHZegMekpq9rnQbGJ7TMwXjgTmA6lg= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -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 v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +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.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 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.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= -github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= +github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= github.com/stretchr/testify v1.2.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.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/wayneashleyberry/terminal-dimensions v1.1.0 h1:EB7cIzBdsOzAgmhTUtTTQXBByuPheP/Zv1zL2BRPY6g= github.com/wayneashleyberry/terminal-dimensions v1.1.0/go.mod h1:2lc/0eWCObmhRczn2SdGSQtgBooLUzIotkkEGXqghyg= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0 h1:3UeQBvD0TFrlVjOeLOBz+CPAI8dnbqNSVwUwRrkp7vQ= +github.com/wsxiaoys/terminal v0.0.0-20160513160801-0940f3fc43a0/go.mod h1:IXCdmsXIht47RaVFLEdVnh1t+pgYtTAhQGj73kz+2DM= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -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/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= gitlab.com/hfuss/mux-prometheus v0.0.5 h1:Kcqyiekx8W2dO1EHg+6wOL1F0cFNgRO1uCK18V31D0s= gitlab.com/hfuss/mux-prometheus v0.0.5/go.mod h1:xcedy8rVGr9TFgRu2urfGuh99B4NdfYdpE4aUMQ0dxA= -gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -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.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -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/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -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.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -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-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -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/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/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/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.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/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-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190225153610-fe579d43d832/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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/exp v0.0.0-20240110193028-0dcbfd608b1e h1:723BNChdd0c2Wk6WOE320qGBiPtYx0F0Bbm1kriShfE= +golang.org/x/exp v0.0.0-20240110193028-0dcbfd608b1e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +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.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191112182307-2180aed22343/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-20200520004742-59133d7f0dd7/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-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20201202161906-c7110b5ffcbb/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-20201224014010-6772e930b67b/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-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +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/oauth2 v0.0.0-20180227000427-d7d64896b5ff/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/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-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/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -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-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= 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/sys v0.0.0-20180224232135-f6cff0780e54/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/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/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-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/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-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/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-20200217220822-9197077df867/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-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200828194041-157a740278f4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/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-20210324051608-47abb6519492/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-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/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-20210603081109-ebe580a85c40/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-20210616045830-e2b7044e8c71/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-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210818153620-00dd8d7831e7/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-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= -golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= 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.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/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.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/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-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/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-20190624222133-a101b041ded4/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-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/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-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-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-20200505023115-26f46d2f7ef8/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-20200616133436-c1934b75d054/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-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/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-20201224043029-2b0845dc783e/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.0.0-20210108195828-e2f9c7f1fc8e/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/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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= +golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= 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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -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.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.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= -google.golang.org/appengine v1.0.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -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/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -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-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -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-20200117163144-32f20d992d24/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-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -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-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -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-20201019141844-1ed22bb0c154/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-20201110150050-8816d57aaa9a/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-20210108203827-ffc7fda8c3d7/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-20210226172003-ab064af71705/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-20210630183607-d20f26d13c79/go.mod h1:yiaVoXHpRzHGyxV3o4DktVWY4mSUErTKaeEOq6C3t3U= -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/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220111164026-67b88f271998/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e h1:S9GbmC1iCgvbLyAokVCwiO6tVIrU9Y7c5oMx1V/ki/Y= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -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.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -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 v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -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= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/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-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= -gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= gotest.tools/v3 v3.1.0 h1:rVV8Tcg/8jHUkPUorwjaMTtemIMVXfIPKiOqnhEhakk= gotest.tools/v3 v3.1.0/go.mod h1:fHy7eyTmJFO5bQbUsEGQ1v4m2J3Jz9eWL54TP2/ZuYQ= -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= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -modernc.org/b v1.0.0/go.mod h1:uZWcZfRj1BpYzfN9JTerzlNUnnPsV9O2ZA8JsRcubNg= -modernc.org/cc/v3 v3.32.4/go.mod h1:0R6jl1aZlIl2avnYfbfHBS1QB6/f+16mihBObaBC878= -modernc.org/ccgo/v3 v3.9.2/go.mod h1:gnJpy6NIVqkETT+L5zPsQFj7L2kkhfPMzOghRNv/CFo= -modernc.org/db v1.0.0/go.mod h1:kYD/cO29L/29RM0hXYl4i3+Q5VojL31kTUVpVJDw0s8= -modernc.org/file v1.0.0/go.mod h1:uqEokAEn1u6e+J45e54dsEA/pw4o7zLrA2GwyntZzjw= -modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= -modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/internal v1.0.0/go.mod h1:VUD/+JAkhCpvkUitlEOnhpVxCgsBI90oTzSCRcqQVSM= -modernc.org/libc v1.7.13-0.20210308123627-12f642a52bb8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= -modernc.org/libc v1.9.5/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= -modernc.org/lldb v1.0.0/go.mod h1:jcRvJGWfCGodDZz8BPwiKMJxGJngQ/5DrRapkQnLob8= -modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= -modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/ql v1.0.0/go.mod h1:xGVyrLIatPcO2C1JvI/Co8c0sr6y91HKFNy4pt9JXEY= -modernc.org/sortutil v1.1.0/go.mod h1:ZyL98OQHJgH9IEfN71VsamvJgrtRX9Dj2gX+vH86L1k= -modernc.org/sqlite v1.10.6/go.mod h1:Z9FEjUtZP4qFEg6/SiADg9XCER7aYy9a/j7Pg9P7CPs= -modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= -modernc.org/tcl v1.5.2/go.mod h1:pmJYOLgpiys3oI4AeAafkcUfE+TKKilminxNyU/+Zlo= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.0.1-0.20210308123920-1f282aa71362/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= -modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= -modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/go.work b/go.work index 890eaec52..28b0fad5d 100644 --- a/go.work +++ b/go.work @@ -1,7 +1,7 @@ -go 1.18 +go 1.21 use ( . - ./smart_contracts/fabric/firefly-go ./smart_contracts/fabric/custompin-sample + ./smart_contracts/fabric/firefly-go ) diff --git a/go.work.sum b/go.work.sum index 57d2cd81a..fc549394f 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,426 +1,691 @@ -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512 h1:SRsZGA7aFnCZETmov57jwPrWuTmaZK6+4R4v5FUe1/c= +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.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +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 v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0 h1:gSmWO7DY1vOm0MVU6DNXM11BWHHsTUmsC5cv1fuW5X8= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go/aiplatform v1.24.0 h1:QqHZT1IMldf/daXoSnkJWBIqGBsw50X+xP6HSVzLRPo= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/analytics v0.12.0 h1:NKw6PpQi6V1O+KsjuTd+bhip9d0REYu4NevC45vtGp8= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/area120 v0.6.0 h1:TCMhwWEWhCn8d44/Zs7UCICTWje9j3HuV6nVGMjdpYw= +cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= +cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.7.0 h1:9yKYCozdh29v7QMx3QBuksZGtPNICFb5SVnyNvkKRGg= +cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/asset v1.8.0 h1:qzYOcI6u4CD+0R1E8rWbrqs04fISCcg2YYxW8yBAqFM= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/assuredworkloads v1.7.0 h1:IYhjgcgwb5TIAhC0aWQGGOqBnP0c2xijgMGf1iJRs50= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/automl v1.6.0 h1:U+kHmeKGXgBvTlrecPJhwkItWaIpIscG5DUpQxBQZZg= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/bigquery v1.42.0 h1:JuTk8po4bCKRwObdT0zLb1K0BGkGHJdtgs2GK3j2Gws= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/billing v1.5.0 h1:4RESn+mA7eGPBr5eQ4B/hbkHNivzYHbgRWpdlNeNjiE= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/binaryauthorization v1.2.0 h1:5F7dowxGuYQlX3LjfjH/sKf+IvI1TsItTw0sDZmoec4= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/cloudtasks v1.6.0 h1:IL5W4fh6dAq9x1mO+4evrWCISOmPJegdaO0hZRZmWNE= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/containeranalysis v0.6.0 h1:2824iym832ljKdVpCBnpqm5K94YT/uHTVhNF+dRTXPI= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.6.0 h1:xzXGAE2fAuMh+ksODKr9nRv9ega1vHjFwRqMA8tRrVE= +cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/dataflow v0.7.0 h1:CW3541Fm7KPTyZjJdnX6NtaGXYFn5XbFC5UcjgALKvU= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.4.0 h1:fnwkyzCVcPI/TmBheGgpmK2h+hWUIDHcZBincHRhrQ0= +cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/datalabeling v0.6.0 h1:dp8jOF21n/7jwgo/uuA0RN8hvLcKO4q6s/yvwevs2ZM= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataqna v0.6.0 h1:gx9jr41ytcA3dXkbbd409euEaWtofCVXYBvJz3iYm18= +cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= -cloud.google.com/go/datastream v1.3.0 h1:ula4YR2K66o5wifLdPQMtR2I6KP+zvqdSEb6ncd1e0g= +cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/dialogflow v1.17.0 h1:NU0Pj57H++JQOW225/7o34sUZ4i9/TLfWFOSbI3N1cY= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/documentai v1.8.0 h1:CipwaecNhtsWUSneV2J5y8OqudHqvqPlcMHgSyh8vak= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/domains v0.7.0 h1:pu3JIgC1rswIqi5romW0JgNO6CTUydLYX8zyjiAvO1c= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.2.0 h1:hd6J2n5dBBRuAqnNUEsKWrp6XNPKsaxwwIyzOPZTokk= +cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/firestore v1.8.0 h1:HokMB9Io0hAyYzlGFeFVMgE3iaPXNvaIsDx5JzblGLI= -cloud.google.com/go/functions v1.7.0 h1:s3Snbr2O4j4p7CuwImBas8rNNmkHS1YJANcCpKGqQSE= +cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/gaming v1.6.0 h1:PKggmegChZulPW8yvtziF8P9UOuVFwbvylbEucTNups= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gkeconnect v0.6.0 h1:zAcvDa04tTnGdu6TEZewaLN2tdMtUOJJ7fEceULjguA= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.10.0 h1:JTcTaYQRGsVm+qkah7WzHb6e9sf1C0laYdRPn9aN+vg= +cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/grafeas v0.2.0 h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM= -cloud.google.com/go/iam v0.3.0 h1:exkAomrVUuzx9kWFI1wm3KI0uoDeUFPB4kKGzx6x+Gc= +cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/language v1.6.0 h1:Fb2iua/5/UBvUuW9PgBinwsCRDi1qoQJEuekOinHFCs= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/lifesciences v0.6.0 h1:tIqhivE2LMVYkX0BLgG7xL64oNpDaFFI7teunglt1tI= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/mediatranslation v0.6.0 h1:qAJzpxmEX+SeND10Y/4868L5wfZpo4Y3BIEnIieP4dk= +cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.5.0 h1:qTBOiSnVw7rnW6GVeH5Br8qs80ILoflNgFZySvaT4ek= +cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/metastore v1.6.0 h1:wzJ9HslsybiJ3HL2168dVonr9D/eBq0VqObiMSCrE6c= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/networkconnectivity v1.5.0 h1:mtIQewrz1ewMU3J0vVkUIJtAkpOqgkz4+UmcreeAm08= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networksecurity v0.6.0 h1:qDEX/3sipg9dS5JYsAY+YvgTjPR63cozzAWop8oZS94= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.3.0 h1:YfPI4pOYQDcqJ+thM2cGtR9oRoRv42vRfubSPZnk3DI= +cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/osconfig v1.8.0 h1:fkFlXCxkUt3tE8LYtF6CipuPbC/HIrciwDTjFpsTf88= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/oslogin v1.5.0 h1:/7sVaMdtqSm6AjxW8KzoM6UKawkg3REr0XJ1zKtidpc= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/phishingprotection v0.6.0 h1:OrwHLSRSZyaiOt3tnY33dsKSedxbMzsXvqB21okItNQ= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/privatecatalog v0.6.0 h1:Vz86uiHCtNGm1DeC32HeG2VXmOq5JRYA3VRPf8ZEcSg= +cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= -cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0 h1:BkkI7C0o8CtaHvdDMr5IA+y8pk0Y5wb73C7DHQiAKnw= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recommendationengine v0.6.0 h1:6w+WxPf2LmUEqX0YyvfCoYb8aBYOcbIV25Vg6R0FLGw= +cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.6.0 h1:C1tw+Qa/bgm6LoH1wuxYdoyinwKkW/jDJ0GpSJf58cE= +cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/redis v1.8.0 h1:gtPd4pG/Go5mrdGQ4MJXxPHtjxtoWUBkrWLXNV1L2TA= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/retail v1.9.0 h1:Q3W/JsQupZWaoFxUOugZd1Eq590R+Dk6dhacLK2h7+w= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/scheduler v1.5.0 h1:Fe1Upic/q4cwqXbInCzgAW35QSerj8JlNwATIxDdfOI= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/secretmanager v1.6.0 h1:5v0zegRMlytVnN7J+bg5Ipqah3I2RZ67ysy00mvA+lA= -cloud.google.com/go/security v1.8.0 h1:linnRc3/gJYDfKbAtNixVQ52+66DpOx5MmCz0NNxal8= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/securitycenter v1.14.0 h1:hKIggnv2eCAPjsVnFcZbytMOsFOk6p4ut0iAUDoNsNA= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/servicedirectory v1.5.0 h1:QmCWml/qvNOYyiPP4G52srYcsHSLCXuvydJDVLTFSe8= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/spanner v1.28.0 h1:1ZukQlok9wZyZUBFm++xpleudtviOPO8gvGAF2ydxWQ= -cloud.google.com/go/speech v1.7.0 h1:bRI2QczZGpcPfuhHr63VOdfyyfYp/43N0wRuBKrd0nQ= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0 h1:wWRIaDURQA8xxHguFCshYepGlrWIrbBnAmc7wfg07qY= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/talent v1.2.0 h1:6c4pvu3k2idEhJRZnZ2HdVLWZUuT9fsns2gQtCzRtqA= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/videointelligence v1.7.0 h1:w56i2xl1jHX2tz6rHXBPHd6xujevhImzbc16Kl+V/zQ= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= -cloud.google.com/go/vision/v2 v2.3.0 h1:eEyIDJ5/98UmQrYZ6eQExUT3iHyDjzzPX29UP6x7ZQo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/webrisk v1.5.0 h1:WdHJmLSAs5bIis/WWO7pIfiRBD1PiWe1OAlPrWeM9Tk= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/workflows v1.7.0 h1:0MjX5ugKmTdbRG2Vai5aAgNAOe2wzvs/XQwFDSowy9c= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= -gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8 h1:V8krnnfGj4pV65YLUm3C0/8bl7V5Nry2Pwvy3ru/wLc= -github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible h1:KnPIugL51v3N3WwvaSmZbxukD1WuWXOiE9fRdu32f2I= -github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= -github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest/autorest v0.11.18 h1:90Y4srNYrwOtAgVo3ndrQkTYn6kf1Eg/AjTFJ8Is2aM= -github.com/Azure/go-autorest/autorest/adal v0.9.16 h1:P8An8Z9rH1ldbOLdFpxYorgOt2sywL9V24dAwWHPuGc= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= -github.com/ClickHouse/clickhouse-go v1.4.3 h1:iAFMa2UrQdR5bHJ2/yaSLffZkxpcOYQMCUuKeNXGdqc= -github.com/DATA-DOG/go-txdb v0.1.3 h1:R4v6OuOcy2O147e2zHxU0B4NDtF+INb5R9q/CV7AEMg= -github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3 h1:4FA+QBaydEHlwxg0lMN3rhwoDaQy6LKhVWR4qvq4BuA= -github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af h1:wVe6/Ea46ZMeNkQjjBW6xcqyQA/j5e0D6GytH95g0gQ= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= -github.com/alexflint/go-filemutex v1.1.0 h1:IAWuUuRYL2hETx5b8vCgwnD+xSdlsTQY6s2JjBsqLdg= -github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= -github.com/apache/arrow/go/arrow v0.0.0-20211013220434-5962184e7a30 h1:HGREIyk0QRPt70R69Gm1JFHDgoiyYpCyuGE8E9k/nf0= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= -github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= -github.com/aws/aws-sdk-go v1.17.7 h1:/4+rDPe0W95KBmNGYCG+NUvdL8ssPYBMxL+aSCg6nIA= -github.com/aws/aws-sdk-go-v2 v1.9.2 h1:dUFQcMNZMLON4BOe273pl0filK9RqyQMhCK/6xssL6s= -github.com/aws/aws-sdk-go-v2/config v1.8.3 h1:o5583X4qUfuRrOGOgmOcDgvr5gJVSu57NK08cWAhIDk= -github.com/aws/aws-sdk-go-v2/credentials v1.4.3 h1:LTdD5QhK073MpElh9umLLP97wxphkgVC/OjQaEbBwZA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0 h1:9tfxW/icbSu98C2pcNynm5jmDwU3/741F11688B6QnU= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.5.4 h1:TnU1cY51027j/MQeFy7DIgk1UuzJY+wLFYqXceY/fiE= -github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4 h1:leSJ6vCqtPpTmBIgE7044B1wql1E4n//McF+mEgNrYg= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0 h1:gceOysEWNNwLd6cki65IMBZ4WAM0MwgBQq2n7kejoT8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2 h1:r7jel2aa4d9Duys7wEmWqDd5ebpC9w6Kxu6wIjjp18E= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.2 h1:RnZjLgtCGLsF2xYYksy0yrx6xPvKG9BYv29VfK4p/J8= -github.com/aws/aws-sdk-go-v2/service/s3 v1.16.1 h1:z+P3r4LrwdudLKBoEVWxIORrk4sVg4/iqpG3+CS53AY= -github.com/aws/aws-sdk-go-v2/service/sso v1.4.2 h1:pZwkxZbspdqRGzddDB92bkZBoB7lg85sMRE7OqdB3V0= -github.com/aws/aws-sdk-go-v2/service/sts v1.7.2 h1:ol2Y5DWqnJeKqNd8th7JWzBtqu63xpOfs1Is+n1t8/4= -github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= -github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= -github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= -github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= -github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/btcsuite/btcd/btcec/v2 v2.1.3 h1:xM/n3yIhHAhHy04z4i43C8p4ehixJZMsnrVJkgl+MTE= -github.com/btcsuite/btcd/btcutil v1.1.3 h1:xfbtw8lwpp0G6NwSHb+UE67ryTFHJAiNuipusjXSohQ= -github.com/btcsuite/btcutil v1.0.2 h1:9iZ1Terx9fMIOtq1VrwdqfsATL9MC2l8ZrUY6YZ2uts= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/adal v0.9.16/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/arrow v0.0.0-20211013220434-5962184e7a30/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs======== +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/aws/aws-sdk-go v1.34.0/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.49.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2 v1.16.16/go.mod h1:SwiyXi/1zTUZ6KIAmLK5V5ll8SiURNUYOqTerZPaF9k= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.8/go.mod h1:JTnlBSot91steJeti4ryyu/tLd4Sk84O5W22L7O2EQU= +github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= +github.com/aws/aws-sdk-go-v2/credentials v1.12.20/go.mod h1:UKY5HyIux08bbNA7Blv4PcXQ8cTkGh7ghHMFklaviR4= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.5.4/go.mod h1:Ex7XQmbFmgFHrjUX6TN3mApKW5Hglyga+F7wZHTtYhA= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33/go.mod h1:84XgODVR8uRhmOnUkKGUZKqIMxmjmLOR8Uyp7G/TPwc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23/go.mod h1:2DFxAQ9pfIRy0imBCJv+vZ2X6RKxves6fbnEuSry6b4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17/go.mod h1:pRwaTYCJemADaqCbUAxltMoHKata7hmB5PjEXeu0kfg= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.14/go.mod h1:AyGgqiKv9ECM6IZeNQtdT8NnMvUb3/2wokeq2Fgryto= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0/go.mod h1:v8ygadNyATSm6elwJ/4gzJwcFhri9RqS8skgHKiwXPU= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9/go.mod h1:a9j48l6yL5XINLHLcOKInjdvknN+vWqPBxqeIDw7ktw= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.18/go.mod h1:NS55eQ4YixUJPTC+INxi2/jCqe1y2Uw3rnh9wEOVJxY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17/go.mod h1:4nYOrY41Lrbk2170/BGkcJKBhws9Pfn8MG3aGqjjeFI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.2/go.mod h1:np7TMuJNT83O0oDOSF8i4dF3dvGqA6hPYYo6YYkzgRA= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.17/go.mod h1:YqMdV+gEKCQ59NrB7rzrJdALeBIsYiVi8Inj3+KcqHI= +github.com/aws/aws-sdk-go-v2/service/s3 v1.16.1/go.mod h1:CQe/KvWV1AqRc65KqeJjrLzr5X2ijnFTTVzJW0VBRCI= +github.com/aws/aws-sdk-go-v2/service/s3 v1.27.11/go.mod h1:fmgDANqTUCxciViKl9hb/zD5LFbvPINFRgWhDbR+vZo= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.13.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/checkpoint-restore/go-criu/v4 v4.1.0 h1:WW2B2uxx9KWF6bGlHqhm8Okiafwwx7Y2kcpn8lCpjgo= -github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= -github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= -github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= -github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4 h1:hzAQntlaYRkVSFEfj9OTWlVV1H155FMD8BTKktLv0QI= -github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490 h1:KwaoQzs/WeUxxJqiJsZ4euOly1Az/IgZXXSxlD/UBNk= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= -github.com/cockroachdb/cockroach-go/v2 v2.1.1 h1:3XzfSMuUT0wBe1a3o5C0eOTcArhmmFAg2Jzh/7hhKqo= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= -github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= -github.com/containerd/btrfs v1.0.0 h1:osn1exbzdub9L5SouXO5swW4ea/xVdJZ3wokxN5GrnA= -github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4= -github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= -github.com/containerd/continuity v0.2.2 h1:QSqfxcn8c+12slxwu00AtzXrsami0MJb/MQs9lOLHLA= -github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU= -github.com/containerd/go-cni v1.1.3 h1:t0MQwrtM96SH71Md8tH0uKrVE9v+jxkDTbvFSm3B9VE= -github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= -github.com/containerd/imgcrypt v1.1.3 h1:69UKRsA3Q/lAwo2eDzWshdjimqhmprrWXfNtBeO0fBc= -github.com/containerd/nri v0.1.0 h1:6QioHRlThlKh2RkRTR4kIT3PKAcrLo3gIWnjkM4dQmQ= -github.com/containerd/stargz-snapshotter/estargz v0.4.1 h1:5e7heayhB7CcgdTkqfZqrNaNv15gABwr3Q2jBTbLlt4= -github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= -github.com/containerd/zfs v1.0.0 h1:cXLJbx+4Jj7rNsTiqVfm6i+RNLx6FFA2fMmDlEf+Wm8= -github.com/containernetworking/cni v1.0.1 h1:9OIL/sZmMYDBe+G8svzILAlulUpaDTUjeAbtH/JNLBo= -github.com/containernetworking/plugins v1.0.1 h1:wwCfYbTCj5FC0EJgyzyjTXmqysOiJE9r712Z+2KVZAk= -github.com/containers/ocicrypt v1.1.2 h1:Ez+GAMP/4GLix5Ywo/fL7O0nY771gsBIigiqUm1aXz0= -github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= -github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ= -github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= -github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= -github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/cucumber/godog v0.8.0 h1:sJ0MaOGfNeJWD+DiBjL4VTwrUJrFdiq5sF5b4wPgS+o= -github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= -github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 h1:XNT/Zf5l++1Pyg08/HV04ppB0gKxAqtZQBRYiYrUuYk= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c h1:Xo2rK1pzOm0jO6abTPIQwbAmqBIOj132otexc1mmzFc= -github.com/d2g/dhcp4client v1.0.0 h1:suYBsYZIkSlUMEz4TAYCczKf62IA2UWC+O8+KtdOhCo= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5 h1:+CpLbZIeUn94m02LdEKPcgErLJ347NUwxPKs5u8ieiY= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4 h1:itqmmf1PFpC4n5JW+j4BU7X4MTfVurhYRTjODoPb2Y8= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/denisenkom/go-mssqldb v0.10.0 h1:QykgLZBorFE95+gO3u9esLd0BmbvpWp0/waNNZfHBM8= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= -github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017 h1:2HQmlpI3yI9deH18Q6xiSOIjXD4sLI55Y/gfpa8/558= -github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= -github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 h1:aaQcKT9WumO6JEJcRyTqFVq4XUZiUcKR2/GI31TOcz8= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= -github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 h1:xvqufLtNVwAhN8NMyWklVgxnWohi+wtMGQMhtxexlm0= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220520190051-1e77728a1eaa/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM= +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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw= +github.com/cucumber/godog v0.12.6/go.mod h1:Y02TTpimPXDb70PnG6M3zpODXm1+bjCsuZzcW76xAww= +github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= +github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +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/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/goat-systems/go-tezos/v4 v4.0.4 h1:5AYxk1uVc0BKGqMCerAf+yzuATa2b2ZkzH4GIwxaeBM= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.6.13/go.mod h1:qEySVqXrEugbHKvmhI8ZqtQi75/RHSSRNpffvB4I6Bw= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= +github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= +github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +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.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.3.1/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.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +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/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/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-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/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +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/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= -github.com/hashicorp/mdns v1.0.0 h1:WhIgCr5a7AaVH6jPUwjtRuuE7/RDufnUvzIr48smyxs= -github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= -github.com/hashicorp/serf v0.9.8 h1:JGklO/2Drf1QGa312EieQN3zhxQ+aJg6pG+aC3MFaVo= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hyperledger/firefly-common v1.2.8 h1:tPHgjGzQnPRXl77qHQd+dieu6N62NFEWhoGW7sn9u6U= -github.com/hyperledger/firefly-common v1.2.8/go.mod h1:q6uawjzWAFekIMFb0t9EWpJQQvjvl2CFBikk6++8Woc= -github.com/hyperledger/firefly-common v1.2.17 h1:l1fVt7zk+ysJWVN2SWr1kVrV2a/3cIh1yajpGRPf9iw= -github.com/hyperledger/firefly-common v1.2.17/go.mod h1:17lOH4YufiPy82LpKm8fPa/YXJ0pUyq01zK1CmklJwM= -github.com/hyperledger/firefly-common v1.2.19 h1:o5eZKVTFEl+o9uVxCTPdaSGxZ0VtzKtgEW0UcQXmELs= -github.com/hyperledger/firefly-common v1.2.19/go.mod h1:17lOH4YufiPy82LpKm8fPa/YXJ0pUyq01zK1CmklJwM= -github.com/hyperledger/firefly-signer v1.1.8 h1:XyJjZXesih2dWYG31m5ZYt4irH7/PdkRutMPld7AqKE= -github.com/hyperledger/firefly-signer v1.1.8/go.mod h1:vNbbROziwqkOmO0b+9ky3devjcFg0JIkR2M1KG7seTQ= -github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/intel/goresctrl v0.2.0 h1:JyZjdMQu9Kl/wLXe9xA6s1X+tF6BWsQPFGJMEeCfWzE= -github.com/j-keck/arping v1.0.2 h1:hlLhuXgQkzIJTZuhMigvG/CuSkaspeaD9hRDk2zuiMI= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/pgconn v1.8.0 h1:FmjZ0rOyXTr1wfWs45i4a9vjnjWUAGpMuQLD9OSs+lw= -github.com/jackc/pgerrcode v0.0.0-20201024163028-a0d42d470451 h1:WAvSpGf7MsFuzAtK4Vk7R4EVe+liW4x83r4oWu0WHKw= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= -github.com/jackc/pgproto3/v2 v2.0.7 h1:6Pwi1b3QdY65cuv6SyVO0FgPd5J3Bl7wf/nQQjinHMA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= -github.com/jackc/pgtype v1.6.2 h1:b3pDeuhbbzBYcg5kwNmNDun4pFUD/0AAr1kLXZLeNt8= -github.com/jackc/pgx/v4 v4.10.1 h1:/6Q3ye4myIj6AaplUm+eRcz4OhK9HAvFf4ePsG40LJY= -github.com/jackc/puddle v1.1.3 h1:JnPg/5Q9xVJGfjsO5CPUOjnJps1JaRUm8I9FXVCFK94= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmoiron/sqlx v1.3.1 h1:aLN7YINNZ7cYOPK3QC83dbM6KT0NMqVMw961TqrejlE= -github.com/joefitzgerald/rainbow-reporter v0.1.0 h1:AuMG652zjdzI0YCCnXAqATtRBpGXMcAnrajcaTrSeuo= -github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= -github.com/k0kubun/pp v2.3.0+incompatible h1:EKhKbi34VQDWJtq+zpsKSEhkHHs9w2P8Izbq8IhLVSo= -github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= -github.com/karrick/godirwalk v1.10.12 h1:BqUm+LuJcXjGv1d2mj3gBiQyrQ57a0rYoAmhvJQ7RDU= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= -github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2 h1:g+4J5sZg6osfvEfkRZxJ1em0VT95/UOZgi/l7zi1/oE= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.3/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v1.14.0/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= +github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.18.1/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE= +github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/microsoft/go-mssqldb v1.0.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/mutecomm/go-sqlcipher/v4 v4.4.0/go.mod h1:PyN04SaWalavxRGH9E8ZftG6Ju7rsPrGmQRjrEaVpiY= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= +github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= +github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.16/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +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/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/valyala/fastjson v1.5.4 h1:r8gpiVwdzDU09NrlN38OyL5dUFpdwGQR5RQEBqY+hLg= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= -github.com/zenazn/goji v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ= -gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b h1:7gd+rd8P3bqcn/96gOZa3F5dpJr/vEiDQYlNb/y2uNs= -go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= -go.etcd.io/etcd/api/v3 v3.5.5 h1:BX4JIbQ7hl7+jL+g+2j5UAr0o1bctCm6/Ct+ArBGkf0= -go.etcd.io/etcd/client/pkg/v3 v3.5.5 h1:9S0JUVvmrVl7wCF39iTQthdaaNIiAaQbmK75ogO6GU8= -go.etcd.io/etcd/client/v2 v2.305.5 h1:DktRP60//JJpnPC0VBymAN/7V71GHMdjDCBt4ZPXDjI= -go.etcd.io/etcd/client/v3 v3.5.5 h1:q++2WTJbUgpQu4B6hCuT7VkdwaTP7Qz6Daak3WzbrlI= -go.etcd.io/etcd/pkg/v3 v3.5.0 h1:ntrg6vvKRW26JRmHTE0iNlDgYK6JX3hg/4cD62X0ixk= -go.etcd.io/etcd/raft/v3 v3.5.0 h1:kw2TmO3yFTgE+F0mdKkG7xMxkit2duBDa2Hu6D/HMlw= -go.etcd.io/etcd/server/v3 v3.5.0 h1:jk8D/lwGEDlQU9kZXUFMSANkE22Sg5+mW27ip8xcF9E= -go.mongodb.org/mongo-driver v1.7.0 h1:hHrvOBWlWB2c7+8Gh/Xi5jj82AgidK/t7KVXBZ+IyUA= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 h1:Ky1MObd188aGbgb5OgNnwGuEEwI9MVIcc7rBW6zk5Ak= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 h1:Q3C9yzW6I9jqEc8sawxzxZmY48fs9u220KXq6d5s3XU= -go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= -go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0 h1:giGm8w67Ja7amYNfYMdme7xSp2pIxThWopw8+QP51Yk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0 h1:VQbUHoJqytHHSJ1OZodPH9tvZZSVzUHjPHpkO85sT6k= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0 h1:Ydage/P0fRrSPpZeCVxzjqGcI6iVmG2xb43+IR8cjqM= -go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8= -go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw= -go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0 h1:c5VRjxCXdQlx1HjzwGdQHzZaVI82b5EbBgOu2ljD92g= -go.opentelemetry.io/otel/sdk/metric v0.20.0 h1:7ao1wpzHRVKf0OQ7GIxiQJA6X7DLX9o14gmVon7mMK8= -go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= -go.opentelemetry.io/proto/otlp v0.11.0 h1:cLDgIBTf4lLOlztkhzAEdQsJ4Lj+i5Wc9k6Nn0K1VyU= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= -golang.org/x/image v0.0.0-20210216034530-4410531fe030 h1:lP9pYkih3DUSC641giIXa2XqfTIbbbRr0w2EOTA7wHA= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= -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= +github.com/rqlite/gorqlite v0.0.0-20230708021416-2acd02b70b79/go.mod h1:xF/KoXmrRyahPfo5L7Szb5cAAUl53dMWBh9cMruGEZg= +github.com/sagikazarmark/crypt v0.17.0/go.mod h1:SMtHTvdmsZMuY/bpZoqokSoChIrcJ/epOxZN58PbZDg= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/snowflakedb/gosnowflake v1.6.3/go.mod h1:6hLajn6yxuJ4xUHZegMekpq9rnQbGJ7TMwXjgTmA6lg= +github.com/snowflakedb/gosnowflake v1.6.19/go.mod h1:FM1+PWUdwB9udFDsXdfD58NONC0m+MlOSmQRvimobSM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= +go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= +go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= +go.etcd.io/etcd/client/v2 v2.305.5/go.mod h1:zQjKllfqfBVyVStbt4FaosoX2iYd8fV/GRy/PbowgP4= +go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= +go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= +go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= +go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +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/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +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-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-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-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/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-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220907135653-1e95f45603a7/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +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-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +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-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/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +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-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-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-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/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-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-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-20210816183151-1e6c022a8912/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-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -428,29 +693,53 @@ golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/sys v0.0.0-20220908150016-7ac13a9a928d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= -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= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +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.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +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.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.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.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= @@ -462,10 +751,55 @@ google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3 google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= +google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= +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.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +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-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +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-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +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/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -474,6 +808,7 @@ google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= @@ -487,13 +822,100 @@ google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljW google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac h1:ZL/Teoy/ZGnzyrqK/Optxxp2pmVh+fmJ97slxSRyzUg= +google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f/go.mod h1:iIgEblxoG4klcXsG0d9cpoxJ4xndv6+1FkDROCHhPRI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= +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.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.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 v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.22.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.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/bson.v2 v2.0.0-20171018101713-d8c8987b8862/go.mod h1:VN8wuk/3Ksp8lVZ82HHf/MI1FHOBDt5bPK9VZ8DvymM= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/b v1.0.0/go.mod h1:uZWcZfRj1BpYzfN9JTerzlNUnnPsV9O2ZA8JsRcubNg= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/db v1.0.0/go.mod h1:kYD/cO29L/29RM0hXYl4i3+Q5VojL31kTUVpVJDw0s8= +modernc.org/file v1.0.0/go.mod h1:uqEokAEn1u6e+J45e54dsEA/pw4o7zLrA2GwyntZzjw= +modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/internal v1.0.0/go.mod h1:VUD/+JAkhCpvkUitlEOnhpVxCgsBI90oTzSCRcqQVSM= +modernc.org/libc v1.16.7/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/lldb v1.0.0/go.mod h1:jcRvJGWfCGodDZz8BPwiKMJxGJngQ/5DrRapkQnLob8= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/ql v1.0.0/go.mod h1:xGVyrLIatPcO2C1JvI/Co8c0sr6y91HKFNy4pt9JXEY= +modernc.org/sortutil v1.1.0/go.mod h1:ZyL98OQHJgH9IEfN71VsamvJgrtRX9Dj2gX+vH86L1k= +modernc.org/sqlite v1.18.0/go.mod h1:B9fRWZacNxJBHoCJZQr1R54zhVn3fjfl0aszflrTSxY= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/zappy v1.0.0/go.mod h1:hHe+oGahLVII/aTTyWK/b53VDHMAGCBYYeZ9sn83HC4= diff --git a/internal/apiserver/ffi2swagger.go b/internal/apiserver/ffi2swagger.go index 15b6dea8b..c6f63d1c2 100644 --- a/internal/apiserver/ffi2swagger.go +++ b/internal/apiserver/ffi2swagger.go @@ -90,11 +90,9 @@ func addFFIMethod(ctx context.Context, routes []*ffapi.Route, method *fftypes.FF Path: fmt.Sprintf("invoke/%s", method.Pathname), // must match a route defined in apiserver routes! Method: http.MethodPost, JSONInputSchema: func(ctx context.Context, schemaGen ffapi.SchemaGenerator) (*openapi3.SchemaRef, error) { - return contractJSONSchema(ctx, &method.Params, hasLocation) - }, - JSONOutputSchema: func(ctx context.Context, schemaGen ffapi.SchemaGenerator) (*openapi3.SchemaRef, error) { - return contractJSONSchema(ctx, &method.Returns, true) + return contractRequestJSONSchema(ctx, &method.Params, hasLocation) }, + JSONOutputValue: func() interface{} { return &core.OperationWithDetail{} }, JSONOutputCodes: []int{http.StatusOK}, PreTranslatedDescription: description, }) @@ -103,10 +101,10 @@ func addFFIMethod(ctx context.Context, routes []*ffapi.Route, method *fftypes.FF Path: fmt.Sprintf("query/%s", method.Pathname), // must match a route defined in apiserver routes! Method: http.MethodPost, JSONInputSchema: func(ctx context.Context, schemaGen ffapi.SchemaGenerator) (*openapi3.SchemaRef, error) { - return contractJSONSchema(ctx, &method.Params, hasLocation) + return contractRequestJSONSchema(ctx, &method.Params, hasLocation) }, JSONOutputSchema: func(ctx context.Context, schemaGen ffapi.SchemaGenerator) (*openapi3.SchemaRef, error) { - return contractJSONSchema(ctx, &method.Returns, true) + return contractQueryResponseJSONSchema(ctx, &method.Returns) }, JSONOutputCodes: []int{http.StatusOK}, PreTranslatedDescription: description, @@ -146,10 +144,10 @@ func addFFIEvent(ctx context.Context, routes []*ffapi.Route, event *fftypes.FFIE } /** - * Parse the FFI and build a corresponding JSON Schema to describe the request body for "invoke". - * Returns the JSON Schema as an `fftypes.JSONObject`. + * Parse the FFI and build a corresponding JSON Schema to describe the request body for "invoke" or "query" requests + * Returns the JSON Schema as an `fftypes.JSONObject` */ -func contractJSONSchema(ctx context.Context, params *fftypes.FFIParams, hasLocation bool) (*openapi3.SchemaRef, error) { +func contractRequestJSONSchema(ctx context.Context, params *fftypes.FFIParams, hasLocation bool) (*openapi3.SchemaRef, error) { paramSchema := make(fftypes.JSONObject, len(*params)) for _, param := range *params { paramSchema[param.Name] = param.Schema @@ -193,6 +191,40 @@ func contractJSONSchema(ctx context.Context, params *fftypes.FFIParams, hasLocat return openapi3.NewSchemaRef("", s), nil } +/** + * Parse the FFI and build a corresponding JSON Schema to describe the response body for "query" requests + * Returns the JSON Schema as an `fftypes.JSONObject` + */ +func contractQueryResponseJSONSchema(ctx context.Context, params *fftypes.FFIParams) (*openapi3.SchemaRef, error) { + paramSchema := make(fftypes.JSONObject, len(*params)) + for i, param := range *params { + paramName := param.Name + if paramName == "" { + if i > 0 { + paramName = fmt.Sprintf("output%v", i) + } else { + paramName = "output" + } + } + paramSchema[paramName] = param.Schema + } + outputSchema := fftypes.JSONObject{ + "type": "object", + "description": i18n.Expand(ctx, coremsgs.ContractCallRequestOutput), + "properties": paramSchema, + } + b, err := json.Marshal(outputSchema) + if err != nil { + return nil, err + } + s := openapi3.NewSchema() + err = s.UnmarshalJSON(b) + if err != nil { + return nil, err + } + return openapi3.NewSchemaRef("", s), nil +} + func buildDetailsTable(ctx context.Context, details map[string]interface{}) string { keyHeader := i18n.Expand(ctx, coremsgs.APISmartContractDetailsKey) valueHeader := i18n.Expand(ctx, coremsgs.APISmartContractDetailsKey) diff --git a/internal/apiserver/ffi2swagger_test.go b/internal/apiserver/ffi2swagger_test.go index 3323e515b..aae513061 100644 --- a/internal/apiserver/ffi2swagger_test.go +++ b/internal/apiserver/ffi2swagger_test.go @@ -98,9 +98,9 @@ func testFFI() *fftypes.FFI { } } -func pathNames(p openapi3.Paths) []string { +func pathNames(p *openapi3.Paths) []string { var keys []string - for k := range p { + for k := range p.Map() { keys = append(keys, k) } return keys @@ -126,25 +126,25 @@ func TestGenerate(t *testing.T) { assert.ElementsMatch(t, []string{"/interface", "/invoke/method1", "/invoke/method2", "/query/method1", "/query/method2", "/listeners/event1"}, pathNames(doc.Paths)) - invokeMethod1 := doc.Paths["/invoke/method1"].Post.RequestBody.Value.Content.Get("application/json").Schema.Value + invokeMethod1 := doc.Paths.Value("/invoke/method1").Post.RequestBody.Value.Content.Get("application/json").Schema.Value assert.Equal(t, "object", invokeMethod1.Type) assert.ElementsMatch(t, []string{"input", "location", "options", "key", "idempotencyKey"}, paramNames(invokeMethod1.Properties)) assert.Equal(t, "object", invokeMethod1.Properties["input"].Value.Type) assert.ElementsMatch(t, []string{"x", "y", "z"}, paramNames(invokeMethod1.Properties["input"].Value.Properties)) - invokeMethod2 := doc.Paths["/invoke/method2"].Post.RequestBody.Value.Content.Get("application/json").Schema.Value + invokeMethod2 := doc.Paths.Value("/invoke/method2").Post.RequestBody.Value.Content.Get("application/json").Schema.Value assert.Equal(t, "object", invokeMethod2.Type) assert.ElementsMatch(t, []string{"input", "location", "options", "key", "idempotencyKey"}, paramNames(invokeMethod2.Properties)) assert.Equal(t, "object", invokeMethod2.Properties["input"].Value.Type) assert.ElementsMatch(t, []string{}, paramNames(invokeMethod2.Properties["input"].Value.Properties)) - queryMethod1 := doc.Paths["/query/method1"].Post.RequestBody.Value.Content.Get("application/json").Schema.Value + queryMethod1 := doc.Paths.Value("/query/method1").Post.RequestBody.Value.Content.Get("application/json").Schema.Value assert.Equal(t, "object", queryMethod1.Type) assert.ElementsMatch(t, []string{"input", "location", "options", "key", "idempotencyKey"}, paramNames(queryMethod1.Properties)) assert.Equal(t, "object", queryMethod1.Properties["input"].Value.Type) assert.ElementsMatch(t, []string{"x", "y", "z"}, paramNames(queryMethod1.Properties["input"].Value.Properties)) - queryMethod2 := doc.Paths["/query/method2"].Post.RequestBody.Value.Content.Get("application/json").Schema.Value + queryMethod2 := doc.Paths.Value("/query/method2").Post.RequestBody.Value.Content.Get("application/json").Schema.Value assert.Equal(t, "object", queryMethod2.Type) assert.ElementsMatch(t, []string{"input", "location", "options", "key", "idempotencyKey"}, paramNames(queryMethod2.Properties)) assert.Equal(t, "object", queryMethod2.Properties["input"].Value.Type) @@ -163,25 +163,25 @@ func TestGenerateWithLocation(t *testing.T) { assert.ElementsMatch(t, []string{"/interface", "/invoke/method1", "/invoke/method2", "/query/method1", "/query/method2", "/listeners/event1"}, pathNames(doc.Paths)) - invokeMethod1 := doc.Paths["/invoke/method1"].Post.RequestBody.Value.Content.Get("application/json").Schema.Value + invokeMethod1 := doc.Paths.Value("/invoke/method1").Post.RequestBody.Value.Content.Get("application/json").Schema.Value assert.Equal(t, "object", invokeMethod1.Type) assert.ElementsMatch(t, []string{"input", "options", "key", "idempotencyKey"}, paramNames(invokeMethod1.Properties)) assert.Equal(t, "object", invokeMethod1.Properties["input"].Value.Type) assert.ElementsMatch(t, []string{"x", "y", "z"}, paramNames(invokeMethod1.Properties["input"].Value.Properties)) - invokeMethod2 := doc.Paths["/invoke/method2"].Post.RequestBody.Value.Content.Get("application/json").Schema.Value + invokeMethod2 := doc.Paths.Value("/invoke/method2").Post.RequestBody.Value.Content.Get("application/json").Schema.Value assert.Equal(t, "object", invokeMethod2.Type) assert.ElementsMatch(t, []string{"input", "options", "key", "idempotencyKey"}, paramNames(invokeMethod2.Properties)) assert.Equal(t, "object", invokeMethod2.Properties["input"].Value.Type) assert.ElementsMatch(t, []string{}, paramNames(invokeMethod2.Properties["input"].Value.Properties)) - queryMethod1 := doc.Paths["/query/method1"].Post.RequestBody.Value.Content.Get("application/json").Schema.Value + queryMethod1 := doc.Paths.Value("/query/method1").Post.RequestBody.Value.Content.Get("application/json").Schema.Value assert.Equal(t, "object", queryMethod1.Type) assert.ElementsMatch(t, []string{"input", "options", "key", "idempotencyKey"}, paramNames(queryMethod1.Properties)) assert.Equal(t, "object", queryMethod1.Properties["input"].Value.Type) assert.ElementsMatch(t, []string{"x", "y", "z"}, paramNames(queryMethod1.Properties["input"].Value.Properties)) - queryMethod2 := doc.Paths["/query/method2"].Post.RequestBody.Value.Content.Get("application/json").Schema.Value + queryMethod2 := doc.Paths.Value("/query/method2").Post.RequestBody.Value.Content.Get("application/json").Schema.Value assert.Equal(t, "object", queryMethod2.Type) assert.ElementsMatch(t, []string{"input", "options", "key", "idempotencyKey"}, paramNames(queryMethod2.Properties)) assert.Equal(t, "object", queryMethod2.Properties["input"].Value.Type) @@ -196,7 +196,7 @@ func TestFFIParamBadSchema(t *testing.T) { Schema: fftypes.JSONAnyPtr(`{`), }, } - _, err := contractJSONSchema(ctx, params, true) + _, err := contractRequestJSONSchema(ctx, params, true) assert.Error(t, err) params = &fftypes.FFIParams{ @@ -205,6 +205,56 @@ func TestFFIParamBadSchema(t *testing.T) { Schema: fftypes.JSONAnyPtr(`{"type": false}`), }, } - _, err = contractJSONSchema(ctx, params, true) + _, err = contractRequestJSONSchema(ctx, params, true) + assert.Error(t, err) +} + +func TestUnnamedOutputs(t *testing.T) { + ctx := context.Background() + params := &fftypes.FFIParams{ + { + Name: "", + Schema: fftypes.JSONAnyPtr(`{}`), + }, + { + Name: "", + Schema: fftypes.JSONAnyPtr(`{}`), + }, + } + + expectedJSON := `{ + "description": "A map of named outputs", + "properties": { + "output": {}, + "output1": {} + }, + "type": "object" + }` + + ref, err := contractQueryResponseJSONSchema(ctx, params) + assert.NoError(t, err) + b, err := ref.MarshalJSON() + assert.JSONEq(t, expectedJSON, string(b)) +} + +func TestBadSchema(t *testing.T) { + ctx := context.Background() + params := &fftypes.FFIParams{ + { + Name: "", + Schema: fftypes.JSONAnyPtr(`{`), + }, + } + _, err := contractQueryResponseJSONSchema(ctx, params) + assert.Error(t, err) + + ctx = context.Background() + params = &fftypes.FFIParams{ + { + Name: "", + Schema: fftypes.JSONAnyPtr(`{"type": false}`), + }, + } + _, err = contractQueryResponseJSONSchema(ctx, params) assert.Error(t, err) } diff --git a/internal/apiserver/route_get_op_by_id.go b/internal/apiserver/route_get_op_by_id.go index 4c61d7930..46a6408af 100644 --- a/internal/apiserver/route_get_op_by_id.go +++ b/internal/apiserver/route_get_op_by_id.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2023 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -37,7 +37,7 @@ var getOpByID = &ffapi.Route{ }, Description: coremsgs.APIEndpointsGetOpByID, JSONInputValue: nil, - JSONOutputValue: func() interface{} { return &core.Operation{} }, + JSONOutputValue: func() interface{} { return &core.OperationWithDetail{} }, JSONOutputCodes: []int{http.StatusOK}, Extensions: &coreExtensions{ CoreJSONHandler: func(r *ffapi.APIRequest, cr *coreRequest) (output interface{}, err error) { diff --git a/internal/apiserver/route_get_subscription_events_filtered.go b/internal/apiserver/route_get_subscription_events_filtered.go new file mode 100644 index 000000000..d09a4d584 --- /dev/null +++ b/internal/apiserver/route_get_subscription_events_filtered.go @@ -0,0 +1,74 @@ +// Copyright © 2024 Kaleido, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package apiserver + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/hyperledger/firefly-common/pkg/ffapi" + "github.com/hyperledger/firefly-common/pkg/i18n" + "github.com/hyperledger/firefly/internal/coremsgs" + "github.com/hyperledger/firefly/pkg/core" + "github.com/hyperledger/firefly/pkg/database" +) + +var getSubscriptionEventsFiltered = &ffapi.Route{ + Name: "getSubscriptionEventsFiltered", + Path: "subscriptions/{subid}/events", + Method: http.MethodGet, + PathParams: []*ffapi.PathParam{ + {Name: "subid", Description: coremsgs.APIParamsSubscriptionID}, + }, + QueryParams: []*ffapi.QueryParam{ + {Name: "startsequence", IsBool: false, Description: coremsgs.APISubscriptionStartSequenceID}, + {Name: "endsequence", IsBool: false, Description: coremsgs.APISubscriptionEndSequenceID}, + }, + FilterFactory: database.EventQueryFactory, + Description: coremsgs.APIEndpointsGetSubscriptionEventsFiltered, + JSONInputValue: nil, + JSONOutputValue: func() interface{} { return []*core.Event{} }, + JSONOutputCodes: []int{http.StatusOK}, + Extensions: &coreExtensions{ + CoreJSONHandler: func(r *ffapi.APIRequest, cr *coreRequest) (output interface{}, err error) { + subscription, _ := cr.or.GetSubscriptionByID(cr.ctx, r.PP["subid"]) + var startSeq int + var endSeq int + + if r.QP["startsequence"] != "" { + startSeq, err = strconv.Atoi(r.QP["startsequence"]) + if err != nil { + return nil, i18n.NewError(cr.ctx, coremsgs.MsgSequenceIDDidNotParseToInt, fmt.Sprintf("startsequence: %s", r.QP["startsequence"])) + } + } else { + startSeq = -1 + } + + if r.QP["endsequence"] != "" { + endSeq, err = strconv.Atoi(r.QP["endsequence"]) + if err != nil { + return nil, i18n.NewError(cr.ctx, coremsgs.MsgSequenceIDDidNotParseToInt, fmt.Sprintf("endsequence: %s", r.QP["endsequence"])) + } + } else { + endSeq = -1 + } + + return r.FilterResult(cr.or.GetSubscriptionEventsHistorical(cr.ctx, subscription, r.Filter, startSeq, endSeq)) + }, + }, +} diff --git a/internal/apiserver/route_get_subscription_events_filtered_test.go b/internal/apiserver/route_get_subscription_events_filtered_test.go new file mode 100644 index 000000000..fd480294d --- /dev/null +++ b/internal/apiserver/route_get_subscription_events_filtered_test.go @@ -0,0 +1,85 @@ +// Copyright © 2024 Kaleido, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package apiserver + +import ( + "net/http/httptest" + "testing" + + "github.com/hyperledger/firefly/pkg/core" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestGetSubscriptionEventsFiltered(t *testing.T) { + o, r := newTestAPIServer() + o.On("Authorize", mock.Anything, mock.Anything).Return(nil) + req := httptest.NewRequest("GET", "/api/v1/namespaces/mynamespace/subscriptions/abcd12345/events?startsequence=100&endsequence=200", nil) + req.Header.Set("Content-Type", "application/json; charset=utf-8") + res := httptest.NewRecorder() + + o.On("GetSubscriptionByID", mock.Anything, "abcd12345"). + Return(&core.Subscription{}, nil) + o.On("GetSubscriptionEventsHistorical", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return([]*core.EnrichedEvent{}, nil, nil) + + r.ServeHTTP(res, req) + assert.Equal(t, 200, res.Result().StatusCode) +} + +func TestGetSubscriptionEventsFilteredStartSequenceIDDoesNotParse(t *testing.T) { + o, r := newTestAPIServer() + o.On("Authorize", mock.Anything, mock.Anything).Return(nil) + req := httptest.NewRequest("GET", "/api/v1/namespaces/mynamespace/subscriptions/abcd12345/events?startsequence=helloworld", nil) + req.Header.Set("Content-Type", "application/json; charset=utf-8") + res := httptest.NewRecorder() + o.On("GetSubscriptionByID", mock.Anything, "abcd12345"). + Return(&core.Subscription{}, nil) + + r.ServeHTTP(res, req) + assert.Equal(t, 400, res.Result().StatusCode) + assert.Contains(t, res.Body.String(), "helloworld") +} + +func TestGetSubscriptionEventsFilteredEndSequenceIDDoesNotParse(t *testing.T) { + o, r := newTestAPIServer() + o.On("Authorize", mock.Anything, mock.Anything).Return(nil) + req := httptest.NewRequest("GET", "/api/v1/namespaces/mynamespace/subscriptions/abcd12345/events?endsequence=helloworld", nil) + req.Header.Set("Content-Type", "application/json; charset=utf-8") + res := httptest.NewRecorder() + o.On("GetSubscriptionByID", mock.Anything, "abcd12345"). + Return(&core.Subscription{}, nil) + + r.ServeHTTP(res, req) + assert.Equal(t, 400, res.Result().StatusCode) + assert.Contains(t, res.Body.String(), "helloworld") +} + +func TestGetSubscriptionEventsFilteredNoSequenceIDsProvided(t *testing.T) { + o, r := newTestAPIServer() + o.On("Authorize", mock.Anything, mock.Anything).Return(nil) + req := httptest.NewRequest("GET", "/api/v1/namespaces/mynamespace/subscriptions/abcd12345/events", nil) + req.Header.Set("Content-Type", "application/json; charset=utf-8") + res := httptest.NewRecorder() + o.On("GetSubscriptionByID", mock.Anything, "abcd12345"). + Return(&core.Subscription{}, nil) + o.On("GetSubscriptionEventsHistorical", mock.Anything, mock.Anything, mock.Anything, -1, -1). + Return([]*core.EnrichedEvent{}, nil, nil) + + r.ServeHTTP(res, req) + assert.Equal(t, 200, res.Result().StatusCode) +} \ No newline at end of file diff --git a/internal/apiserver/routes.go b/internal/apiserver/routes.go index 58e6e6166..28c960589 100644 --- a/internal/apiserver/routes.go +++ b/internal/apiserver/routes.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -110,6 +110,7 @@ var routes = append( getStatusBatchManager, getSubscriptionByID, getSubscriptions, + getSubscriptionEventsFiltered, getTokenAccountPools, getTokenAccounts, getTokenApprovals, diff --git a/internal/apiserver/server.go b/internal/apiserver/server.go index 5dff12d6b..fb61b64b8 100644 --- a/internal/apiserver/server.go +++ b/internal/apiserver/server.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -23,8 +23,6 @@ import ( "strings" "time" - "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/gorilla/mux" "github.com/hyperledger/firefly-common/pkg/config" "github.com/hyperledger/firefly-common/pkg/ffapi" @@ -40,6 +38,7 @@ import ( "github.com/hyperledger/firefly/internal/metrics" "github.com/hyperledger/firefly/internal/namespace" "github.com/hyperledger/firefly/internal/orchestrator" + "github.com/prometheus/client_golang/prometheus/promhttp" ) var ( @@ -385,6 +384,9 @@ func (as *apiServer) createMuxRouter(ctx context.Context, mgr namespace.Manager) ws.(*websockets.WebSockets).SetAuthorizer(mgr) r.HandleFunc(`/ws`, ws.(*websockets.WebSockets).ServeHTTP) + // namespace scoped web sockets + r.HandleFunc("/api/v1/namespaces/{ns}/ws", hf.APIWrapper(getNamespacedWebSocketHandler(ws.(*websockets.WebSockets), mgr))) + uiPath := config.GetString(coreconfig.UIPath) if uiPath != "" && config.GetBool(coreconfig.UIEnabled) { r.PathPrefix(`/ui`).Handler(newStaticHandler(uiPath, "index.html", `/ui`)) @@ -394,6 +396,23 @@ func (as *apiServer) createMuxRouter(ctx context.Context, mgr namespace.Manager) return r } +func getNamespacedWebSocketHandler(ws websockets.WebSocketsNamespaced, mgr namespace.Manager) ffapi.HandlerFunction { + return func(res http.ResponseWriter, req *http.Request) (status int, err error) { + + vars := mux.Vars(req) + namespace := vars["ns"] + or, err := mgr.Orchestrator(req.Context(), namespace, false) + if err != nil || or == nil { + return 404, i18n.NewError(req.Context(), coremsgs.Msg404NotFound) + } + + ws.ServeHTTPNamespaced(namespace, res, req) + + return 200, nil + } + +} + func (as *apiServer) notFoundHandler(res http.ResponseWriter, req *http.Request) (status int, err error) { res.Header().Add("Content-Type", "application/json") return 404, i18n.NewError(req.Context(), coremsgs.Msg404NotFound) diff --git a/internal/apiserver/server_test.go b/internal/apiserver/server_test.go index 8a5ce5ae7..8d61e03c0 100644 --- a/internal/apiserver/server_test.go +++ b/internal/apiserver/server_test.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "io" "mime/multipart" @@ -43,6 +44,7 @@ import ( "github.com/hyperledger/firefly/mocks/namespacemocks" "github.com/hyperledger/firefly/mocks/orchestratormocks" "github.com/hyperledger/firefly/mocks/spieventsmocks" + "github.com/hyperledger/firefly/mocks/websocketsmocks" "github.com/hyperledger/firefly/pkg/core" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -513,3 +515,37 @@ func TestGetOrchestratorMissingTag(t *testing.T) { _, err := getOrchestrator(context.Background(), &namespacemocks.Manager{}, "", nil) assert.Regexp(t, "FF10437", err) } + +func TestGetNamespacedWebSocketHandler(t *testing.T) { + mgr, _, _ := newTestServer() + mwsns := &websocketsmocks.WebSocketsNamespaced{} + mwsns.On("ServeHTTPNamespaced", "ns1", mock.Anything, mock.Anything).Return() + + var b bytes.Buffer + req := httptest.NewRequest("GET", "/api/v1/namespaces/ns1/ws", &b) + req = mux.SetURLVars(req, map[string]string{"ns": "ns1"}) + req.Header.Set("Content-Type", "application/json; charset=utf-8") + res := httptest.NewRecorder() + + handler := getNamespacedWebSocketHandler(mwsns, mgr) + status, err := handler(res, req) + assert.NoError(t, err) + assert.Equal(t, 200, status) +} + +func TestGetNamespacedWebSocketHandlerUnknownNamespace(t *testing.T) { + mgr, _, _ := newTestServer() + mwsns := &websocketsmocks.WebSocketsNamespaced{} + + mgr.On("Orchestrator", mock.Anything, "unknown", false).Return(nil, errors.New("unknown namespace")).Maybe() + var b bytes.Buffer + req := httptest.NewRequest("GET", "/api/v1/namespaces/unknown/ws", &b) + req = mux.SetURLVars(req, map[string]string{"ns": "unknown"}) + req.Header.Set("Content-Type", "application/json; charset=utf-8") + res := httptest.NewRecorder() + + handler := getNamespacedWebSocketHandler(mwsns, mgr) + status, err := handler(res, req) + assert.Error(t, err) + assert.Equal(t, 404, status) +} diff --git a/internal/blockchain/common/common.go b/internal/blockchain/common/common.go index 88232cc8f..d15e0b8c4 100644 --- a/internal/blockchain/common/common.go +++ b/internal/blockchain/common/common.go @@ -101,6 +101,8 @@ type BlockchainReceiptNotification struct { type BlockchainRESTError struct { Error string `json:"error,omitempty"` + // See https://github.com/hyperledger/firefly-transaction-manager/blob/main/pkg/ffcapi/submission_error.go + SubmissionRejected bool `json:"submissionRejected,omitempty"` } type conflictError struct { diff --git a/internal/blockchain/ethereum/ethereum.go b/internal/blockchain/ethereum/ethereum.go index 1216ba4e7..37f232273 100644 --- a/internal/blockchain/ethereum/ethereum.go +++ b/internal/blockchain/ethereum/ethereum.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -607,14 +607,14 @@ func (e *Ethereum) applyOptions(ctx context.Context, body, options map[string]in return body, nil } -func (e *Ethereum) invokeContractMethod(ctx context.Context, address, signingKey string, abi *abi.Entry, requestID string, input []interface{}, errors []*abi.Entry, options map[string]interface{}) error { +func (e *Ethereum) invokeContractMethod(ctx context.Context, address, signingKey string, abi *abi.Entry, requestID string, input []interface{}, errors []*abi.Entry, options map[string]interface{}) (submissionRejected bool, err error) { if e.metrics.IsMetricsEnabled() { e.metrics.BlockchainTransaction(address, abi.Name) } messageType := "SendTransaction" body, err := e.buildEthconnectRequestBody(ctx, messageType, address, signingKey, abi, requestID, input, errors, options) if err != nil { - return err + return true, err } var resErr common.BlockchainRESTError res, err := e.client.R(). @@ -623,9 +623,9 @@ func (e *Ethereum) invokeContractMethod(ctx context.Context, address, signingKey SetError(&resErr). Post("/") if err != nil || !res.IsSuccess() { - return common.WrapRESTError(ctx, &resErr, res, err, coremsgs.MsgEthConnectorRESTErr) + return resErr.SubmissionRejected, common.WrapRESTError(ctx, &resErr, res, err, coremsgs.MsgEthConnectorRESTErr) } - return nil + return false, nil } func (e *Ethereum) queryContractMethod(ctx context.Context, address, signingKey string, abi *abi.Entry, input []interface{}, errors []*abi.Entry, options map[string]interface{}) (*resty.Response, error) { @@ -697,7 +697,8 @@ func (e *Ethereum) SubmitBatchPin(ctx context.Context, nsOpID, networkNamespace, method, input := e.buildBatchPinInput(ctx, version, networkNamespace, batch) var emptyErrors []*abi.Entry - return e.invokeContractMethod(ctx, ethLocation.Address, signingKey, method, nsOpID, input, emptyErrors, nil) + _, err = e.invokeContractMethod(ctx, ethLocation.Address, signingKey, method, nsOpID, input, emptyErrors, nil) + return err } func (e *Ethereum) SubmitNetworkAction(ctx context.Context, nsOpID string, signingKey string, action core.NetworkActionType, location *fftypes.JSONAny) error { @@ -731,10 +732,11 @@ func (e *Ethereum) SubmitNetworkAction(ctx context.Context, nsOpID string, signi } } var emptyErrors []*abi.Entry - return e.invokeContractMethod(ctx, ethLocation.Address, signingKey, method, nsOpID, input, emptyErrors, nil) + _, err = e.invokeContractMethod(ctx, ethLocation.Address, signingKey, method, nsOpID, input, emptyErrors, nil) + return err } -func (e *Ethereum) DeployContract(ctx context.Context, nsOpID, signingKey string, definition, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) error { +func (e *Ethereum) DeployContract(ctx context.Context, nsOpID, signingKey string, definition, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) (submissionRejected bool, err error) { if e.metrics.IsMetricsEnabled() { e.metrics.BlockchainContractDeployment() } @@ -752,9 +754,9 @@ func (e *Ethereum) DeployContract(ctx context.Context, nsOpID, signingKey string if signingKey != "" { body["from"] = signingKey } - body, err := e.applyOptions(ctx, body, options) + body, err = e.applyOptions(ctx, body, options) if err != nil { - return err + return true, err } var resErr common.BlockchainRESTError @@ -767,11 +769,11 @@ func (e *Ethereum) DeployContract(ctx context.Context, nsOpID, signingKey string if strings.Contains(string(res.Body()), "FFEC100130") { // This error is returned by ethconnect because it does not support deploying contracts with this syntax // Return a more helpful and clear error message - return i18n.NewError(ctx, coremsgs.MsgNotSupportedByBlockchainPlugin) + return true, i18n.NewError(ctx, coremsgs.MsgNotSupportedByBlockchainPlugin) } - return common.WrapRESTError(ctx, &resErr, res, err, coremsgs.MsgEthConnectorRESTErr) + return resErr.SubmissionRejected, common.WrapRESTError(ctx, &resErr, res, err, coremsgs.MsgEthConnectorRESTErr) } - return nil + return false, nil } // Check if a method supports passing extra data via conformance to ERC5750. @@ -796,14 +798,14 @@ func (e *Ethereum) ValidateInvokeRequest(ctx context.Context, parsedMethod inter return err } -func (e *Ethereum) InvokeContract(ctx context.Context, nsOpID string, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *blockchain.BatchPin) error { +func (e *Ethereum) InvokeContract(ctx context.Context, nsOpID string, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *blockchain.BatchPin) (bool, error) { ethereumLocation, err := e.parseContractLocation(ctx, location) if err != nil { - return err + return true, err } methodInfo, orderedInput, err := e.prepareRequest(ctx, parsedMethod, input) if err != nil { - return err + return true, err } if batch != nil { err := e.checkDataSupport(ctx, methodInfo.methodABI) @@ -815,7 +817,7 @@ func (e *Ethereum) InvokeContract(ctx context.Context, nsOpID string, signingKey } } if err != nil { - return err + return true, err } } return e.invokeContractMethod(ctx, ethereumLocation.Address, signingKey, methodInfo.methodABI, nsOpID, orderedInput, methodInfo.errorsABI, options) @@ -1027,7 +1029,7 @@ func (e *Ethereum) GenerateFFI(ctx context.Context, generationRequest *fftypes.F if err != nil { return nil, i18n.WrapError(ctx, err, coremsgs.MsgFFIGenerationFailed, "unable to deserialize JSON as ABI") } - if len(*input.ABI) == 0 { + if input.ABI == nil || len(*input.ABI) == 0 { return nil, i18n.NewError(ctx, coremsgs.MsgFFIGenerationFailed, "ABI is empty") } return ffi2abi.ConvertABIToFFI(ctx, generationRequest.Namespace, generationRequest.Name, generationRequest.Version, generationRequest.Description, input.ABI) diff --git a/internal/blockchain/ethereum/ethereum_test.go b/internal/blockchain/ethereum/ethereum_test.go index becab4cf9..194e92c0f 100644 --- a/internal/blockchain/ethereum/ethereum_test.go +++ b/internal/blockchain/ethereum/ethereum_test.go @@ -2652,7 +2652,7 @@ func TestDeployContractOK(t *testing.T) { assert.Equal(t, body["customOption"].(string), "customValue") return httpmock.NewJsonResponderOrPanic(200, "")(req) }) - err = e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) + _, err = e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) assert.NoError(t, err) } @@ -2674,10 +2674,36 @@ func TestDeployContractFFEC100130(t *testing.T) { assert.NoError(t, err) httpmock.RegisterResponder("POST", `http://localhost:12345/`, func(req *http.Request) (*http.Response, error) { - return httpmock.NewJsonResponderOrPanic(500, `{"error":"FFEC100130: failure"}`)(req) + return httpmock.NewJsonResponderOrPanic(500, fftypes.JSONAnyPtr(`{"error":"FFEC100130: failure"}`))(req) }) - err = e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) + submissionRejected, err := e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) assert.Regexp(t, "FF10429", err) + assert.True(t, submissionRejected) +} + +func TestDeployContractRevert(t *testing.T) { + e, cancel := newTestEthereum() + defer cancel() + httpmock.ActivateNonDefault(e.client.GetClient()) + defer httpmock.DeactivateAndReset() + signingKey := ethHexFormatB32(fftypes.NewRandB32()) + input := []interface{}{ + float64(1), + "1000000000000000000000000", + } + options := map[string]interface{}{ + "customOption": "customValue", + } + definitionBytes, err := json.Marshal([]interface{}{}) + contractBytes, err := json.Marshal("0x123456") + assert.NoError(t, err) + httpmock.RegisterResponder("POST", `http://localhost:12345/`, + func(req *http.Request) (*http.Response, error) { + return httpmock.NewJsonResponderOrPanic(500, fftypes.JSONAnyPtr(`{"error":"FF23021: EVM reverted", "submissionRejected": true}`))(req) + }) + submissionRejected, err := e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) + assert.Regexp(t, "FF10111.*FF23021", err) + assert.True(t, submissionRejected) } func TestDeployContractInvalidOption(t *testing.T) { @@ -2708,8 +2734,9 @@ func TestDeployContractInvalidOption(t *testing.T) { assert.Equal(t, body["customOption"].(string), "customValue") return httpmock.NewJsonResponderOrPanic(400, "pop")(req) }) - err = e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) + submissionRejected, err := e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) assert.Regexp(t, "FF10398", err) + assert.True(t, submissionRejected) } func TestDeployContractError(t *testing.T) { @@ -2740,8 +2767,9 @@ func TestDeployContractError(t *testing.T) { assert.Equal(t, body["customOption"].(string), "customValue") return httpmock.NewJsonResponderOrPanic(400, "pop")(req) }) - err = e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) + submissionRejected, err := e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) assert.Regexp(t, "FF10111", err) + assert.False(t, submissionRejected) } func TestInvokeContractOK(t *testing.T) { @@ -2779,7 +2807,7 @@ func TestInvokeContractOK(t *testing.T) { }) parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.NoError(t, err) } @@ -2820,7 +2848,7 @@ func TestInvokeContractWithBatchOK(t *testing.T) { parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, nil, nil, batch) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, nil, nil, batch) assert.NoError(t, err) } @@ -2838,8 +2866,9 @@ func TestInvokeContractWithBatchUnsupported(t *testing.T) { batch := &blockchain.BatchPin{} parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, nil, nil, batch) + submissionRejected, err := e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, nil, nil, batch) assert.Regexp(t, "FF10443", err) + assert.True(t, submissionRejected) } func TestInvokeContractInvalidOption(t *testing.T) { @@ -2875,8 +2904,9 @@ func TestInvokeContractInvalidOption(t *testing.T) { }) parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + submissionRejected, err := e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF10398", err) + assert.True(t, submissionRejected) } func TestInvokeContractInvalidInput(t *testing.T) { @@ -2913,7 +2943,7 @@ func TestInvokeContractInvalidInput(t *testing.T) { }) parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "unsupported type", err) } @@ -2933,8 +2963,9 @@ func TestInvokeContractAddressNotSet(t *testing.T) { assert.NoError(t, err) parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + submissionRejected, err := e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "'address' not set", err) + assert.True(t, submissionRejected) } func TestInvokeContractEthconnectError(t *testing.T) { @@ -2961,8 +2992,38 @@ func TestInvokeContractEthconnectError(t *testing.T) { }) parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + submissionRejected, err := e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + assert.Regexp(t, "FF10111", err) + assert.False(t, submissionRejected) +} + +func TestInvokeContractEVMConnectRejectErr(t *testing.T) { + e, cancel := newTestEthereum() + defer cancel() + httpmock.ActivateNonDefault(e.client.GetClient()) + defer httpmock.DeactivateAndReset() + signingKey := ethHexFormatB32(fftypes.NewRandB32()) + location := &Location{ + Address: "0x12345", + } + method := testFFIMethod() + errors := testFFIErrors() + params := map[string]interface{}{ + "x": float64(1), + "y": float64(2), + } + options := map[string]interface{}{} + locationBytes, err := json.Marshal(location) + assert.NoError(t, err) + httpmock.RegisterResponder("POST", `http://localhost:12345/`, + func(req *http.Request) (*http.Response, error) { + return httpmock.NewJsonResponderOrPanic(400, fftypes.JSONAnyPtr(`{"error":"FF23021: EVM reverted", "submissionRejected": true}`))(req) + }) + parsedMethod, err := e.ParseInterface(context.Background(), method, errors) + assert.NoError(t, err) + submissionRejected, err := e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF10111", err) + assert.True(t, submissionRejected) } func TestInvokeContractPrepareFail(t *testing.T) { @@ -2981,8 +3042,9 @@ func TestInvokeContractPrepareFail(t *testing.T) { options := map[string]interface{}{} locationBytes, err := json.Marshal(location) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), "wrong", params, options, nil) + submissionRejected, err := e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), "wrong", params, options, nil) assert.Regexp(t, "FF10457", err) + assert.True(t, submissionRejected) } func TestParseInterfaceFailFFIMethod(t *testing.T) { diff --git a/internal/blockchain/fabric/fabric.go b/internal/blockchain/fabric/fabric.go index 75624c0f5..03b3fca8e 100644 --- a/internal/blockchain/fabric/fabric.go +++ b/internal/blockchain/fabric/fabric.go @@ -598,10 +598,10 @@ func (f *Fabric) ResolveSigningKey(ctx context.Context, signingKeyInput string, return signingKeyInput, nil } -func (f *Fabric) invokeContractMethod(ctx context.Context, channel, chaincode, methodName, signingKey, requestID string, prefixItems []*PrefixItem, input map[string]interface{}, options map[string]interface{}) error { +func (f *Fabric) invokeContractMethod(ctx context.Context, channel, chaincode, methodName, signingKey, requestID string, prefixItems []*PrefixItem, input map[string]interface{}, options map[string]interface{}) (submissionRejected bool, err error) { body, err := f.buildFabconnectRequestBody(ctx, channel, chaincode, methodName, signingKey, requestID, prefixItems, input, options) if err != nil { - return err + return true, err } var resErr common.BlockchainRESTError res, err := f.client.R(). @@ -611,9 +611,9 @@ func (f *Fabric) invokeContractMethod(ctx context.Context, channel, chaincode, m SetError(&resErr). Post("/transactions") if err != nil || !res.IsSuccess() { - return common.WrapRESTError(ctx, &resErr, res, err, coremsgs.MsgFabconnectRESTErr) + return resErr.SubmissionRejected, common.WrapRESTError(ctx, &resErr, res, err, coremsgs.MsgFabconnectRESTErr) } - return nil + return false, nil } func (f *Fabric) queryContractMethod(ctx context.Context, channel, chaincode, methodName, signingKey, requestID string, prefixItems []*PrefixItem, input map[string]interface{}, options map[string]interface{}) (*resty.Response, error) { @@ -696,7 +696,8 @@ func (f *Fabric) SubmitBatchPin(ctx context.Context, nsOpID, networkNamespace, s prefixItems, pinInput := f.buildBatchPinInput(ctx, version, networkNamespace, batch) input, _ := jsonEncodeInput(pinInput) - return f.invokeContractMethod(ctx, fabricOnChainLocation.Channel, fabricOnChainLocation.Chaincode, batchPinMethodName, signingKey, nsOpID, prefixItems, input, nil) + _, err = f.invokeContractMethod(ctx, fabricOnChainLocation.Channel, fabricOnChainLocation.Chaincode, batchPinMethodName, signingKey, nsOpID, prefixItems, input, nil) + return err } func (f *Fabric) SubmitNetworkAction(ctx context.Context, nsOpID string, signingKey string, action core.NetworkActionType, location *fftypes.JSONAny) error { @@ -734,7 +735,8 @@ func (f *Fabric) SubmitNetworkAction(ctx context.Context, nsOpID string, signing } input, _ := jsonEncodeInput(pinInput) - return f.invokeContractMethod(ctx, fabricOnChainLocation.Channel, fabricOnChainLocation.Chaincode, methodName, signingKey, nsOpID, prefixItems, input, nil) + _, err = f.invokeContractMethod(ctx, fabricOnChainLocation.Channel, fabricOnChainLocation.Chaincode, methodName, signingKey, nsOpID, prefixItems, input, nil) + return err } func (f *Fabric) buildFabconnectRequestBody(ctx context.Context, channel, chaincode, methodName, signingKey, requestID string, prefixItems []*PrefixItem, input map[string]interface{}, options map[string]interface{}) (map[string]interface{}, error) { @@ -768,8 +770,8 @@ func (f *Fabric) buildFabconnectRequestBody(ctx context.Context, channel, chainc return body, nil } -func (f *Fabric) DeployContract(ctx context.Context, nsOpID, signingKey string, definition, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) error { - return i18n.NewError(ctx, coremsgs.MsgNotSupportedByBlockchainPlugin) +func (f *Fabric) DeployContract(ctx context.Context, nsOpID, signingKey string, definition, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) (submissionRejected bool, err error) { + return true, i18n.NewError(ctx, coremsgs.MsgNotSupportedByBlockchainPlugin) } func (f *Fabric) ValidateInvokeRequest(ctx context.Context, parsedMethod interface{}, input map[string]interface{}, hasMessage bool) error { @@ -778,16 +780,16 @@ func (f *Fabric) ValidateInvokeRequest(ctx context.Context, parsedMethod interfa return err } -func (f *Fabric) InvokeContract(ctx context.Context, nsOpID string, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *blockchain.BatchPin) error { +func (f *Fabric) InvokeContract(ctx context.Context, nsOpID string, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *blockchain.BatchPin) (bool, error) { method, _, err := f.recoverFFI(ctx, parsedMethod) if err != nil { - return err + return true, err } fabricOnChainLocation, err := parseContractLocation(ctx, location) if err != nil { - return err + return true, err } // Build the payload schema for the method parameters @@ -795,7 +797,7 @@ func (f *Fabric) InvokeContract(ctx context.Context, nsOpID string, signingKey s for i, param := range method.Params { var paramSchema ffiParamSchema if err := json.Unmarshal(param.Schema.Bytes(), ¶mSchema); err != nil { - return i18n.WrapError(ctx, err, i18n.MsgJSONObjectParseFailed, fmt.Sprintf("%s.schema", param.Name)) + return true, i18n.WrapError(ctx, err, i18n.MsgJSONObjectParseFailed, fmt.Sprintf("%s.schema", param.Name)) } prefixItems[i] = &PrefixItem{ diff --git a/internal/blockchain/fabric/fabric_test.go b/internal/blockchain/fabric/fabric_test.go index 822d8e8b3..b661a2995 100644 --- a/internal/blockchain/fabric/fabric_test.go +++ b/internal/blockchain/fabric/fabric_test.go @@ -2402,7 +2402,7 @@ func TestInvokeContractOK(t *testing.T) { var errors []*fftypes.FFIError parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.NoError(t, err) } @@ -2442,7 +2442,7 @@ func TestInvokeContractWithBatchOK(t *testing.T) { parsedMethod, err := e.ParseInterface(context.Background(), method, nil) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, nil, nil, batch) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, nil, nil, batch) assert.NoError(t, err) } @@ -2474,7 +2474,7 @@ func TestDeployContractOK(t *testing.T) { assert.Equal(t, body["customOption"].(string), "customValue") return httpmock.NewJsonResponderOrPanic(400, "pop")(req) }) - err = e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) + _, err = e.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) assert.Regexp(t, "FF10429", err) } @@ -2509,7 +2509,7 @@ func TestInvokeContractBadSchema(t *testing.T) { var errors []*fftypes.FFIError parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF00127", err) } @@ -2534,7 +2534,7 @@ func TestInvokeContractInvalidOption(t *testing.T) { var errors []*fftypes.FFIError parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF10398", err) } @@ -2554,7 +2554,7 @@ func TestInvokeContractChaincodeNotSet(t *testing.T) { var errors []*fftypes.FFIError parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF10310", err) } @@ -2583,7 +2583,7 @@ func TestInvokeContractFabconnectError(t *testing.T) { var errors []*fftypes.FFIError parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF10284", err) } @@ -2795,7 +2795,7 @@ func TestInvokeJSONEncodeParamsError(t *testing.T) { var errors []*fftypes.FFIError parsedMethod, err := e.ParseInterface(context.Background(), method, errors) assert.NoError(t, err) - err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = e.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF00127", err) } @@ -3326,7 +3326,7 @@ func TestInvokeContractBadFFI(t *testing.T) { e, cancel := newTestFabric() defer cancel() - err := e.InvokeContract(context.Background(), "", "", nil, nil, nil, nil, nil) + _, err := e.InvokeContract(context.Background(), "", "", nil, nil, nil, nil, nil) assert.Regexp(t, "FF10457", err) } diff --git a/internal/blockchain/tezos/ffi2michelson.go b/internal/blockchain/tezos/ffi2michelson.go index 1930ddb4e..f6afb6871 100644 --- a/internal/blockchain/tezos/ffi2michelson.go +++ b/internal/blockchain/tezos/ffi2michelson.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -19,6 +19,7 @@ package tezos import ( "errors" "fmt" + "slices" "blockwatch.cc/tzgo/micheline" "blockwatch.cc/tzgo/tezos" @@ -34,6 +35,7 @@ const ( _internalBoolean = "boolean" _internalList = "list" _internalStruct = "struct" + _internalMap = "map" _internalInteger = "integer" _internalNat = "nat" _internalString = "string" @@ -43,6 +45,13 @@ const ( _internalBytes = "bytes" ) +// Tezos map +const ( + _key = "key" + _value = "value" + _mapEntries = "mapEntries" +) + func processArgs(payloadSchema map[string]interface{}, input map[string]interface{}, methodName string) (micheline.Parameters, error) { params := micheline.Parameters{ Entrypoint: methodName, @@ -143,6 +152,44 @@ func processMichelson(entry interface{}, details map[string]interface{}) (resp m func processSchemaEntry(entry interface{}, schema map[string]interface{}) (resp micheline.Prim, err error) { entryType := schema["type"].(string) switch entryType { + case _internalMap: + schemaArgs := schema["args"].([]interface{}) + + mapResp := micheline.NewMap() + mapEntries := entry.(map[string]interface{})[_mapEntries] + if mapEntries == nil { + return resp, fmt.Errorf("mapEntries schema property must be present") + } + for _, mapEntry := range mapEntries.([]interface{}) { + for name := range mapEntry.(map[string]interface{}) { + if !slices.Contains([]string{_key, _value}, name) { + return resp, errors.New("Unknown schema field '" + name + "' in map entry") + } + } + + var k micheline.Prim + var v micheline.Prim + for i := len(schemaArgs) - 1; i >= 0; i-- { + arg := schemaArgs[i].(map[string]interface{}) + + if arg["name"] == _key { + if k, err = extractValue(_key, arg, mapEntry); err != nil { + return resp, err + } + } + + if arg["name"] == _value { + if v, err = extractValue(_value, arg, mapEntry); err != nil { + return resp, err + } + } + } + + mapElem := micheline.NewMapElem(k, v) + mapResp.Args = append(mapResp.Args, mapElem) + } + + resp = mapResp case _internalStruct: schemaArgs := schema["args"].([]interface{}) @@ -151,15 +198,11 @@ func processSchemaEntry(entry interface{}, schema map[string]interface{}) (resp arg := schemaArgs[i].(map[string]interface{}) argName := arg["name"].(string) - elem := entry.(map[string]interface{}) - if _, ok := elem[argName]; !ok { - return resp, errors.New("Schema field '" + argName + "' wasn't found") - } - - processedEntry, err := processSchemaEntry(elem[argName], arg) + processedEntry, err := extractValue(argName, arg, entry) if err != nil { return resp, err } + newPair := forgePair(processedEntry, rightPairElem) rightPairElem = &newPair @@ -207,6 +250,15 @@ func processSchemaEntry(entry interface{}, schema map[string]interface{}) (resp return resp, err } +func extractValue(argName string, arg map[string]interface{}, entry interface{}) (resp micheline.Prim, err error) { + elem := entry.(map[string]interface{}) + if _, ok := elem[argName]; !ok { + return resp, errors.New("Schema field '" + argName + "' wasn't found") + } + + return processSchemaEntry(elem[argName], arg) +} + // TODO: define an algorithm to support any number of variants. // at the moment, support for up to 4 variants covers most cases func wrapWithVariant(elem micheline.Prim, variantPos int, totalVariantsCount int) (resp micheline.Prim) { diff --git a/internal/blockchain/tezos/ffi2michelson_test.go b/internal/blockchain/tezos/ffi2michelson_test.go index 2a0568e5a..1eccd005e 100644 --- a/internal/blockchain/tezos/ffi2michelson_test.go +++ b/internal/blockchain/tezos/ffi2michelson_test.go @@ -503,6 +503,48 @@ func Test_processArgsOk(t *testing.T) { }, }, }, + { + name: "valid map input param", + processSchemaReq: map[string]interface{}{ + "type": "array", + "prefixItems": []interface{}{ + map[string]interface{}{ + "name": "varMap", + "type": "object", + "details": map[string]interface{}{ + "type": "schema", + "internalSchema": map[string]interface{}{ + "type": "map", + "args": []interface{}{ + map[string]interface{}{ + "name": "key", + "type": "integer", + }, + map[string]interface{}{ + "name": "value", + "type": "string", + }, + }, + }, + }, + }, + }, + }, + input: map[string]interface{}{ + "varMap": map[string]interface{}{ + "mapEntries": []interface{}{ + map[string]interface{}{ + "key": float64(1), + "value": "val1", + }, + map[string]interface{}{ + "key": float64(3), + "value": "val3", + }, + }, + }, + }, + }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { @@ -944,6 +986,177 @@ func Test_processArgsErr(t *testing.T) { }, expectedError: "invalid object passed", }, + { + name: "no mapEntries for map input param", + processSchemaReq: map[string]interface{}{ + "type": "array", + "prefixItems": []interface{}{ + map[string]interface{}{ + "name": "varMap", + "type": "object", + "details": map[string]interface{}{ + "type": "schema", + "internalSchema": map[string]interface{}{ + "type": "map", + "args": []interface{}{ + map[string]interface{}{ + "name": "key", + "type": "integer", + }, + map[string]interface{}{ + "name": "value", + "type": "string", + }, + }, + }, + }, + }, + }, + }, + input: map[string]interface{}{ + "varMap": map[string]interface{}{ + "invalid": []interface{}{ + map[string]interface{}{ + "key": float64(1), + "value": "val1", + }, + map[string]interface{}{ + "key": float64(3), + "value": "val3", + }, + }, + }, + }, + expectedError: "mapEntries schema property must be present", + }, + { + name: "value missing for map input param", + processSchemaReq: map[string]interface{}{ + "type": "array", + "prefixItems": []interface{}{ + map[string]interface{}{ + "name": "varMap", + "type": "object", + "details": map[string]interface{}{ + "type": "schema", + "internalSchema": map[string]interface{}{ + "type": "map", + "args": []interface{}{ + map[string]interface{}{ + "name": "key", + "type": "integer", + }, + map[string]interface{}{ + "name": "value", + "type": "string", + }, + }, + }, + }, + }, + }, + }, + input: map[string]interface{}{ + "varMap": map[string]interface{}{ + "mapEntries": []interface{}{ + map[string]interface{}{ + "key": float64(1), + }, + map[string]interface{}{ + "key": float64(3), + "value": "val3", + }, + }, + }, + }, + expectedError: "Schema field 'value' wasn't found", + }, + { + name: "key missing for map input param", + processSchemaReq: map[string]interface{}{ + "type": "array", + "prefixItems": []interface{}{ + map[string]interface{}{ + "name": "varMap", + "type": "object", + "details": map[string]interface{}{ + "type": "schema", + "internalSchema": map[string]interface{}{ + "type": "map", + "args": []interface{}{ + map[string]interface{}{ + "name": "key", + "type": "integer", + }, + map[string]interface{}{ + "name": "value", + "type": "string", + }, + }, + }, + }, + }, + }, + }, + input: map[string]interface{}{ + "varMap": map[string]interface{}{ + "mapEntries": []interface{}{ + map[string]interface{}{ + "value": "val1", + }, + map[string]interface{}{ + "key": float64(3), + "value": "val3", + }, + }, + }, + }, + expectedError: "Schema field 'key' wasn't found", + }, + { + name: "unknown field for map input param", + processSchemaReq: map[string]interface{}{ + "type": "array", + "prefixItems": []interface{}{ + map[string]interface{}{ + "name": "varMap", + "type": "object", + "details": map[string]interface{}{ + "type": "schema", + "internalSchema": map[string]interface{}{ + "type": "map", + "args": []interface{}{ + map[string]interface{}{ + "name": "key", + "type": "integer", + }, + map[string]interface{}{ + "name": "value", + "type": "string", + }, + }, + }, + }, + }, + }, + }, + input: map[string]interface{}{ + "varMap": map[string]interface{}{ + "mapEntries": []interface{}{ + map[string]interface{}{ + "key": float64(1), + "value": "val1", + "unknown": float64(1), + }, + map[string]interface{}{ + "key": float64(3), + "value": "val3", + }, + }, + }, + }, + expectedError: "Unknown schema field 'unknown' in map entry", + }, } for _, tc := range testCases { diff --git a/internal/blockchain/tezos/tezos.go b/internal/blockchain/tezos/tezos.go index 3e663f309..f5dd984d4 100644 --- a/internal/blockchain/tezos/tezos.go +++ b/internal/blockchain/tezos/tezos.go @@ -300,8 +300,8 @@ func (t *Tezos) SubmitNetworkAction(ctx context.Context, nsOpID string, signingK return nil } -func (t *Tezos) DeployContract(ctx context.Context, nsOpID, signingKey string, definition, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) error { - return i18n.NewError(ctx, coremsgs.MsgNotSupportedByBlockchainPlugin) +func (t *Tezos) DeployContract(ctx context.Context, nsOpID, signingKey string, definition, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) (submissionRejected bool, err error) { + return true, i18n.NewError(ctx, coremsgs.MsgNotSupportedByBlockchainPlugin) } func (t *Tezos) ValidateInvokeRequest(ctx context.Context, parsedMethod interface{}, input map[string]interface{}, hasMessage bool) error { @@ -310,15 +310,15 @@ func (t *Tezos) ValidateInvokeRequest(ctx context.Context, parsedMethod interfac return err } -func (t *Tezos) InvokeContract(ctx context.Context, nsOpID string, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *blockchain.BatchPin) error { +func (t *Tezos) InvokeContract(ctx context.Context, nsOpID string, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *blockchain.BatchPin) (bool, error) { tezosLocation, err := t.parseContractLocation(ctx, location) if err != nil { - return err + return true, err } methodName, michelsonInput, err := t.prepareRequest(ctx, parsedMethod, input) if err != nil { - return err + return true, err } // TODO: add batch pin support @@ -516,14 +516,14 @@ func (t *Tezos) recoverFFI(ctx context.Context, parsedMethod interface{}) (*ffty return methodInfo.method, methodInfo.errors, nil } -func (t *Tezos) invokeContractMethod(ctx context.Context, address, methodName, signingKey, requestID string, michelsonInput micheline.Parameters, options map[string]interface{}) error { +func (t *Tezos) invokeContractMethod(ctx context.Context, address, methodName, signingKey, requestID string, michelsonInput micheline.Parameters, options map[string]interface{}) (submissionRejected bool, err error) { if t.metrics.IsMetricsEnabled() { t.metrics.BlockchainTransaction(address, methodName) } messageType := "SendTransaction" body, err := t.buildTezosconnectRequestBody(ctx, messageType, address, methodName, signingKey, requestID, michelsonInput, options) if err != nil { - return err + return true, err } var resErr common.BlockchainRESTError @@ -533,9 +533,9 @@ func (t *Tezos) invokeContractMethod(ctx context.Context, address, methodName, s SetError(&resErr). Post("/") if err != nil || !res.IsSuccess() { - return common.WrapRESTError(ctx, &resErr, res, err, coremsgs.MsgTezosconnectRESTErr) + return resErr.SubmissionRejected, common.WrapRESTError(ctx, &resErr, res, err, coremsgs.MsgTezosconnectRESTErr) } - return nil + return false, nil } func (t *Tezos) queryContractMethod(ctx context.Context, address, methodName, signingKey string, michelsonInput micheline.Parameters, options map[string]interface{}) (*resty.Response, error) { diff --git a/internal/blockchain/tezos/tezos_test.go b/internal/blockchain/tezos/tezos_test.go index e122c30cb..4f0ec8f96 100644 --- a/internal/blockchain/tezos/tezos_test.go +++ b/internal/blockchain/tezos/tezos_test.go @@ -984,7 +984,7 @@ func TestDeployContractOK(t *testing.T) { contractBytes, err := json.Marshal("KT123") assert.NoError(t, err) - err = tz.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) + _, err = tz.DeployContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(definitionBytes), fftypes.JSONAnyPtrBytes(contractBytes), input, options) assert.Regexp(t, "FF10429", err) } @@ -1030,7 +1030,7 @@ func TestInvokeContractOK(t *testing.T) { parsedMethod, err := tz.ParseInterface(context.Background(), method, nil) assert.NoError(t, err) - err = tz.InvokeContract(context.Background(), "opID", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = tz.InvokeContract(context.Background(), "opID", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.NoError(t, err) } @@ -1076,7 +1076,7 @@ func TestInvokeContractInvalidOption(t *testing.T) { parsedMethod, err := tz.ParseInterface(context.Background(), method, nil) assert.NoError(t, err) - err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF10398", err) } @@ -1109,7 +1109,7 @@ func TestInvokeContractBadSchema(t *testing.T) { parsedMethod, err := tz.ParseInterface(context.Background(), method, nil) assert.NoError(t, err) - err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF00127", err) } @@ -1137,7 +1137,7 @@ func TestInvokeContractAddressNotSet(t *testing.T) { parsedMethod, err := tz.ParseInterface(context.Background(), method, nil) assert.NoError(t, err) - err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "'address' not set", err) } @@ -1172,7 +1172,7 @@ func TestInvokeContractTezosconnectError(t *testing.T) { parsedMethod, err := tz.ParseInterface(context.Background(), method, nil) assert.NoError(t, err) - err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) + _, err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), parsedMethod, params, options, nil) assert.Regexp(t, "FF10283", err) } @@ -1192,7 +1192,7 @@ func TestInvokeContractPrepareFail(t *testing.T) { locationBytes, err := json.Marshal(location) assert.NoError(t, err) - err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), "wrong", params, options, nil) + _, err = tz.InvokeContract(context.Background(), "", signingKey, fftypes.JSONAnyPtrBytes(locationBytes), "wrong", params, options, nil) assert.Regexp(t, "FF10457", err) } diff --git a/internal/contracts/manager.go b/internal/contracts/manager.go index 1b068254d..ce179c084 100644 --- a/internal/contracts/manager.go +++ b/internal/contracts/manager.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -846,8 +846,6 @@ func (cm *contractManager) AddContractListener(ctx context.Context, listener *co }) } - // err = cm.database.RunAsGroup(ctx, func(ctx context.Context) (err error) { - // Namespace + Name must be unique if listener.Name != "" { if existing, err := cm.database.GetContractListener(ctx, cm.namespace, listener.Name); err != nil { @@ -1000,7 +998,17 @@ func (cm *contractManager) checkParamSchema(ctx context.Context, name string, in func (cm *contractManager) GenerateFFI(ctx context.Context, generationRequest *fftypes.FFIGenerationRequest) (*fftypes.FFI, error) { generationRequest.Namespace = cm.namespace - return cm.blockchain.GenerateFFI(ctx, generationRequest) + if generationRequest.Name == "" { + generationRequest.Name = "generated" + } + if generationRequest.Version == "" { + generationRequest.Version = "0.0.1" + } + ffi, err := cm.blockchain.GenerateFFI(ctx, generationRequest) + if err == nil { + err = cm.ResolveFFI(ctx, ffi) + } + return ffi, err } func (cm *contractManager) getDefaultContractListenerOptions() *core.ContractListenerOptions { diff --git a/internal/contracts/manager_test.go b/internal/contracts/manager_test.go index b0a084529..5a8e7ddb6 100644 --- a/internal/contracts/manager_test.go +++ b/internal/contracts/manager_test.go @@ -788,6 +788,46 @@ func TestAddContractListenerInline(t *testing.T) { mdi.AssertExpectations(t) } +func TestAddContractListenerInlineNilLocation(t *testing.T) { + cm := newTestContractManager() + mbi := cm.blockchain.(*blockchainmocks.Plugin) + mdi := cm.database.(*databasemocks.Plugin) + + sub := &core.ContractListenerInput{ + ContractListener: core.ContractListener{ + Event: &core.FFISerializedEvent{ + FFIEventDefinition: fftypes.FFIEventDefinition{ + Name: "changed", + Params: fftypes.FFIParams{ + { + Name: "value", + Schema: fftypes.JSONAnyPtr(`{"type": "integer"}`), + }, + }, + }, + }, + Options: &core.ContractListenerOptions{}, + Topic: "test-topic", + }, + } + + mbi.On("GenerateEventSignature", context.Background(), mock.Anything).Return("changed") + mdi.On("GetContractListeners", context.Background(), "ns1", mock.Anything).Return(nil, nil, nil) + mbi.On("AddContractListener", context.Background(), mock.MatchedBy(func(cl *core.ContractListener) bool { + // Normalize is not called for this case + return cl.Location == nil + })).Return(nil) + mdi.On("InsertContractListener", context.Background(), &sub.ContractListener).Return(nil) + + result, err := cm.AddContractListener(context.Background(), sub) + assert.NoError(t, err) + assert.NotNil(t, result.ID) + assert.NotNil(t, result.Event) + + mbi.AssertExpectations(t) + mdi.AssertExpectations(t) +} + func TestAddContractListenerNoLocationOK(t *testing.T) { cm := newTestContractManager() mbi := cm.blockchain.(*blockchainmocks.Plugin) @@ -3501,13 +3541,32 @@ func TestAddJSONSchemaExtension(t *testing.T) { func TestGenerateFFI(t *testing.T) { cm := newTestContractManager() mbi := cm.blockchain.(*blockchainmocks.Plugin) - mbi.On("GenerateFFI", mock.Anything, mock.Anything).Return(&fftypes.FFI{ - Name: "generated", - }, nil) + gfi := mbi.On("GenerateFFI", mock.Anything, mock.Anything) + gfi.Run(func(args mock.Arguments) { + gf := args[1].(*fftypes.FFIGenerationRequest) + gfi.Return(&fftypes.FFI{ + Name: gf.Name, + Version: gf.Version, + Methods: []*fftypes.FFIMethod{ + { + Name: "method1", + }, + { + Name: "method1", + }, + }, + }, nil) + }) + ffi, err := cm.GenerateFFI(context.Background(), &fftypes.FFIGenerationRequest{}) assert.NoError(t, err) assert.NotNil(t, ffi) assert.Equal(t, "generated", ffi.Name) + assert.Equal(t, "0.0.1", ffi.Version) + assert.Equal(t, "method1", ffi.Methods[0].Name) + assert.Equal(t, "method1", ffi.Methods[0].Pathname) + assert.Equal(t, "method1", ffi.Methods[1].Name) + assert.Equal(t, "method1_1", ffi.Methods[1].Pathname) } type MockFFIParamValidator struct{} diff --git a/internal/contracts/operations.go b/internal/contracts/operations.go index a47398772..c308aa51a 100644 --- a/internal/contracts/operations.go +++ b/internal/contracts/operations.go @@ -22,10 +22,10 @@ import ( "github.com/hyperledger/firefly-common/pkg/fftypes" "github.com/hyperledger/firefly-common/pkg/i18n" + "github.com/hyperledger/firefly-common/pkg/log" "github.com/hyperledger/firefly/internal/batch" "github.com/hyperledger/firefly/internal/coremsgs" "github.com/hyperledger/firefly/internal/data" - "github.com/hyperledger/firefly/internal/operations" "github.com/hyperledger/firefly/internal/txcommon" "github.com/hyperledger/firefly/pkg/blockchain" "github.com/hyperledger/firefly/pkg/core" @@ -131,17 +131,28 @@ func (cm *contractManager) RunOperation(ctx context.Context, op *core.PreparedOp if err != nil { return nil, core.OpPhaseInitializing, err } - err = cm.blockchain.InvokeContract(ctx, op.NamespacedIDString(), req.Key, req.Location, bcParsedMethod, req.Input, req.Options, batchPin) - return nil, operations.ErrTernary(err, core.OpPhaseInitializing, core.OpPhasePending), err + submissionRejected, err := cm.blockchain.InvokeContract(ctx, op.NamespacedIDString(), req.Key, req.Location, bcParsedMethod, req.Input, req.Options, batchPin) + return nil, submissionPhase(ctx, submissionRejected, err), err case blockchainContractDeployData: req := data.Request - err = cm.blockchain.DeployContract(ctx, op.NamespacedIDString(), req.Key, req.Definition, req.Contract, req.Input, req.Options) - return nil, operations.ErrTernary(err, core.OpPhaseInitializing, core.OpPhasePending), err + submissionRejected, err := cm.blockchain.DeployContract(ctx, op.NamespacedIDString(), req.Key, req.Definition, req.Contract, req.Input, req.Options) + return nil, submissionPhase(ctx, submissionRejected, err), err default: return nil, core.OpPhaseInitializing, i18n.NewError(ctx, coremsgs.MsgOperationDataIncorrect, op.Data) } } +func submissionPhase(ctx context.Context, submissionRejected bool, err error) core.OpPhase { + if err == nil { + return core.OpPhasePending + } + log.L(ctx).Errorf("Transaction submission failed [submissionRejected=%t]: %s", submissionRejected, err) + if submissionRejected { + return core.OpPhaseComplete + } + return core.OpPhaseInitializing +} + func (cm *contractManager) OnOperationUpdate(ctx context.Context, op *core.Operation, update *core.OperationUpdate) error { // Special handling for blockchain operations, which writes an event when it succeeds or fails switch op.Type { diff --git a/internal/contracts/operations_test.go b/internal/contracts/operations_test.go index abc8e70e7..bd425dabc 100644 --- a/internal/contracts/operations_test.go +++ b/internal/contracts/operations_test.go @@ -87,7 +87,7 @@ func TestPrepareAndRunBlockchainInvoke(t *testing.T) { }), req.Errors).Return(opaqueData, nil) mbi.On("InvokeContract", context.Background(), "ns1:"+op.ID.String(), "0x123", mock.MatchedBy(func(loc *fftypes.JSONAny) bool { return loc.String() == req.Location.String() - }), opaqueData, req.Input, req.Options, (*blockchain.BatchPin)(nil)).Return(nil) + }), opaqueData, req.Input, req.Options, (*blockchain.BatchPin)(nil)).Return(false, nil) po, err := cm.PrepareOperation(context.Background(), op) assert.NoError(t, err) @@ -101,6 +101,92 @@ func TestPrepareAndRunBlockchainInvoke(t *testing.T) { mbi.AssertExpectations(t) } +func TestPrepareAndRunBlockchainInvokeRejected(t *testing.T) { + cm := newTestContractManager() + + op := &core.Operation{ + Type: core.OpTypeBlockchainInvoke, + ID: fftypes.NewUUID(), + Namespace: "ns1", + } + req := &core.ContractCallRequest{ + Key: "0x123", + Location: fftypes.JSONAnyPtr(`{"address":"0x1111"}`), + Method: &fftypes.FFIMethod{ + Name: "set", + }, + Input: map[string]interface{}{ + "value": "1", + }, + } + err := addBlockchainReqInputs(op, req) + assert.NoError(t, err) + + mbi := cm.blockchain.(*blockchainmocks.Plugin) + opaqueData := "anything" + mbi.On("ParseInterface", context.Background(), mock.MatchedBy(func(method *fftypes.FFIMethod) bool { + return method.Name == req.Method.Name + }), req.Errors).Return(opaqueData, nil) + mbi.On("InvokeContract", context.Background(), "ns1:"+op.ID.String(), "0x123", mock.MatchedBy(func(loc *fftypes.JSONAny) bool { + return loc.String() == req.Location.String() + }), opaqueData, req.Input, req.Options, (*blockchain.BatchPin)(nil)). + Return(true, fmt.Errorf("rejected")) + + po, err := cm.PrepareOperation(context.Background(), op) + assert.NoError(t, err) + assert.Equal(t, req, po.Data.(txcommon.BlockchainInvokeData).Request) + + _, phase, err := cm.RunOperation(context.Background(), po) + + assert.Equal(t, core.OpPhaseComplete, phase) + assert.Regexp(t, "rejected", err) + + mbi.AssertExpectations(t) +} + +func TestPrepareAndRunBlockchainInvokeRetryable(t *testing.T) { + cm := newTestContractManager() + + op := &core.Operation{ + Type: core.OpTypeBlockchainInvoke, + ID: fftypes.NewUUID(), + Namespace: "ns1", + } + req := &core.ContractCallRequest{ + Key: "0x123", + Location: fftypes.JSONAnyPtr(`{"address":"0x1111"}`), + Method: &fftypes.FFIMethod{ + Name: "set", + }, + Input: map[string]interface{}{ + "value": "1", + }, + } + err := addBlockchainReqInputs(op, req) + assert.NoError(t, err) + + mbi := cm.blockchain.(*blockchainmocks.Plugin) + opaqueData := "anything" + mbi.On("ParseInterface", context.Background(), mock.MatchedBy(func(method *fftypes.FFIMethod) bool { + return method.Name == req.Method.Name + }), req.Errors).Return(opaqueData, nil) + mbi.On("InvokeContract", context.Background(), "ns1:"+op.ID.String(), "0x123", mock.MatchedBy(func(loc *fftypes.JSONAny) bool { + return loc.String() == req.Location.String() + }), opaqueData, req.Input, req.Options, (*blockchain.BatchPin)(nil)). + Return(false, fmt.Errorf("rejected")) + + po, err := cm.PrepareOperation(context.Background(), op) + assert.NoError(t, err) + assert.Equal(t, req, po.Data.(txcommon.BlockchainInvokeData).Request) + + _, phase, err := cm.RunOperation(context.Background(), po) + + assert.Equal(t, core.OpPhaseInitializing, phase) + assert.Regexp(t, "rejected", err) + + mbi.AssertExpectations(t) +} + func TestPrepareAndRunBlockchainInvokeValidateFail(t *testing.T) { cm := newTestContractManager() @@ -158,7 +244,7 @@ func TestPrepareAndRunBlockchainContractDeploy(t *testing.T) { assert.NoError(t, err) mbi := cm.blockchain.(*blockchainmocks.Plugin) - mbi.On("DeployContract", context.Background(), "ns1:"+op.ID.String(), signingKey, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) + mbi.On("DeployContract", context.Background(), "ns1:"+op.ID.String(), signingKey, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(false, nil) po, err := cm.PrepareOperation(context.Background(), op) assert.NoError(t, err) @@ -172,6 +258,40 @@ func TestPrepareAndRunBlockchainContractDeploy(t *testing.T) { mbi.AssertExpectations(t) } +func TestPrepareAndRunBlockchainContractDeployRejected(t *testing.T) { + cm := newTestContractManager() + + op := &core.Operation{ + Type: core.OpTypeBlockchainContractDeploy, + ID: fftypes.NewUUID(), + Namespace: "ns1", + } + signingKey := "0x2468" + req := &core.ContractDeployRequest{ + Key: signingKey, + Definition: fftypes.JSONAnyPtr("[]"), + Contract: fftypes.JSONAnyPtr("\"0x123456\""), + Input: []interface{}{"one", "two", "three"}, + } + err := addBlockchainReqInputs(op, req) + assert.NoError(t, err) + + mbi := cm.blockchain.(*blockchainmocks.Plugin) + mbi.On("DeployContract", context.Background(), "ns1:"+op.ID.String(), signingKey, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Return(true, fmt.Errorf("rejected")) + + po, err := cm.PrepareOperation(context.Background(), op) + assert.NoError(t, err) + assert.Equal(t, req, po.Data.(blockchainContractDeployData).Request) + + _, phase, err := cm.RunOperation(context.Background(), po) + + assert.Equal(t, core.OpPhaseComplete, phase) + assert.Regexp(t, "rejected", err) + + mbi.AssertExpectations(t) +} + func TestPrepareOperationNotSupported(t *testing.T) { cm := newTestContractManager() @@ -588,7 +708,7 @@ func TestRunBlockchainInvokeWithBatch(t *testing.T) { assert.Equal(t, []*fftypes.Bytes32{pin}, batchPin.Contexts) assert.Equal(t, "test-payload", batchPin.BatchPayloadRef) return true - })).Return(nil) + })).Return(false, nil) po := txcommon.OpBlockchainInvoke(op, req, &txcommon.BatchPinData{ Batch: storedBatch, diff --git a/internal/coreconfig/coreconfig.go b/internal/coreconfig/coreconfig.go index 1a8e904ec..401f69c1a 100644 --- a/internal/coreconfig/coreconfig.go +++ b/internal/coreconfig/coreconfig.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -327,8 +327,10 @@ var ( OrgDescription = ffc("org.description") // OrchestratorStartupAttempts is how many time to attempt to connect to core infrastructure on startup OrchestratorStartupAttempts = ffc("orchestrator.startupAttempts") - // SubscriptionDefaultsReadAhead default read ahead to enable for subscriptions that do not explicitly configure readahead - SubscriptionDefaultsReadAhead = ffc("subscription.defaults.batchSize") + // SubscriptionDefaultsBatchSize default read ahead to enable for subscriptions that do not explicitly configure readahead + SubscriptionDefaultsBatchSize = ffc("subscription.defaults.batchSize") + // SubscriptionDefaultsBatchTimeout default batch timeout + SubscriptionDefaultsBatchTimeout = ffc("subscription.defaults.batchTimeout") // SubscriptionMax maximum number of pre-defined subscriptions that can exist (note for high fan-out consider connecting a dedicated pub/sub broker to the dispatcher) SubscriptionMax = ffc("subscription.max") // SubscriptionsRetryInitialDelay is the initial retry delay @@ -337,6 +339,8 @@ var ( SubscriptionsRetryMaxDelay = ffc("subscription.retry.maxDelay") // SubscriptionsRetryFactor the backoff factor to use for retry of database operations SubscriptionsRetryFactor = ffc("subscription.retry.factor") + // SubscriptionMaxHistoricalEventScanLength the maximum amount of historical events we scan for in the DB when indexing through old events against a subscription + SubscriptionMaxHistoricalEventScanLength = ffc("subscription.events.maxScanLength") // TransactionWriterCount TransactionWriterCount = ffc("transaction.writer.count") // TransactionWriterBatchTimeout @@ -404,7 +408,7 @@ func setDefaults() { viper.SetDefault(string(DownloadRetryFactor), 2.0) viper.SetDefault(string(EventAggregatorFirstEvent), core.SubOptsFirstEventOldest) viper.SetDefault(string(EventAggregatorBatchSize), 200) - viper.SetDefault(string(EventAggregatorBatchTimeout), "250ms") + viper.SetDefault(string(EventAggregatorBatchTimeout), "0ms") viper.SetDefault(string(EventAggregatorPollTimeout), "30s") viper.SetDefault(string(EventAggregatorRewindTimeout), "50ms") viper.SetDefault(string(EventAggregatorRewindQueueLength), 10) @@ -414,7 +418,7 @@ func setDefaults() { viper.SetDefault(string(EventAggregatorRetryMaxDelay), "30s") viper.SetDefault(string(EventDBEventsBufferSize), 100) viper.SetDefault(string(EventDispatcherBufferLength), 5) - viper.SetDefault(string(EventDispatcherBatchTimeout), "250ms") + viper.SetDefault(string(EventDispatcherBatchTimeout), "0ms") viper.SetDefault(string(EventDispatcherPollTimeout), "30s") viper.SetDefault(string(EventTransportsEnabled), []string{"websockets", "webhooks"}) viper.SetDefault(string(EventTransportsDefault), "websockets") @@ -451,11 +455,13 @@ func setDefaults() { viper.SetDefault(string(PrivateMessagingBatchSize), 200) viper.SetDefault(string(PrivateMessagingBatchTimeout), "1s") viper.SetDefault(string(PrivateMessagingBatchPayloadLimit), "800Kb") - viper.SetDefault(string(SubscriptionDefaultsReadAhead), 0) + viper.SetDefault(string(SubscriptionDefaultsBatchSize), 50) + viper.SetDefault(string(SubscriptionDefaultsBatchTimeout), "50ms") viper.SetDefault(string(SubscriptionMax), 500) viper.SetDefault(string(SubscriptionsRetryInitialDelay), "250ms") viper.SetDefault(string(SubscriptionsRetryMaxDelay), "30s") viper.SetDefault(string(SubscriptionsRetryFactor), 2.0) + viper.SetDefault(string(SubscriptionMaxHistoricalEventScanLength), 1000) viper.SetDefault(string(TransactionWriterBatchMaxTransactions), 100) viper.SetDefault(string(TransactionWriterBatchTimeout), "10ms") viper.SetDefault(string(TransactionWriterCount), 5) diff --git a/internal/coremsgs/en_api_translations.go b/internal/coremsgs/en_api_translations.go index 677d768f6..39ed59e83 100644 --- a/internal/coremsgs/en_api_translations.go +++ b/internal/coremsgs/en_api_translations.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -133,6 +133,7 @@ var ( APIEndpointsGetWebSockets = ffm("api.endpoints.getStatusWebSockets", "Gets a list of the current WebSocket connections to this node") APIEndpointsGetStatus = ffm("api.endpoints.getStatus", "Gets the status of this namespace") APIEndpointsGetSubscriptionByID = ffm("api.endpoints.getSubscriptionByID", "Gets a subscription by its ID") + APIEndpointsGetSubscriptionEventsFiltered = ffm("api.endpoints.getSubscriptionEventsFiltered", "Gets a collection of events filtered by the subscription for further filtering") APIEndpointsGetSubscriptions = ffm("api.endpoints.getSubscriptions", "Gets a list of subscriptions") APIEndpointsGetTokenAccountPools = ffm("api.endpoints.getTokenAccountPools", "Gets a list of token pools that contain a given token account key") APIEndpointsGetTokenAccounts = ffm("api.endpoints.getTokenAccounts", "Gets a list of token accounts") @@ -208,4 +209,7 @@ var ( APISmartContractDetails = ffm("api.smartContractDetails", "Additional smart contract details") APISmartContractDetailsKey = ffm("api.smartContractDetailsKey", "Key") APISmartContractDetailsValue = ffm("api.smartContractDetailsValue", "Value") + + APISubscriptionStartSequenceID = ffm("api.startsequenceid", "The sequence ID in the raw event stream to start indexing through events from. Leave blank to start indexing from the most recent events") + APISubscriptionEndSequenceID = ffm("api.endsequenceid", "The sequence ID in the raw event stream to stop indexing through events at. Leave blank to start indexing from the most recent events") ) diff --git a/internal/coremsgs/en_config_descriptions.go b/internal/coremsgs/en_config_descriptions.go index e03e89ac0..1015b7571 100644 --- a/internal/coremsgs/en_config_descriptions.go +++ b/internal/coremsgs/en_config_descriptions.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -25,6 +25,9 @@ var ffc = func(key, translation, fieldType string) i18n.ConfigMessageKey { return i18n.FFC(language.AmericanEnglish, key, translation, fieldType) } +var urlStringType = "URL " + i18n.StringType +var addressStringType = "Address " + i18n.StringType + //revive:disable var ( ConfigGlobalMigrationsAuto = ffc("config.global.migrations.auto", "Enables automatic database migrations", i18n.BooleanType) @@ -41,7 +44,7 @@ var ( ConfigSPIAddress = ffc("config.spi.address", "The IP address on which the admin HTTP API should listen", "IP Address "+i18n.StringType) ConfigSPIEnabled = ffc("config.spi.enabled", "Enables the admin HTTP API", i18n.BooleanType) ConfigSPIPort = ffc("config.spi.port", "The port on which the admin HTTP API should listen", i18n.IntType) - ConfigSPIPublicURL = ffc("config.spi.publicURL", "The fully qualified public URL for the admin API. This is used for building URLs in HTTP responses and in OpenAPI Spec generation", "URL "+i18n.StringType) + ConfigSPIPublicURL = ffc("config.spi.publicURL", "The fully qualified public URL for the admin API. This is used for building URLs in HTTP responses and in OpenAPI Spec generation", urlStringType) ConfigSPIReadTimeout = ffc("config.spi.readTimeout", "The maximum time to wait when reading from an HTTP connection", i18n.TimeDurationType) ConfigSPIWriteTimeout = ffc("config.spi.writeTimeout", "The maximum time to wait when writing to an HTTP connection", i18n.TimeDurationType) @@ -75,17 +78,17 @@ var ( ConfigBlockchainEthereumAddressResolverRetainOriginal = ffc("config.blockchain.ethereum.addressResolver.retainOriginal", "When true the original pre-resolved string is retained after the lookup, and passed down to Ethconnect as the from address", i18n.BooleanType) ConfigBlockchainEthereumAddressResolverURL = ffc("config.blockchain.ethereum.addressResolver.url", "The URL of the Address Resolver", i18n.StringType) ConfigBlockchainEthereumAddressResolverURLTemplate = ffc("config.blockchain.ethereum.addressResolver.urlTemplate", "The URL Go template string to use when calling the Address Resolver. The template input contains '.Key' and '.Intent' string variables", i18n.GoTemplateType) - ConfigBlockchainEthereumAddressResolverProxyURL = ffc("config.blockchain.ethereum.addressResolver.proxy.url", "Optional HTTP proxy server to use when connecting to the Address Resolver", "URL "+i18n.StringType) + ConfigBlockchainEthereumAddressResolverProxyURL = ffc("config.blockchain.ethereum.addressResolver.proxy.url", "Optional HTTP proxy server to use when connecting to the Address Resolver", urlStringType) ConfigBlockchainEthereumEthconnectBatchSize = ffc("config.blockchain.ethereum.ethconnect.batchSize", "The number of events Ethconnect should batch together for delivery to FireFly core. Only applies when automatically creating a new event stream", i18n.IntType) ConfigBlockchainEthereumEthconnectBatchTimeout = ffc("config.blockchain.ethereum.ethconnect.batchTimeout", "How long Ethconnect should wait for new events to arrive and fill a batch, before sending the batch to FireFly core. Only applies when automatically creating a new event stream", i18n.TimeDurationType) - ConfigBlockchainEthereumEthconnectInstance = ffc("config.blockchain.ethereum.ethconnect.instance", "The Ethereum address of the FireFly BatchPin smart contract that has been deployed to the blockchain (deprecated - use namespaces.predefined[].multiparty.contract[].location.address)", "Address "+i18n.StringType) - ConfigBlockchainEthereumEthconnectFromBlock = ffc("config.blockchain.ethereum.ethconnect.fromBlock", "The first event this FireFly instance should listen to from the BatchPin smart contract. Default=0. Only affects initial creation of the event stream (deprecated - use namespaces.predefined[].multiparty.contract[].location.firstEvent)", "Address "+i18n.StringType) + ConfigBlockchainEthereumEthconnectInstance = ffc("config.blockchain.ethereum.ethconnect.instance", "The Ethereum address of the FireFly BatchPin smart contract that has been deployed to the blockchain (deprecated - use namespaces.predefined[].multiparty.contract[].location.address)", addressStringType) + ConfigBlockchainEthereumEthconnectFromBlock = ffc("config.blockchain.ethereum.ethconnect.fromBlock", "The first event this FireFly instance should listen to from the BatchPin smart contract. Default=0. Only affects initial creation of the event stream (deprecated - use namespaces.predefined[].multiparty.contract[].location.firstEvent)", addressStringType) ConfigBlockchainEthereumEthconnectPrefixLong = ffc("config.blockchain.ethereum.ethconnect.prefixLong", "The prefix that will be used for Ethconnect specific HTTP headers when FireFly makes requests to Ethconnect", i18n.StringType) ConfigBlockchainEthereumEthconnectPrefixShort = ffc("config.blockchain.ethereum.ethconnect.prefixShort", "The prefix that will be used for Ethconnect specific query parameters when FireFly makes requests to Ethconnect", i18n.StringType) ConfigBlockchainEthereumEthconnectTopic = ffc("config.blockchain.ethereum.ethconnect.topic", "The websocket listen topic that the node should register on, which is important if there are multiple nodes using a single ethconnect", i18n.StringType) - ConfigBlockchainEthereumEthconnectURL = ffc("config.blockchain.ethereum.ethconnect.url", "The URL of the Ethconnect instance", "URL "+i18n.StringType) - ConfigBlockchainEthereumEthconnectProxyURL = ffc("config.blockchain.ethereum.ethconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Ethconnect", "URL "+i18n.StringType) + ConfigBlockchainEthereumEthconnectURL = ffc("config.blockchain.ethereum.ethconnect.url", "The URL of the Ethconnect instance", urlStringType) + ConfigBlockchainEthereumEthconnectProxyURL = ffc("config.blockchain.ethereum.ethconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Ethconnect", urlStringType) ConfigBlockchainEthereumFFTMURL = ffc("config.blockchain.ethereum.fftm.url", "The URL of the FireFly Transaction Manager runtime, if enabled", i18n.StringType) ConfigBlockchainEthereumFFTMProxyURL = ffc("config.blockchain.ethereum.fftm.proxy.url", "Optional HTTP proxy server to use when connecting to the Transaction Manager", i18n.StringType) @@ -98,8 +101,8 @@ var ( ConfigBlockchainFabricFabconnectPrefixShort = ffc("config.blockchain.fabric.fabconnect.prefixShort", "The prefix that will be used for Fabconnect specific query parameters when FireFly makes requests to Fabconnect", i18n.StringType) ConfigBlockchainFabricFabconnectSigner = ffc("config.blockchain.fabric.fabconnect.signer", "The Fabric signing key to use when submitting transactions to Fabconnect", i18n.StringType) ConfigBlockchainFabricFabconnectTopic = ffc("config.blockchain.fabric.fabconnect.topic", "The websocket listen topic that the node should register on, which is important if there are multiple nodes using a single Fabconnect", i18n.StringType) - ConfigBlockchainFabricFabconnectURL = ffc("config.blockchain.fabric.fabconnect.url", "The URL of the Fabconnect instance", "URL "+i18n.StringType) - ConfigBlockchainFabricFabconnectProxyURL = ffc("config.blockchain.fabric.fabconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Fabconnect", "URL "+i18n.StringType) + ConfigBlockchainFabricFabconnectURL = ffc("config.blockchain.fabric.fabconnect.url", "The URL of the Fabconnect instance", urlStringType) + ConfigBlockchainFabricFabconnectProxyURL = ffc("config.blockchain.fabric.fabconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Fabconnect", urlStringType) ConfigCacheEnabled = ffc("config.cache.enabled", "Enables caching, defaults to true", i18n.BooleanType) @@ -166,7 +169,7 @@ var ( ConfigPluginBlockchainEthereumAddressResolverURL = ffc("config.plugins.blockchain[].ethereum.addressResolver.url", "The URL of the Address Resolver", i18n.StringType) ConfigPluginBlockchainEthereumAddressResolverURLTemplate = ffc("config.plugins.blockchain[].ethereum.addressResolver.urlTemplate", "The URL Go template string to use when calling the Address Resolver. The template input contains '.Key' and '.Intent' string variables.", i18n.GoTemplateType) - ConfigPluginBlockchainEthereumAddressResolverProxyURL = ffc("config.plugins.blockchain[].ethereum.addressResolver.proxy.url", "Optional HTTP proxy server to use when connecting to the Address Resolver", "URL "+i18n.StringType) + ConfigPluginBlockchainEthereumAddressResolverProxyURL = ffc("config.plugins.blockchain[].ethereum.addressResolver.proxy.url", "Optional HTTP proxy server to use when connecting to the Address Resolver", urlStringType) ConfigPluginBlockchainEthereumEthconnectBackgroundStart = ffc("config.plugins.blockchain[].ethereum.ethconnect.backgroundStart.enabled", "Start the Ethconnect plugin in the background and enter retry loop if failed to start", i18n.BooleanType) ConfigPluginBlockchainEthereumEthconnectBackgroundStartInitialDelay = ffc("config.plugins.blockchain[].ethereum.ethconnect.backgroundStart.initialDelay", "Delay between restarts in the case where we retry to restart the ethereum plugin", i18n.TimeDurationType) @@ -174,13 +177,13 @@ var ( ConfigPluginBlockchainEthereumEthconnectBackgroundStartFactor = ffc("config.plugins.blockchain[].ethereum.ethconnect.backgroundStart.factor", "Set the factor by which the delay increases when retrying", i18n.FloatType) ConfigPluginBlockchainEthereumEthconnectBatchSize = ffc("config.plugins.blockchain[].ethereum.ethconnect.batchSize", "The number of events Ethconnect should batch together for delivery to FireFly core. Only applies when automatically creating a new event stream", i18n.IntType) ConfigPluginBlockchainEthereumEthconnectBatchTimeout = ffc("config.plugins.blockchain[].ethereum.ethconnect.batchTimeout", "How long Ethconnect should wait for new events to arrive and fill a batch, before sending the batch to FireFly core. Only applies when automatically creating a new event stream", i18n.TimeDurationType) - ConfigPluginBlockchainEthereumEthconnectInstance = ffc("config.plugins.blockchain[].ethereum.ethconnect.instance", "The Ethereum address of the FireFly BatchPin smart contract that has been deployed to the blockchain", "Address "+i18n.StringType) - ConfigPluginBlockchainEthereumEthconnectFromBlock = ffc("config.plugins.blockchain[].ethereum.ethconnect.fromBlock", "The first event this FireFly instance should listen to from the BatchPin smart contract. Default=0. Only affects initial creation of the event stream", "Address "+i18n.StringType) + ConfigPluginBlockchainEthereumEthconnectInstance = ffc("config.plugins.blockchain[].ethereum.ethconnect.instance", "The Ethereum address of the FireFly BatchPin smart contract that has been deployed to the blockchain", addressStringType) + ConfigPluginBlockchainEthereumEthconnectFromBlock = ffc("config.plugins.blockchain[].ethereum.ethconnect.fromBlock", "The first event this FireFly instance should listen to from the BatchPin smart contract. Default=0. Only affects initial creation of the event stream", addressStringType) ConfigPluginBlockchainEthereumEthconnectPrefixLong = ffc("config.plugins.blockchain[].ethereum.ethconnect.prefixLong", "The prefix that will be used for Ethconnect specific HTTP headers when FireFly makes requests to Ethconnect", i18n.StringType) ConfigPluginBlockchainEthereumEthconnectPrefixShort = ffc("config.plugins.blockchain[].ethereum.ethconnect.prefixShort", "The prefix that will be used for Ethconnect specific query parameters when FireFly makes requests to Ethconnect", i18n.StringType) ConfigPluginBlockchainEthereumEthconnectTopic = ffc("config.plugins.blockchain[].ethereum.ethconnect.topic", "The websocket listen topic that the node should register on, which is important if there are multiple nodes using a single ethconnect", i18n.StringType) - ConfigPluginBlockchainEthereumEthconnectURL = ffc("config.plugins.blockchain[].ethereum.ethconnect.url", "The URL of the Ethconnect instance", "URL "+i18n.StringType) - ConfigPluginBlockchainEthereumEthconnectProxyURL = ffc("config.plugins.blockchain[].ethereum.ethconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Ethconnect", "URL "+i18n.StringType) + ConfigPluginBlockchainEthereumEthconnectURL = ffc("config.plugins.blockchain[].ethereum.ethconnect.url", "The URL of the Ethconnect instance", urlStringType) + ConfigPluginBlockchainEthereumEthconnectProxyURL = ffc("config.plugins.blockchain[].ethereum.ethconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Ethconnect", urlStringType) ConfigPluginBlockchainEthereumFFTMURL = ffc("config.plugins.blockchain[].ethereum.fftm.url", "The URL of the FireFly Transaction Manager runtime, if enabled", i18n.StringType) ConfigPluginBlockchainEthereumFFTMProxyURL = ffc("config.plugins.blockchain[].ethereum.fftm.proxy.url", "Optional HTTP proxy server to use when connecting to the Transaction Manager", i18n.StringType) @@ -198,13 +201,13 @@ var ( ConfigPluginBlockchainTezosTezosconnectBackgroundStartFactor = ffc("config.plugins.blockchain[].tezos.tezosconnect.backgroundStart.factor", "Set the factor by which the delay increases when retrying", i18n.FloatType) ConfigPluginBlockchainTezosTezosconnectBatchSize = ffc("config.plugins.blockchain[].tezos.tezosconnect.batchSize", "The number of events Tezosconnect should batch together for delivery to FireFly core. Only applies when automatically creating a new event stream", i18n.IntType) ConfigPluginBlockchainTezosTezosconnectBatchTimeout = ffc("config.plugins.blockchain[].tezos.tezosconnect.batchTimeout", "How long Tezosconnect should wait for new events to arrive and fill a batch, before sending the batch to FireFly core. Only applies when automatically creating a new event stream", i18n.TimeDurationType) - ConfigPluginBlockchainTezosTezosconnectInstance = ffc("config.plugins.blockchain[].tezos.tezosconnect.instance", "The Tezosconnect address of the FireFly BatchPin smart contract that has been deployed to the blockchain", "Address "+i18n.StringType) - ConfigPluginBlockchainTezosTezosconnectFromBlock = ffc("config.plugins.blockchain[].tezos.tezosconnect.fromBlock", "The first event this FireFly instance should listen to from the BatchPin smart contract. Default=0. Only affects initial creation of the event stream", "Address "+i18n.StringType) + ConfigPluginBlockchainTezosTezosconnectInstance = ffc("config.plugins.blockchain[].tezos.tezosconnect.instance", "The Tezosconnect address of the FireFly BatchPin smart contract that has been deployed to the blockchain", addressStringType) + ConfigPluginBlockchainTezosTezosconnectFromBlock = ffc("config.plugins.blockchain[].tezos.tezosconnect.fromBlock", "The first event this FireFly instance should listen to from the BatchPin smart contract. Default=0. Only affects initial creation of the event stream", addressStringType) ConfigPluginBlockchainTezosTezosconnectPrefixLong = ffc("config.plugins.blockchain[].tezos.tezosconnect.prefixLong", "The prefix that will be used for Tezosconnect specific HTTP headers when FireFly makes requests to Tezosconnect", i18n.StringType) ConfigPluginBlockchainTezosTezosconnectPrefixShort = ffc("config.plugins.blockchain[].tezos.tezosconnect.prefixShort", "The prefix that will be used for Tezosconnect specific query parameters when FireFly makes requests to Tezosconnect", i18n.StringType) ConfigPluginBlockchainTezosTezosconnectTopic = ffc("config.plugins.blockchain[].tezos.tezosconnect.topic", "The websocket listen topic that the node should register on, which is important if there are multiple nodes using a single tezosconnect", i18n.StringType) - ConfigPluginBlockchainTezosTezosconnectURL = ffc("config.plugins.blockchain[].tezos.tezosconnect.url", "The URL of the Tezosconnect instance", "URL "+i18n.StringType) - ConfigPluginBlockchainTezosTezosconnectProxyURL = ffc("config.plugins.blockchain[].tezos.tezosconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Tezosconnect", "URL "+i18n.StringType) + ConfigPluginBlockchainTezosTezosconnectURL = ffc("config.plugins.blockchain[].tezos.tezosconnect.url", "The URL of the Tezosconnect instance", urlStringType) + ConfigPluginBlockchainTezosTezosconnectProxyURL = ffc("config.plugins.blockchain[].tezos.tezosconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Tezosconnect", urlStringType) ConfigPluginBlockchainFabricFabconnectBackgroundStart = ffc("config.plugins.blockchain[].fabric.fabconnect.backgroundStart.enabled", "Start the fabric plugin in the background and enter retry loop if failed to start", i18n.BooleanType) ConfigPluginBlockchainFabricFabconnectBackgroundStartInitialDelay = ffc("config.plugins.blockchain[].fabric.fabconnect.backgroundStart.initialDelay", "Delay between restarts in the case where we retry to restart the fabric plugin", i18n.TimeDurationType) @@ -216,8 +219,8 @@ var ( ConfigPluginBlockchainFabricFabconnectPrefixShort = ffc("config.plugins.blockchain[].fabric.fabconnect.prefixShort", "The prefix that will be used for Fabconnect specific query parameters when FireFly makes requests to Fabconnect", i18n.StringType) ConfigPluginBlockchainFabricFabconnectSigner = ffc("config.plugins.blockchain[].fabric.fabconnect.signer", "The Fabric signing key to use when submitting transactions to Fabconnect", i18n.StringType) ConfigPluginBlockchainFabricFabconnectTopic = ffc("config.plugins.blockchain[].fabric.fabconnect.topic", "The websocket listen topic that the node should register on, which is important if there are multiple nodes using a single Fabconnect", i18n.StringType) - ConfigPluginBlockchainFabricFabconnectURL = ffc("config.plugins.blockchain[].fabric.fabconnect.url", "The URL of the Fabconnect instance", "URL "+i18n.StringType) - ConfigPluginBlockchainFabricFabconnectProxyURL = ffc("config.plugins.blockchain[].fabric.fabconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Fabconnect", "URL "+i18n.StringType) + ConfigPluginBlockchainFabricFabconnectURL = ffc("config.plugins.blockchain[].fabric.fabconnect.url", "The URL of the Fabconnect instance", urlStringType) + ConfigPluginBlockchainFabricFabconnectProxyURL = ffc("config.plugins.blockchain[].fabric.fabconnect.proxy.url", "Optional HTTP proxy server to use when connecting to Fabconnect", urlStringType) ConfigPluginBlockchainFabricFabconnectChaincode = ffc("config.plugins.blockchain[].fabric.fabconnect.chaincode", "The name of the Fabric chaincode that FireFly will use for BatchPin transactions (deprecated - use fireflyContract[].chaincode)", i18n.StringType) ConfigPluginBlockchainFabricFabconnectChannel = ffc("config.plugins.blockchain[].fabric.fabconnect.channel", "The Fabric channel that FireFly will use for BatchPin transactions", i18n.StringType) @@ -244,9 +247,9 @@ var ( ConfigDataexchangeFfdxInitEnabled = ffc("config.dataexchange.ffdx.initEnabled", "Instructs FireFly to always post all current nodes to the `/init` API before connecting or reconnecting to the connector", i18n.BooleanType) ConfigDataexchangeFfdxManifestEnabled = ffc("config.dataexchange.ffdx.manifestEnabled", "Determines whether to require+validate a manifest from other DX instances in the network. Must be supported by the connector", i18n.StringType) - ConfigDataexchangeFfdxURL = ffc("config.dataexchange.ffdx.url", "The URL of the Data Exchange instance", "URL "+i18n.StringType) + ConfigDataexchangeFfdxURL = ffc("config.dataexchange.ffdx.url", "The URL of the Data Exchange instance", urlStringType) - ConfigDataexchangeFfdxProxyURL = ffc("config.dataexchange.ffdx.proxy.url", "Optional HTTP proxy server to use when connecting to the Data Exchange", "URL "+i18n.StringType) + ConfigDataexchangeFfdxProxyURL = ffc("config.dataexchange.ffdx.proxy.url", "Optional HTTP proxy server to use when connecting to the Data Exchange", urlStringType) ConfigPluginDataexchange = ffc("config.plugins.dataexchange", "The array of configured Data Exchange plugins ", i18n.StringType) ConfigPluginDataexchangeType = ffc("config.plugins.dataexchange[].type", "The Data Exchange plugin to use", i18n.StringType) @@ -254,13 +257,13 @@ var ( ConfigPluginDataexchangeFfdxInitEnabled = ffc("config.plugins.dataexchange[].ffdx.initEnabled", "Instructs FireFly to always post all current nodes to the `/init` API before connecting or reconnecting to the connector", i18n.BooleanType) ConfigPluginDataexchangeFfdxManifestEnabled = ffc("config.plugins.dataexchange[].ffdx.manifestEnabled", "Determines whether to require+validate a manifest from other DX instances in the network. Must be supported by the connector", i18n.StringType) - ConfigPluginDataexchangeFfdxURL = ffc("config.plugins.dataexchange[].ffdx.url", "The URL of the Data Exchange instance", "URL "+i18n.StringType) + ConfigPluginDataexchangeFfdxURL = ffc("config.plugins.dataexchange[].ffdx.url", "The URL of the Data Exchange instance", urlStringType) ConfigPluginDataexchangeFfdxBackgroundStart = ffc("config.plugins.dataexchange[].ffdx.backgroundStart.enabled", "Start the data exchange plugin in the background and enter retry loop if failed to start", i18n.BooleanType) ConfigPluginDataexchangeFfdxBackgroundStartInitialDelay = ffc("config.plugins.dataexchange[].ffdx.backgroundStart.initialDelay", "Delay between restarts in the case where we retry to restart the data exchange plugin", i18n.TimeDurationType) ConfigPluginDataexchangeFfdxBackgroundStartMaxDelay = ffc("config.plugins.dataexchange[].ffdx.backgroundStart.maxDelay", "Max delay between restarts in the case where we retry to restart the data exchange plugin", i18n.TimeDurationType) ConfigPluginDataexchangeFfdxBackgroundStartFactor = ffc("config.plugins.dataexchange[].ffdx.backgroundStart.factor", "Set the factor by which the delay increases when retrying", i18n.FloatType) - ConfigPluginDataexchangeFfdxProxyURL = ffc("config.plugins.dataexchange[].ffdx.proxy.url", "Optional HTTP proxy server to use when connecting to the Data Exchange", "URL "+i18n.StringType) + ConfigPluginDataexchangeFfdxProxyURL = ffc("config.plugins.dataexchange[].ffdx.proxy.url", "Optional HTTP proxy server to use when connecting to the Data Exchange", urlStringType) ConfigDebugPort = ffc("config.debug.port", "An HTTP port on which to enable the go debugger", i18n.IntType) ConfigDebugAddress = ffc("config.debug.address", "The HTTP interface the go debugger binds to", i18n.StringType) @@ -288,7 +291,7 @@ var ( ConfigHTTPAddress = ffc("config.http.address", "The IP address on which the HTTP API should listen", "IP Address "+i18n.StringType) ConfigHTTPPort = ffc("config.http.port", "The port on which the HTTP API should listen", i18n.IntType) - ConfigHTTPPublicURL = ffc("config.http.publicURL", "The fully qualified public URL for the API. This is used for building URLs in HTTP responses and in OpenAPI Spec generation", "URL "+i18n.StringType) + ConfigHTTPPublicURL = ffc("config.http.publicURL", "The fully qualified public URL for the API. This is used for building URLs in HTTP responses and in OpenAPI Spec generation", urlStringType) ConfigHTTPReadTimeout = ffc("config.http.readTimeout", "The maximum time to wait when reading from an HTTP connection", i18n.TimeDurationType) ConfigHTTPWriteTimeout = ffc("config.http.writeTimeout", "The maximum time to wait when writing to an HTTP connection", i18n.TimeDurationType) @@ -321,7 +324,7 @@ var ( ConfigMetricsEnabled = ffc("config.metrics.enabled", "Enables the metrics API", i18n.BooleanType) ConfigMetricsPath = ffc("config.metrics.path", "The path from which to serve the Prometheus metrics", i18n.StringType) ConfigMetricsPort = ffc("config.metrics.port", "The port on which the metrics HTTP API should listen", i18n.IntType) - ConfigMetricsPublicURL = ffc("config.metrics.publicURL", "The fully qualified public URL for the metrics API. This is used for building URLs in HTTP responses and in OpenAPI Spec generation", "URL "+i18n.StringType) + ConfigMetricsPublicURL = ffc("config.metrics.publicURL", "The fully qualified public URL for the metrics API. This is used for building URLs in HTTP responses and in OpenAPI Spec generation", urlStringType) ConfigMetricsReadTimeout = ffc("config.metrics.readTimeout", "The maximum time to wait when reading from an HTTP connection", i18n.TimeDurationType) ConfigMetricsWriteTimeout = ffc("config.metrics.writeTimeout", "The maximum time to wait when writing to an HTTP connection", i18n.TimeDurationType) @@ -367,33 +370,35 @@ var ( ConfigPrivatemessagingBatchTimeout = ffc("config.privatemessaging.batch.timeout", "The timeout to wait for a batch to fill, before sending", i18n.TimeDurationType) ConfigSharedstorageType = ffc("config.sharedstorage.type", "The Shared Storage plugin to use", i18n.StringType) - ConfigSharedstorageIpfsAPIURL = ffc("config.sharedstorage.ipfs.api.url", "The URL for the IPFS API", "URL "+i18n.StringType) - ConfigSharedstorageIpfsAPIProxyURL = ffc("config.sharedstorage.ipfs.api.proxy.url", "Optional HTTP proxy server to use when connecting to the IPFS API", "URL "+i18n.StringType) - ConfigSharedstorageIpfsGatewayURL = ffc("config.sharedstorage.ipfs.gateway.url", "The URL for the IPFS Gateway", "URL "+i18n.StringType) - ConfigSharedstorageIpfsGatewayProxyURL = ffc("config.sharedstorage.ipfs.gateway.proxy.url", "Optional HTTP proxy server to use when connecting to the IPFS Gateway", "URL "+i18n.StringType) + ConfigSharedstorageIpfsAPIURL = ffc("config.sharedstorage.ipfs.api.url", "The URL for the IPFS API", urlStringType) + ConfigSharedstorageIpfsAPIProxyURL = ffc("config.sharedstorage.ipfs.api.proxy.url", "Optional HTTP proxy server to use when connecting to the IPFS API", urlStringType) + ConfigSharedstorageIpfsGatewayURL = ffc("config.sharedstorage.ipfs.gateway.url", "The URL for the IPFS Gateway", urlStringType) + ConfigSharedstorageIpfsGatewayProxyURL = ffc("config.sharedstorage.ipfs.gateway.proxy.url", "Optional HTTP proxy server to use when connecting to the IPFS Gateway", urlStringType) ConfigPluginSharedstorage = ffc("config.plugins.sharedstorage", "The list of configured Shared Storage plugins", i18n.StringType) ConfigPluginSharedstorageName = ffc("config.plugins.sharedstorage[].name", "The name of the Shared Storage plugin to use", i18n.StringType) ConfigPluginSharedstorageType = ffc("config.plugins.sharedstorage[].type", "The Shared Storage plugin to use", i18n.StringType) - ConfigPluginSharedstorageIpfsAPIURL = ffc("config.plugins.sharedstorage[].ipfs.api.url", "The URL for the IPFS API", "URL "+i18n.StringType) - ConfigPluginSharedstorageIpfsAPIProxyURL = ffc("config.plugins.sharedstorage[].ipfs.api.proxy.url", "Optional HTTP proxy server to use when connecting to the IPFS API", "URL "+i18n.StringType) - ConfigPluginSharedstorageIpfsGatewayURL = ffc("config.plugins.sharedstorage[].ipfs.gateway.url", "The URL for the IPFS Gateway", "URL "+i18n.StringType) - ConfigPluginSharedstorageIpfsGatewayProxyURL = ffc("config.plugins.sharedstorage[].ipfs.gateway.proxy.url", "Optional HTTP proxy server to use when connecting to the IPFS Gateway", "URL "+i18n.StringType) + ConfigPluginSharedstorageIpfsAPIURL = ffc("config.plugins.sharedstorage[].ipfs.api.url", "The URL for the IPFS API", urlStringType) + ConfigPluginSharedstorageIpfsAPIProxyURL = ffc("config.plugins.sharedstorage[].ipfs.api.proxy.url", "Optional HTTP proxy server to use when connecting to the IPFS API", urlStringType) + ConfigPluginSharedstorageIpfsGatewayURL = ffc("config.plugins.sharedstorage[].ipfs.gateway.url", "The URL for the IPFS Gateway", urlStringType) + ConfigPluginSharedstorageIpfsGatewayProxyURL = ffc("config.plugins.sharedstorage[].ipfs.gateway.proxy.url", "Optional HTTP proxy server to use when connecting to the IPFS Gateway", urlStringType) - ConfigSubscriptionMax = ffc("config.subscription.max", "The maximum number of pre-defined subscriptions that can exist (note for high fan-out consider connecting a dedicated pub/sub broker to the dispatcher)", i18n.IntType) - ConfigSubscriptionDefaultsBatchSize = ffc("config.subscription.defaults.batchSize", "Default read ahead to enable for subscriptions that do not explicitly configure readahead", i18n.IntType) + ConfigSubscriptionMax = ffc("config.subscription.max", "The maximum number of pre-defined subscriptions that can exist (note for high fan-out consider connecting a dedicated pub/sub broker to the dispatcher)", i18n.IntType) + ConfigSubscriptionDefaultsBatchSize = ffc("config.subscription.defaults.batchSize", "Default read ahead to enable for subscriptions that do not explicitly configure readahead", i18n.IntType) + ConfigSubscriptionDefaultsBatchTimeout = ffc("config.subscription.defaults.batchTimeout", "Default batch timeout", i18n.IntType) + ConfigSubscriptionMaxHistoricalEventScanLength = ffc("config.subscription.events.maxScanLength", "The maximum number of events a search for historical events matching a subscription will index from the database", i18n.IntType) ConfigTokensName = ffc("config.tokens[].name", "A name to identify this token plugin", i18n.StringType) ConfigTokensPlugin = ffc("config.tokens[].plugin", "The type of the token plugin to use", i18n.StringType) - ConfigTokensURL = ffc("config.tokens[].url", "The URL of the token connector", "URL "+i18n.StringType) - ConfigTokensProxyURL = ffc("config.tokens[].proxy.url", "Optional HTTP proxy server to use when connecting to the token connector", "URL "+i18n.StringType) + ConfigTokensURL = ffc("config.tokens[].url", "The URL of the token connector", urlStringType) + ConfigTokensProxyURL = ffc("config.tokens[].proxy.url", "Optional HTTP proxy server to use when connecting to the token connector", urlStringType) ConfigPluginTokens = ffc("config.plugins.tokens", "The token plugin configurations", i18n.StringType) ConfigPluginTokensName = ffc("config.plugins.tokens[].name", "A name to identify this token plugin", i18n.StringType) ConfigPluginTokensBroadcastName = ffc("config.plugins.tokens[].broadcastName", "The name to be used in broadcast messages related to this token plugin, if it differs from the local plugin name", i18n.StringType) ConfigPluginTokensType = ffc("config.plugins.tokens[].type", "The type of the token plugin to use", i18n.StringType) - ConfigPluginTokensURL = ffc("config.plugins.tokens[].fftokens.url", "The URL of the token connector", "URL "+i18n.StringType) - ConfigPluginTokensProxyURL = ffc("config.plugins.tokens[].fftokens.proxy.url", "Optional HTTP proxy server to use when connecting to the token connector", "URL "+i18n.StringType) + ConfigPluginTokensURL = ffc("config.plugins.tokens[].fftokens.url", "The URL of the token connector", urlStringType) + ConfigPluginTokensProxyURL = ffc("config.plugins.tokens[].fftokens.proxy.url", "Optional HTTP proxy server to use when connecting to the token connector", urlStringType) ConfigPluginTokensBackgroundStart = ffc("config.plugins.tokens[].fftokens.backgroundStart.enabled", "Start the tokens plugin in the background and enter retry loop if failed to start", i18n.BooleanType) ConfigPluginTokensBackgroundStartInitialDelay = ffc("config.plugins.tokens[].fftokens.backgroundStart.initialDelay", "Delay between restarts in the case where we retry to restart the token plugin", i18n.TimeDurationType) ConfigPluginTokensBackgroundStartMaxDelay = ffc("config.plugins.tokens[].fftokens.backgroundStart.maxDelay", "Max delay between restarts in the case where we retry to restart the token plugin", i18n.TimeDurationType) diff --git a/internal/coremsgs/en_error_messages.go b/internal/coremsgs/en_error_messages.go index c7a87ff0d..7ad5cec26 100644 --- a/internal/coremsgs/en_error_messages.go +++ b/internal/coremsgs/en_error_messages.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -27,277 +27,280 @@ var ffe = func(key, translation string, statusHint ...int) i18n.ErrorMessageKey //revive:disable var ( - MsgConfigFailed = ffe("FF10101", "Failed to read config") - MsgJSONDecodeFailed = ffe("FF10103", "Failed to decode input JSON") - MsgTLSConfigFailed = ffe("FF10105", "Failed to initialize TLS configuration") - MsgWebsocketClientError = ffe("FF10108", "Error received from WebSocket client: %s") - Msg404NotFound = ffe("FF10109", "Not found", 404) - MsgUnknownBlockchainPlugin = ffe("FF10110", "Unknown blockchain plugin: %s") - MsgEthConnectorRESTErr = ffe("FF10111", "Error from ethereum connector: %s") - MsgDBInitFailed = ffe("FF10112", "Database initialization failed") - MsgDBQueryBuildFailed = ffe("FF10113", "Database query builder failed") - MsgDBBeginFailed = ffe("FF10114", "Database begin transaction failed") - MsgDBQueryFailed = ffe("FF10115", "Database query failed") - MsgDBInsertFailed = ffe("FF10116", "Database insert failed") - MsgDBUpdateFailed = ffe("FF10117", "Database update failed") - MsgDBDeleteFailed = ffe("FF10118", "Database delete failed") - MsgDBCommitFailed = ffe("FF10119", "Database commit failed") - MsgDBMissingJoin = ffe("FF10120", "Database missing expected join entry in table '%s' for id '%s'") - MsgDBReadErr = ffe("FF10121", "Database resultset read error from table '%s'") - MsgUnknownDatabasePlugin = ffe("FF10122", "Unknown database plugin '%s'") - MsgNullDataReferenceID = ffe("FF10123", "Data id is null in message data reference %d") - MsgDupDataReferenceID = ffe("FF10124", "Duplicate data ID in message '%s'", 409) - MsgScanFailed = ffe("FF10125", "Failed to restore type '%T' into '%T'") - MsgUnregisteredBatchType = ffe("FF10126", "Unregistered batch type '%s'") - MsgBatchDispatchTimeout = ffe("FF10127", "Timed out dispatching work to batch") - MsgInitializationNilDepError = ffe("FF10128", "Initialization failed in %s due to unmet dependency") - MsgNilResponseNon204 = ffe("FF10129", "No output from API call") - MsgDataNotFound = ffe("FF10133", "Data not found for message %s", 400) - MsgUnknownSharedStoragePlugin = ffe("FF10134", "Unknown Shared Storage plugin '%s'") - MsgIPFSHashDecodeFailed = ffe("FF10135", "Failed to decode IPFS hash into 32byte value '%s'") - MsgIPFSRESTErr = ffe("FF10136", "Error from IPFS: %s") - MsgSerializationFailed = ffe("FF10137", "Serialization failed") - MsgMissingPluginConfig = ffe("FF10138", "Missing configuration '%s' for %s") - MsgMissingDataHashIndex = ffe("FF10139", "Missing data hash for index '%d' in message", 400) - MsgInvalidEthAddress = ffe("FF10141", "Supplied ethereum address is invalid", 400) - MsgInvalidTezosAddress = ffe("FF10142", "Supplied tezos address is invalid", 400) - Msg404NoResult = ffe("FF10143", "No result found", 404) - MsgUnsupportedSQLOpInFilter = ffe("FF10150", "No SQL mapping implemented for filter operator '%s'", 400) - MsgFilterSortDesc = ffe("FF10154", "Sort field. For multi-field sort use comma separated values (or multiple query values) with '-' prefix for descending") - MsgContextCanceled = ffe("FF00154", "Context cancelled") - MsgDBMigrationFailed = ffe("FF10163", "Database migration failed") - MsgHashMismatch = ffe("FF10164", "Hash mismatch") - MsgDefaultNamespaceNotFound = ffe("FF10166", "namespaces.default '%s' must be included in the namespaces.predefined configuration") - MsgEventTypesParseFail = ffe("FF10168", "Unable to parse list of event types", 400) - MsgUnknownEventType = ffe("FF10169", "Unknown event type '%s'", 400) - MsgIDMismatch = ffe("FF10170", "ID mismatch") - MsgRegexpCompileFailed = ffe("FF10171", "Unable to compile '%s' regexp '%s'") - MsgUnknownEventTransportPlugin = ffe("FF10172", "Unknown event transport plugin: %s") - MsgWSConnectionNotActive = ffe("FF10173", "Websocket connection '%s' no longer active") - MsgWSSubAlreadyInFlight = ffe("FF10174", "Websocket subscription '%s' already has a message in flight") - MsgWSMsgSubNotMatched = ffe("FF10175", "Acknowledgment does not match an inflight event + subscription") - MsgWSClientSentInvalidData = ffe("FF10176", "Invalid data") - MsgWSClientUnknownAction = ffe("FF10177", "Unknown action '%s'") - MsgWSInvalidStartAction = ffe("FF10178", "A start action must set namespace and either a name or ephemeral=true") - MsgWSAutoAckChanged = ffe("FF10179", "The autoack option must be set consistently on all start requests") - MsgWSAutoAckEnabled = ffe("FF10180", "The autoack option is enabled on this connection") - MsgConnSubscriptionNotStarted = ffe("FF10181", "Subscription %v is not started on connection") - MsgDispatcherClosing = ffe("FF10182", "Event dispatcher closing") - MsgMaxFilterSkip = ffe("FF10183", "You have reached the maximum pagination limit for this query (%d)", 400) - MsgMaxFilterLimit = ffe("FF10184", "Your query exceeds the maximum filter limit (%d)", 400) - MsgAPIServerStaticFail = ffe("FF10185", "An error occurred loading static content", 500) - MsgEventListenerClosing = ffe("FF10186", "Event listener closing") - MsgNamespaceDoesNotExist = ffe("FF10187", "Namespace does not exist", 404) - MsgInvalidSubscription = ffe("FF10189", "Invalid subscription", 400) - MsgMismatchedTransport = ffe("FF10190", "Connection ID '%s' appears not to be unique between transport '%s' and '%s'", 400) - MsgInvalidFirstEvent = ffe("FF10191", "Invalid firstEvent definition - must be 'newest','oldest' or a sequence number", 400) - MsgNumberMustBeGreaterEqual = ffe("FF10192", "Number must be greater than or equal to %d", 400) - MsgAlreadyExists = ffe("FF10193", "A %s with name '%s:%s' already exists", 409) - MsgJSONValidatorBadRef = ffe("FF10194", "Cannot use JSON validator for data with type '%s' and validator reference '%v'", 400) - MsgDatatypeNotFound = ffe("FF10195", "Datatype '%v' not found", 400) - MsgSchemaLoadFailed = ffe("FF10196", "Datatype '%s' schema invalid", 400) - MsgDataCannotBeValidated = ffe("FF10197", "Data cannot be validated", 400) - MsgJSONDataInvalidPerSchema = ffe("FF10198", "Data does not conform to the JSON schema of datatype '%s': %s", 400) - MsgDataValueIsNull = ffe("FF10199", "Data value is null", 400) - MsgDataInvalidHash = ffe("FF10201", "Invalid data: hashes do not match Hash=%s Expected=%s", 400) - MsgDataReferenceUnresolvable = ffe("FF10204", "Data reference %d cannot be resolved", 400) - MsgDataMissing = ffe("FF10205", "Data entry %d has neither 'id' to refer to existing data, or 'value' to include in-line JSON data", 400) - MsgAuthorInvalid = ffe("FF10206", "Invalid author specified", 400) - MsgMessageNotFound = ffe("FF10207", "Message '%s' not found", 404) - MsgBatchNotFound = ffe("FF10209", "Batch '%s' not found for message", 404) - MsgMessageTXNotSet = ffe("FF10210", "Message '%s' does not have an assigned transaction", 404) - MsgOwnerMissing = ffe("FF10211", "Owner missing", 400) - MsgUnknownIdentityPlugin = ffe("FF10212", "Unknown Identity plugin '%s'") - MsgUnknownDataExchangePlugin = ffe("FF10213", "Unknown Data Exchange plugin '%s'") - MsgParentIdentityNotFound = ffe("FF10214", "Identity '%s' not found in identity chain for %s '%s'") - MsgInvalidSigningIdentity = ffe("FF10215", "Invalid signing identity") - MsgNodeAndOrgIDMustBeSet = ffe("FF10216", "node.name, org.name and org.key must be configured first", 409) - MsgBlobStreamingFailed = ffe("FF10217", "Blob streaming terminated with error", 500) - MsgNodeNotFound = ffe("FF10224", "Node with name or identity '%s' not found", 400) - MsgLocalNodeNotSet = ffe("FF10225", "Unable to resolve the local node. Please ensure node.name is configured", 500) - MsgGroupNotFound = ffe("FF10226", "Group '%s' not found", 404) - MsgDXRESTErr = ffe("FF10229", "Error from data exchange: %s") - MsgInvalidHex = ffe("FF10231", "Invalid hex supplied", 400) - MsgInvalidWrongLenB32 = ffe("FF00107", "Byte length must be 32 (64 hex characters)", 400) - MsgNodeNotFoundInOrg = ffe("FF10233", "Unable to find any nodes owned by org '%s', or parent orgs", 400) - MsgDXBadResponse = ffe("FF10237", "Unexpected '%s' in data exchange response: %s") - MsgDXBadHash = ffe("FF10238", "Unexpected hash returned from data exchange upload. Hash=%s Expected=%s") - MsgBlobNotFound = ffe("FF10239", "No blob has been uploaded or confirmed received, with hash=%s", 404) - MsgDownloadBlobFailed = ffe("FF10240", "Error download blob with reference '%s' from local data exchange") - MsgDataDoesNotHaveBlob = ffe("FF10241", "Data does not have a blob attachment", 404) - MsgWebhookURLEmpty = ffe("FF10242", "Webhook subscription option 'url' cannot be empty", 400) - MsgWebhookInvalidStringMap = ffe("FF10243", "Webhook subscription option '%s' must be map of string values. %s=%T", 400) - MsgWebsocketsNoData = ffe("FF10244", "Websockets subscriptions do not support streaming the full data payload, just the references (withData must be false)", 400) - MsgWebhooksWithData = ffe("FF10245", "Webhook subscriptions require the full data payload (withData must be true)", 400) - MsgWebhooksReplyBadJSON = ffe("FF10257", "Failed to process reply from webhook as JSON") - MsgRequestTimeout = ffe("FF10260", "The request with id '%s' timed out after %.2fms", 408) - MsgRequestReplyTagRequired = ffe("FF10261", "For request messages 'header.tag' must be set on the request message to route it to a suitable responder", 400) - MsgRequestCannotHaveCID = ffe("FF10262", "For request messages 'header.cid' must be unset", 400) - MsgSystemTransportInternal = ffe("FF10266", "You cannot create subscriptions on the system events transport") - MsgFilterCountNotSupported = ffe("FF10267", "This query does not support generating a count of all results") - MsgRejected = ffe("FF10269", "Message with ID '%s' was rejected. Please check the FireFly logs for more information") - MsgRequestMustBePrivate = ffe("FF10271", "For request messages you must specify a group of private recipients", 400) - MsgUnknownTokensPlugin = ffe("FF10272", "Unknown tokens plugin '%s'", 400) - MsgMissingTokensPluginConfig = ffe("FF10273", "Invalid tokens configuration - name and plugin are required", 400) - MsgTokensRESTErr = ffe("FF10274", "Error from tokens service: %s") - MsgTokenPoolDuplicate = ffe("FF10275", "Duplicate token pool: %s", 409) - MsgTokenPoolRejected = ffe("FF10276", "Token pool with ID '%s' was rejected. Please check the FireFly logs for more information") - MsgIdentityNotFoundByString = ffe("FF10277", "Identity could not be resolved via lookup string '%s'") - MsgAuthorOrgSigningKeyMismatch = ffe("FF10279", "Author organization '%s' is not associated with signing key '%s'") - MsgCannotTransferToSelf = ffe("FF10280", "From and to addresses must be different", 400) - MsgLocalOrgNotSet = ffe("FF10281", "Unable to resolve the local root org. Please ensure org.name is configured", 500) - MsgTezosconnectRESTErr = ffe("FF10283", "Error from tezos connector: %s") - MsgFabconnectRESTErr = ffe("FF10284", "Error from fabconnect: %s") - MsgInvalidIdentity = ffe("FF10285", "Supplied Fabric signer identity is invalid", 400) - MsgFailedToDecodeCertificate = ffe("FF10286", "Failed to decode certificate: %s", 500) - MsgInvalidMessageType = ffe("FF10287", "Invalid message type - allowed types are %s", 400) - MsgWSClosed = ffe("FF10290", "Websocket closed") - MsgFieldNotSpecified = ffe("FF10292", "Field '%s' must be specified", 400) - MsgTokenPoolNotActive = ffe("FF10293", "Token pool is not yet activated") - MsgHistogramCollectionParam = ffe("FF10297", "Collection to fetch") - MsgInvalidNumberOfIntervals = ffe("FF10298", "Number of time intervals must be between %d and %d", 400) - MsgInvalidChartNumberParam = ffe("FF10299", "Invalid %s. Must be a number.", 400) - MsgHistogramInvalidTimes = ffe("FF10300", "Start time must be before end time", 400) - MsgUnsupportedCollection = ffe("FF10301", "%s collection is not supported", 400) - MsgContractInterfaceExists = ffe("FF10302", "A contract interface already exists in the namespace: '%s' with name: '%s' and version: '%s'", 409) - MsgContractInterfaceNotFound = ffe("FF10303", "Contract interface %s not found", 404) - MsgContractMissingInputArgument = ffe("FF10304", "Missing required input argument '%s'", 400) - MsgContractWrongInputType = ffe("FF10305", "Input '%v' is of type '%v' not expected type of '%v'", 400) - MsgContractMissingInputField = ffe("FF10306", "Expected object of type '%v' to contain field named '%v' but it was missing", 400) - MsgContractMapInputType = ffe("FF10307", "Unable to map input type '%v' to known FireFly type - was expecting '%v'", 400) - MsgContractByteDecode = ffe("FF10308", "Unable to decode field '%v' as bytes", 400) - MsgContractInternalType = ffe("FF10309", "Input '%v' of type '%v' is not compatible blockchain internalType of '%v'", 400) - MsgContractLocationInvalid = ffe("FF10310", "Failed to validate contract location: %v", 400) - MsgContractParamInvalid = ffe("FF10311", "Failed to validate contract param: %v", 400) - MsgContractListenerNameExists = ffe("FF10312", "A contract listener already exists in the namespace: '%s' with name: '%s'", 409) - MsgContractMethodNotSet = ffe("FF10313", "Either an interface reference and method path, or in-line method definition, must be supplied on invoke contract request", 400) - MsgContractMethodResolveError = ffe("FF10315", "Unable to resolve contract method: %s", 400) - MsgContractLocationExists = ffe("FF10316", "The contract location cannot be changed after it is created", 400) - MsgListenerNoEvent = ffe("FF10317", "Either an interface reference and event path, or in-line event definition must be supplied when creating a contract listener", 400) - MsgListenerEventNotFound = ffe("FF10318", "No event was found in namespace '%s' with id '%s'", 400) - MsgEventNameMustBeSet = ffe("FF10319", "Event name must be set", 400) - MsgMethodNameMustBeSet = ffe("FF10320", "Method name must be set", 400) - MsgContractEventResolveError = ffe("FF10321", "Unable to resolve contract event", 400) - MsgQueryOpUnsupportedMod = ffe("FF10322", "Operation '%s' on '%s' does not support modifiers", 400) - MsgDXBadSize = ffe("FF10323", "Unexpected size returned from data exchange upload. Size=%d Expected=%d") - MsgTooLargeBroadcast = ffe("FF10327", "Message size %.2fkb is too large for the max broadcast batch size of %.2fkb", 400) - MsgTooLargePrivate = ffe("FF10328", "Message size %.2fkb is too large for the max private message size of %.2fkb", 400) - MsgManifestMismatch = ffe("FF10329", "Manifest mismatch overriding '%s' status as failure: '%s'", 400) - MsgFFIValidationFail = ffe("FF10331", "Field '%s' does not validate against the provided schema", 400) - MsgFFISchemaParseFail = ffe("FF10332", "Failed to parse schema for param '%s'", 400) - MsgFFISchemaCompileFail = ffe("FF10333", "Failed compile schema for param '%s'", 400) - MsgPluginInitializationFailed = ffe("FF10334", "Plugin initialization error", 500) - MsgUnknownTransactionType = ffe("FF10336", "Unknown transaction type '%s'", 400) - MsgGoTemplateCompileFailed = ffe("FF10337", "Go template compilation for '%s' failed: %s", 500) - MsgGoTemplateExecuteFailed = ffe("FF10338", "Go template execution for '%s' failed: %s", 500) - MsgAddressResolveFailed = ffe("FF10339", "Failed to resolve signing key string '%s': %s", 500) - MsgAddressResolveBadStatus = ffe("FF10340", "Failed to resolve signing key string '%s' [%d]: %s", 500) - MsgAddressResolveBadResData = ffe("FF10341", "Failed to resolve signing key string '%s' - invalid address returned '%s': %s", 500) - MsgDXNotInitialized = ffe("FF10342", "Data exchange is initializing") - MsgDBLockFailed = ffe("FF10345", "Database lock failed") - MsgFFIGenerationFailed = ffe("FF10346", "Error generating smart contract interface: %s", 400) - MsgFFIGenerationUnsupported = ffe("FF10347", "Smart contract interface generation is not supported by this blockchain plugin", 400) - MsgBlobHashMismatch = ffe("FF10348", "Blob hash mismatch sent=%s received=%s", 400) - MsgDIDResolverUnknown = ffe("FF10349", "DID resolver unknown for DID: %s", 400) - MsgIdentityNotOrg = ffe("FF10350", "Identity '%s' with DID '%s' is not an organization", 400) - MsgIdentityNotNode = ffe("FF10351", "Identity '%s' with DID '%s' is not a node", 400) - MsgBlockchainKeyNotSet = ffe("FF10352", "No blockchain key specified", 400) - MsgNoVerifierForIdentity = ffe("FF10353", "No %s verifier registered for identity %s", 400) - MsgNodeMissingBlockchainKey = ffe("FF10354", "No default signing key or organization signing key configured for this namespace", 400) - MsgAuthorRegistrationMismatch = ffe("FF10355", "Verifier '%s' cannot be used for signing with author '%s'. Verifier registered to '%s'", 400) - MsgAuthorMissingForKey = ffe("FF10356", "Key '%s' has not been registered by any identity, and a separate 'author' was not supplied", 404) - MsgAuthorIncorrectForRootReg = ffe("FF10357", "Author namespace '%s' and DID '%s' combination invalid for root organization registration", 400) - MsgKeyIdentityMissing = ffe("FF10358", "Identity owner of key '%s' not found", 500) - MsgIdentityChainLoop = ffe("FF10364", "Loop detected on identity %s in chain for %s (%s)", 400) - MsgInvalidIdentityParentType = ffe("FF10365", "Parent %s (%s) of type %s is invalid for child %s (%s) of type", 400) - MsgParentIdentityMissingClaim = ffe("FF10366", "Parent %s (%s) is invalid (missing claim)", 400) - MsgDXInfoMissingID = ffe("FF10367", "Data exchange endpoint info missing 'id' field", 500) - MsgEventNotFound = ffe("FF10370", "Event with name '%s' not found", 400) - MsgOperationNotSupported = ffe("FF10371", "Operation not supported: %s", 400) - MsgFailedToRetrieve = ffe("FF10372", "Failed to retrieve %s %s", 500) - MsgBlobMissingPublic = ffe("FF10373", "Blob for data %s missing public payload reference while flushing batch", 500) - MsgDBMultiRowConfigError = ffe("FF10374", "Database invalid configuration - using multi-row insert on DB plugin that does not support query syntax for input") - MsgDBNoSequence = ffe("FF10375", "Failed to retrieve sequence for insert row %d (could mean duplicate insert)", 500) - MsgDownloadSharedFailed = ffe("FF10376", "Error downloading data with reference '%s' from shared storage") - MsgDownloadBatchMaxBytes = ffe("FF10377", "Error downloading batch with reference '%s' from shared storage - maximum size limit reached") - MsgOperationDataIncorrect = ffe("FF10378", "Operation data type incorrect: %T", 400) - MsgDataMissingBlobHash = ffe("FF10379", "Blob for data %s cannot be transferred as it is missing a hash", 500) - MsgUnexpectedDXMessageType = ffe("FF10380", "Unexpected websocket event type from DX plugin: %s", 500) - MsgContractListenerExists = ffe("FF10383", "A contract listener already exists for this combination of topic + location + event", 409) - MsgInvalidOutputOption = ffe("FF10385", "invalid output option '%s'") - MsgInvalidPluginConfiguration = ffe("FF10386", "Invalid %s plugin configuration - name and type are required") - MsgReferenceMarkdownMissing = ffe("FF10387", "Reference markdown file missing: '%s'") - MsgFFSystemReservedName = ffe("FF10388", "Invalid namespace configuration - %s is a reserved name") - MsgInvalidNamespaceMode = ffe("FF10389", "Invalid %s namespace configuration - unknown mode") - MsgNamespaceUnknownPlugin = ffe("FF10390", "Invalid %s namespace configuration - unknown plugin %s") - MsgNamespaceWrongPluginsMultiparty = ffe("FF10391", "Invalid %s namespace configuration - multiparty mode requires database, blockchain, shared storage, and data exchange plugins") - MsgNamespaceNoDatabase = ffe("FF10392", "Invalid %s namespace configuration - a database plugin is required") - MsgNamespaceMultiplePluginType = ffe("FF10394", "Invalid %s namespace configuration - multiple %s plugins provided") - MsgDuplicatePluginName = ffe("FF10395", "Invalid plugin configuration - plugin with name %s already exists", 409) - MsgInvalidFireFlyContractIndex = ffe("FF10396", "No configuration found for FireFly contract at %s") - MsgUnrecognizedNetworkAction = ffe("FF10397", "Unrecognized network action: %s", 400) - MsgOverrideExistingFieldCustomOption = ffe("FF10398", "Cannot override existing field with custom option named '%s'", 400) - MsgTerminateNotSupported = ffe("FF10399", "The 'terminate' operation to mark a switchover of smart contracts is not supported on namespace %s", 400) - MsgDefRejectedBadPayload = ffe("FF10400", "Rejected %s message '%s' - invalid payload") - MsgDefRejectedAuthorBlank = ffe("FF10401", "Rejected %s message '%s' - author is blank") - MsgDefRejectedSignatureMismatch = ffe("FF10402", "Rejected %s message '%s' - signature mismatch") - MsgDefRejectedValidateFail = ffe("FF10403", "Rejected %s '%s' - validate failed") - MsgDefRejectedIDMismatch = ffe("FF10404", "Rejected %s '%s' - ID mismatch with existing record") - MsgDefRejectedLocationMismatch = ffe("FF10405", "Rejected %s '%s' - location mismatch with existing record") - MsgDefRejectedSchemaFail = ffe("FF10406", "Rejected %s '%s' - schema check: %s") - MsgDefRejectedConflict = ffe("FF10407", "Rejected %s '%s' - conflicts with existing: %s") - MsgDefRejectedIdentityNotFound = ffe("FF10408", "Rejected %s '%s' - identity not found: %s") - MsgDefRejectedWrongAuthor = ffe("FF10409", "Rejected %s '%s' - wrong author: %s") - MsgDefRejectedHashMismatch = ffe("FF10410", "Rejected %s '%s' - hash mismatch: %s != %s") - MsgInvalidNamespaceUUID = ffe("FF10411", "Expected 'namespace:' prefix on ID '%s'", 400) - MsgBadNetworkVersion = ffe("FF10412", "Bad network version: %s") - MsgDefinitionRejected = ffe("FF10413", "Definition rejected") - MsgActionNotSupported = ffe("FF10414", "This action is not supported in this namespace", 400) - MsgMessagesNotSupported = ffe("FF10415", "Messages are not supported in this namespace", 400) - MsgInvalidSubscriptionForNetwork = ffe("FF10416", "Subscription name '%s' is invalid according to multiparty network rules in effect (network version=%d)") - MsgBlockchainNotConfigured = ffe("FF10417", "No blockchain plugin configured") - MsgInvalidBatchPinEvent = ffe("FF10418", "BatchPin event is not valid - %s (%s): %s") - MsgDuplicatePluginBroadcastName = ffe("FF10419", "Invalid %s plugin broadcast name: %s - broadcast names must be unique", 409) - MsgInvalidConnectorName = ffe("FF10420", "Could not find name %s for %s connector") - MsgCannotInitLegacyNS = ffe("FF10421", "could not initialize legacy '%s' namespace - found conflicting V1 multi-party config in %s") - MsgInvalidGroupMember = ffe("FF10422", "invalid group member - node '%s' is not owned by '%s' or any of its ancestors") - MsgContractListenerStatusInvalid = ffe("FF10423", "Failed to validate contract listener status: %v", 400) - MsgCacheMissSizeLimitKeyInternal = ffe("FF10424", "could not initialize cache - size limit config key is not provided") - MsgCacheMissTTLKeyInternal = ffe("FF10425", "could not initialize cache - ttl config key is not provided") - MsgCacheConfigKeyMismatchInternal = ffe("FF10426", "could not initialize cache - '%s' and '%s' do not have identical prefix, mismatching prefixes are: '%s','%s'") - MsgCacheUnexpectedSizeKeyNameInternal = ffe("FF10427", "could not initialize cache - '%s' is not an expected size configuration key suffix. Expected values are: 'size', 'limit'") - MsgUnknownVerifierType = ffe("FF10428", "Unknown verifier type", 400) - MsgNotSupportedByBlockchainPlugin = ffe("FF10429", "Not supported by blockchain plugin", 400) - MsgIdempotencyKeyDuplicateMessage = ffe("FF10430", "Idempotency key '%s' already used for message '%s'", 409) - MsgIdempotencyKeyDuplicateTransaction = ffe("FF10431", "Idempotency key '%s' already used for transaction '%s'", 409) - MsgNonIdempotencyKeyConflictTxInsert = ffe("FF10432", "Conflict on insert of transaction '%s'. No existing transaction matching idempotency key '%s' found", 409) - MsgErrorNameMustBeSet = ffe("FF10433", "The name of the error must be set", 400) - MsgContractErrorsResolveError = ffe("FF10434", "Unable to resolve contract errors: %s", 400) - MsgUnknownInterfaceFormat = ffe("FF10435", "Unknown interface format: %s", 400) - MsgUnknownNamespace = ffe("FF10436", "Unknown namespace '%s'", 404) - MsgMissingNamespace = ffe("FF10437", "Missing namespace in request", 400) - MsgDeprecatedResetWithAutoReload = ffe("FF10438", "The deprecated reset API cannot be used when dynamic config reload is enabled", 409) - MsgConfigArrayVsRawConfigMismatch = ffe("FF10439", "Error processing configuration - mismatch between raw and processed array lengths") - MsgDefaultChannelNotConfigured = ffe("FF10440", "No default channel configured for this namespace", 400) - MsgNamespaceInitializing = ffe("FF10441", "Namespace '%s' is initializing", 412) - MsgPinsNotAssigned = ffe("FF10442", "Message cannot be sent because pins have not been assigned") - MsgMethodDoesNotSupportPinning = ffe("FF10443", "This method does not support passing a payload for pinning") - MsgOperationNotFoundInTransaction = ffe("FF10444", "No operation of type %s was found in transaction '%s'") - MsgCannotSetParameterWithMessage = ffe("FF10445", "Cannot provide a value for '%s' when pinning a message", 400) - MsgNamespaceNotStarted = ffe("FF10446", "Namespace '%s' is not started", 412) - MsgNameExists = ffe("FF10447", "Name already exists", 409) - MsgNetworkNameExists = ffe("FF10448", "Network name already exists", 409) - MsgCannotDeletePublished = ffe("FF10449", "Cannot delete an item that has been published", 409) - MsgAlreadyPublished = ffe("FF10450", "Item has already been published", 409) - MsgContractInterfaceNotPublished = ffe("FF10451", "Contract interface '%s' has not been published", 409) - MsgInvalidMessageSigner = ffe("FF10452", "Invalid message '%s'. Key '%s' does not match the signer of the pin: %s") - MsgInvalidMessageIdentity = ffe("FF10453", "Invalid message '%s'. Author '%s' does not match identity registered to %s: %s (%s)") - MsgDuplicateTLSConfig = ffe("FF10454", "Found duplicate TLS Config '%s'", 400) - MsgNotFoundTLSConfig = ffe("FF10455", "Provided TLS Config name '%s' not found for namespace '%s'", 400) - MsgSQLInsertManyOutsideTransaction = ffe("FF10456", "Attempt to perform insert many outside of a transaction", 500) - MsgUnexpectedInterfaceType = ffe("FF10457", "Unexpected interface type: %T", 500) - MsgBlockchainConnectorRESTErrConflict = ffe("FF10458", "Conflict from blockchain connector: %s", 409) - MsgTokensRESTErrConflict = ffe("FF10459", "Conflict from tokens service: %s", 409) - MsgBatchWithDataNotSupported = ffe("FF10460", "Provided subscription '%s' enables batching and withData which is not supported", 400) - MsgBatchDeliveryNotSupported = ffe("FF10461", "Batch delivery not supported by transport '%s'", 400) + MsgConfigFailed = ffe("FF10101", "Failed to read config") + MsgJSONDecodeFailed = ffe("FF10103", "Failed to decode input JSON") + MsgTLSConfigFailed = ffe("FF10105", "Failed to initialize TLS configuration") + MsgWebsocketClientError = ffe("FF10108", "Error received from WebSocket client: %s") + Msg404NotFound = ffe("FF10109", "Not found", 404) + MsgUnknownBlockchainPlugin = ffe("FF10110", "Unknown blockchain plugin: %s") + MsgEthConnectorRESTErr = ffe("FF10111", "Error from ethereum connector: %s") + MsgDBInitFailed = ffe("FF10112", "Database initialization failed") + MsgDBQueryBuildFailed = ffe("FF10113", "Database query builder failed") + MsgDBBeginFailed = ffe("FF10114", "Database begin transaction failed") + MsgDBQueryFailed = ffe("FF10115", "Database query failed") + MsgDBInsertFailed = ffe("FF10116", "Database insert failed") + MsgDBUpdateFailed = ffe("FF10117", "Database update failed") + MsgDBDeleteFailed = ffe("FF10118", "Database delete failed") + MsgDBCommitFailed = ffe("FF10119", "Database commit failed") + MsgDBMissingJoin = ffe("FF10120", "Database missing expected join entry in table '%s' for id '%s'") + MsgDBReadErr = ffe("FF10121", "Database resultset read error from table '%s'") + MsgUnknownDatabasePlugin = ffe("FF10122", "Unknown database plugin '%s'") + MsgNullDataReferenceID = ffe("FF10123", "Data id is null in message data reference %d") + MsgDupDataReferenceID = ffe("FF10124", "Duplicate data ID in message '%s'", 409) + MsgScanFailed = ffe("FF10125", "Failed to restore type '%T' into '%T'") + MsgUnregisteredBatchType = ffe("FF10126", "Unregistered batch type '%s'") + MsgBatchDispatchTimeout = ffe("FF10127", "Timed out dispatching work to batch") + MsgInitializationNilDepError = ffe("FF10128", "Initialization failed in %s due to unmet dependency") + MsgNilResponseNon204 = ffe("FF10129", "No output from API call") + MsgDataNotFound = ffe("FF10133", "Data not found for message %s", 400) + MsgUnknownSharedStoragePlugin = ffe("FF10134", "Unknown Shared Storage plugin '%s'") + MsgIPFSHashDecodeFailed = ffe("FF10135", "Failed to decode IPFS hash into 32byte value '%s'") + MsgIPFSRESTErr = ffe("FF10136", "Error from IPFS: %s") + MsgSerializationFailed = ffe("FF10137", "Serialization failed") + MsgMissingPluginConfig = ffe("FF10138", "Missing configuration '%s' for %s") + MsgMissingDataHashIndex = ffe("FF10139", "Missing data hash for index '%d' in message", 400) + MsgInvalidEthAddress = ffe("FF10141", "Supplied ethereum address is invalid", 400) + MsgInvalidTezosAddress = ffe("FF10142", "Supplied tezos address is invalid", 400) + Msg404NoResult = ffe("FF10143", "No result found", 404) + MsgUnsupportedSQLOpInFilter = ffe("FF10150", "No SQL mapping implemented for filter operator '%s'", 400) + MsgFilterSortDesc = ffe("FF10154", "Sort field. For multi-field sort use comma separated values (or multiple query values) with '-' prefix for descending") + MsgContextCanceled = ffe("FF00154", "Context cancelled") + MsgDBMigrationFailed = ffe("FF10163", "Database migration failed") + MsgHashMismatch = ffe("FF10164", "Hash mismatch") + MsgDefaultNamespaceNotFound = ffe("FF10166", "namespaces.default '%s' must be included in the namespaces.predefined configuration") + MsgEventTypesParseFail = ffe("FF10168", "Unable to parse list of event types", 400) + MsgUnknownEventType = ffe("FF10169", "Unknown event type '%s'", 400) + MsgIDMismatch = ffe("FF10170", "ID mismatch") + MsgRegexpCompileFailed = ffe("FF10171", "Unable to compile '%s' regexp '%s'") + MsgUnknownEventTransportPlugin = ffe("FF10172", "Unknown event transport plugin: %s") + MsgWSConnectionNotActive = ffe("FF10173", "Websocket connection '%s' no longer active") + MsgWSSubAlreadyInFlight = ffe("FF10174", "Websocket subscription '%s' already has a message in flight") + MsgWSMsgSubNotMatched = ffe("FF10175", "Acknowledgment does not match an inflight event + subscription") + MsgWSClientSentInvalidData = ffe("FF10176", "Invalid data") + MsgWSClientUnknownAction = ffe("FF10177", "Unknown action '%s'") + MsgWSInvalidStartAction = ffe("FF10178", "A start action must set namespace and either a name or ephemeral=true") + MsgWSAutoAckChanged = ffe("FF10179", "The autoack option must be set consistently on all start requests") + MsgWSAutoAckEnabled = ffe("FF10180", "The autoack option is enabled on this connection") + MsgConnSubscriptionNotStarted = ffe("FF10181", "Subscription %v is not started on connection") + MsgDispatcherClosing = ffe("FF10182", "Event dispatcher closing") + MsgMaxFilterSkip = ffe("FF10183", "You have reached the maximum pagination limit for this query (%d)", 400) + MsgMaxFilterLimit = ffe("FF10184", "Your query exceeds the maximum filter limit (%d)", 400) + MsgAPIServerStaticFail = ffe("FF10185", "An error occurred loading static content", 500) + MsgEventListenerClosing = ffe("FF10186", "Event listener closing") + MsgNamespaceDoesNotExist = ffe("FF10187", "Namespace does not exist", 404) + MsgInvalidSubscription = ffe("FF10189", "Invalid subscription", 400) + MsgMismatchedTransport = ffe("FF10190", "Connection ID '%s' appears not to be unique between transport '%s' and '%s'", 400) + MsgInvalidFirstEvent = ffe("FF10191", "Invalid firstEvent definition - must be 'newest','oldest' or a sequence number", 400) + MsgNumberMustBeGreaterEqual = ffe("FF10192", "Number must be greater than or equal to %d", 400) + MsgAlreadyExists = ffe("FF10193", "A %s with name '%s:%s' already exists", 409) + MsgJSONValidatorBadRef = ffe("FF10194", "Cannot use JSON validator for data with type '%s' and validator reference '%v'", 400) + MsgDatatypeNotFound = ffe("FF10195", "Datatype '%v' not found", 400) + MsgSchemaLoadFailed = ffe("FF10196", "Datatype '%s' schema invalid", 400) + MsgDataCannotBeValidated = ffe("FF10197", "Data cannot be validated", 400) + MsgJSONDataInvalidPerSchema = ffe("FF10198", "Data does not conform to the JSON schema of datatype '%s': %s", 400) + MsgDataValueIsNull = ffe("FF10199", "Data value is null", 400) + MsgDataInvalidHash = ffe("FF10201", "Invalid data: hashes do not match Hash=%s Expected=%s", 400) + MsgDataReferenceUnresolvable = ffe("FF10204", "Data reference %d cannot be resolved", 400) + MsgDataMissing = ffe("FF10205", "Data entry %d has neither 'id' to refer to existing data, or 'value' to include in-line JSON data", 400) + MsgAuthorInvalid = ffe("FF10206", "Invalid author specified", 400) + MsgMessageNotFound = ffe("FF10207", "Message '%s' not found", 404) + MsgBatchNotFound = ffe("FF10209", "Batch '%s' not found for message", 404) + MsgMessageTXNotSet = ffe("FF10210", "Message '%s' does not have an assigned transaction", 404) + MsgOwnerMissing = ffe("FF10211", "Owner missing", 400) + MsgUnknownIdentityPlugin = ffe("FF10212", "Unknown Identity plugin '%s'") + MsgUnknownDataExchangePlugin = ffe("FF10213", "Unknown Data Exchange plugin '%s'") + MsgParentIdentityNotFound = ffe("FF10214", "Identity '%s' not found in identity chain for %s '%s'") + MsgInvalidSigningIdentity = ffe("FF10215", "Invalid signing identity") + MsgNodeAndOrgIDMustBeSet = ffe("FF10216", "node.name, org.name and org.key must be configured first", 409) + MsgBlobStreamingFailed = ffe("FF10217", "Blob streaming terminated with error", 500) + MsgNodeNotFound = ffe("FF10224", "Node with name or identity '%s' not found", 400) + MsgLocalNodeNotSet = ffe("FF10225", "Unable to resolve the local node. Please ensure node.name is configured", 500) + MsgGroupNotFound = ffe("FF10226", "Group '%s' not found", 404) + MsgDXRESTErr = ffe("FF10229", "Error from data exchange: %s") + MsgInvalidHex = ffe("FF10231", "Invalid hex supplied", 400) + MsgInvalidWrongLenB32 = ffe("FF00107", "Byte length must be 32 (64 hex characters)", 400) + MsgNodeNotFoundInOrg = ffe("FF10233", "Unable to find any nodes owned by org '%s', or parent orgs", 400) + MsgDXBadResponse = ffe("FF10237", "Unexpected '%s' in data exchange response: %s") + MsgDXBadHash = ffe("FF10238", "Unexpected hash returned from data exchange upload. Hash=%s Expected=%s") + MsgBlobNotFound = ffe("FF10239", "No blob has been uploaded or confirmed received, with hash=%s", 404) + MsgDownloadBlobFailed = ffe("FF10240", "Error download blob with reference '%s' from local data exchange") + MsgDataDoesNotHaveBlob = ffe("FF10241", "Data does not have a blob attachment", 404) + MsgWebhookURLEmpty = ffe("FF10242", "Webhook subscription option 'url' cannot be empty", 400) + MsgWebhookInvalidStringMap = ffe("FF10243", "Webhook subscription option '%s' must be map of string values. %s=%T", 400) + MsgWebsocketsNoData = ffe("FF10244", "Websockets subscriptions do not support streaming the full data payload, just the references (withData must be false)", 400) + MsgWebhooksWithData = ffe("FF10245", "Webhook subscriptions require the full data payload (withData must be true)", 400) + MsgWebhooksReplyBadJSON = ffe("FF10257", "Failed to process reply from webhook as JSON") + MsgRequestTimeout = ffe("FF10260", "The request with id '%s' timed out after %.2fms", 408) + MsgRequestReplyTagRequired = ffe("FF10261", "For request messages 'header.tag' must be set on the request message to route it to a suitable responder", 400) + MsgRequestCannotHaveCID = ffe("FF10262", "For request messages 'header.cid' must be unset", 400) + MsgSystemTransportInternal = ffe("FF10266", "You cannot create subscriptions on the system events transport") + MsgFilterCountNotSupported = ffe("FF10267", "This query does not support generating a count of all results") + MsgRejected = ffe("FF10269", "Message with ID '%s' was rejected. Please check the FireFly logs for more information") + MsgRequestMustBePrivate = ffe("FF10271", "For request messages you must specify a group of private recipients", 400) + MsgUnknownTokensPlugin = ffe("FF10272", "Unknown tokens plugin '%s'", 400) + MsgMissingTokensPluginConfig = ffe("FF10273", "Invalid tokens configuration - name and plugin are required", 400) + MsgTokensRESTErr = ffe("FF10274", "Error from tokens service: %s") + MsgTokenPoolDuplicate = ffe("FF10275", "Duplicate token pool: %s", 409) + MsgTokenPoolRejected = ffe("FF10276", "Token pool with ID '%s' was rejected. Please check the FireFly logs for more information") + MsgIdentityNotFoundByString = ffe("FF10277", "Identity could not be resolved via lookup string '%s'") + MsgAuthorOrgSigningKeyMismatch = ffe("FF10279", "Author organization '%s' is not associated with signing key '%s'") + MsgCannotTransferToSelf = ffe("FF10280", "From and to addresses must be different", 400) + MsgLocalOrgNotSet = ffe("FF10281", "Unable to resolve the local root org. Please ensure org.name is configured", 500) + MsgTezosconnectRESTErr = ffe("FF10283", "Error from tezos connector: %s") + MsgFabconnectRESTErr = ffe("FF10284", "Error from fabconnect: %s") + MsgInvalidIdentity = ffe("FF10285", "Supplied Fabric signer identity is invalid", 400) + MsgFailedToDecodeCertificate = ffe("FF10286", "Failed to decode certificate: %s", 500) + MsgInvalidMessageType = ffe("FF10287", "Invalid message type - allowed types are %s", 400) + MsgWSClosed = ffe("FF10290", "Websocket closed") + MsgFieldNotSpecified = ffe("FF10292", "Field '%s' must be specified", 400) + MsgTokenPoolNotActive = ffe("FF10293", "Token pool is not yet activated") + MsgHistogramCollectionParam = ffe("FF10297", "Collection to fetch") + MsgInvalidNumberOfIntervals = ffe("FF10298", "Number of time intervals must be between %d and %d", 400) + MsgInvalidChartNumberParam = ffe("FF10299", "Invalid %s. Must be a number.", 400) + MsgHistogramInvalidTimes = ffe("FF10300", "Start time must be before end time", 400) + MsgUnsupportedCollection = ffe("FF10301", "%s collection is not supported", 400) + MsgContractInterfaceExists = ffe("FF10302", "A contract interface already exists in the namespace: '%s' with name: '%s' and version: '%s'", 409) + MsgContractInterfaceNotFound = ffe("FF10303", "Contract interface %s not found", 404) + MsgContractMissingInputArgument = ffe("FF10304", "Missing required input argument '%s'", 400) + MsgContractWrongInputType = ffe("FF10305", "Input '%v' is of type '%v' not expected type of '%v'", 400) + MsgContractMissingInputField = ffe("FF10306", "Expected object of type '%v' to contain field named '%v' but it was missing", 400) + MsgContractMapInputType = ffe("FF10307", "Unable to map input type '%v' to known FireFly type - was expecting '%v'", 400) + MsgContractByteDecode = ffe("FF10308", "Unable to decode field '%v' as bytes", 400) + MsgContractInternalType = ffe("FF10309", "Input '%v' of type '%v' is not compatible blockchain internalType of '%v'", 400) + MsgContractLocationInvalid = ffe("FF10310", "Failed to validate contract location: %v", 400) + MsgContractParamInvalid = ffe("FF10311", "Failed to validate contract param: %v", 400) + MsgContractListenerNameExists = ffe("FF10312", "A contract listener already exists in the namespace: '%s' with name: '%s'", 409) + MsgContractMethodNotSet = ffe("FF10313", "Either an interface reference and method path, or in-line method definition, must be supplied on invoke contract request", 400) + MsgContractMethodResolveError = ffe("FF10315", "Unable to resolve contract method: %s", 400) + MsgContractLocationExists = ffe("FF10316", "The contract location cannot be changed after it is created", 400) + MsgListenerNoEvent = ffe("FF10317", "Either an interface reference and event path, or in-line event definition must be supplied when creating a contract listener", 400) + MsgListenerEventNotFound = ffe("FF10318", "No event was found in namespace '%s' with id '%s'", 400) + MsgEventNameMustBeSet = ffe("FF10319", "Event name must be set", 400) + MsgMethodNameMustBeSet = ffe("FF10320", "Method name must be set", 400) + MsgContractEventResolveError = ffe("FF10321", "Unable to resolve contract event", 400) + MsgQueryOpUnsupportedMod = ffe("FF10322", "Operation '%s' on '%s' does not support modifiers", 400) + MsgDXBadSize = ffe("FF10323", "Unexpected size returned from data exchange upload. Size=%d Expected=%d") + MsgTooLargeBroadcast = ffe("FF10327", "Message size %.2fkb is too large for the max broadcast batch size of %.2fkb", 400) + MsgTooLargePrivate = ffe("FF10328", "Message size %.2fkb is too large for the max private message size of %.2fkb", 400) + MsgManifestMismatch = ffe("FF10329", "Manifest mismatch overriding '%s' status as failure: '%s'", 400) + MsgFFIValidationFail = ffe("FF10331", "Field '%s' does not validate against the provided schema", 400) + MsgFFISchemaParseFail = ffe("FF10332", "Failed to parse schema for param '%s'", 400) + MsgFFISchemaCompileFail = ffe("FF10333", "Failed compile schema for param '%s'", 400) + MsgPluginInitializationFailed = ffe("FF10334", "Plugin initialization error", 500) + MsgUnknownTransactionType = ffe("FF10336", "Unknown transaction type '%s'", 400) + MsgGoTemplateCompileFailed = ffe("FF10337", "Go template compilation for '%s' failed: %s", 500) + MsgGoTemplateExecuteFailed = ffe("FF10338", "Go template execution for '%s' failed: %s", 500) + MsgAddressResolveFailed = ffe("FF10339", "Failed to resolve signing key string '%s': %s", 500) + MsgAddressResolveBadStatus = ffe("FF10340", "Failed to resolve signing key string '%s' [%d]: %s", 500) + MsgAddressResolveBadResData = ffe("FF10341", "Failed to resolve signing key string '%s' - invalid address returned '%s': %s", 500) + MsgDXNotInitialized = ffe("FF10342", "Data exchange is initializing") + MsgDBLockFailed = ffe("FF10345", "Database lock failed") + MsgFFIGenerationFailed = ffe("FF10346", "Error generating smart contract interface: %s", 400) + MsgFFIGenerationUnsupported = ffe("FF10347", "Smart contract interface generation is not supported by this blockchain plugin", 400) + MsgBlobHashMismatch = ffe("FF10348", "Blob hash mismatch sent=%s received=%s", 400) + MsgDIDResolverUnknown = ffe("FF10349", "DID resolver unknown for DID: %s", 400) + MsgIdentityNotOrg = ffe("FF10350", "Identity '%s' with DID '%s' is not an organization", 400) + MsgIdentityNotNode = ffe("FF10351", "Identity '%s' with DID '%s' is not a node", 400) + MsgBlockchainKeyNotSet = ffe("FF10352", "No blockchain key specified", 400) + MsgNoVerifierForIdentity = ffe("FF10353", "No %s verifier registered for identity %s", 400) + MsgNodeMissingBlockchainKey = ffe("FF10354", "No default signing key or organization signing key configured for this namespace", 400) + MsgAuthorRegistrationMismatch = ffe("FF10355", "Verifier '%s' cannot be used for signing with author '%s'. Verifier registered to '%s'", 400) + MsgAuthorMissingForKey = ffe("FF10356", "Key '%s' has not been registered by any identity, and a separate 'author' was not supplied", 404) + MsgAuthorIncorrectForRootReg = ffe("FF10357", "Author namespace '%s' and DID '%s' combination invalid for root organization registration", 400) + MsgKeyIdentityMissing = ffe("FF10358", "Identity owner of key '%s' not found", 500) + MsgIdentityChainLoop = ffe("FF10364", "Loop detected on identity %s in chain for %s (%s)", 400) + MsgInvalidIdentityParentType = ffe("FF10365", "Parent %s (%s) of type %s is invalid for child %s (%s) of type", 400) + MsgParentIdentityMissingClaim = ffe("FF10366", "Parent %s (%s) is invalid (missing claim)", 400) + MsgDXInfoMissingID = ffe("FF10367", "Data exchange endpoint info missing 'id' field", 500) + MsgEventNotFound = ffe("FF10370", "Event with name '%s' not found", 400) + MsgOperationNotSupported = ffe("FF10371", "Operation not supported: %s", 400) + MsgFailedToRetrieve = ffe("FF10372", "Failed to retrieve %s %s", 500) + MsgBlobMissingPublic = ffe("FF10373", "Blob for data %s missing public payload reference while flushing batch", 500) + MsgDBMultiRowConfigError = ffe("FF10374", "Database invalid configuration - using multi-row insert on DB plugin that does not support query syntax for input") + MsgDBNoSequence = ffe("FF10375", "Failed to retrieve sequence for insert row %d (could mean duplicate insert)", 500) + MsgDownloadSharedFailed = ffe("FF10376", "Error downloading data with reference '%s' from shared storage") + MsgDownloadBatchMaxBytes = ffe("FF10377", "Error downloading batch with reference '%s' from shared storage - maximum size limit reached") + MsgOperationDataIncorrect = ffe("FF10378", "Operation data type incorrect: %T", 400) + MsgDataMissingBlobHash = ffe("FF10379", "Blob for data %s cannot be transferred as it is missing a hash", 500) + MsgUnexpectedDXMessageType = ffe("FF10380", "Unexpected websocket event type from DX plugin: %s", 500) + MsgContractListenerExists = ffe("FF10383", "A contract listener already exists for this combination of topic + location + event", 409) + MsgInvalidOutputOption = ffe("FF10385", "invalid output option '%s'") + MsgInvalidPluginConfiguration = ffe("FF10386", "Invalid %s plugin configuration - name and type are required") + MsgReferenceMarkdownMissing = ffe("FF10387", "Reference markdown file missing: '%s'") + MsgFFSystemReservedName = ffe("FF10388", "Invalid namespace configuration - %s is a reserved name") + MsgInvalidNamespaceMode = ffe("FF10389", "Invalid %s namespace configuration - unknown mode") + MsgNamespaceUnknownPlugin = ffe("FF10390", "Invalid %s namespace configuration - unknown plugin %s") + MsgNamespaceWrongPluginsMultiparty = ffe("FF10391", "Invalid %s namespace configuration - multiparty mode requires database, blockchain, shared storage, and data exchange plugins") + MsgNamespaceNoDatabase = ffe("FF10392", "Invalid %s namespace configuration - a database plugin is required") + MsgNamespaceMultiplePluginType = ffe("FF10394", "Invalid %s namespace configuration - multiple %s plugins provided") + MsgDuplicatePluginName = ffe("FF10395", "Invalid plugin configuration - plugin with name %s already exists", 409) + MsgInvalidFireFlyContractIndex = ffe("FF10396", "No configuration found for FireFly contract at %s") + MsgUnrecognizedNetworkAction = ffe("FF10397", "Unrecognized network action: %s", 400) + MsgOverrideExistingFieldCustomOption = ffe("FF10398", "Cannot override existing field with custom option named '%s'", 400) + MsgTerminateNotSupported = ffe("FF10399", "The 'terminate' operation to mark a switchover of smart contracts is not supported on namespace %s", 400) + MsgDefRejectedBadPayload = ffe("FF10400", "Rejected %s message '%s' - invalid payload") + MsgDefRejectedAuthorBlank = ffe("FF10401", "Rejected %s message '%s' - author is blank") + MsgDefRejectedSignatureMismatch = ffe("FF10402", "Rejected %s message '%s' - signature mismatch") + MsgDefRejectedValidateFail = ffe("FF10403", "Rejected %s '%s' - validate failed") + MsgDefRejectedIDMismatch = ffe("FF10404", "Rejected %s '%s' - ID mismatch with existing record") + MsgDefRejectedLocationMismatch = ffe("FF10405", "Rejected %s '%s' - location mismatch with existing record") + MsgDefRejectedSchemaFail = ffe("FF10406", "Rejected %s '%s' - schema check: %s") + MsgDefRejectedConflict = ffe("FF10407", "Rejected %s '%s' - conflicts with existing: %s", 409) + MsgDefRejectedIdentityNotFound = ffe("FF10408", "Rejected %s '%s' - identity not found: %s") + MsgDefRejectedWrongAuthor = ffe("FF10409", "Rejected %s '%s' - wrong author: %s") + MsgDefRejectedHashMismatch = ffe("FF10410", "Rejected %s '%s' - hash mismatch: %s != %s") + MsgInvalidNamespaceUUID = ffe("FF10411", "Expected 'namespace:' prefix on ID '%s'", 400) + MsgBadNetworkVersion = ffe("FF10412", "Bad network version: %s") + MsgDefinitionRejected = ffe("FF10413", "Definition rejected") + MsgActionNotSupported = ffe("FF10414", "This action is not supported in this namespace", 400) + MsgMessagesNotSupported = ffe("FF10415", "Messages are not supported in this namespace", 400) + MsgInvalidSubscriptionForNetwork = ffe("FF10416", "Subscription name '%s' is invalid according to multiparty network rules in effect (network version=%d)") + MsgBlockchainNotConfigured = ffe("FF10417", "No blockchain plugin configured") + MsgInvalidBatchPinEvent = ffe("FF10418", "BatchPin event is not valid - %s (%s): %s") + MsgDuplicatePluginBroadcastName = ffe("FF10419", "Invalid %s plugin broadcast name: %s - broadcast names must be unique", 409) + MsgInvalidConnectorName = ffe("FF10420", "Could not find name %s for %s connector") + MsgCannotInitLegacyNS = ffe("FF10421", "could not initialize legacy '%s' namespace - found conflicting V1 multi-party config in %s") + MsgInvalidGroupMember = ffe("FF10422", "invalid group member - node '%s' is not owned by '%s' or any of its ancestors") + MsgContractListenerStatusInvalid = ffe("FF10423", "Failed to validate contract listener status: %v", 400) + MsgCacheMissSizeLimitKeyInternal = ffe("FF10424", "could not initialize cache - size limit config key is not provided") + MsgCacheMissTTLKeyInternal = ffe("FF10425", "could not initialize cache - ttl config key is not provided") + MsgCacheConfigKeyMismatchInternal = ffe("FF10426", "could not initialize cache - '%s' and '%s' do not have identical prefix, mismatching prefixes are: '%s','%s'") + MsgCacheUnexpectedSizeKeyNameInternal = ffe("FF10427", "could not initialize cache - '%s' is not an expected size configuration key suffix. Expected values are: 'size', 'limit'") + MsgUnknownVerifierType = ffe("FF10428", "Unknown verifier type", 400) + MsgNotSupportedByBlockchainPlugin = ffe("FF10429", "Not supported by blockchain plugin", 400) + MsgIdempotencyKeyDuplicateMessage = ffe("FF10430", "Idempotency key '%s' already used for message '%s'", 409) + MsgIdempotencyKeyDuplicateTransaction = ffe("FF10431", "Idempotency key '%s' already used for transaction '%s'", 409) + MsgNonIdempotencyKeyConflictTxInsert = ffe("FF10432", "Conflict on insert of transaction '%s'. No existing transaction matching idempotency key '%s' found", 409) + MsgErrorNameMustBeSet = ffe("FF10433", "The name of the error must be set", 400) + MsgContractErrorsResolveError = ffe("FF10434", "Unable to resolve contract errors: %s", 400) + MsgUnknownInterfaceFormat = ffe("FF10435", "Unknown interface format: %s", 400) + MsgUnknownNamespace = ffe("FF10436", "Unknown namespace '%s'", 404) + MsgMissingNamespace = ffe("FF10437", "Missing namespace in request", 400) + MsgDeprecatedResetWithAutoReload = ffe("FF10438", "The deprecated reset API cannot be used when dynamic config reload is enabled", 409) + MsgConfigArrayVsRawConfigMismatch = ffe("FF10439", "Error processing configuration - mismatch between raw and processed array lengths") + MsgDefaultChannelNotConfigured = ffe("FF10440", "No default channel configured for this namespace", 400) + MsgNamespaceInitializing = ffe("FF10441", "Namespace '%s' is initializing", 412) + MsgPinsNotAssigned = ffe("FF10442", "Message cannot be sent because pins have not been assigned") + MsgMethodDoesNotSupportPinning = ffe("FF10443", "This method does not support passing a payload for pinning") + MsgOperationNotFoundInTransaction = ffe("FF10444", "No operation of type %s was found in transaction '%s'") + MsgCannotSetParameterWithMessage = ffe("FF10445", "Cannot provide a value for '%s' when pinning a message", 400) + MsgNamespaceNotStarted = ffe("FF10446", "Namespace '%s' is not started", 412) + MsgNameExists = ffe("FF10447", "Name already exists", 409) + MsgNetworkNameExists = ffe("FF10448", "Network name already exists", 409) + MsgCannotDeletePublished = ffe("FF10449", "Cannot delete an item that has been published", 409) + MsgAlreadyPublished = ffe("FF10450", "Item has already been published", 409) + MsgContractInterfaceNotPublished = ffe("FF10451", "Contract interface '%s' has not been published", 409) + MsgInvalidMessageSigner = ffe("FF10452", "Invalid message '%s'. Key '%s' does not match the signer of the pin: %s") + MsgInvalidMessageIdentity = ffe("FF10453", "Invalid message '%s'. Author '%s' does not match identity registered to %s: %s (%s)") + MsgDuplicateTLSConfig = ffe("FF10454", "Found duplicate TLS Config '%s'", 400) + MsgNotFoundTLSConfig = ffe("FF10455", "Provided TLS Config name '%s' not found for namespace '%s'", 400) + MsgSQLInsertManyOutsideTransaction = ffe("FF10456", "Attempt to perform insert many outside of a transaction", 500) + MsgUnexpectedInterfaceType = ffe("FF10457", "Unexpected interface type: %T", 500) + MsgBlockchainConnectorRESTErrConflict = ffe("FF10458", "Conflict from blockchain connector: %s", 409) + MsgTokensRESTErrConflict = ffe("FF10459", "Conflict from tokens service: %s", 409) + MsgBatchWithDataNotSupported = ffe("FF10460", "Provided subscription '%s' enables batching and withData which is not supported", 400) + MsgBatchDeliveryNotSupported = ffe("FF10461", "Batch delivery not supported by transport '%s'", 400) + MsgWSWrongNamespace = ffe("FF10462", "Websocket request received on a namespace scoped connection but the provided namespace does not match") + MsgMaxSubscriptionEventScanLimitBreached = ffe("FF10463", "Event scan limit breached with start sequence ID %d and end sequence ID %d. Please restrict your query to a narrower range", 400) + MsgSequenceIDDidNotParseToInt = ffe("FF10464", "Could not parse provided %s to an integer sequence ID", 400) ) diff --git a/internal/coremsgs/en_struct_descriptions.go b/internal/coremsgs/en_struct_descriptions.go index 9b88777d8..393af6fa0 100644 --- a/internal/coremsgs/en_struct_descriptions.go +++ b/internal/coremsgs/en_struct_descriptions.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -547,7 +547,7 @@ var ( SubscriptionCoreOptionsFirstEvent = ffm("SubscriptionCoreOptions.firstEvent", "Whether your application would like to receive events from the 'oldest' event emitted by your FireFly node (from the beginning of time), or the 'newest' event (from now), or a specific event sequence. Default is 'newest'") SubscriptionCoreOptionsReadAhead = ffm("SubscriptionCoreOptions.readAhead", "The number of events to stream ahead to your application, while waiting for confirmation of consumption of those events. At least once delivery semantics are used in FireFly, so if your application crashes/reconnects this is the maximum number of events you would expect to be redelivered after it restarts") SubscriptionCoreOptionsWithData = ffm("SubscriptionCoreOptions.withData", "Whether message events delivered over the subscription, should be packaged with the full data of those messages in-line as part of the event JSON payload. Or if the application should make separate REST calls to download that data. May not be supported on some transports.") - SubscriptionCoreOptionsBatch = ffm("SubscriptionCoreOptions.batch", "Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event in the batch. Commonly used with Webhooks to allow events to be delivered and acknowledged in batches.") + SubscriptionCoreOptionsBatch = ffm("SubscriptionCoreOptions.batch", "Events are delivered in batches in an ordered array. The batch size is capped to the readAhead limit. The event payload is always an array even if there is a single event in the batch, allowing client-side optimizations when processing the events in a group. Available for both Webhooks and WebSockets.") SubscriptionCoreOptionsBatchTimeout = ffm("SubscriptionCoreOptions.batchTimeout", "When batching is enabled, the optional timeout to send events even when the batch hasn't filled.") // TokenApproval field descriptions @@ -669,6 +669,7 @@ var ( ContractCallRequestMethodPath = ffm("ContractCallRequest.methodPath", "The pathname of the method on the specified FFI") ContractCallRequestErrors = ffm("ContractCallRequest.errors", "An in-line FFI errors definition for the method to invoke. Alternative to specifying FFI") ContractCallRequestInput = ffm("ContractCallRequest.input", "A map of named inputs. The name and type of each input must be compatible with the FFI description of the method, so that FireFly knows how to serialize it to the blockchain via the connector") + ContractCallRequestOutput = ffm("ContractCallRequest.output", "A map of named outputs") ContractCallRequestOptions = ffm("ContractCallRequest.options", "A map of named inputs that will be passed through to the blockchain connector") ContractCallMessage = ffm("ContractCallRequest.message", "You can specify a message to correlate with the invocation, which can be of type broadcast or private. Your specified method must support on-chain/off-chain correlation by taking a data input on the call") ContractCallIdempotencyKey = ffm("ContractCallRequest.idempotencyKey", "An optional identifier to allow idempotent submission of requests. Stored on the transaction uniquely within a namespace") diff --git a/internal/database/sqlcommon/batch_sql.go b/internal/database/sqlcommon/batch_sql.go index 007209e40..74a128a9d 100644 --- a/internal/database/sqlcommon/batch_sql.go +++ b/internal/database/sqlcommon/batch_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -172,7 +172,7 @@ func (s *SQLCommon) GetBatches(ctx context.Context, namespace string, filter ffa batches = append(batches, batch) } - return batches, s.QueryRes(ctx, batchesTable, tx, fop, fi), err + return batches, s.QueryRes(ctx, batchesTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/blob_sql.go b/internal/database/sqlcommon/blob_sql.go index f702eb7c5..6bbc34b17 100644 --- a/internal/database/sqlcommon/blob_sql.go +++ b/internal/database/sqlcommon/blob_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -162,7 +162,7 @@ func (s *SQLCommon) GetBlobs(ctx context.Context, namespace string, filter ffapi blob = append(blob, d) } - return blob, s.QueryRes(ctx, blobsTable, tx, fop, fi), err + return blob, s.QueryRes(ctx, blobsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/blockchainevents_sql.go b/internal/database/sqlcommon/blockchainevents_sql.go index b83a9d288..f6c13c06b 100644 --- a/internal/database/sqlcommon/blockchainevents_sql.go +++ b/internal/database/sqlcommon/blockchainevents_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -228,5 +228,5 @@ func (s *SQLCommon) GetBlockchainEvents(ctx context.Context, namespace string, f events = append(events, event) } - return events, s.QueryRes(ctx, blockchaineventsTable, tx, fop, fi), err + return events, s.QueryRes(ctx, blockchaineventsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/contractapis_sql.go b/internal/database/sqlcommon/contractapis_sql.go index 92d25d647..4d31b578b 100644 --- a/internal/database/sqlcommon/contractapis_sql.go +++ b/internal/database/sqlcommon/contractapis_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -259,7 +259,7 @@ func (s *SQLCommon) GetContractAPIs(ctx context.Context, namespace string, filte apis = append(apis, api) } - return apis, s.QueryRes(ctx, contractapisTable, tx, fop, fi), err + return apis, s.QueryRes(ctx, contractapisTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/contractlisteners_sql.go b/internal/database/sqlcommon/contractlisteners_sql.go index b0e2d4388..1f9ccfc63 100644 --- a/internal/database/sqlcommon/contractlisteners_sql.go +++ b/internal/database/sqlcommon/contractlisteners_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -194,7 +194,7 @@ func (s *SQLCommon) GetContractListeners(ctx context.Context, namespace string, subs = append(subs, sub) } - return subs, s.QueryRes(ctx, contractlistenersTable, tx, fop, fi), err + return subs, s.QueryRes(ctx, contractlistenersTable, tx, fop, nil, fi), err } func (s *SQLCommon) UpdateContractListener(ctx context.Context, ns string, id *fftypes.UUID, update ffapi.Update) (err error) { diff --git a/internal/database/sqlcommon/data_sql.go b/internal/database/sqlcommon/data_sql.go index e828e3dca..fe63b4788 100644 --- a/internal/database/sqlcommon/data_sql.go +++ b/internal/database/sqlcommon/data_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -322,7 +322,7 @@ func (s *SQLCommon) GetData(ctx context.Context, namespace string, filter ffapi. data = append(data, d) } - return data, s.QueryRes(ctx, dataTable, tx, fop, fi), err + return data, s.QueryRes(ctx, dataTable, tx, fop, nil, fi), err } @@ -354,7 +354,7 @@ func (s *SQLCommon) GetDataRefs(ctx context.Context, namespace string, filter ff refs = append(refs, &ref) } - return refs, s.QueryRes(ctx, dataTable, tx, fop, fi), err + return refs, s.QueryRes(ctx, dataTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/datatype_sql.go b/internal/database/sqlcommon/datatype_sql.go index f33717626..31aa8ae31 100644 --- a/internal/database/sqlcommon/datatype_sql.go +++ b/internal/database/sqlcommon/datatype_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -196,6 +196,6 @@ func (s *SQLCommon) GetDatatypes(ctx context.Context, namespace string, filter f datatypes = append(datatypes, datatype) } - return datatypes, s.QueryRes(ctx, datatypesTable, tx, fop, fi), err + return datatypes, s.QueryRes(ctx, datatypesTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/event_sql.go b/internal/database/sqlcommon/event_sql.go index 574add68e..f0c63f4fd 100644 --- a/internal/database/sqlcommon/event_sql.go +++ b/internal/database/sqlcommon/event_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -196,12 +196,9 @@ func (s *SQLCommon) GetEventByID(ctx context.Context, namespace string, id *ffty return event, nil } -func (s *SQLCommon) GetEvents(ctx context.Context, namespace string, filter ffapi.Filter) (message []*core.Event, res *ffapi.FilterResult, err error) { - - cols := append([]string{}, eventColumns...) - cols = append(cols, s.SequenceColumn()) +func (s *SQLCommon) getEventsGeneric(ctx context.Context, namespace string, sql sq.SelectBuilder, filter ffapi.Filter) (message []*core.Event, res *ffapi.FilterResult, err error) { query, fop, fi, err := s.FilterSelect( - ctx, "", sq.Select(cols...).From(eventsTable), + ctx, "", sql, filter, eventFilterFieldMap, []interface{}{"sequence"}, sq.Eq{"namespace": namespace}) if err != nil { return nil, nil, err @@ -222,6 +219,30 @@ func (s *SQLCommon) GetEvents(ctx context.Context, namespace string, filter ffap events = append(events, event) } - return events, s.QueryRes(ctx, eventsTable, tx, fop, fi), err + return events, s.QueryRes(ctx, eventsTable, tx, fop, nil, fi), err +} + +func (s *SQLCommon) GetEvents(ctx context.Context, namespace string, filter ffapi.Filter) (message []*core.Event, res *ffapi.FilterResult, err error) { + + cols := append([]string{}, eventColumns...) + cols = append(cols, s.SequenceColumn()) + + query := sq.Select(cols...).From(eventsTable) + + return s.getEventsGeneric(ctx, namespace, query, filter) +} + +func (s *SQLCommon) GetEventsInSequenceRange(ctx context.Context, namespace string, filter ffapi.Filter, startSequence int, endSequence int) (message []*core.Event, res *ffapi.FilterResult, err error) { + cols := append([]string{}, eventColumns...) + cols = append(cols, s.SequenceColumn()) + + filter.Limit(0) + + query := sq.Select(cols...).From(eventsTable).Where(sq.GtOrEq{ + "seq": startSequence, + }).Where(sq.Lt{ + "seq": endSequence, + }) + return s.getEventsGeneric(ctx, namespace, query, filter) } diff --git a/internal/database/sqlcommon/event_sql_test.go b/internal/database/sqlcommon/event_sql_test.go index 134460deb..17a95f0ad 100644 --- a/internal/database/sqlcommon/event_sql_test.go +++ b/internal/database/sqlcommon/event_sql_test.go @@ -89,6 +89,56 @@ func TestEventE2EWithDB(t *testing.T) { s.callbacks.AssertExpectations(t) } +func TestGetEventsInSequenceRangeE2EWithDB(t *testing.T) { + + s, cleanup := newSQLiteTestProvider(t) + defer cleanup() + ctx := context.Background() + + s.callbacks.On("OrderedUUIDCollectionNSEvent", database.CollectionEvents, core.ChangeEventTypeCreated, "ns1", mock.Anything, mock.Anything).Return() + + numberOfEvents := 1000 + var eventID *fftypes.UUID + for i := 0; i < numberOfEvents; i++ { + eventID = fftypes.NewUUID() + event := &core.Event{ + ID: eventID, + Namespace: "ns1", + Type: core.EventTypeMessageConfirmed, + Reference: fftypes.NewUUID(), + Correlator: fftypes.NewUUID(), + Topic: fmt.Sprintf("topic%d", i % 2), + Created: fftypes.Now(), + } + err := s.InsertEvent(ctx, event) + assert.NoError(t, err) + } + + fb := database.EventQueryFactory.NewFilter(ctx) + fb.Limit(1000) + + // Check we can get back some events given a start and end + events, _, err := s.GetEventsInSequenceRange(ctx, "ns1", fb.And(), 1, 1001) + assert.Nil(t, err) + assert.Equal(t, 1000, len(events)) + + // Do some basic filtering to show that works + fb2 := database.EventQueryFactory.NewFilter(ctx) + fb2.Limit(1000) + + events, _, err = s.GetEventsInSequenceRange(ctx, "ns1", fb2.And(fb2.Eq("topic", "topic1")), 1, 1001) + assert.Nil(t, err) + assert.Equal(t, 500, len(events)) + + // And get a single record from a range (EventID right now contains the last event ID created) + fb3 := database.EventQueryFactory.NewFilter(ctx) + fb3.Limit(1000) + + events, _, err = s.GetEventsInSequenceRange(ctx, "ns1", fb3.And(fb3.Eq("id", eventID.String())), 1, 1001) + assert.Nil(t, err) + assert.Equal(t, 1, len(events)) +} + func TestInsertEventFailBegin(t *testing.T) { s, mock := newMockProvider().init() mock.ExpectBegin().WillReturnError(fmt.Errorf("pop")) @@ -253,3 +303,29 @@ func TestGettEventsReadMessageFail(t *testing.T) { assert.Regexp(t, "FF10121", err) assert.NoError(t, mock.ExpectationsWereMet()) } + +func TestGetEventsInSequenceRangeQueryFail(t *testing.T) { + s, mock := newMockProvider().init() + mock.ExpectQuery("SELECT .*").WillReturnError(fmt.Errorf("pop")) + f := database.EventQueryFactory.NewFilter(context.Background()).Eq("id", "") + _, _, err := s.GetEventsInSequenceRange(context.Background(), "ns1", f, 0, 100) + assert.Regexp(t, "FF00176", err) + assert.NoError(t, mock.ExpectationsWereMet()) +} + +func TestGetEventsInSequenceRangeBuildQueryFail(t *testing.T) { + s, _ := newMockProvider().init() + f := database.EventQueryFactory.NewFilter(context.Background()).Eq("id", map[bool]bool{true: false}) + _, _, err := s.GetEventsInSequenceRange(context.Background(), "ns1", f, 0, 100) + assert.Regexp(t, "FF00143.*id", err) +} + +func TestGetEventsInSequenceRangeShouldCallGetEventsWhenNoSequencedProvidedAndThrowAnError(t *testing.T) { + s, mock := newMockProvider().init() + mock.ExpectQuery("SELECT .*").WillReturnRows(sqlmock.NewRows([]string{"id", }).AddRow("only one")) + f := database.EventQueryFactory.NewFilter(context.Background()).And() + _, _, err := s.GetEventsInSequenceRange(context.Background(), "ns1", f, -1, -1) + assert.NotNil(t, err) + assert.NoError(t, mock.ExpectationsWereMet()) +} + diff --git a/internal/database/sqlcommon/ffi_errors_sql.go b/internal/database/sqlcommon/ffi_errors_sql.go index 364b90322..9f40815f1 100644 --- a/internal/database/sqlcommon/ffi_errors_sql.go +++ b/internal/database/sqlcommon/ffi_errors_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -137,6 +137,6 @@ func (s *SQLCommon) GetFFIErrors(ctx context.Context, namespace string, filter f errors = append(errors, ci) } - return errors, s.QueryRes(ctx, ffierrorsTable, tx, fop, fi), err + return errors, s.QueryRes(ctx, ffierrorsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/ffi_events_sql.go b/internal/database/sqlcommon/ffi_events_sql.go index 75f9841ce..9e741c62f 100644 --- a/internal/database/sqlcommon/ffi_events_sql.go +++ b/internal/database/sqlcommon/ffi_events_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -165,7 +165,7 @@ func (s *SQLCommon) GetFFIEvents(ctx context.Context, namespace string, filter f events = append(events, ci) } - return events, s.QueryRes(ctx, ffieventsTable, tx, fop, fi), err + return events, s.QueryRes(ctx, ffieventsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/ffi_methods_sql.go b/internal/database/sqlcommon/ffi_methods_sql.go index cb673dfc1..7ad284d0a 100644 --- a/internal/database/sqlcommon/ffi_methods_sql.go +++ b/internal/database/sqlcommon/ffi_methods_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -169,7 +169,7 @@ func (s *SQLCommon) GetFFIMethods(ctx context.Context, namespace string, filter methods = append(methods, ci) } - return methods, s.QueryRes(ctx, ffimethodsTable, tx, fop, fi), err + return methods, s.QueryRes(ctx, ffimethodsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/ffi_sql.go b/internal/database/sqlcommon/ffi_sql.go index c0461d36e..34115a5f2 100644 --- a/internal/database/sqlcommon/ffi_sql.go +++ b/internal/database/sqlcommon/ffi_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -248,7 +248,7 @@ func (s *SQLCommon) GetFFIs(ctx context.Context, namespace string, filter ffapi. ffis = append(ffis, cd) } - return ffis, s.QueryRes(ctx, ffiTable, tx, fop, fi), err + return ffis, s.QueryRes(ctx, ffiTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/group_sql.go b/internal/database/sqlcommon/group_sql.go index 8309129a1..fec8173e4 100644 --- a/internal/database/sqlcommon/group_sql.go +++ b/internal/database/sqlcommon/group_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -306,5 +306,5 @@ func (s *SQLCommon) GetGroups(ctx context.Context, namespace string, filter ffap } } - return groups, s.QueryRes(ctx, groupsTable, tx, fop, fi), err + return groups, s.QueryRes(ctx, groupsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/identity_sql.go b/internal/database/sqlcommon/identity_sql.go index 0ddf43838..3a043483a 100644 --- a/internal/database/sqlcommon/identity_sql.go +++ b/internal/database/sqlcommon/identity_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -229,6 +229,6 @@ func (s *SQLCommon) GetIdentities(ctx context.Context, namespace string, filter identities = append(identities, d) } - return identities, s.QueryRes(ctx, identitiesTable, tx, fop, fi), err + return identities, s.QueryRes(ctx, identitiesTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/message_sql.go b/internal/database/sqlcommon/message_sql.go index 6743cfe7d..f8df55645 100644 --- a/internal/database/sqlcommon/message_sql.go +++ b/internal/database/sqlcommon/message_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -531,7 +531,7 @@ func (s *SQLCommon) getMessagesQuery(ctx context.Context, namespace string, quer return nil, nil, err } } - return msgs, s.QueryRes(ctx, messagesTable, tx, fop, fi), err + return msgs, s.QueryRes(ctx, messagesTable, tx, fop, nil, fi), err } func (s *SQLCommon) GetMessageIDs(ctx context.Context, namespace string, filter ffapi.Filter) (ids []*core.IDAndSequence, err error) { diff --git a/internal/database/sqlcommon/nextpin_sql.go b/internal/database/sqlcommon/nextpin_sql.go index 48afb358b..0c484b724 100644 --- a/internal/database/sqlcommon/nextpin_sql.go +++ b/internal/database/sqlcommon/nextpin_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -138,7 +138,7 @@ func (s *SQLCommon) GetNextPins(ctx context.Context, namespace string, filter ff nextpins = append(nextpins, d) } - return nextpins, s.QueryRes(ctx, pinsTable, tx, fop, fi), err + return nextpins, s.QueryRes(ctx, pinsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/nonce_sql.go b/internal/database/sqlcommon/nonce_sql.go index e42efca3f..f101034ab 100644 --- a/internal/database/sqlcommon/nonce_sql.go +++ b/internal/database/sqlcommon/nonce_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -141,7 +141,7 @@ func (s *SQLCommon) GetNonces(ctx context.Context, filter ffapi.Filter) (message nonce = append(nonce, d) } - return nonce, s.QueryRes(ctx, noncesTable, tx, fop, fi), err + return nonce, s.QueryRes(ctx, noncesTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/offset_sql.go b/internal/database/sqlcommon/offset_sql.go index d84a3cb31..bbd1c329f 100644 --- a/internal/database/sqlcommon/offset_sql.go +++ b/internal/database/sqlcommon/offset_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -171,7 +171,7 @@ func (s *SQLCommon) GetOffsets(ctx context.Context, filter ffapi.Filter) (messag offset = append(offset, d) } - return offset, s.QueryRes(ctx, offsetsTable, tx, fop, fi), err + return offset, s.QueryRes(ctx, offsetsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/operation_sql.go b/internal/database/sqlcommon/operation_sql.go index 46a512267..78c45f7fa 100644 --- a/internal/database/sqlcommon/operation_sql.go +++ b/internal/database/sqlcommon/operation_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -210,7 +210,7 @@ func (s *SQLCommon) GetOperations(ctx context.Context, namespace string, filter ops = append(ops, op) } - return ops, s.QueryRes(ctx, operationsTable, tx, fop, fi), err + return ops, s.QueryRes(ctx, operationsTable, tx, fop, nil, fi), err } func (s *SQLCommon) UpdateOperation(ctx context.Context, ns string, id *fftypes.UUID, filter ffapi.Filter, update ffapi.Update) (updated bool, err error) { diff --git a/internal/database/sqlcommon/pin_sql.go b/internal/database/sqlcommon/pin_sql.go index a2961aa40..bd61079b6 100644 --- a/internal/database/sqlcommon/pin_sql.go +++ b/internal/database/sqlcommon/pin_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -197,7 +197,7 @@ func (s *SQLCommon) GetPins(ctx context.Context, namespace string, filter ffapi. pin = append(pin, d) } - return pin, s.QueryRes(ctx, pinsTable, tx, fop, fi), err + return pin, s.QueryRes(ctx, pinsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/subscription_sql.go b/internal/database/sqlcommon/subscription_sql.go index cb0bf5baa..46b07ff84 100644 --- a/internal/database/sqlcommon/subscription_sql.go +++ b/internal/database/sqlcommon/subscription_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -210,7 +210,7 @@ func (s *SQLCommon) GetSubscriptions(ctx context.Context, namespace string, filt subscription = append(subscription, d) } - return subscription, s.QueryRes(ctx, subscriptionsTable, tx, fop, fi), err + return subscription, s.QueryRes(ctx, subscriptionsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/tokenapproval_sql.go b/internal/database/sqlcommon/tokenapproval_sql.go index a52a7926d..a529c1e97 100644 --- a/internal/database/sqlcommon/tokenapproval_sql.go +++ b/internal/database/sqlcommon/tokenapproval_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -232,7 +232,7 @@ func (s *SQLCommon) GetTokenApprovals(ctx context.Context, namespace string, fil approvals = append(approvals, d) } - return approvals, s.QueryRes(ctx, tokenapprovalTable, tx, fop, fi), err + return approvals, s.QueryRes(ctx, tokenapprovalTable, tx, fop, nil, fi), err } func (s *SQLCommon) UpdateTokenApprovals(ctx context.Context, filter ffapi.Filter, update ffapi.Update) (err error) { diff --git a/internal/database/sqlcommon/tokenbalance_sql.go b/internal/database/sqlcommon/tokenbalance_sql.go index a6b7fdcae..79834117c 100644 --- a/internal/database/sqlcommon/tokenbalance_sql.go +++ b/internal/database/sqlcommon/tokenbalance_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -201,7 +201,7 @@ func (s *SQLCommon) GetTokenBalances(ctx context.Context, namespace string, filt accounts = append(accounts, d) } - return accounts, s.QueryRes(ctx, tokenbalanceTable, tx, fop, fi), err + return accounts, s.QueryRes(ctx, tokenbalanceTable, tx, fop, nil, fi), err } func (s *SQLCommon) GetTokenAccounts(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.TokenAccount, *ffapi.FilterResult, error) { @@ -229,7 +229,7 @@ func (s *SQLCommon) GetTokenAccounts(ctx context.Context, namespace string, filt accounts = append(accounts, &account) } - return accounts, s.QueryRes(ctx, tokenbalanceTable, tx, fop, fi), err + return accounts, s.QueryRes(ctx, tokenbalanceTable, tx, fop, nil, fi), err } func (s *SQLCommon) GetTokenAccountPools(ctx context.Context, namespace, key string, filter ffapi.Filter) ([]*core.TokenAccountPool, *ffapi.FilterResult, error) { @@ -257,7 +257,7 @@ func (s *SQLCommon) GetTokenAccountPools(ctx context.Context, namespace, key str pools = append(pools, &pool) } - return pools, s.QueryRes(ctx, tokenbalanceTable, tx, fop, fi), err + return pools, s.QueryRes(ctx, tokenbalanceTable, tx, fop, nil, fi), err } func (s *SQLCommon) DeleteTokenBalances(ctx context.Context, namespace string, poolID *fftypes.UUID) error { diff --git a/internal/database/sqlcommon/tokenpool_sql.go b/internal/database/sqlcommon/tokenpool_sql.go index a0bc8e9a6..fe5273213 100644 --- a/internal/database/sqlcommon/tokenpool_sql.go +++ b/internal/database/sqlcommon/tokenpool_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -325,7 +325,7 @@ func (s *SQLCommon) GetTokenPools(ctx context.Context, namespace string, filter pools = append(pools, d) } - return pools, s.QueryRes(ctx, tokenpoolTable, tx, fop, fi), err + return pools, s.QueryRes(ctx, tokenpoolTable, tx, fop, nil, fi), err } func (s *SQLCommon) DeleteTokenPool(ctx context.Context, namespace string, id *fftypes.UUID) error { diff --git a/internal/database/sqlcommon/tokentransfer_sql.go b/internal/database/sqlcommon/tokentransfer_sql.go index e5f9970e2..00ea407ef 100644 --- a/internal/database/sqlcommon/tokentransfer_sql.go +++ b/internal/database/sqlcommon/tokentransfer_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -212,7 +212,7 @@ func (s *SQLCommon) GetTokenTransfers(ctx context.Context, namespace string, fil transfers = append(transfers, d) } - return transfers, s.QueryRes(ctx, tokentransferTable, tx, fop, fi), err + return transfers, s.QueryRes(ctx, tokentransferTable, tx, fop, nil, fi), err } func (s *SQLCommon) DeleteTokenTransfers(ctx context.Context, namespace string, poolID *fftypes.UUID) error { diff --git a/internal/database/sqlcommon/transaction_sql.go b/internal/database/sqlcommon/transaction_sql.go index 115b02796..647685b5b 100644 --- a/internal/database/sqlcommon/transaction_sql.go +++ b/internal/database/sqlcommon/transaction_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -226,7 +226,7 @@ func (s *SQLCommon) GetTransactions(ctx context.Context, namespace string, filte transactions = append(transactions, transaction) } - return transactions, s.QueryRes(ctx, transactionsTable, tx, fop, fi), err + return transactions, s.QueryRes(ctx, transactionsTable, tx, fop, nil, fi), err } diff --git a/internal/database/sqlcommon/verifier_sql.go b/internal/database/sqlcommon/verifier_sql.go index c819b9032..af3dd8095 100644 --- a/internal/database/sqlcommon/verifier_sql.go +++ b/internal/database/sqlcommon/verifier_sql.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -193,6 +193,6 @@ func (s *SQLCommon) GetVerifiers(ctx context.Context, namespace string, filter f verifiers = append(verifiers, d) } - return verifiers, s.QueryRes(ctx, verifiersTable, tx, fop, fi), err + return verifiers, s.QueryRes(ctx, verifiersTable, tx, fop, nil, fi), err } diff --git a/internal/dataexchange/ffdx/ffdx.go b/internal/dataexchange/ffdx/ffdx.go index 3d1e1dc17..00c63dd53 100644 --- a/internal/dataexchange/ffdx/ffdx.go +++ b/internal/dataexchange/ffdx/ffdx.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -273,7 +273,7 @@ func (h *FFDX) Capabilities() *dataexchange.Capabilities { return h.capabilities } -func (h *FFDX) beforeConnect(ctx context.Context) error { +func (h *FFDX) beforeConnect(ctx context.Context, w wsclient.WSClient) error { h.initMutex.Lock() defer h.initMutex.Unlock() diff --git a/internal/definitions/sender_contracts.go b/internal/definitions/sender_contracts.go index 30f162feb..7264a9f92 100644 --- a/internal/definitions/sender_contracts.go +++ b/internal/definitions/sender_contracts.go @@ -99,7 +99,7 @@ func (ds *definitionSender) PublishFFI(ctx context.Context, name, version, netwo var sender *sendWrapper err = ds.database.RunAsGroup(ctx, func(ctx context.Context) error { - if ffi, err = ds.contracts.GetFFI(ctx, name, version); err != nil { + if ffi, err = ds.contracts.GetFFIWithChildren(ctx, name, version); err != nil { return err } if ffi.Published { diff --git a/internal/definitions/sender_contracts_test.go b/internal/definitions/sender_contracts_test.go index f9ab92fdf..b0717cc46 100644 --- a/internal/definitions/sender_contracts_test.go +++ b/internal/definitions/sender_contracts_test.go @@ -359,7 +359,7 @@ func TestPublishFFI(t *testing.T) { } ds.mdi.On("GetFFIByNetworkName", context.Background(), "ns1", "ffi1-shared", "1.0").Return(nil, nil) - ds.mcm.On("GetFFI", context.Background(), "ffi1", "1.0").Return(ffi, nil) + ds.mcm.On("GetFFIWithChildren", context.Background(), "ffi1", "1.0").Return(ffi, nil) ds.mcm.On("ResolveFFI", context.Background(), ffi).Return(nil) ds.mim.On("GetRootOrg", context.Background()).Return(&core.Identity{ IdentityBase: core.IdentityBase{ @@ -392,7 +392,7 @@ func TestPublishFFIAlreadyPublished(t *testing.T) { Published: true, } - ds.mcm.On("GetFFI", context.Background(), "ffi1", "1.0").Return(ffi, nil) + ds.mcm.On("GetFFIWithChildren", context.Background(), "ffi1", "1.0").Return(ffi, nil) mockRunAsGroupPassthrough(ds.mdi) _, err := ds.PublishFFI(context.Background(), "ffi1", "1.0", "ffi1-shared", false) @@ -404,7 +404,7 @@ func TestPublishFFIQueryFail(t *testing.T) { defer ds.cleanup(t) ds.multiparty = true - ds.mcm.On("GetFFI", context.Background(), "ffi1", "1.0").Return(nil, fmt.Errorf("pop")) + ds.mcm.On("GetFFIWithChildren", context.Background(), "ffi1", "1.0").Return(nil, fmt.Errorf("pop")) mockRunAsGroupPassthrough(ds.mdi) _, err := ds.PublishFFI(context.Background(), "ffi1", "1.0", "ffi1-shared", false) @@ -423,7 +423,7 @@ func TestPublishFFIResolveFail(t *testing.T) { Published: false, } - ds.mcm.On("GetFFI", context.Background(), "ffi1", "1.0").Return(ffi, nil) + ds.mcm.On("GetFFIWithChildren", context.Background(), "ffi1", "1.0").Return(ffi, nil) ds.mcm.On("ResolveFFI", context.Background(), ffi).Return(fmt.Errorf("pop")) mockRunAsGroupPassthrough(ds.mdi) @@ -446,7 +446,7 @@ func TestPublishFFIPrepareFail(t *testing.T) { } ds.mdi.On("GetFFIByNetworkName", context.Background(), "ns1", "ffi1-shared", "1.0").Return(nil, nil) - ds.mcm.On("GetFFI", context.Background(), "ffi1", "1.0").Return(ffi, nil) + ds.mcm.On("GetFFIWithChildren", context.Background(), "ffi1", "1.0").Return(ffi, nil) ds.mcm.On("ResolveFFI", context.Background(), ffi).Return(nil) ds.mim.On("GetRootOrg", context.Background()).Return(&core.Identity{ IdentityBase: core.IdentityBase{ diff --git a/internal/events/event_dispatcher.go b/internal/events/event_dispatcher.go index a862d2dd5..f97a0174a 100644 --- a/internal/events/event_dispatcher.go +++ b/internal/events/event_dispatcher.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -65,25 +65,21 @@ type eventDispatcher struct { elected bool eventPoller *eventPoller inflight map[fftypes.UUID]*core.Event - eventDelivery chan *core.EventDelivery + eventDelivery chan []*core.EventDelivery mux sync.Mutex namespace string readAhead int batch bool - batchTimeout time.Duration subscription *subscription txHelper txcommon.Helper } func newEventDispatcher(ctx context.Context, enricher *eventEnricher, ei events.Plugin, di database.Plugin, dm data.Manager, bm broadcast.Manager, pm privatemessaging.Manager, connID string, sub *subscription, en *eventNotifier, txHelper txcommon.Helper) *eventDispatcher { ctx, cancelCtx := context.WithCancel(ctx) - readAhead := config.GetUint(coreconfig.SubscriptionDefaultsReadAhead) + readAhead := uint(0) if sub.definition.Options.ReadAhead != nil { readAhead = uint(*sub.definition.Options.ReadAhead) } - if readAhead > maxReadAhead { - readAhead = maxReadAhead - } batchTimeout := defaultBatchTimeout if sub.definition.Options.BatchTimeout != nil && *sub.definition.Options.BatchTimeout != "" { @@ -108,13 +104,12 @@ func newEventDispatcher(ctx context.Context, enricher *eventEnricher, ei events. subscription: sub, namespace: sub.definition.Namespace, inflight: make(map[fftypes.UUID]*core.Event), - eventDelivery: make(chan *core.EventDelivery, readAhead+1), + eventDelivery: make(chan []*core.EventDelivery, readAhead+1), readAhead: int(readAhead), acksNacks: make(chan ackNack), closed: make(chan struct{}), txHelper: txHelper, batch: batch, - batchTimeout: batchTimeout, } pollerConf := &eventPollerConf{ @@ -138,6 +133,20 @@ func newEventDispatcher(ctx context.Context, enricher *eventEnricher, ei events. firstEvent: sub.definition.Options.FirstEvent, } + // Users can tune the batch related settings. + // This is always true in batch:true cases, and optionally you can use the batchTimeout setting + // to tweak how we optimize ourselves for readahead / latency detection without batching + // (most likely users with this requirement would be best to just move to batch:true). + if batchTimeout > 0 { + pollerConf.eventBatchTimeout = batchTimeout + if batchTimeout > pollerConf.eventPollTimeout { + pollerConf.eventPollTimeout = batchTimeout + } + } + if batch || pollerConf.eventBatchSize < int(readAhead) { + pollerConf.eventBatchSize = ed.readAhead + } + ed.eventPoller = newEventPoller(ctx, di, en, pollerConf) return ed } @@ -165,11 +174,8 @@ func (ed *eventDispatcher) electAndStart() { ed.elected = true ed.eventPoller.start() - if ed.batch { - go ed.deliverBatchedEvents() - } else { - go ed.deliverEvents() - } + go ed.deliverEvents() + // Wait until the event poller closes <-ed.eventPoller.closed } @@ -203,77 +209,9 @@ func (ed *eventDispatcher) enrichEvents(events []core.LocallySequenced) ([]*core func (ed *eventDispatcher) filterEvents(candidates []*core.EventDelivery) []*core.EventDelivery { matchingEvents := make([]*core.EventDelivery, 0, len(candidates)) for _, event := range candidates { - filter := ed.subscription - if filter.eventMatcher != nil && !filter.eventMatcher.MatchString(string(event.Type)) { - continue - } - - msg := event.Message - tx := event.Transaction - be := event.BlockchainEvent - tag := "" - topic := event.Topic - group := "" - author := "" - txType := "" - beName := "" - beListener := "" - - if msg != nil { - tag = msg.Header.Tag - author = msg.Header.Author - if msg.Header.Group != nil { - group = msg.Header.Group.String() - } - } - - if tx != nil { - txType = tx.Type.String() - } - - if be != nil { - beName = be.Name - beListener = be.Listener.String() - } - - if filter.topicFilter != nil { - topicsMatch := false - if filter.topicFilter.MatchString(topic) { - topicsMatch = true - } - if !topicsMatch { - continue - } - } - - if filter.messageFilter != nil { - if filter.messageFilter.tagFilter != nil && !filter.messageFilter.tagFilter.MatchString(tag) { - continue - } - if filter.messageFilter.authorFilter != nil && !filter.messageFilter.authorFilter.MatchString(author) { - continue - } - if filter.messageFilter.groupFilter != nil && !filter.messageFilter.groupFilter.MatchString(group) { - continue - } - } - - if filter.transactionFilter != nil { - if filter.transactionFilter.typeFilter != nil && !filter.transactionFilter.typeFilter.MatchString(txType) { - continue - } + if ed.subscription.MatchesEvent(&event.EnrichedEvent) { + matchingEvents = append(matchingEvents, event) } - - if filter.blockchainFilter != nil { - if filter.blockchainFilter.nameFilter != nil && !filter.blockchainFilter.nameFilter.MatchString(beName) { - continue - } - if filter.blockchainFilter.listenerFilter != nil && !filter.blockchainFilter.listenerFilter.MatchString(beListener) { - continue - } - } - - matchingEvents = append(matchingEvents, event) } return matchingEvents } @@ -326,7 +264,15 @@ func (ed *eventDispatcher) bufferedDelivery(events []core.LocallySequenced) (boo ed.mux.Unlock() dispatched++ - ed.eventDelivery <- event + if !ed.batch { + // dispatch individually + ed.eventDelivery <- []*core.EventDelivery{event} + } + } + + if ed.batch && len(dispatchable) > 0 { + // Dispatch the whole batch now marked in-flight + ed.eventDelivery <- dispatchable } if inflightCount == 0 { @@ -384,88 +330,59 @@ func (ed *eventDispatcher) handleAckOffsetUpdate(ack ackNack) { } } -func (ed *eventDispatcher) deliverBatchedEvents() { +func (ed *eventDispatcher) deliverEvents() { withData := ed.subscription.definition.Options.WithData != nil && *ed.subscription.definition.Options.WithData - - var events []*core.CombinedEventDataDelivery - var batchTimeoutContext context.Context - var batchTimeoutCancel func() for { - var timeoutContext context.Context - var timedOut bool - if batchTimeoutContext != nil { - timeoutContext = batchTimeoutContext - } else { - timeoutContext = ed.ctx - } select { - case event, ok := <-ed.eventDelivery: + case events, ok := <-ed.eventDelivery: if !ok { - if batchTimeoutCancel != nil { - batchTimeoutCancel() - } return } - if events == nil { - events = []*core.CombinedEventDataDelivery{} - batchTimeoutContext, batchTimeoutCancel = context.WithTimeout(ed.ctx, ed.batchTimeout) - } - - log.L(ed.ctx).Debugf("Dispatching %s event in a batch: %.10d/%s [%s]: ref=%s/%s", ed.transport.Name(), event.Sequence, event.ID, event.Type, event.Namespace, event.Reference) - - var data []*core.Data + // As soon as we hit an error, we need to trigger into nack mode var err error - if withData && event.Message != nil { - data, _, err = ed.data.GetMessageDataCached(ed.ctx, event.Message) - } - - events = append(events, &core.CombinedEventDataDelivery{Event: event, Data: data}) - - if err != nil { - ed.deliveryResponse(&core.EventDeliveryResponse{ID: event.ID, Rejected: true}) - } - - case <-timeoutContext.Done(): - timedOut = true - case <-ed.ctx.Done(): - if batchTimeoutCancel != nil { - batchTimeoutCancel() - } - return - } - - if len(events) == ed.readAhead || (timedOut && len(events) > 0) { - _ = ed.transport.BatchDeliveryRequest(ed.ctx, ed.connID, ed.subscription.definition, events) - // If err handle all the delivery responses for all the events?? - events = nil - } - } -} -// TODO issue here, we can't just call DeliveryRequest with one thing. -func (ed *eventDispatcher) deliverEvents() { - withData := ed.subscription.definition.Options.WithData != nil && *ed.subscription.definition.Options.WithData - for { - select { - case event, ok := <-ed.eventDelivery: - if !ok { - return + // Loop through the events enriching them, and dispatching individually in non-batch mode + eventsWithData := make([]*core.CombinedEventDataDelivery, len(events)) + for i := 0; i < len(events); i++ { + e := &core.CombinedEventDataDelivery{ + Event: events[i], + } + eventsWithData[i] = e + // The first error we encounter stops us attempting to enrich or dispatch any more events + if err == nil { + log.L(ed.ctx).Debugf("Dispatching %s event: %.10d/%s [%s]: ref=%s/%s", ed.transport.Name(), e.Event.Sequence, e.Event.ID, e.Event.Type, e.Event.Namespace, e.Event.Reference) + if withData && e.Event.Message != nil { + e.Data, _, err = ed.data.GetMessageDataCached(ed.ctx, e.Event.Message) + } + } + // If we are non-batched, we have to deliver each event individually... + if !ed.batch { + // .. only attempt to deliver if we've not triggered into an error scenario for one of the events already + if err == nil { + err = ed.transport.DeliveryRequest(ed.ctx, ed.connID, ed.subscription.definition, e.Event, e.Data) + } + // ... if we've triggered into an error scenario, we need to nack immediately for this and all the rest of the events + if err != nil { + ed.deliveryResponse(&core.EventDeliveryResponse{ID: e.Event.ID, Rejected: true}) + } + } } - log.L(ed.ctx).Debugf("Dispatching %s event: %.10d/%s [%s]: ref=%s/%s", ed.transport.Name(), event.Sequence, event.ID, event.Type, event.Namespace, event.Reference) - var data []*core.Data - var err error - if withData && event.Message != nil { - data, _, err = ed.data.GetMessageDataCached(ed.ctx, event.Message) + // In batch mode we do one dispatch of the whole set as one + if ed.batch { + // Only attempt to deliver if we're in a non error case (enrich might have failed above) + if err == nil { + err = ed.transport.BatchDeliveryRequest(ed.ctx, ed.connID, ed.subscription.definition, eventsWithData) + } + // If we're in an error case we have to nack everything immediately + if err != nil { + for _, e := range events { + ed.deliveryResponse(&core.EventDeliveryResponse{ID: e.Event.ID, Rejected: true}) + } + } } - if err == nil { - err = ed.transport.DeliveryRequest(ed.ctx, ed.connID, ed.subscription.definition, event, data) - } - if err != nil { - ed.deliveryResponse(&core.EventDeliveryResponse{ID: event.ID, Rejected: true}) - } case <-ed.ctx.Done(): return } diff --git a/internal/events/event_dispatcher_test.go b/internal/events/event_dispatcher_test.go index 2f592c92d..a056c3251 100644 --- a/internal/events/event_dispatcher_test.go +++ b/internal/events/event_dispatcher_test.go @@ -23,7 +23,6 @@ import ( "testing" "time" - "github.com/hyperledger/firefly-common/pkg/config" "github.com/hyperledger/firefly-common/pkg/fftypes" "github.com/hyperledger/firefly-common/pkg/log" "github.com/hyperledger/firefly/internal/cache" @@ -131,20 +130,6 @@ func TestEventDispatcherStartStopBatched(t *testing.T) { ed.close() } -func TestMaxReadAhead(t *testing.T) { - config.Set(coreconfig.SubscriptionDefaultsReadAhead, 65537) - ed, cancel := newTestEventDispatcher(&subscription{ - dispatcherElection: make(chan bool, 1), - definition: &core.Subscription{ - SubscriptionRef: core.SubscriptionRef{Namespace: "ns1", Name: "sub1"}, - Ephemeral: true, - Options: core.SubscriptionOptions{}, - }, - }) - defer cancel() - assert.Equal(t, int(65536), ed.readAhead) -} - func TestEventDispatcherLeaderElection(t *testing.T) { log.SetLevel("debug") @@ -377,6 +362,171 @@ func TestEventDispatcherNoReadAheadInOrder(t *testing.T) { mdm.AssertExpectations(t) } +func TestEventDispatcherBatchBased(t *testing.T) { + log.SetLevel("debug") + three := uint16(3) + longTime := "1m" + subID := fftypes.NewUUID() + truthy := true + sub := &subscription{ + dispatcherElection: make(chan bool, 1), + definition: &core.Subscription{ + SubscriptionRef: core.SubscriptionRef{ID: subID, Namespace: "ns1", Name: "sub1"}, + Options: core.SubscriptionOptions{ + SubscriptionCoreOptions: core.SubscriptionCoreOptions{ + Batch: &truthy, + ReadAhead: &three, + BatchTimeout: &longTime, // because the batch should fill + }, + }, + }, + eventMatcher: regexp.MustCompile(fmt.Sprintf("^%s|%s$", core.EventTypeMessageConfirmed, core.EventTypeMessageConfirmed)), + } + + ed, cancel := newTestEventDispatcher(sub) + defer cancel() + go ed.deliverEvents() + ed.eventPoller.offsetCommitted = make(chan int64, 3) + mdi := ed.database.(*databasemocks.Plugin) + mei := ed.transport.(*eventsmocks.Plugin) + mdm := ed.data.(*datamocks.Manager) + + eventDeliveries := make(chan []*core.CombinedEventDataDelivery) + deliveryRequestMock := mei.On("BatchDeliveryRequest", ed.ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) + deliveryRequestMock.RunFn = func(a mock.Arguments) { + eventDeliveries <- a.Get(3).([]*core.CombinedEventDataDelivery) + } + + // Setup the IDs + ref1 := fftypes.NewUUID() + ev1 := fftypes.NewUUID() + ref2 := fftypes.NewUUID() + ev2 := fftypes.NewUUID() + ref3 := fftypes.NewUUID() + ev3 := fftypes.NewUUID() + ref4 := fftypes.NewUUID() + ev4 := fftypes.NewUUID() + + // Setup enrichment + mdm.On("GetMessageWithDataCached", mock.Anything, ref1).Return(&core.Message{ + Header: core.MessageHeader{ID: ref1}, + }, nil, true, nil) + mdm.On("GetMessageWithDataCached", mock.Anything, ref2).Return(&core.Message{ + Header: core.MessageHeader{ID: ref2}, + }, nil, true, nil) + mdm.On("GetMessageWithDataCached", mock.Anything, ref3).Return(&core.Message{ + Header: core.MessageHeader{ID: ref3}, + }, nil, true, nil) + mdm.On("GetMessageWithDataCached", mock.Anything, ref4).Return(&core.Message{ + Header: core.MessageHeader{ID: ref4}, + }, nil, true, nil) + + // Deliver a batch of messages + batch1Done := make(chan struct{}) + go func() { + repoll, err := ed.bufferedDelivery([]core.LocallySequenced{ + &core.Event{ID: ev1, Sequence: 10000001, Reference: ref1, Type: core.EventTypeMessageConfirmed}, // match + &core.Event{ID: ev2, Sequence: 10000002, Reference: ref2, Type: core.EventTypeMessageRejected}, + &core.Event{ID: ev3, Sequence: 10000003, Reference: ref3, Type: core.EventTypeMessageConfirmed}, // match + &core.Event{ID: ev4, Sequence: 10000004, Reference: ref4, Type: core.EventTypeMessageConfirmed}, // match + }) + assert.NoError(t, err) + assert.True(t, repoll) + close(batch1Done) + }() + + // Expect to get the batch dispatched - with the three matching events + events := <-eventDeliveries + assert.Len(t, events, 3) + assert.Equal(t, *ev1, *events[0].Event.ID) + assert.Equal(t, *ref1, *events[0].Event.Message.Header.ID) + assert.Equal(t, *ev3, *events[1].Event.ID) + assert.Equal(t, *ref3, *events[1].Event.Message.Header.ID) + assert.Equal(t, *ev4, *events[2].Event.ID) + assert.Equal(t, *ref4, *events[2].Event.Message.Header.ID) + + // Ack the batch + go func() { + ed.deliveryResponse(&core.EventDeliveryResponse{ID: events[0].Event.ID}) + ed.deliveryResponse(&core.EventDeliveryResponse{ID: events[1].Event.ID}) + ed.deliveryResponse(&core.EventDeliveryResponse{ID: events[2].Event.ID}) + }() + + assert.Equal(t, int64(10000001), <-ed.eventPoller.offsetCommitted) + assert.Equal(t, int64(10000003), <-ed.eventPoller.offsetCommitted) + assert.Equal(t, int64(10000004), <-ed.eventPoller.offsetCommitted) + + // This should complete the batch + <-batch1Done + + mdi.AssertExpectations(t) + mei.AssertExpectations(t) + mdm.AssertExpectations(t) +} + +func TestEventDispatcherBatchDispatchFail(t *testing.T) { + log.SetLevel("debug") + two := uint16(2) + longTime := "1m" + subID := fftypes.NewUUID() + truthy := true + sub := &subscription{ + dispatcherElection: make(chan bool, 1), + definition: &core.Subscription{ + SubscriptionRef: core.SubscriptionRef{ID: subID, Namespace: "ns1", Name: "sub1"}, + Options: core.SubscriptionOptions{ + SubscriptionCoreOptions: core.SubscriptionCoreOptions{ + Batch: &truthy, + ReadAhead: &two, + BatchTimeout: &longTime, // because the batch should fill + }, + }, + }, + eventMatcher: regexp.MustCompile(fmt.Sprintf("^%s|%s$", core.EventTypeMessageConfirmed, core.EventTypeMessageConfirmed)), + } + + ed, cancel := newTestEventDispatcher(sub) + defer cancel() + go ed.deliverEvents() + ed.eventPoller.offsetCommitted = make(chan int64, 3) + mdi := ed.database.(*databasemocks.Plugin) + mei := ed.transport.(*eventsmocks.Plugin) + mdm := ed.data.(*datamocks.Manager) + + eventDeliveries := make(chan []*core.CombinedEventDataDelivery) + deliveryRequestMock := mei.On("BatchDeliveryRequest", ed.ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("pop")) + deliveryRequestMock.RunFn = func(a mock.Arguments) { + eventDeliveries <- a.Get(3).([]*core.CombinedEventDataDelivery) + } + + // Deliver a batch of messages + batch1Done := make(chan struct{}) + go func() { + repoll, err := ed.bufferedDelivery([]core.LocallySequenced{ + &core.Event{ID: fftypes.NewUUID(), Sequence: 10000001, Type: core.EventTypeMessageConfirmed}, + &core.Event{ID: fftypes.NewUUID(), Sequence: 10000002, Type: core.EventTypeMessageConfirmed}, + }) + assert.NoError(t, err) + assert.True(t, repoll) + close(batch1Done) + }() + + mdm.On("GetMessageWithDataCached", mock.Anything, mock.Anything).Return(&core.Message{ + Header: core.MessageHeader{ID: fftypes.NewUUID()}, + }, nil, true, nil) + + // Expect to get the batch dispatched - with the three matching events + events := <-eventDeliveries + assert.Len(t, events, 2) + + // This should complete the batch + <-batch1Done + + mdi.AssertExpectations(t) + mei.AssertExpectations(t) + mdm.AssertExpectations(t) +} + func TestEnrichEventsFailGetMessages(t *testing.T) { sub := &subscription{ @@ -966,21 +1116,6 @@ func TestEventDeliveryClosed(t *testing.T) { cancel() } -func TestBatchEventDeliveryClosed(t *testing.T) { - - sub := &subscription{ - definition: &core.Subscription{}, - } - ed, cancel := newTestEventDispatcher(sub) - defer cancel() - - ed.batchTimeout = 1 * time.Minute - ed.eventDelivery <- &core.EventDelivery{} - close(ed.eventDelivery) - - ed.deliverBatchedEvents() -} - func TestAckClosed(t *testing.T) { sub := &subscription{ @@ -1039,17 +1174,19 @@ func TestDeliverEventsWithDataFail(t *testing.T) { mdm.On("GetMessageDataCached", ed.ctx, mock.Anything).Return(nil, false, fmt.Errorf("pop")) id1 := fftypes.NewUUID() - ed.eventDelivery <- &core.EventDelivery{ - EnrichedEvent: core.EnrichedEvent{ - Event: core.Event{ - ID: id1, - }, - Message: &core.Message{ - Header: core.MessageHeader{ - ID: fftypes.NewUUID(), + ed.eventDelivery <- []*core.EventDelivery{ + { + EnrichedEvent: core.EnrichedEvent{ + Event: core.Event{ + ID: id1, }, - Data: core.DataRefs{ - {ID: fftypes.NewUUID()}, + Message: &core.Message{ + Header: core.MessageHeader{ + ID: fftypes.NewUUID(), + }, + Data: core.DataRefs{ + {ID: fftypes.NewUUID()}, + }, }, }, }, @@ -1166,154 +1303,3 @@ func TestEventDeliveryBatch(t *testing.T) { mbm.AssertExpectations(t) mms.AssertExpectations(t) } - -func TestEventDispatcherBatchReadAhead(t *testing.T) { - log.SetLevel("debug") - var five = uint16(5) - subID := fftypes.NewUUID() - truthy := true - oneSec := "1s" - sub := &subscription{ - dispatcherElection: make(chan bool, 1), - definition: &core.Subscription{ - SubscriptionRef: core.SubscriptionRef{ID: subID, Namespace: "ns1", Name: "sub1"}, - Options: core.SubscriptionOptions{ - SubscriptionCoreOptions: core.SubscriptionCoreOptions{ - ReadAhead: &five, - Batch: &truthy, - BatchTimeout: &oneSec, - }, - }, - }, - eventMatcher: regexp.MustCompile(fmt.Sprintf("^%s|%s$", core.EventTypeMessageConfirmed, core.EventTypeMessageConfirmed)), - } - - ed, cancel := newTestEventDispatcher(sub) - defer cancel() - go ed.deliverBatchedEvents() - ed.eventPoller.offsetCommitted = make(chan int64, 3) - mdi := ed.database.(*databasemocks.Plugin) - mei := ed.transport.(*eventsmocks.Plugin) - mdm := ed.data.(*datamocks.Manager) - - eventDeliveries := make(chan *core.EventDelivery) - deliveryRequestMock := mei.On("BatchDeliveryRequest", ed.ctx, mock.Anything, mock.Anything, mock.Anything).Return(nil) - deliveryRequestMock.RunFn = func(a mock.Arguments) { - batchEvents := a.Get(3).([]*core.CombinedEventDataDelivery) - for _, event := range batchEvents { - eventDeliveries <- event.Event - } - } - - // Setup the IDs - ref1 := fftypes.NewUUID() - ev1 := fftypes.NewUUID() - ref2 := fftypes.NewUUID() - ev2 := fftypes.NewUUID() - ref3 := fftypes.NewUUID() - ev3 := fftypes.NewUUID() - ref4 := fftypes.NewUUID() - ev4 := fftypes.NewUUID() - - // Setup enrichment - mdm.On("GetMessageWithDataCached", mock.Anything, ref1).Return(&core.Message{ - Header: core.MessageHeader{ID: ref1}, - }, nil, true, nil) - mdm.On("GetMessageWithDataCached", mock.Anything, ref2).Return(&core.Message{ - Header: core.MessageHeader{ID: ref2}, - }, nil, true, nil) - mdm.On("GetMessageWithDataCached", mock.Anything, ref3).Return(&core.Message{ - Header: core.MessageHeader{ID: ref3}, - }, nil, true, nil) - mdm.On("GetMessageWithDataCached", mock.Anything, ref4).Return(&core.Message{ - Header: core.MessageHeader{ID: ref4}, - }, nil, true, nil) - - // Deliver a batch of messages - batch1Done := make(chan struct{}) - go func() { - repoll, err := ed.bufferedDelivery([]core.LocallySequenced{ - &core.Event{ID: ev1, Sequence: 10000001, Reference: ref1, Type: core.EventTypeMessageConfirmed}, // match - &core.Event{ID: ev2, Sequence: 10000002, Reference: ref2, Type: core.EventTypeMessageRejected}, - &core.Event{ID: ev3, Sequence: 10000003, Reference: ref3, Type: core.EventTypeMessageConfirmed}, // match - &core.Event{ID: ev4, Sequence: 10000004, Reference: ref4, Type: core.EventTypeMessageConfirmed}, // match - }) - assert.NoError(t, err) - assert.True(t, repoll) - close(batch1Done) - }() - - // Wait for the two calls to deliver the matching messages to the client (read ahead allows this) - event1 := <-eventDeliveries - assert.Equal(t, *ev1, *event1.ID) - assert.Equal(t, *ref1, *event1.Message.Header.ID) - event3 := <-eventDeliveries - assert.Equal(t, *ev3, *event3.ID) - assert.Equal(t, *ref3, *event3.Message.Header.ID) - event4 := <-eventDeliveries - assert.Equal(t, *ev4, *event4.ID) - assert.Equal(t, *ref4, *event4.Message.Header.ID) - - // Send back the two acks - out of order to validate the read-ahead logic - go func() { - ed.deliveryResponse(&core.EventDeliveryResponse{ID: event4.ID}) - ed.deliveryResponse(&core.EventDeliveryResponse{ID: event1.ID}) - ed.deliveryResponse(&core.EventDeliveryResponse{ID: event3.ID}) - }() - - // Confirm we get the offset updates in the correct order, even though the confirmations - // came in a different order from the app. - assert.Equal(t, int64(10000001), <-ed.eventPoller.offsetCommitted) - assert.Equal(t, int64(10000003), <-ed.eventPoller.offsetCommitted) - assert.Equal(t, int64(10000004), <-ed.eventPoller.offsetCommitted) - - // This should complete the batch - <-batch1Done - - mdi.AssertExpectations(t) - mei.AssertExpectations(t) - mdm.AssertExpectations(t) -} - -func TestBatchDeliverEventsWithDataFail(t *testing.T) { - yes := true - sub := &subscription{ - definition: &core.Subscription{ - Options: core.SubscriptionOptions{ - SubscriptionCoreOptions: core.SubscriptionCoreOptions{ - WithData: &yes, - }, - }, - }, - } - - ed, cancel := newTestEventDispatcher(sub) - defer cancel() - - mdm := ed.data.(*datamocks.Manager) - mdm.On("GetMessageDataCached", ed.ctx, mock.Anything).Return(nil, false, fmt.Errorf("pop")) - - id1 := fftypes.NewUUID() - ed.eventDelivery <- &core.EventDelivery{ - EnrichedEvent: core.EnrichedEvent{ - Event: core.Event{ - ID: id1, - }, - Message: &core.Message{ - Header: core.MessageHeader{ - ID: fftypes.NewUUID(), - }, - Data: core.DataRefs{ - {ID: fftypes.NewUUID()}, - }, - }, - }, - } - - ed.inflight[*id1] = &core.Event{ID: id1} - go ed.deliverBatchedEvents() - - an := <-ed.acksNacks - assert.True(t, an.isNack) - -} diff --git a/internal/events/event_enrich.go b/internal/events/event_enrich.go index 2036b202d..9b986ae00 100644 --- a/internal/events/event_enrich.go +++ b/internal/events/event_enrich.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -44,6 +44,18 @@ func newEventEnricher(ns string, di database.Plugin, dm data.Manager, om operati } } +func (em *eventEnricher) enrichEvents(ctx context.Context, events []*core.Event) ([]*core.EnrichedEvent, error) { + enriched := make([]*core.EnrichedEvent, len(events)) + for i, event := range events { + enrichedEvent, err := em.enrichEvent(ctx, event) + if err != nil { + return nil, err + } + enriched[i] = enrichedEvent + } + return enriched, nil +} + func (em *eventEnricher) enrichEvent(ctx context.Context, event *core.Event) (*core.EnrichedEvent, error) { e := &core.EnrichedEvent{ Event: *event, diff --git a/internal/events/event_enrich_test.go b/internal/events/event_enrich_test.go index 4c708cf7a..d98e7773f 100644 --- a/internal/events/event_enrich_test.go +++ b/internal/events/event_enrich_test.go @@ -70,6 +70,33 @@ func TestEnrichMessageConfirmed(t *testing.T) { assert.Equal(t, ref1, enriched.Message.Header.ID) } +func TestEnrichEventsMessageConfirmed(t *testing.T) { + em := newTestEventManager(t) + defer em.cleanup(t) + ctx := context.Background() + + // Setup the IDs + ref1 := fftypes.NewUUID() + ev1 := fftypes.NewUUID() + + // Setup enrichment + em.mdm.On("GetMessageWithDataCached", mock.Anything, ref1).Return(&core.Message{ + Header: core.MessageHeader{ID: ref1}, + }, nil, true, nil) + + event := []*core.Event{ + { + ID: ev1, + Type: core.EventTypeMessageConfirmed, + Reference: ref1, + }, + } + + enriched, err := em.EnrichEvents(ctx, event) + assert.NoError(t, err) + assert.Equal(t, ref1, enriched[0].Message.Header.ID) +} + func TestEnrichMessageFail(t *testing.T) { em := newTestEventEnricher() ctx := context.Background() @@ -613,3 +640,63 @@ func TestEnrichOperationFail(t *testing.T) { _, err := em.enrichEvent(ctx, event) assert.EqualError(t, err, "pop") } + +func TestEnrichEventsFails(t *testing.T) { + em := newTestEventEnricher() + ctx := context.Background() + + ev1 := fftypes.NewUUID() + ev2 := fftypes.NewUUID() + ref1 := fftypes.NewUUID() + + // Setup enrichment + mom := em.operations.(*operationmocks.Manager) + mom.On("GetOperationByIDCached", mock.Anything, mock.Anything).Return(&core.Operation{ + ID: ref1, + }, nil).Once() + mom.On("GetOperationByIDCached", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("pop")) + + events := []*core.Event{ + { + ID: ev1, + Type: core.EventTypeApprovalOpFailed, + }, + { + ID: ev2, + Type: core.EventTypeApprovalOpFailed, + }, + } + + _, err := em.enrichEvents(ctx, events) + assert.EqualError(t, err, "pop") +} + +func TestEnrichEventsOK(t *testing.T) { + em := newTestEventEnricher() + ctx := context.Background() + + ev1 := fftypes.NewUUID() + ev2 := fftypes.NewUUID() + ref1 := fftypes.NewUUID() + + // Setup enrichment + mom := em.operations.(*operationmocks.Manager) + mom.On("GetOperationByIDCached", mock.Anything, mock.Anything).Return(&core.Operation{ + ID: ref1, + }, nil) + + events := []*core.Event{ + { + ID: ev1, + Type: core.EventTypeApprovalOpFailed, + }, + { + ID: ev2, + Type: core.EventTypeApprovalOpFailed, + }, + } + + result, err := em.enrichEvents(ctx, events) + assert.Nil(t, err) + assert.Equal(t, 2, len(result)) +} diff --git a/internal/events/event_manager.go b/internal/events/event_manager.go index 0bf7a02e3..9a57bda10 100644 --- a/internal/events/event_manager.go +++ b/internal/events/event_manager.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -61,6 +61,8 @@ type EventManager interface { DeleteDurableSubscription(ctx context.Context, subDef *core.Subscription) (err error) CreateUpdateDurableSubscription(ctx context.Context, subDef *core.Subscription, mustNew bool) (err error) EnrichEvent(ctx context.Context, event *core.Event) (*core.EnrichedEvent, error) + EnrichEvents(ctx context.Context, events []*core.Event) ([]*core.EnrichedEvent, error) + FilterHistoricalEventsOnSubscription(ctx context.Context, events []*core.EnrichedEvent, sub *core.Subscription) ([]*core.EnrichedEvent, error) QueueBatchRewind(batchID *fftypes.UUID) ResolveTransportAndCapabilities(ctx context.Context, transportName string) (string, *events.Capabilities, error) Start() error @@ -300,6 +302,28 @@ func (em *eventManager) EnrichEvent(ctx context.Context, event *core.Event) (*co return em.enricher.enrichEvent(ctx, event) } +func (em *eventManager) EnrichEvents(ctx context.Context, events []*core.Event) ([]*core.EnrichedEvent, error) { + return em.enricher.enrichEvents(ctx, events) +} + func (em *eventManager) QueueBatchRewind(batchID *fftypes.UUID) { em.aggregator.queueBatchRewind(batchID) } + +func (em *eventManager) FilterHistoricalEventsOnSubscription(ctx context.Context, events []*core.EnrichedEvent, sub *core.Subscription) ([]*core.EnrichedEvent, error) { + // Transport must be provided for validation, but we're not using it for event delivery so fake the transport + sub.Transport = "websockets" + subscriptionDef, err := em.subManager.parseSubscriptionDef(ctx, sub) + if err != nil { + return nil, err + } + + matchingEvents := []*core.EnrichedEvent{} + for _, event := range events { + if subscriptionDef.MatchesEvent(event) { + matchingEvents = append(matchingEvents, event) + } + } + + return matchingEvents, nil +} diff --git a/internal/events/event_manager_test.go b/internal/events/event_manager_test.go index df18f7276..f634108c4 100644 --- a/internal/events/event_manager_test.go +++ b/internal/events/event_manager_test.go @@ -1,4 +1,4 @@ -// Copyright © 2021 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -650,3 +650,197 @@ func TestResolveTransportAndCapabilitiesDefault(t *testing.T) { em.mev.AssertExpectations(t) } + +func TestEventFilterOnSubscriptionMatchesEventType(t *testing.T) { + em := newTestEventManager(t) + defer em.cleanup(t) + + events := []*core.EnrichedEvent{ + { + Event: core.Event{ + Type: core.EventTypeIdentityConfirmed, + }, + }, + } + + subscription := &core.Subscription{ + Filter: core.SubscriptionFilter{ + Events: core.EventTypeIdentityConfirmed.String(), + }, + } + + filteredEvents, _ := em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, filteredEvents) + assert.Equal(t, 1, len(filteredEvents)) + + events[0].Event.Type = "" + subscription.Filter.Events = "" + events[0].Event.Topic = "someTopic" + subscription.Filter.Topic = "someTopic" + + filteredEvents, _ = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, filteredEvents) + assert.Equal(t, 1, len(filteredEvents)) + + listenerUuid := fftypes.NewUUID() + + events[0].Event.Topic = "" + subscription.Filter.Topic = "" + events[0].BlockchainEvent = &core.BlockchainEvent{ + Listener: listenerUuid, + } + subscription.Filter.BlockchainEvent.Listener = listenerUuid.String() + + filteredEvents, _ = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, filteredEvents) + assert.Equal(t, 1, len(filteredEvents)) + + events[0].BlockchainEvent.Listener = nil + subscription.Filter.BlockchainEvent.Listener = "" + events[0].BlockchainEvent.Name = "someName" + subscription.Filter.BlockchainEvent.Name = "someName" + + filteredEvents, _ = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, filteredEvents) + assert.Equal(t, 1, len(filteredEvents)) + + events[0].BlockchainEvent.Name = "" + subscription.Filter.BlockchainEvent.Name = "" + events[0].Transaction = &core.Transaction{ + Type: core.TransactionTypeContractInvoke, + } + subscription.Filter.Transaction.Type = core.TransactionTypeContractInvoke.String() + + filteredEvents, _ = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, filteredEvents) + assert.Equal(t, 1, len(filteredEvents)) + + events[0].Transaction.Type = "" + subscription.Filter.Transaction.Type = "" + events[0].Message = &core.Message{ + Header: core.MessageHeader{ + Tag: "someTag", + }, + } + subscription.Filter.Message.Tag = "someTag" + + filteredEvents, _ = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, filteredEvents) + assert.Equal(t, 1, len(filteredEvents)) + + group := &fftypes.Bytes32{} + + events[0].Message.Header.Tag = "" + subscription.Filter.Message.Tag = "" + events[0].Message.Header.Group = group + subscription.Filter.Message.Group = group.String() + + filteredEvents, _ = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, filteredEvents) + assert.Equal(t, 1, len(filteredEvents)) + + events[0].Message.Header.Group = nil + subscription.Filter.Message.Group = "" + events[0].Message.Header.SignerRef = core.SignerRef{ + Author: "someAuthor", + } + subscription.Filter.Message.Author = "someAuthor" + + filteredEvents, _ = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, filteredEvents) + assert.Equal(t, 1, len(filteredEvents)) +} + +func TestEventFilterOnSubscriptionFailsWithBadRegex(t *testing.T) { + em := newTestEventManager(t) + defer em.cleanup(t) + + regexThatFailsToCompile := "^(a(b)c$" + + events := []*core.EnrichedEvent{ + { + Event: core.Event{ + Type: core.EventTypeIdentityConfirmed, + }, + }, + } + + subscription := &core.Subscription{ + Filter: core.SubscriptionFilter{ + Events: regexThatFailsToCompile, + }, + } + + _, err := em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, err) + + events[0].Event.Type = "" + subscription.Filter.Events = "" + events[0].Event.Topic = "someTopic" + subscription.Filter.Topic = regexThatFailsToCompile + + _, err = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, err) + + listenerUuid := fftypes.NewUUID() + + events[0].Event.Topic = "" + subscription.Filter.Topic = "" + events[0].BlockchainEvent = &core.BlockchainEvent{ + Listener: listenerUuid, + } + subscription.Filter.BlockchainEvent.Listener = regexThatFailsToCompile + + _, err = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, err) + + events[0].BlockchainEvent.Listener = nil + subscription.Filter.BlockchainEvent.Listener = "" + events[0].BlockchainEvent.Name = "someName" + subscription.Filter.BlockchainEvent.Name = regexThatFailsToCompile + + _, err = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, err) + + events[0].BlockchainEvent.Name = "" + subscription.Filter.BlockchainEvent.Name = "" + events[0].Transaction = &core.Transaction{ + Type: core.TransactionTypeContractInvoke, + } + subscription.Filter.Transaction.Type = regexThatFailsToCompile + + _, err = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, err) + + events[0].Transaction.Type = "" + subscription.Filter.Transaction.Type = "" + events[0].Message = &core.Message{ + Header: core.MessageHeader{ + Tag: "someTag", + }, + } + subscription.Filter.Message.Tag = regexThatFailsToCompile + + _, err = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, err) + + group := &fftypes.Bytes32{} + + events[0].Message.Header.Tag = "" + subscription.Filter.Message.Tag = "" + events[0].Message.Header.Group = group + subscription.Filter.Message.Group = regexThatFailsToCompile + + _, err = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, err) + + events[0].Message.Header.Group = nil + subscription.Filter.Message.Group = "" + events[0].Message.Header.SignerRef = core.SignerRef{ + Author: "someAuthor", + } + subscription.Filter.Message.Author = regexThatFailsToCompile + + _, err = em.FilterHistoricalEventsOnSubscription(context.Background(), events, subscription) + assert.NotNil(t, err) +} diff --git a/internal/events/event_poller.go b/internal/events/event_poller.go index 9d876b6c8..cd509cc20 100644 --- a/internal/events/event_poller.go +++ b/internal/events/event_poller.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -196,7 +196,12 @@ func (ep *eventPoller) eventLoop() { close(ep.offsetCommitted) }() + doBatchDelay := false for { + if doBatchDelay { + ep.waitForBatchTimeout() + } + // Read messages from the DB - in an error condition we retry until success, or a closed context events, err := ep.readPage() if err != nil { @@ -205,6 +210,15 @@ func (ep *eventPoller) eventLoop() { } eventCount := len(events) + + // We might want to wait for the batch to fill - so we delay and re-poll + if ep.conf.eventBatchTimeout > 0 && !doBatchDelay && eventCount < ep.conf.eventBatchSize { + doBatchDelay = true + l.Tracef("Batch delay: detected=%d, batchSize=%d batchTimeout=%s", eventCount, ep.conf.eventBatchSize, ep.conf.eventBatchTimeout) + continue + } + doBatchDelay = false // clear any batch delay for next iteration + repoll := false if eventCount > 0 { // We process all the events in the page in a single database run group, and @@ -280,6 +294,16 @@ func (ep *eventPoller) shoulderTap() { } } +func (ep *eventPoller) waitForBatchTimeout() { + // For throughput optimized environments, we can set an eventBatchingTimeout to allow + // dispatching of incomplete batches at a shorter timeout than the + // long timeout between polling cycles (at the cost of some dispatch latency) + select { + case <-time.After(ep.conf.eventBatchTimeout): + case <-ep.ctx.Done(): + } +} + func (ep *eventPoller) waitForShoulderTapOrPollTimeout(lastEventCount int) bool { l := log.L(ep.ctx) longTimeoutDuration := ep.conf.eventPollTimeout @@ -289,20 +313,6 @@ func (ep *eventPoller) waitForShoulderTapOrPollTimeout(lastEventCount int) bool return true } - // For throughput optimized environments, we can set an eventBatchingTimeout to allow messages to arrive - // between polling cycles (at the cost of some dispatch latency) - if ep.conf.eventBatchTimeout > 0 && lastEventCount > 0 { - shortTimeout := time.NewTimer(ep.conf.eventBatchTimeout) - select { - case <-shortTimeout.C: - l.Tracef("Woken after batch timeout") - case <-ep.ctx.Done(): - l.Debugf("Exiting due to cancelled context") - return false - } - longTimeoutDuration -= ep.conf.eventBatchTimeout - } - longTimeout := time.NewTimer(longTimeoutDuration) select { case <-longTimeout.C: diff --git a/internal/events/event_poller_test.go b/internal/events/event_poller_test.go index 8215d2c8a..de080a5a2 100644 --- a/internal/events/event_poller_test.go +++ b/internal/events/event_poller_test.go @@ -36,7 +36,7 @@ func newTestEventPoller(t *testing.T, mdi *databasemocks.Plugin, neh newEventsHa ctx, cancel := context.WithCancel(context.Background()) ep = newEventPoller(ctx, mdi, newEventNotifier(ctx, "ut"), &eventPollerConf{ eventBatchSize: 10, - eventBatchTimeout: 1 * time.Millisecond, + eventBatchTimeout: 0, // customized for individual tests that enable this eventPollTimeout: 10 * time.Second, startupOffsetRetryAttempts: 1, retry: retry.Retry{ @@ -219,6 +219,57 @@ func TestReadPageSingleCommitEvent(t *testing.T) { mdi.AssertExpectations(t) } +func TestReadPageBatchTimeoutNotFull(t *testing.T) { + mdi := &databasemocks.Plugin{} + processEventCalled := make(chan []core.LocallySequenced, 1) + ep, cancel := newTestEventPoller(t, mdi, func(events []core.LocallySequenced) (bool, error) { + processEventCalled <- events + return false, nil + }, nil) + ep.conf.eventBatchTimeout = 1 * time.Microsecond + ep.conf.eventBatchSize = 3 + ev1 := core.NewEvent(core.EventTypeMessageConfirmed, "ns1", fftypes.NewUUID(), nil, "") + ev2 := core.NewEvent(core.EventTypeMessageConfirmed, "ns1", fftypes.NewUUID(), nil, "") + mdi.On("GetEvents", mock.Anything, "unit", mock.Anything).Return([]*core.Event{ev1}, nil, nil).Once() // half batch + mdi.On("GetEvents", mock.Anything, "unit", mock.Anything).Return([]*core.Event{ev1, ev2}, nil, nil).Run(func(args mock.Arguments) { + ep.shoulderTap() + }).Once() + mdi.On("GetEvents", mock.Anything, "unit", mock.Anything).Return(nil, nil, fmt.Errorf("context done")).Run(func(args mock.Arguments) { + cancel() + }) + ep.eventLoop() + + events := <-processEventCalled + assert.Equal(t, *ev1.ID, *events[0].(*core.Event).ID) + assert.Equal(t, *ev2.ID, *events[1].(*core.Event).ID) + mdi.AssertExpectations(t) +} + +func TestReadPageBatchFull(t *testing.T) { + mdi := &databasemocks.Plugin{} + processEventCalled := make(chan []core.LocallySequenced, 1) + ep, cancel := newTestEventPoller(t, mdi, func(events []core.LocallySequenced) (bool, error) { + processEventCalled <- events + return false, nil + }, nil) + ep.conf.eventBatchTimeout = 1 * time.Microsecond + ep.conf.eventBatchSize = 2 + ev1 := core.NewEvent(core.EventTypeMessageConfirmed, "ns1", fftypes.NewUUID(), nil, "") + ev2 := core.NewEvent(core.EventTypeMessageConfirmed, "ns1", fftypes.NewUUID(), nil, "") + mdi.On("GetEvents", mock.Anything, "unit", mock.Anything).Return([]*core.Event{ev1, ev2}, nil, nil).Run(func(args mock.Arguments) { + ep.shoulderTap() + }).Once() + mdi.On("GetEvents", mock.Anything, "unit", mock.Anything).Return(nil, nil, fmt.Errorf("context done")).Run(func(args mock.Arguments) { + cancel() + }) + ep.eventLoop() + + events := <-processEventCalled + assert.Equal(t, *ev1.ID, *events[0].(*core.Event).ID) + assert.Equal(t, *ev2.ID, *events[1].(*core.Event).ID) + mdi.AssertExpectations(t) +} + func TestReadPageRewind(t *testing.T) { mdi := &databasemocks.Plugin{} processEventCalled := make(chan core.LocallySequenced, 1) @@ -325,6 +376,14 @@ func TestDoubleTap(t *testing.T) { ep.shoulderTap() // this should not block } +func TestWaitForBatchTimeoutClosedContext(t *testing.T) { + mdi := &databasemocks.Plugin{} + ep, cancel := newTestEventPoller(t, mdi, nil, nil) + ep.conf.eventBatchTimeout = 1 * time.Minute + cancel() + ep.waitForBatchTimeout() +} + func TestDoubleConfirm(t *testing.T) { mdi := &databasemocks.Plugin{} ep, cancel := newTestEventPoller(t, mdi, nil, nil) diff --git a/internal/events/subscription_manager.go b/internal/events/subscription_manager.go index 788e72ec3..a31b937e5 100644 --- a/internal/events/subscription_manager.go +++ b/internal/events/subscription_manager.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -20,6 +20,7 @@ import ( "context" "regexp" "sync" + "time" "github.com/hyperledger/firefly-common/pkg/config" "github.com/hyperledger/firefly-common/pkg/fftypes" @@ -90,6 +91,9 @@ type subscriptionManager struct { newOrUpdatedSubscriptions chan *fftypes.UUID deletedSubscriptions chan *fftypes.UUID retry retry.Retry + + defaultBatchSize uint16 + defaultBatchTimeout time.Duration } func newSubscriptionManager(ctx context.Context, ns *core.Namespace, enricher *eventEnricher, di database.Plugin, dm data.Manager, en *eventNotifier, bm broadcast.Manager, pm privatemessaging.Manager, txHelper txcommon.Helper, transports map[string]events.Plugin) (*subscriptionManager, error) { @@ -116,6 +120,8 @@ func newSubscriptionManager(ctx context.Context, ns *core.Namespace, enricher *e MaximumDelay: config.GetDuration(coreconfig.SubscriptionsRetryMaxDelay), Factor: config.GetFloat64(coreconfig.SubscriptionsRetryFactor), }, + defaultBatchSize: uint16(config.GetInt(coreconfig.SubscriptionDefaultsBatchSize)), + defaultBatchTimeout: config.GetDuration(coreconfig.SubscriptionDefaultsBatchTimeout), } for _, ei := range sm.transports { @@ -270,6 +276,18 @@ func (sm *subscriptionManager) parseSubscriptionDef(ctx context.Context, subDef subDef.Options.TLSConfig = sm.namespace.TLSConfigs[subDef.Options.TLSConfigName] } + // Defaults that only apply in batch mode + if subDef.Options.Batch != nil && *subDef.Options.Batch { + if subDef.Options.ReadAhead == nil || *subDef.Options.ReadAhead == 0 { + defaultBatchSize := sm.defaultBatchSize + subDef.Options.ReadAhead = &defaultBatchSize + } + if subDef.Options.BatchTimeout == nil || *subDef.Options.BatchTimeout == "" { + defaultBatchTimeout := sm.defaultBatchTimeout.String() + subDef.Options.BatchTimeout = &defaultBatchTimeout + } + } + if err := transport.ValidateOptions(ctx, &subDef.Options); err != nil { return nil, err } @@ -555,3 +573,75 @@ func (sm *subscriptionManager) deliveryResponse(ei events.Plugin, connID string, sm.mux.Unlock() dispatcher.deliveryResponse(inflight) } + +func (sub *subscription) MatchesEvent(event *core.EnrichedEvent) bool { + if sub.eventMatcher != nil && !sub.eventMatcher.MatchString(string(event.Type)) { + return false + } + + msg := event.Message + tx := event.Transaction + be := event.BlockchainEvent + tag := "" + topic := event.Topic + group := "" + author := "" + txType := "" + beName := "" + beListener := "" + + if msg != nil { + tag = msg.Header.Tag + author = msg.Header.Author + if msg.Header.Group != nil { + group = msg.Header.Group.String() + } + } + + if tx != nil { + txType = tx.Type.String() + } + + if be != nil { + beName = be.Name + beListener = be.Listener.String() + } + + if sub.topicFilter != nil { + topicsMatch := false + if sub.topicFilter.MatchString(topic) { + topicsMatch = true + } + if !topicsMatch { + return false + } + } + + if sub.messageFilter != nil { + if sub.messageFilter.tagFilter != nil && !sub.messageFilter.tagFilter.MatchString(tag) { + return false + } + if sub.messageFilter.authorFilter != nil && !sub.messageFilter.authorFilter.MatchString(author) { + return false + } + if sub.messageFilter.groupFilter != nil && !sub.messageFilter.groupFilter.MatchString(group) { + return false + } + } + + if sub.transactionFilter != nil { + if sub.transactionFilter.typeFilter != nil && !sub.transactionFilter.typeFilter.MatchString(txType) { + return false + } + } + + if sub.blockchainFilter != nil { + if sub.blockchainFilter.nameFilter != nil && !sub.blockchainFilter.nameFilter.MatchString(beName) { + return false + } + if sub.blockchainFilter.listenerFilter != nil && !sub.blockchainFilter.listenerFilter.MatchString(beListener) { + return false + } + } + return true +} diff --git a/internal/events/subscription_manager_test.go b/internal/events/subscription_manager_test.go index d72b8d111..ef509c705 100644 --- a/internal/events/subscription_manager_test.go +++ b/internal/events/subscription_manager_test.go @@ -551,6 +551,30 @@ func TestCreateSubscriptionSuccessTLSConfig(t *testing.T) { assert.NotNil(t, sub.definition.Options.TLSConfig) } +func TestCreateSubscriptionSuccessBatch(t *testing.T) { + coreconfig.Reset() + + mei := &eventsmocks.Plugin{} + sm, cancel := newTestSubManager(t, mei) + defer cancel() + + mei.On("GetFFRestyConfig", mock.Anything).Return(&ffresty.Config{}) + mei.On("ValidateOptions", mock.Anything, mock.Anything).Return(nil) + truthy := true + sub, err := sm.parseSubscriptionDef(sm.ctx, &core.Subscription{ + Options: core.SubscriptionOptions{ + SubscriptionCoreOptions: core.SubscriptionCoreOptions{ + Batch: &truthy, + }, + }, + Transport: "ut", + }) + assert.NoError(t, err) + + assert.Equal(t, uint16(50), *sub.definition.Options.ReadAhead) + assert.Equal(t, "50ms", *sub.definition.Options.BatchTimeout) +} + func TestCreateSubscriptionWithDeprecatedFilters(t *testing.T) { mei := &eventsmocks.Plugin{} sm, cancel := newTestSubManager(t, mei) diff --git a/internal/events/webhooks/webhooks.go b/internal/events/webhooks/webhooks.go index b350e10f1..0bc1fd6dd 100644 --- a/internal/events/webhooks/webhooks.go +++ b/internal/events/webhooks/webhooks.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -139,7 +139,7 @@ func (p *whPayload) firstData() fftypes.JSONObject { } func (wh *WebHooks) buildPayload(ctx context.Context, sub *core.Subscription, event *core.CombinedEventDataDelivery) *whPayload { - + log.L(wh.ctx).Debugf("Webhook-> %s event %s on subscription %s", sub.Options.URL, event.Event.ID, sub.ID) withData := sub.Options.WithData != nil && *sub.Options.WithData options := sub.Options.TransportOptions() p := &whPayload{ @@ -285,7 +285,7 @@ func (wh *WebHooks) ValidateOptions(ctx context.Context, options *core.Subscript if err != nil { return err } - newFFRestyConfig.RetryInitialDelay = time.Duration(ffd) + newFFRestyConfig.RetryInitialDelay = fftypes.FFDuration(time.Duration(ffd)) } if options.Retry.MaximumDelay != "" { @@ -293,7 +293,7 @@ func (wh *WebHooks) ValidateOptions(ctx context.Context, options *core.Subscript if err != nil { return err } - newFFRestyConfig.RetryMaximumDelay = time.Duration(ffd) + newFFRestyConfig.RetryMaximumDelay = fftypes.FFDuration(time.Duration(ffd)) } } @@ -306,7 +306,7 @@ func (wh *WebHooks) ValidateOptions(ctx context.Context, options *core.Subscript if err != nil { return err } - newFFRestyConfig.HTTPRequestTimeout = time.Duration(ffd) + newFFRestyConfig.HTTPRequestTimeout = fftypes.FFDuration(time.Duration(ffd)) } if options.HTTPOptions.HTTPIdleConnTimeout != "" { @@ -314,7 +314,7 @@ func (wh *WebHooks) ValidateOptions(ctx context.Context, options *core.Subscript if err != nil { return err } - newFFRestyConfig.HTTPIdleConnTimeout = time.Duration(ffd) + newFFRestyConfig.HTTPIdleConnTimeout = fftypes.FFDuration(time.Duration(ffd)) } if options.HTTPOptions.HTTPExpectContinueTimeout != "" { @@ -322,7 +322,7 @@ func (wh *WebHooks) ValidateOptions(ctx context.Context, options *core.Subscript if err != nil { return err } - newFFRestyConfig.HTTPExpectContinueTimeout = time.Duration(ffd) + newFFRestyConfig.HTTPExpectContinueTimeout = fftypes.FFDuration(time.Duration(ffd)) } if options.HTTPOptions.HTTPConnectionTimeout != "" { @@ -330,7 +330,7 @@ func (wh *WebHooks) ValidateOptions(ctx context.Context, options *core.Subscript if err != nil { return err } - newFFRestyConfig.HTTPConnectionTimeout = time.Duration(ffd) + newFFRestyConfig.HTTPConnectionTimeout = fftypes.FFDuration(time.Duration(ffd)) } if options.HTTPOptions.HTTPTLSHandshakeTimeout != "" { @@ -338,7 +338,7 @@ func (wh *WebHooks) ValidateOptions(ctx context.Context, options *core.Subscript if err != nil { return err } - newFFRestyConfig.HTTPTLSHandshakeTimeout = time.Duration(ffd) + newFFRestyConfig.HTTPTLSHandshakeTimeout = fftypes.FFDuration(time.Duration(ffd)) } if options.HTTPOptions.HTTPProxyURL != nil { @@ -391,10 +391,9 @@ func (wh *WebHooks) attemptRequest(ctx context.Context, sub *core.Subscription, req.r.SetBody(requestBody) } - // log.L(wh.ctx).Debugf("Webhook-> %s %s event %s on subscription %s", req.method, req.url, event.ID, sub.ID) resp, err := req.r.Execute(req.method, req.url) if err != nil { - // log.L(ctx).Errorf("Webhook<- %s %s event %s on subscription %s failed: %s", req.method, req.url, event.ID, sub.ID, err) + log.L(ctx).Errorf("Webhook<- %s %s on subscription %s failed: %s", req.method, req.url, sub.ID, err) return nil, nil, err } defer func() { _ = resp.RawBody().Close() }() @@ -403,7 +402,7 @@ func (wh *WebHooks) attemptRequest(ctx context.Context, sub *core.Subscription, Status: resp.StatusCode(), Headers: fftypes.JSONObject{}, } - // log.L(wh.ctx).Infof("Webhook<- %s %s event %s on subscription %s returned %d", req.method, req.url, event.ID, sub.ID, res.Status) + log.L(wh.ctx).Debugf("Webhook<- %s %s on subscription %s returned %d", req.method, req.url, sub.ID, res.Status) header := resp.Header() for h := range header { res.Headers[h] = header.Get(h) diff --git a/internal/events/webhooks/webhooks_test.go b/internal/events/webhooks/webhooks_test.go index e9ad0d738..f38ba4e0a 100644 --- a/internal/events/webhooks/webhooks_test.go +++ b/internal/events/webhooks/webhooks_test.go @@ -462,8 +462,6 @@ func TestRequestWithBodyReplyEndToEndWithTLS(t *testing.T) { ClientCAs: caCertPool, ClientAuth: tls.RequireAndVerifyClientCert, } - tlsConfig.BuildNameToCertificate() - // Create a Server instance to listen on port 8443 with the TLS config server := &http.Server{ Addr: "127.0.0.1:8443", @@ -499,7 +497,9 @@ func TestRequestWithBodyReplyEndToEndWithTLS(t *testing.T) { groupHash := fftypes.NewRandB32() client := ffresty.NewWithConfig(ctx, ffresty.Config{ - TLSClientConfig: clientTLSConfig, + HTTPConfig: ffresty.HTTPConfig{ + TLSClientConfig: clientTLSConfig, + }, }) sub := &core.Subscription{ SubscriptionRef: core.SubscriptionRef{ diff --git a/internal/events/websockets/config.go b/internal/events/websockets/config.go index 8ce482a87..c5d8df776 100644 --- a/internal/events/websockets/config.go +++ b/internal/events/websockets/config.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -32,5 +32,4 @@ const ( func (ws *WebSockets) InitConfig(config config.Section) { config.AddKnownKey(ReadBufferSize, bufferSizeDefault) config.AddKnownKey(WriteBufferSize, bufferSizeDefault) - } diff --git a/internal/events/websockets/websocket_connection.go b/internal/events/websockets/websocket_connection.go index 70aa9b50f..58de422fa 100644 --- a/internal/events/websockets/websocket_connection.go +++ b/internal/events/websockets/websocket_connection.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -21,6 +21,8 @@ import ( "encoding/json" "io" "net/http" + "net/url" + "strconv" "sync" "time" @@ -38,23 +40,26 @@ type websocketStartedSub struct { } type websocketConnection struct { - ctx context.Context - ws *WebSockets - wsConn *websocket.Conn - cancelCtx func() - connID string - sendMessages chan interface{} - senderDone chan struct{} - receiverDone chan struct{} - autoAck bool - started []*websocketStartedSub - inflight []*core.EventDeliveryResponse - mux sync.Mutex - closed bool - remoteAddr string - userAgent string - header http.Header - auth core.Authorizer + ctx context.Context + ws *WebSockets + wsConn *websocket.Conn + cancelCtx func() + connID string + sendMessages chan interface{} + senderDone chan struct{} + receiverDone chan struct{} + autoAck bool + started []*websocketStartedSub + inflight []*core.EventDeliveryResponse + inflightBatches []*core.WSEventBatch + mux sync.Mutex + closed bool + remoteAddr string + userAgent string + header http.Header + auth core.Authorizer + namespaceScoped bool // if true then any request to listen is asserted to be in the context of namespace + namespace string } func newConnection(pCtx context.Context, ws *WebSockets, wsConn *websocket.Conn, req *http.Request, auth core.Authorizer) *websocketConnection { @@ -80,22 +85,71 @@ func newConnection(pCtx context.Context, ws *WebSockets, wsConn *websocket.Conn, return wc } +func (wc *websocketConnection) assertNamespace(namespace string) (string, error) { + + if wc.namespaceScoped { + if namespace == "" { + namespace = wc.namespace + } else if namespace != wc.namespace { + return "", i18n.NewError(wc.ctx, coremsgs.MsgWSWrongNamespace) + } + } + return namespace, nil +} + +func isBoolQuerySet(query url.Values, boolOption string) bool { + optionValues, hasOptionValues := query[boolOption] + return hasOptionValues && (len(optionValues) == 0 || optionValues[0] != "false") +} + +func (wc *websocketConnection) getReadAhead(query url.Values, isBatch bool) *uint16 { + readaheadStr := query.Get("readahead") + if readaheadStr != "" { + readAheadInt, err := strconv.ParseUint(readaheadStr, 10, 16) + if err == nil { + readahead := uint16(readAheadInt) + return &readahead + } + } + return nil +} + +func (wc *websocketConnection) getBatchTimeout(query url.Values) *string { + batchTimeout := query.Get("batchtimeout") + if batchTimeout != "" { + return &batchTimeout + } + return nil +} + // processAutoStart gives a helper to specify query parameters to auto-start your subscription func (wc *websocketConnection) processAutoStart(req *http.Request) { query := req.URL.Query() - ephemeral, hasEphemeral := req.URL.Query()["ephemeral"] - isEphemeral := hasEphemeral && (len(ephemeral) == 0 || ephemeral[0] != "false") + isEphemeral := isBoolQuerySet(query, "ephemeral") _, hasName := query["name"] - autoAck, hasAutoack := req.URL.Query()["autoack"] - isAutoack := hasAutoack && (len(autoAck) == 0 || autoAck[0] != "false") - if hasEphemeral || hasName { + isAutoack := isBoolQuerySet(query, "autoack") + namespace, err := wc.assertNamespace(query.Get("namespace")) + if err != nil { + wc.protocolError(err) + return + } + + if isEphemeral || hasName { + isBatch := isBoolQuerySet(query, "batch") filter := core.NewSubscriptionFilterFromQuery(query) err := wc.handleStart(&core.WSStart{ AutoAck: &isAutoack, Ephemeral: isEphemeral, - Namespace: query.Get("namespace"), + Namespace: namespace, Name: query.Get("name"), Filter: filter, + Options: core.SubscriptionOptions{ + SubscriptionCoreOptions: core.SubscriptionCoreOptions{ + Batch: &isBatch, + BatchTimeout: wc.getBatchTimeout(query), + ReadAhead: wc.getReadAhead(query, isBatch), + }, + }, }) if err != nil { wc.protocolError(err) @@ -157,7 +211,10 @@ func (wc *websocketConnection) receiveLoop() { var msg core.WSStart err = json.Unmarshal(msgData, &msg) if err == nil { - err = wc.authorizeMessage(msg.Namespace) + msg.Namespace, err = wc.assertNamespace(msg.Namespace) + if err == nil { + err = wc.authorizeMessage(msg.Namespace) + } if err == nil { err = wc.handleStart(&msg) } @@ -208,6 +265,54 @@ func (wc *websocketConnection) dispatch(event *core.EventDelivery) error { return nil } +func (wc *websocketConnection) dispatchBatch(sub *core.Subscription, events []*core.CombinedEventDataDelivery) error { + inflightBatch := &core.WSEventBatch{ + Type: core.WSEventBatchType, + ID: fftypes.NewUUID(), + Events: make([]*core.EventDelivery, len(events)), + } + if sub != nil { + inflightBatch.Subscription = sub.SubscriptionRef + } + for i, e := range events { + // For ephemeral there's no sub, so we pick up from first event + if inflightBatch.Subscription.Namespace == "" { + inflightBatch.Subscription = e.Event.Subscription + } + inflightBatch.Events[i] = e.Event + } + + var autoAck bool + wc.mux.Lock() + autoAck = wc.autoAck + if !autoAck { + wc.inflightBatches = append(wc.inflightBatches, inflightBatch) + } + wc.mux.Unlock() + + err := wc.send(inflightBatch) + if err != nil { + return err + } + + if autoAck { + wc.ackBatch(inflightBatch) + } + + return nil +} + +func (wc *websocketConnection) ackBatch(batch *core.WSEventBatch) { + for _, e := range batch.Events { + // We individually drive an ack back on each event, but do so in one pass + // (this matches the webhook implementation of batching). + wc.ws.ack(wc.connID, &core.EventDeliveryResponse{ + ID: e.ID, + Subscription: batch.Subscription, + }) + } +} + func (wc *websocketConnection) protocolError(err error) { log.L(wc.ctx).Errorf("Sending protocol error to client: %s", err) sendErr := wc.send(&core.WSError{ @@ -251,6 +356,14 @@ func (wc *websocketConnection) restartForNamespace(ns string, startTime time.Tim } func (wc *websocketConnection) handleStart(start *core.WSStart) (err error) { + // this will very likely already be checked before we get here but + // it doesn't do any harm to do a final assertion just in case it hasn't been done yet + + start.Namespace, err = wc.assertNamespace(start.Namespace) + if err != nil { + return err + } + wc.mux.Lock() if start.AutoAck != nil { if *start.AutoAck != wc.autoAck && len(wc.started) > 0 { @@ -278,6 +391,22 @@ func (wc *websocketConnection) durableSubMatcher(sr core.SubscriptionRef) bool { return false } +func (wc *websocketConnection) handleBatchAck(ack *core.WSAck) (handled bool) { + wc.mux.Lock() + defer wc.mux.Unlock() + var newInflightBatches []*core.WSEventBatch + for _, batch := range wc.inflightBatches { + if batch.ID.Equals(ack.ID) { // nil safe check + wc.ackBatch(batch) + handled = true + } else { + newInflightBatches = append(newInflightBatches, batch) + } + } + wc.inflightBatches = newInflightBatches + return handled +} + func (wc *websocketConnection) checkAck(ack *core.WSAck) (*core.EventDeliveryResponse, error) { l := log.L(wc.ctx) var inflight *core.EventDeliveryResponse @@ -332,6 +461,10 @@ func (wc *websocketConnection) checkAck(ack *core.WSAck) (*core.EventDeliveryRes } func (wc *websocketConnection) handleAck(ack *core.WSAck) error { + if handled := wc.handleBatchAck(ack); handled { + return nil + } + // Perform a locked set of check inflight, err := wc.checkAck(ack) if err != nil { diff --git a/internal/events/websockets/websockets.go b/internal/events/websockets/websockets.go index 4388aff16..fe6dc9bf0 100644 --- a/internal/events/websockets/websockets.go +++ b/internal/events/websockets/websockets.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -31,6 +31,10 @@ import ( "github.com/hyperledger/firefly/pkg/events" ) +type WebSocketsNamespaced interface { + ServeHTTPNamespaced(namespace string, res http.ResponseWriter, req *http.Request) +} + type WebSockets struct { ctx context.Context capabilities *events.Capabilities @@ -50,9 +54,11 @@ func (ws *WebSockets) Name() string { return "websockets" } func (ws *WebSockets) Init(ctx context.Context, config config.Section) error { *ws = WebSockets{ - ctx: ctx, - connections: make(map[string]*websocketConnection), - capabilities: &events.Capabilities{}, + ctx: ctx, + connections: make(map[string]*websocketConnection), + capabilities: &events.Capabilities{ + BatchDelivery: true, + }, callbacks: callbacks{ handlers: make(map[string]events.Callbacks), }, @@ -122,6 +128,25 @@ func (ws *WebSockets) ServeHTTP(res http.ResponseWriter, req *http.Request) { wc.processAutoStart(req) } +func (ws *WebSockets) ServeHTTPNamespaced(namespace string, res http.ResponseWriter, req *http.Request) { + + wsConn, err := ws.upgrader.Upgrade(res, req, nil) + if err != nil { + log.L(ws.ctx).Errorf("WebSocket upgrade failed: %s", err) + return + } + + ws.connMux.Lock() + wc := newConnection(ws.ctx, ws, wsConn, req, ws.auth) + wc.namespaceScoped = true + wc.namespace = namespace + ws.connections[wc.connID] = wc + ws.connMux.Unlock() + + wc.processAutoStart(req) + +} + func (ws *WebSockets) ack(connID string, inflight *core.EventDeliveryResponse) { if cb, ok := ws.callbacks.handlers[inflight.Subscription.Namespace]; ok { cb.DeliveryResponse(connID, inflight) @@ -219,6 +244,11 @@ func (ws *WebSockets) GetStatus() *core.WebSocketStatus { } func (ws *WebSockets) BatchDeliveryRequest(ctx context.Context, connID string, sub *core.Subscription, events []*core.CombinedEventDataDelivery) error { - // We should have rejected creation of the subscription, due to us not supporting this in our capabilities - return i18n.NewError(ctx, coremsgs.MsgBatchDeliveryNotSupported, ws.Name()) + ws.connMux.Lock() + conn, ok := ws.connections[connID] + ws.connMux.Unlock() + if !ok { + return i18n.NewError(ctx, coremsgs.MsgWSConnectionNotActive, connID) + } + return conn.dispatchBatch(sub, events) } diff --git a/internal/events/websockets/websockets_test.go b/internal/events/websockets/websockets_test.go index 6947d66e7..cba25ebfa 100644 --- a/internal/events/websockets/websockets_test.go +++ b/internal/events/websockets/websockets_test.go @@ -51,6 +51,18 @@ func (t *testAuthorizer) Authorize(ctx context.Context, authReq *fftypes.AuthReq } func newTestWebsockets(t *testing.T, cbs *eventsmocks.Callbacks, authorizer core.Authorizer, queryParams ...string) (ws *WebSockets, wsc wsclient.WSClient, cancel func()) { + return newTestWebsocketsCommon(t, cbs, authorizer, "", queryParams...) +} + +type testNamespacedHandler struct { + ws *WebSockets + namespace string +} + +func (h *testNamespacedHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) { + h.ws.ServeHTTPNamespaced(h.namespace, res, req) +} +func newTestWebsocketsCommon(t *testing.T, cbs *eventsmocks.Callbacks, authorizer core.Authorizer, namespace string, queryParams ...string) (ws *WebSockets, wsc wsclient.WSClient, cancel func()) { coreconfig.Reset() ws = &WebSockets{} @@ -63,8 +75,16 @@ func newTestWebsockets(t *testing.T, cbs *eventsmocks.Callbacks, authorizer core assert.Equal(t, "websockets", ws.Name()) assert.NotNil(t, ws.Capabilities()) cbs.On("ConnectionClosed", mock.Anything).Return(nil).Maybe() - - svr := httptest.NewServer(ws) + var svr *httptest.Server + if namespace == "" { + svr = httptest.NewServer(ws) + } else { + namespacedHandler := &testNamespacedHandler{ + ws: ws, + namespace: namespace, + } + svr = httptest.NewServer(namespacedHandler) + } clientConfig := config.RootSection("ut.wsclient") wsclient.InitConfig(clientConfig) @@ -216,6 +236,68 @@ func TestStartReceiveAckEphemeral(t *testing.T) { cbs.AssertExpectations(t) } +func TestAutoAckBatch(t *testing.T) { + log.SetLevel("trace") + + cbs := &eventsmocks.Callbacks{} + ws, wsc, cancel := newTestWebsockets(t, cbs, nil, "autoack=true") + defer cancel() + var connID string + mes := cbs.On("EphemeralSubscription", + mock.MatchedBy(func(s string) bool { connID = s; return true }), + "ns1", mock.Anything, mock.MatchedBy(func(o *core.SubscriptionOptions) bool { + return *o.Batch + })).Return(nil) + ack := cbs.On("DeliveryResponse", + mock.MatchedBy(func(s string) bool { return s == connID }), + mock.Anything).Return(nil) + + waitSubscribed := make(chan struct{}) + mes.RunFn = func(a mock.Arguments) { + close(waitSubscribed) + } + + waitAcked := make(chan struct{}) + ack.RunFn = func(a mock.Arguments) { + close(waitAcked) + } + + err := wsc.Send(context.Background(), []byte(`{ + "type":"start", + "namespace":"ns1", + "ephemeral":true, + "autoack": true, + "options": { + "batch": true + } + }`)) + assert.NoError(t, err) + + <-waitSubscribed + sub := &core.Subscription{ + SubscriptionRef: core.SubscriptionRef{ID: fftypes.NewUUID(), Namespace: "ns1", Name: "sub1"}, + } + ws.BatchDeliveryRequest(ws.ctx, connID, sub, []*core.CombinedEventDataDelivery{ + {Event: &core.EventDelivery{ + EnrichedEvent: core.EnrichedEvent{ + Event: core.Event{ID: fftypes.NewUUID()}, + }, + Subscription: core.SubscriptionRef{ + ID: fftypes.NewUUID(), + Namespace: "ns1", + }, + }}, + }) + + b := <-wsc.Receive() + var res core.EventDelivery + err = json.Unmarshal(b, &res) + assert.NoError(t, err) + + <-waitAcked + cbs.AssertExpectations(t) +} + func TestStartReceiveDurable(t *testing.T) { cbs := &eventsmocks.Callbacks{} ws, wsc, cancel := newTestWebsockets(t, cbs, nil) @@ -223,12 +305,13 @@ func TestStartReceiveDurable(t *testing.T) { var connID string sub := cbs.On("RegisterConnection", mock.MatchedBy(func(s string) bool { connID = s; return true }), - mock.MatchedBy(func(subMatch events.SubscriptionMatcher) bool { - return subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub1"}) && - !subMatch(core.SubscriptionRef{Namespace: "ns2", Name: "sub1"}) && - !subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub2"}) - }), - ).Return(nil) + mock.Anything, + ).Return(nil).Run(func(args mock.Arguments) { + subMatch := args[1].(events.SubscriptionMatcher) + assert.True(t, subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub1"})) + assert.False(t, subMatch(core.SubscriptionRef{Namespace: "ns2", Name: "sub1"})) + assert.False(t, subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub2"})) + }) ack := cbs.On("DeliveryResponse", mock.MatchedBy(func(s string) bool { return s == connID }), mock.Anything).Return(nil) @@ -296,28 +379,107 @@ func TestStartReceiveDurable(t *testing.T) { cbs.AssertExpectations(t) } -func TestStartReceiveDurableWithAuth(t *testing.T) { +func TestStartReceiveDurableBatch(t *testing.T) { cbs := &eventsmocks.Callbacks{} - ws, wsc, cancel := newTestWebsockets(t, cbs, &testAuthorizer{}) + ws, wsc, cancel := newTestWebsockets(t, cbs, nil) defer cancel() var connID string - sub := cbs.On("RegisterConnection", + mrg := cbs.On("RegisterConnection", mock.MatchedBy(func(s string) bool { connID = s; return true }), - mock.MatchedBy(func(subMatch events.SubscriptionMatcher) bool { - return subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub1"}) && - !subMatch(core.SubscriptionRef{Namespace: "ns2", Name: "sub1"}) && - !subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub2"}) - }), - ).Return(nil) + mock.Anything, + ).Return(nil).Run(func(args mock.Arguments) { + subMatch := args[1].(events.SubscriptionMatcher) + assert.True(t, subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub1"})) + assert.False(t, subMatch(core.SubscriptionRef{Namespace: "ns2", Name: "sub1"})) + assert.False(t, subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub2"})) + }) ack := cbs.On("DeliveryResponse", mock.MatchedBy(func(s string) bool { return s == connID }), mock.Anything).Return(nil) waitSubscribed := make(chan struct{}) - sub.RunFn = func(a mock.Arguments) { + mrg.RunFn = func(a mock.Arguments) { close(waitSubscribed) } + acks := make(chan *core.EventDeliveryResponse) + ack.RunFn = func(a mock.Arguments) { + acks <- a[1].(*core.EventDeliveryResponse) + } + + err := wsc.Send(context.Background(), []byte(`{"type":"start","namespace":"ns1","name":"sub1"}`)) + assert.NoError(t, err) + + <-waitSubscribed + sub := &core.Subscription{ + SubscriptionRef: core.SubscriptionRef{ID: fftypes.NewUUID(), Namespace: "ns1", Name: "sub1"}, + } + event1ID := fftypes.NewUUID() + event2ID := fftypes.NewUUID() + ws.BatchDeliveryRequest(ws.ctx, connID, sub, []*core.CombinedEventDataDelivery{ + { + Event: &core.EventDelivery{ + EnrichedEvent: core.EnrichedEvent{ + Event: core.Event{ID: event1ID}, + }, + Subscription: sub.SubscriptionRef, + }, + }, + { + Event: &core.EventDelivery{ + EnrichedEvent: core.EnrichedEvent{ + Event: core.Event{ID: event2ID}, + }, + Subscription: sub.SubscriptionRef, + }, + }, + }) + + b := <-wsc.Receive() + var deliveredBatch core.WSEventBatch + err = json.Unmarshal(b, &deliveredBatch) + assert.NoError(t, err) + assert.Len(t, deliveredBatch.Events, 2) + assert.Equal(t, "ns1", deliveredBatch.Subscription.Namespace) + assert.Equal(t, "sub1", deliveredBatch.Subscription.Name) + err = wsc.Send(context.Background(), []byte(fmt.Sprintf(`{ + "type":"ack", + "id": "%s", + "subscription": { + "namespace": "ns1", + "name": "sub1" + } + }`, deliveredBatch.ID))) + assert.NoError(t, err) + + ack1 := <-acks + assert.Equal(t, *event1ID, *ack1.ID) + ack2 := <-acks + assert.Equal(t, *event2ID, *ack2.ID) + + cbs.AssertExpectations(t) +} + +func TestStartReceiveDurableWithAuth(t *testing.T) { + cbs := &eventsmocks.Callbacks{} + ws, wsc, cancel := newTestWebsockets(t, cbs, &testAuthorizer{}) + defer cancel() + var connID string + waitSubscribed := make(chan struct{}) + cbs.On("RegisterConnection", + mock.MatchedBy(func(s string) bool { connID = s; return true }), + mock.Anything, + ).Run(func(args mock.Arguments) { + subMatch := args[1].(events.SubscriptionMatcher) + assert.True(t, subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub1"})) + assert.False(t, subMatch(core.SubscriptionRef{Namespace: "ns2", Name: "sub1"})) + assert.False(t, subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub2"})) + close(waitSubscribed) + }).Return(nil) + ack := cbs.On("DeliveryResponse", + mock.MatchedBy(func(s string) bool { return s == connID }), + mock.Anything).Return(nil) + waitAcked := make(chan struct{}) ack.RunFn = func(a mock.Arguments) { close(waitAcked) @@ -381,22 +543,20 @@ func TestStartReceiveDurableUnauthorized(t *testing.T) { _, wsc, cancel := newTestWebsockets(t, cbs, &testAuthorizer{}) defer cancel() var connID string - sub := cbs.On("RegisterConnection", + waitSubscribed := make(chan struct{}) + cbs.On("RegisterConnection", mock.MatchedBy(func(s string) bool { connID = s; return true }), - mock.MatchedBy(func(subMatch events.SubscriptionMatcher) bool { - return subMatch(core.SubscriptionRef{Namespace: "ns2", Name: "sub1"}) && - !subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub2"}) - }), - ).Return(nil) + mock.Anything, + ).Return(nil).Run(func(args mock.Arguments) { + subMatch := args[1].(events.SubscriptionMatcher) + assert.True(t, subMatch(core.SubscriptionRef{Namespace: "ns2", Name: "sub1"})) + assert.False(t, subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub2"})) + close(waitSubscribed) + }) ack := cbs.On("DeliveryResponse", mock.MatchedBy(func(s string) bool { return s == connID }), mock.Anything).Return(nil) - waitSubscribed := make(chan struct{}) - sub.RunFn = func(a mock.Arguments) { - close(waitSubscribed) - } - waitAcked := make(chan struct{}) ack.RunFn = func(a mock.Arguments) { close(waitAcked) @@ -415,18 +575,18 @@ func TestStartReceiveDurableUnauthorized(t *testing.T) { func TestAutoStartReceiveAckEphemeral(t *testing.T) { var connID string cbs := &eventsmocks.Callbacks{} - sub := cbs.On("EphemeralSubscription", + waitSubscribed := make(chan struct{}) + cbs.On("EphemeralSubscription", mock.MatchedBy(func(s string) bool { connID = s; return true }), - "ns1", mock.Anything, mock.Anything).Return(nil) + "ns1", mock.Anything, mock.Anything). + Return(nil). + Run(func(args mock.Arguments) { + close(waitSubscribed) + }) ack := cbs.On("DeliveryResponse", mock.MatchedBy(func(s string) bool { return s == connID }), mock.Anything).Return(nil) - waitSubscribed := make(chan struct{}) - sub.RunFn = func(a mock.Arguments) { - close(waitSubscribed) - } - waitAcked := make(chan struct{}) ack.RunFn = func(a mock.Arguments) { close(waitAcked) @@ -458,6 +618,55 @@ func TestAutoStartReceiveAckEphemeral(t *testing.T) { cbs.AssertExpectations(t) } +func TestAutoStartReceiveAckBatchEphemeral(t *testing.T) { + var connID string + cbs := &eventsmocks.Callbacks{} + waitSubscribed := make(chan struct{}) + cbs.On("EphemeralSubscription", + mock.MatchedBy(func(s string) bool { connID = s; return true }), + "ns1", mock.Anything, mock.Anything). + Return(nil). + Run(func(args mock.Arguments) { + close(waitSubscribed) + }) + ack := cbs.On("DeliveryResponse", + mock.MatchedBy(func(s string) bool { return s == connID }), + mock.Anything).Return(nil) + + waitAcked := make(chan struct{}) + ack.RunFn = func(a mock.Arguments) { + close(waitAcked) + } + + ws, wsc, cancel := newTestWebsockets(t, cbs, nil, "ephemeral", "namespace=ns1", "batch") + defer cancel() + + <-waitSubscribed + ws.BatchDeliveryRequest(ws.ctx, connID, nil, []*core.CombinedEventDataDelivery{ + {Event: &core.EventDelivery{ + EnrichedEvent: core.EnrichedEvent{ + Event: core.Event{ID: fftypes.NewUUID()}, + }, + Subscription: core.SubscriptionRef{ + ID: fftypes.NewUUID(), + Namespace: "ns1", + }, + }}, + }) + + b := <-wsc.Receive() + var deliveredBatch core.WSEventBatch + err := json.Unmarshal(b, &deliveredBatch) + assert.NoError(t, err) + assert.Len(t, deliveredBatch.Events, 1) + + err = wsc.Send(context.Background(), []byte(`{"type":"ack", "id": "`+deliveredBatch.ID.String()+`"}`)) + assert.NoError(t, err) + + <-waitAcked + cbs.AssertExpectations(t) +} + func TestAutoStartBadOptions(t *testing.T) { cbs := &eventsmocks.Callbacks{} _, wsc, cancel := newTestWebsockets(t, cbs, nil, "name=missingnamespace") @@ -471,6 +680,29 @@ func TestAutoStartBadOptions(t *testing.T) { cbs.AssertExpectations(t) } +func TestAutoStartCustomReadAheadBatch(t *testing.T) { + cbs := &eventsmocks.Callbacks{} + + subscribedConn := make(chan string, 1) + cbs.On("EphemeralSubscription", + mock.MatchedBy(func(s string) bool { + subscribedConn <- s + return true + }), + "ns1", + mock.Anything, + mock.MatchedBy(func(o *core.SubscriptionOptions) bool { + return *o.ReadAhead == 42 && *o.BatchTimeout == "1s" + }), + ).Return(nil) + + _, _, cancel := newTestWebsockets(t, cbs, nil, "namespace=ns1", "ephemeral", "batch", "batchtimeout=1s", "readahead=42") + defer cancel() + + <-subscribedConn + +} + func TestAutoStartBadNamespace(t *testing.T) { cbs := &eventsmocks.Callbacks{} _, wsc, cancel := newTestWebsockets(t, cbs, nil, "ephemeral", "namespace=ns2") @@ -503,6 +735,30 @@ func TestHandleAckWithAutoAck(t *testing.T) { assert.Regexp(t, "FF10180", err) } +func TestHandleBatchNotMatch(t *testing.T) { + eventUUID := fftypes.NewUUID() + wsc := &websocketConnection{ + ctx: context.Background(), + started: []*websocketStartedSub{{WSStart: core.WSStart{ + Ephemeral: false, Name: "name1", Namespace: "ns1", + }}}, + sendMessages: make(chan interface{}, 1), + inflight: []*core.EventDeliveryResponse{ + {ID: eventUUID}, + }, + inflightBatches: []*core.WSEventBatch{ + {ID: fftypes.NewUUID()}, + }, + autoAck: true, + } + err := wsc.handleAck(&core.WSAck{ + ID: eventUUID, + }) + assert.Regexp(t, "FF10180", err) + assert.Len(t, wsc.inflight, 1) + assert.Len(t, wsc.inflightBatches, 1) +} + func TestHandleStartFlippingAutoAck(t *testing.T) { eventUUID := fftypes.NewUUID() wsc := &websocketConnection{ @@ -645,6 +901,16 @@ func TestConnectionDispatchAfterClose(t *testing.T) { assert.Regexp(t, "FF00147", err) } +func TestConnectionDispatchBatchAfterClose(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + cancel() + wsc := &websocketConnection{ + ctx: ctx, + } + err := wsc.dispatchBatch(&core.Subscription{}, []*core.CombinedEventDataDelivery{}) + assert.Regexp(t, "FF00147", err) +} + func TestWebsocketDispatchAfterClose(t *testing.T) { ws := &WebSockets{ ctx: context.Background(), @@ -654,6 +920,15 @@ func TestWebsocketDispatchAfterClose(t *testing.T) { assert.Regexp(t, "FF10173", err) } +func TestWebsocketBatchDispatchAfterClose(t *testing.T) { + ws := &WebSockets{ + ctx: context.Background(), + connections: make(map[string]*websocketConnection), + } + err := ws.BatchDeliveryRequest(ws.ctx, "gone", nil, []*core.CombinedEventDataDelivery{}) + assert.Regexp(t, "FF10173", err) +} + func TestDispatchAutoAck(t *testing.T) { cbs := &eventsmocks.Callbacks{} cbs.On("DeliveryResponse", mock.Anything, mock.Anything).Return(nil) @@ -806,17 +1081,142 @@ func TestNamespaceRestartedFailClose(t *testing.T) { mcb.AssertExpectations(t) } -func TestEventDeliveryBatchReturnsUnsupported(t *testing.T) { +func TestNamespaceScopedSendWrongNamespaceStartAction(t *testing.T) { cbs := &eventsmocks.Callbacks{} - ws, _, cancel := newTestWebsockets(t, cbs, nil) + _, wsc, cancel := newTestWebsocketsCommon(t, cbs, nil, "ns1") defer cancel() + cbs.On("ConnectionClosed", mock.Anything).Return(nil) - sub := &core.Subscription{ - SubscriptionRef: core.SubscriptionRef{ + err := wsc.Send(context.Background(), []byte(`{"type":"start","namespace":"ns2"}`)) + assert.NoError(t, err) + b := <-wsc.Receive() + var res core.WSError + err = json.Unmarshal(b, &res) + assert.NoError(t, err) + assert.Equal(t, core.WSProtocolErrorEventType, res.Type) + assert.Regexp(t, "FF10462", res.Error) +} + +func TestNamespaceScopedSendWrongNamespaceQueryParameter(t *testing.T) { + cbs := &eventsmocks.Callbacks{} + _, wsc, cancel := newTestWebsocketsCommon(t, cbs, nil, "ns1", "namespace=ns2") + defer cancel() + cbs.On("ConnectionClosed", mock.Anything).Return(nil) + + b := <-wsc.Receive() + var res core.WSError + err := json.Unmarshal(b, &res) + assert.NoError(t, err) + assert.Equal(t, core.WSProtocolErrorEventType, res.Type) + assert.Regexp(t, "FF10462", res.Error) +} + +func TestNamespaceScopedUpgradeFail(t *testing.T) { + cbs := &eventsmocks.Callbacks{} + _, wsc, cancel := newTestWebsocketsCommon(t, cbs, nil, "ns1") + defer cancel() + + u, _ := url.Parse(wsc.URL()) + u.Scheme = "http" + res, err := http.Get(u.String()) + assert.NoError(t, err) + assert.Equal(t, 400, res.StatusCode) + +} + +func TestNamespaceScopedSuccess(t *testing.T) { + cbs := &eventsmocks.Callbacks{} + ws, wsc, cancel := newTestWebsocketsCommon(t, cbs, nil, "ns1") + defer cancel() + var connID string + waitSubscribed := make(chan struct{}) + + cbs.On("RegisterConnection", + mock.MatchedBy(func(s string) bool { connID = s; return true }), + mock.Anything, + ).Return(nil).Run(func(args mock.Arguments) { + subMatch := args[1].(events.SubscriptionMatcher) + assert.True(t, subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub1"})) + assert.False(t, subMatch(core.SubscriptionRef{Namespace: "ns2", Name: "sub1"})) + assert.False(t, subMatch(core.SubscriptionRef{Namespace: "ns1", Name: "sub2"})) + close(waitSubscribed) + }) + ack := cbs.On("DeliveryResponse", + mock.MatchedBy(func(s string) bool { return s == connID }), + mock.Anything).Return(nil) + + waitAcked := make(chan struct{}) + ack.RunFn = func(a mock.Arguments) { + close(waitAcked) + } + + err := wsc.Send(context.Background(), []byte(`{"type":"start","name":"sub1"}`)) + assert.NoError(t, err) + + <-waitSubscribed + ws.DeliveryRequest(ws.ctx, connID, nil, &core.EventDelivery{ + EnrichedEvent: core.EnrichedEvent{ + Event: core.Event{ID: fftypes.NewUUID()}, + }, + Subscription: core.SubscriptionRef{ + ID: fftypes.NewUUID(), Namespace: "ns1", + Name: "sub1", }, - } + }, nil) + // Put a second in flight + ws.DeliveryRequest(ws.ctx, connID, nil, &core.EventDelivery{ + EnrichedEvent: core.EnrichedEvent{ + Event: core.Event{ID: fftypes.NewUUID()}, + }, + Subscription: core.SubscriptionRef{ + ID: fftypes.NewUUID(), + Namespace: "ns1", + Name: "sub2", + }, + }, nil) + + b := <-wsc.Receive() + var res core.EventDelivery + err = json.Unmarshal(b, &res) + assert.NoError(t, err) + + assert.Equal(t, "ns1", res.Subscription.Namespace) + assert.Equal(t, "sub1", res.Subscription.Name) + err = wsc.Send(context.Background(), []byte(fmt.Sprintf(`{ + "type":"ack", + "id": "%s", + "subscription": { + "namespace": "ns1", + "name": "sub1" + } + }`, res.ID))) + assert.NoError(t, err) + + <-waitAcked - err := ws.BatchDeliveryRequest(ws.ctx, "id", sub, []*core.CombinedEventDataDelivery{}) - assert.Regexp(t, "FF10461", err) + // Check we left the right one behind + conn := ws.connections[connID] + assert.Equal(t, 1, len(conn.inflight)) + assert.Equal(t, "sub2", conn.inflight[0].Subscription.Name) + + cbs.AssertExpectations(t) +} + +func TestHandleStartWrongNamespace(t *testing.T) { + + // it is not currently possible through exported functions to get to handleStart with the wrong namespace + // but we like to have a final assertion in there as a safety net for accidentaly data leakage across namespaces + // so to prove that safety net, we need to drive the private function handleStart directly. + wc := &websocketConnection{ + ctx: context.Background(), + namespaceScoped: true, + namespace: "ns1", + } + startMessage := &core.WSStart{ + Namespace: "ns2", + } + err := wc.handleStart(startMessage) + assert.Error(t, err) + assert.Regexp(t, "FF10462", err) } diff --git a/internal/identity/identitymanager.go b/internal/identity/identitymanager.go index c20b19e2b..3121f3a6a 100644 --- a/internal/identity/identitymanager.go +++ b/internal/identity/identitymanager.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -105,13 +105,12 @@ func ParseKeyNormalizationConfig(strConfigVal string) int { func (im *identityManager) GetLocalNode(ctx context.Context) (node *core.Identity, err error) { nodeName := im.multiparty.LocalNode().Name - if nodeName != "" { - nodeDID := fmt.Sprintf("%s%s", core.FireFlyNodeDIDPrefix, nodeName) - node, _, err = im.CachedIdentityLookupNilOK(ctx, nodeDID) - } - if err == nil && node == nil { + if nodeName == "" { return nil, i18n.NewError(ctx, coremsgs.MsgLocalNodeNotSet) } + + nodeDID := fmt.Sprintf("%s%s", core.FireFlyNodeDIDPrefix, nodeName) + node, _, err = im.CachedIdentityLookupNilOK(ctx, nodeDID) return node, err } diff --git a/internal/namespace/config.go b/internal/namespace/config.go index 16ff8ade6..7345b1a19 100644 --- a/internal/namespace/config.go +++ b/internal/namespace/config.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // diff --git a/internal/namespace/configreload.go b/internal/namespace/configreload.go index 486c111ec..1556fb2f6 100644 --- a/internal/namespace/configreload.go +++ b/internal/namespace/configreload.go @@ -61,6 +61,8 @@ func (nm *namespaceManager) configFileChanged() { } func (nm *namespaceManager) configReloaded(ctx context.Context) { + // Always make sure log level is up to date + log.SetLevel(config.GetString(config.LogLevel)) // Get Viper to dump the whole new config, with everything resolved across env vars // and the config file etc. diff --git a/internal/namespace/manager.go b/internal/namespace/manager.go index 36409a574..018b04e5d 100644 --- a/internal/namespace/manager.go +++ b/internal/namespace/manager.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -798,6 +798,7 @@ func (nm *namespaceManager) loadTLSConfig(ctx context.Context, tlsConfigs map[st return nil } +// nolint: gocyclo func (nm *namespaceManager) loadNamespace(ctx context.Context, name string, index int, conf config.Section, rawNSConfig fftypes.JSONObject, availablePlugins map[string]*plugin) (ns *namespace, err error) { if err := fftypes.ValidateFFNameField(ctx, name, fmt.Sprintf("namespaces.predefined[%d].name", index)); err != nil { return nil, err @@ -890,9 +891,10 @@ func (nm *namespaceManager) loadNamespace(ctx context.Context, name string, inde } config := orchestrator.Config{ - DefaultKey: conf.GetString(coreconfig.NamespaceDefaultKey), - TokenBroadcastNames: nm.tokenBroadcastNames, - KeyNormalization: keyNormalization, + DefaultKey: conf.GetString(coreconfig.NamespaceDefaultKey), + TokenBroadcastNames: nm.tokenBroadcastNames, + KeyNormalization: keyNormalization, + MaxHistoricalEventScanLimit: config.GetInt(coreconfig.SubscriptionMaxHistoricalEventScanLength), } if multipartyEnabled.(bool) { contractsConf := multipartyConf.SubArray(coreconfig.NamespaceMultipartyContract) diff --git a/internal/networkmap/update_identity.go b/internal/networkmap/update_identity.go index a7435182e..d675c8e75 100644 --- a/internal/networkmap/update_identity.go +++ b/internal/networkmap/update_identity.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -44,6 +44,12 @@ func (nm *networkMap) updateIdentityID(ctx context.Context, id *fftypes.UUID, dt return nil, i18n.NewError(ctx, coremsgs.Msg404NoResult) } + // We can't sparse merge the generic JSON fields, but we need to propagate the ID + if dto.IdentityProfile.Profile.GetString("id") == "" { + existingID := identity.IdentityProfile.Profile.GetString("id") + dto.IdentityProfile.Profile["id"] = existingID + } + var updateSigner *core.SignerRef if nm.multiparty != nil { diff --git a/internal/networkmap/update_identity_test.go b/internal/networkmap/update_identity_test.go index 20f0ce921..08507082b 100644 --- a/internal/networkmap/update_identity_test.go +++ b/internal/networkmap/update_identity_test.go @@ -192,3 +192,79 @@ func TestUpdateIdentityProfileBadID(t *testing.T) { _, err := nm.UpdateIdentity(nm.ctx, "badness", &core.IdentityUpdateDTO{}, true) assert.Regexp(t, "FF00138", err) } + +func TestUpdateIdentityProfileExistingIdNotSpecified(t *testing.T) { + + nm, cancel := newTestNetworkmap(t) + defer cancel() + + identity := testOrg("org1") + identity.Profile["id"] = "member_0/node_aaaaaa" + + mim := nm.identity.(*identitymanagermocks.Manager) + mim.On("CachedIdentityLookupByID", nm.ctx, identity.ID).Return(identity, nil) + signerRef := &core.SignerRef{Key: "0x12345"} + mim.On("ResolveIdentitySigner", nm.ctx, identity).Return(signerRef, nil) + + mds := nm.defsender.(*definitionsmocks.Sender) + + mds.On("UpdateIdentity", nm.ctx, + mock.AnythingOfType("*core.Identity"), + mock.MatchedBy(func(iden *core.IdentityUpdate) bool { + return iden.Updates.Profile.GetString("id") == "member_0/node_aaaaaa" + }), + mock.MatchedBy(func(sr *core.SignerRef) bool { + return sr.Key == "0x12345" + }), + true).Return(nil) + + org, err := nm.UpdateIdentity(nm.ctx, identity.ID.String(), &core.IdentityUpdateDTO{ + IdentityProfile: core.IdentityProfile{ + Description: "new desc", + Profile: fftypes.JSONObject{"new": "profile"}, + }, + }, true) + assert.NoError(t, err) + assert.NotNil(t, org) + + mim.AssertExpectations(t) + mds.AssertExpectations(t) +} + +func TestUpdateIdentityProfileOverwrite(t *testing.T) { + + nm, cancel := newTestNetworkmap(t) + defer cancel() + + identity := testOrg("org1") + identity.Profile["id"] = "member_0/node_aaaaaa" + + mim := nm.identity.(*identitymanagermocks.Manager) + mim.On("CachedIdentityLookupByID", nm.ctx, identity.ID).Return(identity, nil) + signerRef := &core.SignerRef{Key: "0x12345"} + mim.On("ResolveIdentitySigner", nm.ctx, identity).Return(signerRef, nil) + + mds := nm.defsender.(*definitionsmocks.Sender) + + mds.On("UpdateIdentity", nm.ctx, + mock.AnythingOfType("*core.Identity"), + mock.MatchedBy(func(iden *core.IdentityUpdate) bool { + return iden.Updates.Profile.GetString("id") == "member_0/node_bbbbbb" + }), + mock.MatchedBy(func(sr *core.SignerRef) bool { + return sr.Key == "0x12345" + }), + true).Return(nil) + + org, err := nm.UpdateIdentity(nm.ctx, identity.ID.String(), &core.IdentityUpdateDTO{ + IdentityProfile: core.IdentityProfile{ + Description: "new desc", + Profile: fftypes.JSONObject{"new": "profile", "id": "member_0/node_bbbbbb"}, + }, + }, true) + assert.NoError(t, err) + assert.NotNil(t, org) + + mim.AssertExpectations(t) + mds.AssertExpectations(t) +} diff --git a/internal/operations/operation_updater.go b/internal/operations/operation_updater.go index 0365d8fff..9f3b6d3a6 100644 --- a/internal/operations/operation_updater.go +++ b/internal/operations/operation_updater.go @@ -105,6 +105,12 @@ func (ou *operationUpdater) SubmitOperationUpdate(ctx context.Context, update *c } if ou.conf.workerCount > 0 { + if update.Status == core.OpStatusFailed { + // We do a cache update pre-emptively, as for idempotency checking on an error status we want to + // see the update immediately - even though it's being asynchronously flushed to the storage + ou.manager.updateCachedOperation(id, update.Status, &update.ErrorMessage, update.Output, nil) + } + select { case ou.pickWorker(ctx, id, update) <- update: case <-ou.ctx.Done(): diff --git a/internal/orchestrator/data_query.go b/internal/orchestrator/data_query.go index 36ac69d6a..f24555ec8 100644 --- a/internal/orchestrator/data_query.go +++ b/internal/orchestrator/data_query.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -322,13 +322,24 @@ func (or *orchestrator) GetEventsWithReferences(ctx context.Context, filter ffap return nil, nil, err } - enriched := make([]*core.EnrichedEvent, len(events)) - for i, event := range events { - enrichedEvent, err := or.events.EnrichEvent(or.ctx, event) - if err != nil { - return nil, nil, err - } - enriched[i] = enrichedEvent + enriched, err := or.events.EnrichEvents(ctx, events) + if err != nil { + return nil, nil, err } + + return enriched, fr, err +} + +func (or *orchestrator) GetEventsWithReferencesInSequenceRange(ctx context.Context, filter ffapi.AndFilter, startSequence int, endSequence int) ([]*core.EnrichedEvent, *ffapi.FilterResult, error) { + events, fr, err := or.database().GetEventsInSequenceRange(ctx, or.namespace.Name, filter, startSequence, endSequence) + if err != nil { + return nil, nil, err + } + + enriched, err := or.events.EnrichEvents(ctx, events) + if err != nil { + return nil, nil, err + } + return enriched, fr, err } diff --git a/internal/orchestrator/data_query_test.go b/internal/orchestrator/data_query_test.go index 1de2489ef..384484ac6 100644 --- a/internal/orchestrator/data_query_test.go +++ b/internal/orchestrator/data_query_test.go @@ -691,25 +691,25 @@ func TestGetEventsWithReferences(t *testing.T) { Type: core.EventTypeMessageConfirmed, } - or.mem.On("EnrichEvent", mock.Anything, blockchainEvent).Return(&core.EnrichedEvent{ - Event: *blockchainEvent, - BlockchainEvent: &core.BlockchainEvent{ - ID: ref1, + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return([]*core.EnrichedEvent{ + { + Event: *blockchainEvent, + BlockchainEvent: &core.BlockchainEvent{ + ID: ref1, + }, }, - }, nil) - - or.mem.On("EnrichEvent", mock.Anything, txEvent).Return(&core.EnrichedEvent{ - Event: *txEvent, - Transaction: &core.Transaction{ - ID: ref2, + { + Event: *txEvent, + Transaction: &core.Transaction{ + ID: ref2, + }, }, - }, nil) - - or.mem.On("EnrichEvent", mock.Anything, msgEvent).Return(&core.EnrichedEvent{ - Event: *msgEvent, - Message: &core.Message{ - Header: core.MessageHeader{ - ID: ref3, + { + Event: *msgEvent, + Message: &core.Message{ + Header: core.MessageHeader{ + ID: ref3, + }, }, }, }, nil) @@ -731,7 +731,7 @@ func TestGetEventsWithReferencesEnrichFail(t *testing.T) { u := fftypes.NewUUID() or.mdi.On("GetEvents", mock.Anything, "ns", mock.Anything).Return([]*core.Event{{ID: fftypes.NewUUID()}}, nil, nil) - or.mem.On("EnrichEvent", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("pop")) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("pop")) fb := database.EventQueryFactory.NewFilter(context.Background()) f := fb.And(fb.Eq("id", u)) _, _, err := or.GetEventsWithReferences(context.Background(), f) @@ -848,3 +848,15 @@ func TestGetNextPins(t *testing.T) { _, _, err := or.GetNextPins(context.Background(), f) assert.NoError(t, err) } + +func TestGetEventsInSequenceWithReferencesWhenEnrichEventsFails(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + u := fftypes.NewUUID() + or.mdi.On("GetEventsInSequenceRange", mock.Anything, "ns", mock.Anything, mock.Anything, mock.Anything).Return([]*core.Event{}, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return(nil, fmt.Errorf("Oops...")) + fb := database.EventQueryFactory.NewFilter(context.Background()) + f := fb.And(fb.Eq("id", u)) + _, _, err := or.GetEventsWithReferencesInSequenceRange(context.Background(), f, 0, 100) + assert.EqualError(t, err, "Oops...") +} diff --git a/internal/orchestrator/orchestrator.go b/internal/orchestrator/orchestrator.go index 186782d63..3b599b915 100644 --- a/internal/orchestrator/orchestrator.go +++ b/internal/orchestrator/orchestrator.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -81,6 +81,7 @@ type Orchestrator interface { GetSubscriptions(ctx context.Context, filter ffapi.AndFilter) ([]*core.Subscription, *ffapi.FilterResult, error) GetSubscriptionByID(ctx context.Context, id string) (*core.Subscription, error) GetSubscriptionByIDWithStatus(ctx context.Context, id string) (*core.SubscriptionWithStatus, error) + GetSubscriptionEventsHistorical(ctx context.Context, subscription *core.Subscription, filter ffapi.AndFilter, startSequence int, endSequence int) ([]*core.EnrichedEvent, *ffapi.FilterResult, error) CreateSubscription(ctx context.Context, subDef *core.Subscription) (*core.Subscription, error) CreateUpdateSubscription(ctx context.Context, subDef *core.Subscription) (*core.Subscription, error) DeleteSubscription(ctx context.Context, id string) error @@ -181,10 +182,11 @@ type Plugins struct { } type Config struct { - DefaultKey string - KeyNormalization string - Multiparty multiparty.Config - TokenBroadcastNames map[string]string + DefaultKey string + KeyNormalization string + Multiparty multiparty.Config + TokenBroadcastNames map[string]string + MaxHistoricalEventScanLimit int } type orchestrator struct { diff --git a/internal/orchestrator/orchestrator_test.go b/internal/orchestrator/orchestrator_test.go index a3a3d31ca..695a6e374 100644 --- a/internal/orchestrator/orchestrator_test.go +++ b/internal/orchestrator/orchestrator_test.go @@ -171,6 +171,7 @@ func newTestOrchestrator() *testOrchestrator { tor.orchestrator.defhandler = tor.mdh tor.orchestrator.defsender = tor.mds tor.orchestrator.config.Multiparty.Enabled = true + tor.orchestrator.config.MaxHistoricalEventScanLimit = 1000 tor.orchestrator.plugins = &Plugins{ Blockchain: BlockchainPlugin{ Plugin: tor.mbi, diff --git a/internal/orchestrator/subscriptions.go b/internal/orchestrator/subscriptions.go index fcfd93412..d7ebe9743 100644 --- a/internal/orchestrator/subscriptions.go +++ b/internal/orchestrator/subscriptions.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -18,11 +18,14 @@ package orchestrator import ( "context" + "math" "time" + "github.com/hyperledger/firefly-common/pkg/config" "github.com/hyperledger/firefly-common/pkg/ffapi" "github.com/hyperledger/firefly-common/pkg/fftypes" "github.com/hyperledger/firefly-common/pkg/i18n" + "github.com/hyperledger/firefly/internal/coreconfig" "github.com/hyperledger/firefly/internal/coremsgs" "github.com/hyperledger/firefly/internal/events/system" "github.com/hyperledger/firefly/pkg/core" @@ -134,3 +137,58 @@ func (or *orchestrator) GetSubscriptionByIDWithStatus(ctx context.Context, id st return subWithStatus, nil } + +func (or *orchestrator) GetSubscriptionEventsHistorical(ctx context.Context, subscription *core.Subscription, filter ffapi.AndFilter, startSequence int, endSequence int) ([]*core.EnrichedEvent, *ffapi.FilterResult, error) { + if startSequence != -1 && endSequence != -1 && endSequence-startSequence > config.GetInt(coreconfig.SubscriptionMaxHistoricalEventScanLength) { + return nil, nil, i18n.NewError(ctx, coremsgs.MsgMaxSubscriptionEventScanLimitBreached, startSequence, endSequence) + } + + requestedFiltering, err := filter.Finalize() + if err != nil { + return nil, nil, err + } + + var unfilteredEvents []*core.EnrichedEvent + if startSequence == -1 && endSequence == -1 { + unfilteredEvents, _, err = or.GetEventsWithReferences(ctx, filter) + if err != nil { + return nil, nil, err + } + } else { + if startSequence == -1 { + recordLimit := math.Min(float64(requestedFiltering.Limit), float64(config.GetInt(coreconfig.SubscriptionMaxHistoricalEventScanLength))) + if endSequence-int(recordLimit) > 0 { + startSequence = endSequence - int(recordLimit) + } else { + startSequence = 0 + } + } + + if endSequence == -1 { + // This blind assertion is safe since the DB won't blow up, it'll just return nothing + endSequence = startSequence + 1000 + } + + unfilteredEvents, _, err = or.GetEventsWithReferencesInSequenceRange(ctx, filter, startSequence, endSequence) + if err != nil { + return nil, nil, err + } + } + + filteredEvents, err := or.events.FilterHistoricalEventsOnSubscription(ctx, unfilteredEvents, subscription) + if err != nil { + return nil, nil, err + } + + var filteredEventsMatchingSubscription []*core.EnrichedEvent + if len(filteredEvents) > int(requestedFiltering.Limit) { + filteredEventsMatchingSubscription = filteredEvents[len(filteredEvents)-int(requestedFiltering.Limit):] + } else { + filteredEventsMatchingSubscription = filteredEvents + } + + filterResultLength := int64(len(filteredEventsMatchingSubscription)) + return filteredEventsMatchingSubscription, &ffapi.FilterResult{ + TotalCount: &filterResultLength, + }, nil +} diff --git a/internal/orchestrator/subscriptions_test.go b/internal/orchestrator/subscriptions_test.go index 58326469f..bee445506 100644 --- a/internal/orchestrator/subscriptions_test.go +++ b/internal/orchestrator/subscriptions_test.go @@ -358,3 +358,258 @@ func TestGetSGetSubscriptionsByIDWithStatusUnknownSub(t *testing.T) { assert.NoError(t, err) assert.Nil(t, subWithStatus) } + +func generateFakeEvents(eventCount int) ([]*core.Event, []*core.EnrichedEvent) { + baseEvents := []*core.Event{} + enrichedEvents := []*core.EnrichedEvent{} + baseEvent := &core.Event{ + Type: core.EventTypeIdentityConfirmed, + Topic: "Topic1", + } + enrichedEvent := &core.EnrichedEvent{ + Event: *baseEvent, + BlockchainEvent: &core.BlockchainEvent{ + Namespace: "ns1", + }, + } + + for i := 0; i < eventCount; i++ { + baseEvents = append(baseEvents, baseEvent) + enrichedEvents = append(enrichedEvents, enrichedEvent) + } + + return baseEvents, enrichedEvents +} + +func TestGetHistoricalEventsForSubscription(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + baseEvents, enrichedEvents := generateFakeEvents(20) + + or.mdi.On("GetEventsInSequenceRange", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(baseEvents, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return(enrichedEvents, nil) + or.mem.On("FilterHistoricalEventsOnSubscription", mock.Anything, mock.Anything, mock.Anything).Return(enrichedEvents, nil) + + u := fftypes.NewUUID() + // Subscription will match all of the the fake events + sub := &core.Subscription{ + SubscriptionRef: core.SubscriptionRef{ + ID: u, + Name: "sub1", + Namespace: "ns1", + }, + } + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(20) + retEvents, _, err := or.GetSubscriptionEventsHistorical(context.Background(), sub, filter, 0, 100) + assert.Equal(t, err, nil) + assert.Equal(t, len(retEvents), 20) +} + +func TestGetHistoricalEventsForSubscriptionNotEnoughEventsToSatisfyLimit(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + // Generate fewer events than the total event limit + baseEvents, enrichedEvents := generateFakeEvents(20) + + or.mdi.On("GetEventsInSequenceRange", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(baseEvents, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return(enrichedEvents, nil) + or.mem.On("FilterHistoricalEventsOnSubscription", mock.Anything, mock.Anything, mock.Anything).Return(enrichedEvents, nil) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(50) + + retEvents, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, 0, 100) + assert.Equal(t, err, nil) + assert.Equal(t, 20, len(retEvents)) +} + +func TestGetHistoricalEventsForSubscriptionMoreEventsThanRequired(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + // Generate more events than the overall limit + baseEvents, enrichedEvents := generateFakeEvents(50) + + or.mdi.On("GetEventsInSequenceRange", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(baseEvents, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return(enrichedEvents, nil) + or.mem.On("FilterHistoricalEventsOnSubscription", mock.Anything, mock.Anything, mock.Anything).Return(enrichedEvents, nil) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(25) // Limit of processing 25 unfiltered events + retEvents, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, 0, 100) + assert.Equal(t, err, nil) + assert.Equal(t, 25, len(retEvents)) +} + +func TestGetHistoricalEventsForSubscriptionGetEventsFails(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + or.mdi.On("GetEventsInSequenceRange", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("Something went wrong!")) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(20) + + _, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, 0, 100) + assert.NotNil(t, err) +} + +func TestGetHistoricalEventsForSubscriptionBadQueryFilter(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And(fb.Eq("tag", map[bool]bool{true: false})) + _, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, 0, 100) + assert.NotNil(t, err) +} + +func TestGetHistoricalEventsForSubscriptionGettingHistoricalEventsThrows(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + baseEvents, _ := generateFakeEvents(20) + + or.mdi.On("GetEventsInSequenceRange", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(baseEvents, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return([]*core.EnrichedEvent{}, nil) + or.mem.On("FilterHistoricalEventsOnSubscription", mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("KERRR-BOOM!")) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(20) + + _, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, 0, 100) + assert.NotNil(t, err) +} + +func TestGetHistoricalEventsForSubscriptionGettingHistoricalEventsGoesPastScanLimit(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + + _, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, 0, 2000) // Default limit is 1000 + assert.NotNil(t, err) + assert.Contains(t, err.Error(), "Event scan limit breached") +} + +func TestGetHistoricalEventsForSubscriptionEndSequenceNotProvided(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(1000) + + // Generate more events than the overall limit + baseEvents, enrichedEvents := generateFakeEvents(1500) + + or.mdi.On("GetEventsInSequenceRange", mock.Anything, mock.Anything, mock.Anything, 0, 1000).Return(baseEvents, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return(enrichedEvents, nil) + or.mem.On("FilterHistoricalEventsOnSubscription", mock.Anything, mock.Anything, mock.Anything).Return(enrichedEvents, nil) + + retEvents, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, 0, -1) + assert.Equal(t, err, nil) + assert.Equal(t, 1000, len(retEvents)) +} + +func TestGetHistoricalEventsForSubscriptionEndSequencePastRecordCount(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(1000) + + // Generate more events than the overall limit + baseEvents, _ := generateFakeEvents(1500) + + or.mdi.On("GetEventsInSequenceRange", mock.Anything, mock.Anything, mock.Anything, 1000, 2000).Return(baseEvents, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return([]*core.EnrichedEvent{}, nil) + or.mem.On("FilterHistoricalEventsOnSubscription", mock.Anything, mock.Anything, mock.Anything).Return([]*core.EnrichedEvent{}, nil) + + retEvents, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, 1000, -1) + assert.Equal(t, err, nil) + assert.Equal(t, 0, len(retEvents)) +} + +func TestGetHistoricalEventsForSubscriptionStartSequenceNotProvidedAndBelowTotalLimit(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(1000) + + // Generate more events than the overall limit + baseEvents, enrichedEvents := generateFakeEvents(200) + + or.mdi.On("GetEventsInSequenceRange", mock.Anything, mock.Anything, mock.Anything, 0, 200).Return(baseEvents, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return(enrichedEvents, nil) + or.mem.On("FilterHistoricalEventsOnSubscription", mock.Anything, mock.Anything, mock.Anything).Return(enrichedEvents, nil) + + retEvents, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, -1, 200) + assert.Equal(t, err, nil) + assert.Equal(t, 200, len(retEvents)) +} + +func TestGetHistoricalEventsForSubscriptionStartSequenceNotProvided(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(1000) + + // Generate more events than the overall limit + baseEvents, enrichedEvents := generateFakeEvents(1000) + + or.mdi.On("GetEventsInSequenceRange", mock.Anything, mock.Anything, mock.Anything, 100, 1100).Return(baseEvents, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return(enrichedEvents, nil) + or.mem.On("FilterHistoricalEventsOnSubscription", mock.Anything, mock.Anything, mock.Anything).Return(enrichedEvents, nil) + + retEvents, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, -1, 1100) + assert.Equal(t, err, nil) + assert.Equal(t, 1000, len(retEvents)) +} + +func TestGetHistoricalEventsForSubscriptionNoStartOrEndSequence(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(1000) + + baseEvents, enrichedEvents := generateFakeEvents(1000) + + or.mdi.On("GetEvents", mock.Anything, mock.Anything, mock.Anything).Return(baseEvents, nil, nil) + or.mem.On("EnrichEvents", mock.Anything, mock.Anything).Return(enrichedEvents, nil) + or.mem.On("FilterHistoricalEventsOnSubscription", mock.Anything, mock.Anything, mock.Anything).Return(enrichedEvents, nil) + + retEvents, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, -1, -1) + assert.Equal(t, err, nil) + assert.Equal(t, 1000, len(retEvents)) +} + +func TestGetHistoricalEventsForSubscriptionNoStartOrEndSequenceFails(t *testing.T) { + or := newTestOrchestrator() + defer or.cleanup(t) + + fb := database.SubscriptionQueryFactory.NewFilter(context.Background()) + filter := fb.And() + filter.Limit(1000) + + or.mdi.On("GetEvents", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, fmt.Errorf("boom!")) + + _, _, err := or.GetSubscriptionEventsHistorical(context.Background(), &core.Subscription{}, filter, -1, -1) + assert.NotNil(t, err) +} diff --git a/manifest.json b/manifest.json index fecfa30e5..a9ca4f285 100644 --- a/manifest.json +++ b/manifest.json @@ -6,18 +6,18 @@ }, "evmconnect": { "image": "ghcr.io/hyperledger/firefly-evmconnect", - "tag": "v1.3.0", - "sha": "cddfbe3a67a660e72a35e79af931625fdc1a285c2ea97faef68ad0408aa0d8c3" + "tag": "v1.3.2", + "sha": "9752a2c8b9c6cbd3f2b7327a309609a6b33ec80973004aed37e193b4e7f4a7c4" }, "fabconnect": { "image": "ghcr.io/hyperledger/firefly-fabconnect", - "tag": "v0.9.17", - "sha": "7d4aa158f9dff31f200ae7a04f68665f32930f7739156b25a0da80e5353f3245" + "tag": "v0.9.19", + "sha": "9479213b0114619c7690fa924ebbe7f837cf851c4ea9bd901798c7783edfc7e7" }, "tezosconnect": { "image": "ghcr.io/hyperledger/firefly-tezosconnect", - "tag": "v0.1.0", - "sha": "2c20731765f9203fceca6e28a5fa443e4ce5c3a9eb1de7710ed46f8e24db1c00" + "tag": "v0.2.2", + "sha": "238cef711f2ee8f841ad767be12ad33710136d6f5ab160de74715c0225188b94" }, "dataexchange-https": { "image": "ghcr.io/hyperledger/firefly-dataexchange-https", @@ -36,22 +36,22 @@ }, "signer": { "image": "ghcr.io/hyperledger/firefly-signer", - "tag": "v1.1.9", - "sha": "515271ea722e6bf9601524880e7280a1fc052453733338d6ed474f85d6618aa1" + "tag": "v1.1.12", + "sha": "7d6760b611853c8f99ad462ebd8e6df6930e71c22d68f460e95bdd007b928eca" }, "build": { "firefly-builder": { - "image": "golang:1.19-alpine3.16" + "image": "golang:1.21-alpine3.19" }, "fabric-builder": { - "image": "golang:1.19-alpine3.16", + "image": "golang:1.21-alpine3.19", "platform": "linux/x86_64" }, "solidity-builder": { "image": "ethereum/solc:0.8.11-alpine" }, "base": { - "image": "alpine:3.16" + "image": "alpine:3.19" } }, "ui": { @@ -59,6 +59,6 @@ "release": "v1.2.0" }, "cli": { - "tag": "v1.2.1" + "tag": "b1c3e57586f0333b7a50030a5ff003c7e272701f" } } diff --git a/mocks/apiservermocks/ffi_swagger_gen.go b/mocks/apiservermocks/ffi_swagger_gen.go index 1e71bed06..fa0cf0838 100644 --- a/mocks/apiservermocks/ffi_swagger_gen.go +++ b/mocks/apiservermocks/ffi_swagger_gen.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package apiservermocks @@ -22,6 +22,10 @@ type FFISwaggerGen struct { func (_m *FFISwaggerGen) Build(ctx context.Context, api *core.ContractAPI, ffi *fftypes.FFI) (*ffapi.SwaggerGenOptions, []*ffapi.Route) { ret := _m.Called(ctx, api, ffi) + if len(ret) == 0 { + panic("no return value specified for Build") + } + var r0 *ffapi.SwaggerGenOptions var r1 []*ffapi.Route if rf, ok := ret.Get(0).(func(context.Context, *core.ContractAPI, *fftypes.FFI) (*ffapi.SwaggerGenOptions, []*ffapi.Route)); ok { diff --git a/mocks/apiservermocks/server.go b/mocks/apiservermocks/server.go index b7045eed2..6b73db0b8 100644 --- a/mocks/apiservermocks/server.go +++ b/mocks/apiservermocks/server.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package apiservermocks @@ -18,6 +18,10 @@ type Server struct { func (_m *Server) Serve(ctx context.Context, mgr namespace.Manager) error { ret := _m.Called(ctx, mgr) + if len(ret) == 0 { + panic("no return value specified for Serve") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, namespace.Manager) error); ok { r0 = rf(ctx, mgr) diff --git a/mocks/assetmocks/manager.go b/mocks/assetmocks/manager.go index 437b2f127..262b2ac67 100644 --- a/mocks/assetmocks/manager.go +++ b/mocks/assetmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package assetmocks @@ -24,6 +24,10 @@ type Manager struct { func (_m *Manager) ActivateTokenPool(ctx context.Context, pool *core.TokenPool) error { ret := _m.Called(ctx, pool) + if len(ret) == 0 { + panic("no return value specified for ActivateTokenPool") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenPool) error); ok { r0 = rf(ctx, pool) @@ -38,6 +42,10 @@ func (_m *Manager) ActivateTokenPool(ctx context.Context, pool *core.TokenPool) func (_m *Manager) BurnTokens(ctx context.Context, transfer *core.TokenTransferInput, waitConfirm bool) (*core.TokenTransfer, error) { ret := _m.Called(ctx, transfer, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for BurnTokens") + } + var r0 *core.TokenTransfer var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenTransferInput, bool) (*core.TokenTransfer, error)); ok { @@ -64,6 +72,10 @@ func (_m *Manager) BurnTokens(ctx context.Context, transfer *core.TokenTransferI func (_m *Manager) CreateTokenPool(ctx context.Context, pool *core.TokenPoolInput, waitConfirm bool) (*core.TokenPool, error) { ret := _m.Called(ctx, pool, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for CreateTokenPool") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenPoolInput, bool) (*core.TokenPool, error)); ok { @@ -90,6 +102,10 @@ func (_m *Manager) CreateTokenPool(ctx context.Context, pool *core.TokenPoolInpu func (_m *Manager) DeleteTokenPool(ctx context.Context, poolNameOrID string) error { ret := _m.Called(ctx, poolNameOrID) + if len(ret) == 0 { + panic("no return value specified for DeleteTokenPool") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { r0 = rf(ctx, poolNameOrID) @@ -104,6 +120,10 @@ func (_m *Manager) DeleteTokenPool(ctx context.Context, poolNameOrID string) err func (_m *Manager) GetTokenAccountPools(ctx context.Context, key string, filter ffapi.AndFilter) ([]*core.TokenAccountPool, *ffapi.FilterResult, error) { ret := _m.Called(ctx, key, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenAccountPools") + } + var r0 []*core.TokenAccountPool var r1 *ffapi.FilterResult var r2 error @@ -139,6 +159,10 @@ func (_m *Manager) GetTokenAccountPools(ctx context.Context, key string, filter func (_m *Manager) GetTokenAccounts(ctx context.Context, filter ffapi.AndFilter) ([]*core.TokenAccount, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenAccounts") + } + var r0 []*core.TokenAccount var r1 *ffapi.FilterResult var r2 error @@ -174,6 +198,10 @@ func (_m *Manager) GetTokenAccounts(ctx context.Context, filter ffapi.AndFilter) func (_m *Manager) GetTokenApprovals(ctx context.Context, filter ffapi.AndFilter) ([]*core.TokenApproval, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenApprovals") + } + var r0 []*core.TokenApproval var r1 *ffapi.FilterResult var r2 error @@ -209,6 +237,10 @@ func (_m *Manager) GetTokenApprovals(ctx context.Context, filter ffapi.AndFilter func (_m *Manager) GetTokenBalances(ctx context.Context, filter ffapi.AndFilter) ([]*core.TokenBalance, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenBalances") + } + var r0 []*core.TokenBalance var r1 *ffapi.FilterResult var r2 error @@ -244,6 +276,10 @@ func (_m *Manager) GetTokenBalances(ctx context.Context, filter ffapi.AndFilter) func (_m *Manager) GetTokenConnectors(ctx context.Context) []*core.TokenConnector { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for GetTokenConnectors") + } + var r0 []*core.TokenConnector if rf, ok := ret.Get(0).(func(context.Context) []*core.TokenConnector); ok { r0 = rf(ctx) @@ -260,6 +296,10 @@ func (_m *Manager) GetTokenConnectors(ctx context.Context) []*core.TokenConnecto func (_m *Manager) GetTokenPoolByID(ctx context.Context, id *fftypes.UUID) (*core.TokenPool, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetTokenPoolByID") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) (*core.TokenPool, error)); ok { @@ -286,6 +326,10 @@ func (_m *Manager) GetTokenPoolByID(ctx context.Context, id *fftypes.UUID) (*cor func (_m *Manager) GetTokenPoolByLocator(ctx context.Context, connector string, poolLocator string) (*core.TokenPool, error) { ret := _m.Called(ctx, connector, poolLocator) + if len(ret) == 0 { + panic("no return value specified for GetTokenPoolByLocator") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.TokenPool, error)); ok { @@ -312,6 +356,10 @@ func (_m *Manager) GetTokenPoolByLocator(ctx context.Context, connector string, func (_m *Manager) GetTokenPoolByNameOrID(ctx context.Context, poolNameOrID string) (*core.TokenPool, error) { ret := _m.Called(ctx, poolNameOrID) + if len(ret) == 0 { + panic("no return value specified for GetTokenPoolByNameOrID") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.TokenPool, error)); ok { @@ -338,6 +386,10 @@ func (_m *Manager) GetTokenPoolByNameOrID(ctx context.Context, poolNameOrID stri func (_m *Manager) GetTokenPools(ctx context.Context, filter ffapi.AndFilter) ([]*core.TokenPool, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenPools") + } + var r0 []*core.TokenPool var r1 *ffapi.FilterResult var r2 error @@ -373,6 +425,10 @@ func (_m *Manager) GetTokenPools(ctx context.Context, filter ffapi.AndFilter) ([ func (_m *Manager) GetTokenTransferByID(ctx context.Context, id string) (*core.TokenTransfer, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetTokenTransferByID") + } + var r0 *core.TokenTransfer var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.TokenTransfer, error)); ok { @@ -399,6 +455,10 @@ func (_m *Manager) GetTokenTransferByID(ctx context.Context, id string) (*core.T func (_m *Manager) GetTokenTransfers(ctx context.Context, filter ffapi.AndFilter) ([]*core.TokenTransfer, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenTransfers") + } + var r0 []*core.TokenTransfer var r1 *ffapi.FilterResult var r2 error @@ -434,6 +494,10 @@ func (_m *Manager) GetTokenTransfers(ctx context.Context, filter ffapi.AndFilter func (_m *Manager) MintTokens(ctx context.Context, transfer *core.TokenTransferInput, waitConfirm bool) (*core.TokenTransfer, error) { ret := _m.Called(ctx, transfer, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for MintTokens") + } + var r0 *core.TokenTransfer var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenTransferInput, bool) (*core.TokenTransfer, error)); ok { @@ -460,6 +524,10 @@ func (_m *Manager) MintTokens(ctx context.Context, transfer *core.TokenTransferI func (_m *Manager) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -474,6 +542,10 @@ func (_m *Manager) Name() string { func (_m *Manager) NewApproval(approve *core.TokenApprovalInput) syncasync.Sender { ret := _m.Called(approve) + if len(ret) == 0 { + panic("no return value specified for NewApproval") + } + var r0 syncasync.Sender if rf, ok := ret.Get(0).(func(*core.TokenApprovalInput) syncasync.Sender); ok { r0 = rf(approve) @@ -490,6 +562,10 @@ func (_m *Manager) NewApproval(approve *core.TokenApprovalInput) syncasync.Sende func (_m *Manager) NewTransfer(transfer *core.TokenTransferInput) syncasync.Sender { ret := _m.Called(transfer) + if len(ret) == 0 { + panic("no return value specified for NewTransfer") + } + var r0 syncasync.Sender if rf, ok := ret.Get(0).(func(*core.TokenTransferInput) syncasync.Sender); ok { r0 = rf(transfer) @@ -506,6 +582,10 @@ func (_m *Manager) NewTransfer(transfer *core.TokenTransferInput) syncasync.Send func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*core.PreparedOperation, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for PrepareOperation") + } + var r0 *core.PreparedOperation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Operation) (*core.PreparedOperation, error)); ok { @@ -532,6 +612,10 @@ func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*c func (_m *Manager) ResolvePoolMethods(ctx context.Context, pool *core.TokenPool) error { ret := _m.Called(ctx, pool) + if len(ret) == 0 { + panic("no return value specified for ResolvePoolMethods") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenPool) error); ok { r0 = rf(ctx, pool) @@ -546,6 +630,10 @@ func (_m *Manager) ResolvePoolMethods(ctx context.Context, pool *core.TokenPool) func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation) (fftypes.JSONObject, core.OpPhase, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for RunOperation") + } + var r0 fftypes.JSONObject var r1 core.OpPhase var r2 error @@ -579,6 +667,10 @@ func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation) func (_m *Manager) TokenApproval(ctx context.Context, approval *core.TokenApprovalInput, waitConfirm bool) (*core.TokenApproval, error) { ret := _m.Called(ctx, approval, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for TokenApproval") + } + var r0 *core.TokenApproval var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenApprovalInput, bool) (*core.TokenApproval, error)); ok { @@ -605,6 +697,10 @@ func (_m *Manager) TokenApproval(ctx context.Context, approval *core.TokenApprov func (_m *Manager) TransferTokens(ctx context.Context, transfer *core.TokenTransferInput, waitConfirm bool) (*core.TokenTransfer, error) { ret := _m.Called(ctx, transfer, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for TransferTokens") + } + var r0 *core.TokenTransfer var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenTransferInput, bool) (*core.TokenTransfer, error)); ok { diff --git a/mocks/batchmocks/manager.go b/mocks/batchmocks/manager.go index 5fb28c04a..c938d70a7 100644 --- a/mocks/batchmocks/manager.go +++ b/mocks/batchmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package batchmocks @@ -26,6 +26,10 @@ func (_m *Manager) Close() { func (_m *Manager) LoadContexts(ctx context.Context, payload *batch.DispatchPayload) error { ret := _m.Called(ctx, payload) + if len(ret) == 0 { + panic("no return value specified for LoadContexts") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *batch.DispatchPayload) error); ok { r0 = rf(ctx, payload) @@ -40,6 +44,10 @@ func (_m *Manager) LoadContexts(ctx context.Context, payload *batch.DispatchPayl func (_m *Manager) NewMessages() chan<- int64 { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for NewMessages") + } + var r0 chan<- int64 if rf, ok := ret.Get(0).(func() chan<- int64); ok { r0 = rf() @@ -61,6 +69,10 @@ func (_m *Manager) RegisterDispatcher(name string, txType fftypes.FFEnum, msgTyp func (_m *Manager) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -75,6 +87,10 @@ func (_m *Manager) Start() error { func (_m *Manager) Status() *batch.ManagerStatus { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Status") + } + var r0 *batch.ManagerStatus if rf, ok := ret.Get(0).(func() *batch.ManagerStatus); ok { r0 = rf() diff --git a/mocks/blockchaincommonmocks/firefly_subscriptions.go b/mocks/blockchaincommonmocks/firefly_subscriptions.go index 605e7ee38..c8ce82366 100644 --- a/mocks/blockchaincommonmocks/firefly_subscriptions.go +++ b/mocks/blockchaincommonmocks/firefly_subscriptions.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package blockchaincommonmocks @@ -26,6 +26,10 @@ func (_m *FireflySubscriptions) AddSubscription(ctx context.Context, namespace * func (_m *FireflySubscriptions) GetSubscription(subID string) *common.SubscriptionInfo { ret := _m.Called(subID) + if len(ret) == 0 { + panic("no return value specified for GetSubscription") + } + var r0 *common.SubscriptionInfo if rf, ok := ret.Get(0).(func(string) *common.SubscriptionInfo); ok { r0 = rf(subID) diff --git a/mocks/blockchainmocks/callbacks.go b/mocks/blockchainmocks/callbacks.go index 56654c774..0769667f6 100644 --- a/mocks/blockchainmocks/callbacks.go +++ b/mocks/blockchainmocks/callbacks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package blockchainmocks @@ -16,6 +16,10 @@ type Callbacks struct { func (_m *Callbacks) BlockchainEventBatch(batch []*blockchain.EventToDispatch) error { ret := _m.Called(batch) + if len(ret) == 0 { + panic("no return value specified for BlockchainEventBatch") + } + var r0 error if rf, ok := ret.Get(0).(func([]*blockchain.EventToDispatch) error); ok { r0 = rf(batch) diff --git a/mocks/blockchainmocks/plugin.go b/mocks/blockchainmocks/plugin.go index ab1812f64..1f0802259 100644 --- a/mocks/blockchainmocks/plugin.go +++ b/mocks/blockchainmocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package blockchainmocks @@ -28,6 +28,10 @@ type Plugin struct { func (_m *Plugin) AddContractListener(ctx context.Context, subscription *core.ContractListener) error { ret := _m.Called(ctx, subscription) + if len(ret) == 0 { + panic("no return value specified for AddContractListener") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.ContractListener) error); ok { r0 = rf(ctx, subscription) @@ -42,6 +46,10 @@ func (_m *Plugin) AddContractListener(ctx context.Context, subscription *core.Co func (_m *Plugin) AddFireflySubscription(ctx context.Context, namespace *core.Namespace, contract *blockchain.MultipartyContract) (string, error) { ret := _m.Called(ctx, namespace, contract) + if len(ret) == 0 { + panic("no return value specified for AddFireflySubscription") + } + var r0 string var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Namespace, *blockchain.MultipartyContract) (string, error)); ok { @@ -66,6 +74,10 @@ func (_m *Plugin) AddFireflySubscription(ctx context.Context, namespace *core.Na func (_m *Plugin) Capabilities() *blockchain.Capabilities { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Capabilities") + } + var r0 *blockchain.Capabilities if rf, ok := ret.Get(0).(func() *blockchain.Capabilities); ok { r0 = rf() @@ -82,6 +94,10 @@ func (_m *Plugin) Capabilities() *blockchain.Capabilities { func (_m *Plugin) DeleteContractListener(ctx context.Context, subscription *core.ContractListener, okNotFound bool) error { ret := _m.Called(ctx, subscription, okNotFound) + if len(ret) == 0 { + panic("no return value specified for DeleteContractListener") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.ContractListener, bool) error); ok { r0 = rf(ctx, subscription, okNotFound) @@ -93,23 +109,41 @@ func (_m *Plugin) DeleteContractListener(ctx context.Context, subscription *core } // DeployContract provides a mock function with given fields: ctx, nsOpID, signingKey, definition, contract, input, options -func (_m *Plugin) DeployContract(ctx context.Context, nsOpID string, signingKey string, definition *fftypes.JSONAny, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) error { +func (_m *Plugin) DeployContract(ctx context.Context, nsOpID string, signingKey string, definition *fftypes.JSONAny, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) (bool, error) { ret := _m.Called(ctx, nsOpID, signingKey, definition, contract, input, options) - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, string, string, *fftypes.JSONAny, *fftypes.JSONAny, []interface{}, map[string]interface{}) error); ok { + if len(ret) == 0 { + panic("no return value specified for DeployContract") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, *fftypes.JSONAny, *fftypes.JSONAny, []interface{}, map[string]interface{}) (bool, error)); ok { + return rf(ctx, nsOpID, signingKey, definition, contract, input, options) + } + if rf, ok := ret.Get(0).(func(context.Context, string, string, *fftypes.JSONAny, *fftypes.JSONAny, []interface{}, map[string]interface{}) bool); ok { r0 = rf(ctx, nsOpID, signingKey, definition, contract, input, options) } else { - r0 = ret.Error(0) + r0 = ret.Get(0).(bool) } - return r0 + if rf, ok := ret.Get(1).(func(context.Context, string, string, *fftypes.JSONAny, *fftypes.JSONAny, []interface{}, map[string]interface{}) error); ok { + r1 = rf(ctx, nsOpID, signingKey, definition, contract, input, options) + } else { + r1 = ret.Error(1) + } + + return r0, r1 } // GenerateErrorSignature provides a mock function with given fields: ctx, errorDef func (_m *Plugin) GenerateErrorSignature(ctx context.Context, errorDef *fftypes.FFIErrorDefinition) string { ret := _m.Called(ctx, errorDef) + if len(ret) == 0 { + panic("no return value specified for GenerateErrorSignature") + } + var r0 string if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFIErrorDefinition) string); ok { r0 = rf(ctx, errorDef) @@ -124,6 +158,10 @@ func (_m *Plugin) GenerateErrorSignature(ctx context.Context, errorDef *fftypes. func (_m *Plugin) GenerateEventSignature(ctx context.Context, event *fftypes.FFIEventDefinition) string { ret := _m.Called(ctx, event) + if len(ret) == 0 { + panic("no return value specified for GenerateEventSignature") + } + var r0 string if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFIEventDefinition) string); ok { r0 = rf(ctx, event) @@ -138,6 +176,10 @@ func (_m *Plugin) GenerateEventSignature(ctx context.Context, event *fftypes.FFI func (_m *Plugin) GenerateFFI(ctx context.Context, generationRequest *fftypes.FFIGenerationRequest) (*fftypes.FFI, error) { ret := _m.Called(ctx, generationRequest) + if len(ret) == 0 { + panic("no return value specified for GenerateFFI") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFIGenerationRequest) (*fftypes.FFI, error)); ok { @@ -164,6 +206,10 @@ func (_m *Plugin) GenerateFFI(ctx context.Context, generationRequest *fftypes.FF func (_m *Plugin) GetAndConvertDeprecatedContractConfig(ctx context.Context) (*fftypes.JSONAny, string, error) { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for GetAndConvertDeprecatedContractConfig") + } + var r0 *fftypes.JSONAny var r1 string var r2 error @@ -197,6 +243,10 @@ func (_m *Plugin) GetAndConvertDeprecatedContractConfig(ctx context.Context) (*f func (_m *Plugin) GetContractListenerStatus(ctx context.Context, subID string, okNotFound bool) (bool, interface{}, error) { ret := _m.Called(ctx, subID, okNotFound) + if len(ret) == 0 { + panic("no return value specified for GetContractListenerStatus") + } + var r0 bool var r1 interface{} var r2 error @@ -230,6 +280,10 @@ func (_m *Plugin) GetContractListenerStatus(ctx context.Context, subID string, o func (_m *Plugin) GetFFIParamValidator(ctx context.Context) (fftypes.FFIParamValidator, error) { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for GetFFIParamValidator") + } + var r0 fftypes.FFIParamValidator var r1 error if rf, ok := ret.Get(0).(func(context.Context) (fftypes.FFIParamValidator, error)); ok { @@ -256,6 +310,10 @@ func (_m *Plugin) GetFFIParamValidator(ctx context.Context) (fftypes.FFIParamVal func (_m *Plugin) GetNetworkVersion(ctx context.Context, location *fftypes.JSONAny) (int, error) { ret := _m.Called(ctx, location) + if len(ret) == 0 { + panic("no return value specified for GetNetworkVersion") + } + var r0 int var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.JSONAny) (int, error)); ok { @@ -280,6 +338,10 @@ func (_m *Plugin) GetNetworkVersion(ctx context.Context, location *fftypes.JSONA func (_m *Plugin) GetTransactionStatus(ctx context.Context, operation *core.Operation) (interface{}, error) { ret := _m.Called(ctx, operation) + if len(ret) == 0 { + panic("no return value specified for GetTransactionStatus") + } + var r0 interface{} var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Operation) (interface{}, error)); ok { @@ -306,6 +368,10 @@ func (_m *Plugin) GetTransactionStatus(ctx context.Context, operation *core.Oper func (_m *Plugin) Init(ctx context.Context, cancelCtx context.CancelFunc, _a2 config.Section, _a3 metrics.Manager, cacheManager cache.Manager) error { ret := _m.Called(ctx, cancelCtx, _a2, _a3, cacheManager) + if len(ret) == 0 { + panic("no return value specified for Init") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, context.CancelFunc, config.Section, metrics.Manager, cache.Manager) error); ok { r0 = rf(ctx, cancelCtx, _a2, _a3, cacheManager) @@ -322,23 +388,41 @@ func (_m *Plugin) InitConfig(_a0 config.Section) { } // InvokeContract provides a mock function with given fields: ctx, nsOpID, signingKey, location, parsedMethod, input, options, batch -func (_m *Plugin) InvokeContract(ctx context.Context, nsOpID string, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *blockchain.BatchPin) error { +func (_m *Plugin) InvokeContract(ctx context.Context, nsOpID string, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *blockchain.BatchPin) (bool, error) { ret := _m.Called(ctx, nsOpID, signingKey, location, parsedMethod, input, options, batch) - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, string, string, *fftypes.JSONAny, interface{}, map[string]interface{}, map[string]interface{}, *blockchain.BatchPin) error); ok { + if len(ret) == 0 { + panic("no return value specified for InvokeContract") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, *fftypes.JSONAny, interface{}, map[string]interface{}, map[string]interface{}, *blockchain.BatchPin) (bool, error)); ok { + return rf(ctx, nsOpID, signingKey, location, parsedMethod, input, options, batch) + } + if rf, ok := ret.Get(0).(func(context.Context, string, string, *fftypes.JSONAny, interface{}, map[string]interface{}, map[string]interface{}, *blockchain.BatchPin) bool); ok { r0 = rf(ctx, nsOpID, signingKey, location, parsedMethod, input, options, batch) } else { - r0 = ret.Error(0) + r0 = ret.Get(0).(bool) } - return r0 + if rf, ok := ret.Get(1).(func(context.Context, string, string, *fftypes.JSONAny, interface{}, map[string]interface{}, map[string]interface{}, *blockchain.BatchPin) error); ok { + r1 = rf(ctx, nsOpID, signingKey, location, parsedMethod, input, options, batch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 } // Name provides a mock function with given fields: func (_m *Plugin) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -353,6 +437,10 @@ func (_m *Plugin) Name() string { func (_m *Plugin) NormalizeContractLocation(ctx context.Context, ntype blockchain.NormalizeType, location *fftypes.JSONAny) (*fftypes.JSONAny, error) { ret := _m.Called(ctx, ntype, location) + if len(ret) == 0 { + panic("no return value specified for NormalizeContractLocation") + } + var r0 *fftypes.JSONAny var r1 error if rf, ok := ret.Get(0).(func(context.Context, blockchain.NormalizeType, *fftypes.JSONAny) (*fftypes.JSONAny, error)); ok { @@ -379,6 +467,10 @@ func (_m *Plugin) NormalizeContractLocation(ctx context.Context, ntype blockchai func (_m *Plugin) ParseInterface(ctx context.Context, method *fftypes.FFIMethod, errors []*fftypes.FFIError) (interface{}, error) { ret := _m.Called(ctx, method, errors) + if len(ret) == 0 { + panic("no return value specified for ParseInterface") + } + var r0 interface{} var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFIMethod, []*fftypes.FFIError) (interface{}, error)); ok { @@ -405,6 +497,10 @@ func (_m *Plugin) ParseInterface(ctx context.Context, method *fftypes.FFIMethod, func (_m *Plugin) QueryContract(ctx context.Context, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}) (interface{}, error) { ret := _m.Called(ctx, signingKey, location, parsedMethod, input, options) + if len(ret) == 0 { + panic("no return value specified for QueryContract") + } + var r0 interface{} var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.JSONAny, interface{}, map[string]interface{}, map[string]interface{}) (interface{}, error)); ok { @@ -436,6 +532,10 @@ func (_m *Plugin) RemoveFireflySubscription(ctx context.Context, subID string) { func (_m *Plugin) ResolveSigningKey(ctx context.Context, keyRef string, intent blockchain.ResolveKeyIntent) (string, error) { ret := _m.Called(ctx, keyRef, intent) + if len(ret) == 0 { + panic("no return value specified for ResolveSigningKey") + } + var r0 string var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, blockchain.ResolveKeyIntent) (string, error)); ok { @@ -470,6 +570,10 @@ func (_m *Plugin) SetOperationHandler(namespace string, handler core.OperationCa func (_m *Plugin) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -484,6 +588,10 @@ func (_m *Plugin) Start() error { func (_m *Plugin) SubmitBatchPin(ctx context.Context, nsOpID string, networkNamespace string, signingKey string, batch *blockchain.BatchPin, location *fftypes.JSONAny) error { ret := _m.Called(ctx, nsOpID, networkNamespace, signingKey, batch, location) + if len(ret) == 0 { + panic("no return value specified for SubmitBatchPin") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, string, string, *blockchain.BatchPin, *fftypes.JSONAny) error); ok { r0 = rf(ctx, nsOpID, networkNamespace, signingKey, batch, location) @@ -498,6 +606,10 @@ func (_m *Plugin) SubmitBatchPin(ctx context.Context, nsOpID string, networkName func (_m *Plugin) SubmitNetworkAction(ctx context.Context, nsOpID string, signingKey string, action fftypes.FFEnum, location *fftypes.JSONAny) error { ret := _m.Called(ctx, nsOpID, signingKey, action, location) + if len(ret) == 0 { + panic("no return value specified for SubmitNetworkAction") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, string, fftypes.FFEnum, *fftypes.JSONAny) error); ok { r0 = rf(ctx, nsOpID, signingKey, action, location) @@ -512,6 +624,10 @@ func (_m *Plugin) SubmitNetworkAction(ctx context.Context, nsOpID string, signin func (_m *Plugin) ValidateInvokeRequest(ctx context.Context, parsedMethod interface{}, input map[string]interface{}, hasMessage bool) error { ret := _m.Called(ctx, parsedMethod, input, hasMessage) + if len(ret) == 0 { + panic("no return value specified for ValidateInvokeRequest") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, interface{}, map[string]interface{}, bool) error); ok { r0 = rf(ctx, parsedMethod, input, hasMessage) @@ -526,6 +642,10 @@ func (_m *Plugin) ValidateInvokeRequest(ctx context.Context, parsedMethod interf func (_m *Plugin) VerifierType() fftypes.FFEnum { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for VerifierType") + } + var r0 fftypes.FFEnum if rf, ok := ret.Get(0).(func() fftypes.FFEnum); ok { r0 = rf() diff --git a/mocks/broadcastmocks/manager.go b/mocks/broadcastmocks/manager.go index ad208a2fb..76b9fcefc 100644 --- a/mocks/broadcastmocks/manager.go +++ b/mocks/broadcastmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package broadcastmocks @@ -22,6 +22,10 @@ type Manager struct { func (_m *Manager) BroadcastMessage(ctx context.Context, in *core.MessageInOut, waitConfirm bool) (*core.Message, error) { ret := _m.Called(ctx, in, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for BroadcastMessage") + } + var r0 *core.Message var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.MessageInOut, bool) (*core.Message, error)); ok { @@ -48,6 +52,10 @@ func (_m *Manager) BroadcastMessage(ctx context.Context, in *core.MessageInOut, func (_m *Manager) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -62,6 +70,10 @@ func (_m *Manager) Name() string { func (_m *Manager) NewBroadcast(in *core.MessageInOut) syncasync.Sender { ret := _m.Called(in) + if len(ret) == 0 { + panic("no return value specified for NewBroadcast") + } + var r0 syncasync.Sender if rf, ok := ret.Get(0).(func(*core.MessageInOut) syncasync.Sender); ok { r0 = rf(in) @@ -78,6 +90,10 @@ func (_m *Manager) NewBroadcast(in *core.MessageInOut) syncasync.Sender { func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*core.PreparedOperation, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for PrepareOperation") + } + var r0 *core.PreparedOperation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Operation) (*core.PreparedOperation, error)); ok { @@ -104,6 +120,10 @@ func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*c func (_m *Manager) PublishDataBlob(ctx context.Context, id string, idempotencyKey core.IdempotencyKey) (*core.Data, error) { ret := _m.Called(ctx, id, idempotencyKey) + if len(ret) == 0 { + panic("no return value specified for PublishDataBlob") + } + var r0 *core.Data var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, core.IdempotencyKey) (*core.Data, error)); ok { @@ -130,6 +150,10 @@ func (_m *Manager) PublishDataBlob(ctx context.Context, id string, idempotencyKe func (_m *Manager) PublishDataValue(ctx context.Context, id string, idempotencyKey core.IdempotencyKey) (*core.Data, error) { ret := _m.Called(ctx, id, idempotencyKey) + if len(ret) == 0 { + panic("no return value specified for PublishDataValue") + } + var r0 *core.Data var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, core.IdempotencyKey) (*core.Data, error)); ok { @@ -156,6 +180,10 @@ func (_m *Manager) PublishDataValue(ctx context.Context, id string, idempotencyK func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation) (fftypes.JSONObject, core.OpPhase, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for RunOperation") + } + var r0 fftypes.JSONObject var r1 core.OpPhase var r2 error @@ -189,6 +217,10 @@ func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation) func (_m *Manager) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() diff --git a/mocks/cachemocks/manager.go b/mocks/cachemocks/manager.go index 9dee64684..d8569e249 100644 --- a/mocks/cachemocks/manager.go +++ b/mocks/cachemocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package cachemocks @@ -16,6 +16,10 @@ type Manager struct { func (_m *Manager) GetCache(cc *cache.CConfig) (cache.CInterface, error) { ret := _m.Called(cc) + if len(ret) == 0 { + panic("no return value specified for GetCache") + } + var r0 cache.CInterface var r1 error if rf, ok := ret.Get(0).(func(*cache.CConfig) (cache.CInterface, error)); ok { @@ -42,6 +46,10 @@ func (_m *Manager) GetCache(cc *cache.CConfig) (cache.CInterface, error) { func (_m *Manager) ListCacheNames(namespace string) []string { ret := _m.Called(namespace) + if len(ret) == 0 { + panic("no return value specified for ListCacheNames") + } + var r0 []string if rf, ok := ret.Get(0).(func(string) []string); ok { r0 = rf(namespace) diff --git a/mocks/contractmocks/manager.go b/mocks/contractmocks/manager.go index 7b45ecc53..042061c6f 100644 --- a/mocks/contractmocks/manager.go +++ b/mocks/contractmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package contractmocks @@ -23,6 +23,10 @@ type Manager struct { func (_m *Manager) AddContractAPIListener(ctx context.Context, apiName string, eventPath string, listener *core.ContractListener) (*core.ContractListener, error) { ret := _m.Called(ctx, apiName, eventPath, listener) + if len(ret) == 0 { + panic("no return value specified for AddContractAPIListener") + } + var r0 *core.ContractListener var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string, *core.ContractListener) (*core.ContractListener, error)); ok { @@ -49,6 +53,10 @@ func (_m *Manager) AddContractAPIListener(ctx context.Context, apiName string, e func (_m *Manager) AddContractListener(ctx context.Context, listener *core.ContractListenerInput) (*core.ContractListener, error) { ret := _m.Called(ctx, listener) + if len(ret) == 0 { + panic("no return value specified for AddContractListener") + } + var r0 *core.ContractListener var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.ContractListenerInput) (*core.ContractListener, error)); ok { @@ -75,6 +83,10 @@ func (_m *Manager) AddContractListener(ctx context.Context, listener *core.Contr func (_m *Manager) DeleteContractAPI(ctx context.Context, apiName string) error { ret := _m.Called(ctx, apiName) + if len(ret) == 0 { + panic("no return value specified for DeleteContractAPI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { r0 = rf(ctx, apiName) @@ -89,6 +101,10 @@ func (_m *Manager) DeleteContractAPI(ctx context.Context, apiName string) error func (_m *Manager) DeleteContractListenerByNameOrID(ctx context.Context, nameOrID string) error { ret := _m.Called(ctx, nameOrID) + if len(ret) == 0 { + panic("no return value specified for DeleteContractListenerByNameOrID") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { r0 = rf(ctx, nameOrID) @@ -103,6 +119,10 @@ func (_m *Manager) DeleteContractListenerByNameOrID(ctx context.Context, nameOrI func (_m *Manager) DeleteFFI(ctx context.Context, id *fftypes.UUID) error { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for DeleteFFI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) error); ok { r0 = rf(ctx, id) @@ -117,6 +137,10 @@ func (_m *Manager) DeleteFFI(ctx context.Context, id *fftypes.UUID) error { func (_m *Manager) DeployContract(ctx context.Context, req *core.ContractDeployRequest, waitConfirm bool) (interface{}, error) { ret := _m.Called(ctx, req, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for DeployContract") + } + var r0 interface{} var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.ContractDeployRequest, bool) (interface{}, error)); ok { @@ -143,6 +167,10 @@ func (_m *Manager) DeployContract(ctx context.Context, req *core.ContractDeployR func (_m *Manager) GenerateFFI(ctx context.Context, generationRequest *fftypes.FFIGenerationRequest) (*fftypes.FFI, error) { ret := _m.Called(ctx, generationRequest) + if len(ret) == 0 { + panic("no return value specified for GenerateFFI") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFIGenerationRequest) (*fftypes.FFI, error)); ok { @@ -169,6 +197,10 @@ func (_m *Manager) GenerateFFI(ctx context.Context, generationRequest *fftypes.F func (_m *Manager) GetContractAPI(ctx context.Context, httpServerURL string, apiName string) (*core.ContractAPI, error) { ret := _m.Called(ctx, httpServerURL, apiName) + if len(ret) == 0 { + panic("no return value specified for GetContractAPI") + } + var r0 *core.ContractAPI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.ContractAPI, error)); ok { @@ -195,6 +227,10 @@ func (_m *Manager) GetContractAPI(ctx context.Context, httpServerURL string, api func (_m *Manager) GetContractAPIInterface(ctx context.Context, apiName string) (*fftypes.FFI, error) { ret := _m.Called(ctx, apiName) + if len(ret) == 0 { + panic("no return value specified for GetContractAPIInterface") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*fftypes.FFI, error)); ok { @@ -221,6 +257,10 @@ func (_m *Manager) GetContractAPIInterface(ctx context.Context, apiName string) func (_m *Manager) GetContractAPIListeners(ctx context.Context, apiName string, eventPath string, filter ffapi.AndFilter) ([]*core.ContractListener, *ffapi.FilterResult, error) { ret := _m.Called(ctx, apiName, eventPath, filter) + if len(ret) == 0 { + panic("no return value specified for GetContractAPIListeners") + } + var r0 []*core.ContractListener var r1 *ffapi.FilterResult var r2 error @@ -256,6 +296,10 @@ func (_m *Manager) GetContractAPIListeners(ctx context.Context, apiName string, func (_m *Manager) GetContractAPIs(ctx context.Context, httpServerURL string, filter ffapi.AndFilter) ([]*core.ContractAPI, *ffapi.FilterResult, error) { ret := _m.Called(ctx, httpServerURL, filter) + if len(ret) == 0 { + panic("no return value specified for GetContractAPIs") + } + var r0 []*core.ContractAPI var r1 *ffapi.FilterResult var r2 error @@ -291,6 +335,10 @@ func (_m *Manager) GetContractAPIs(ctx context.Context, httpServerURL string, fi func (_m *Manager) GetContractListenerByNameOrID(ctx context.Context, nameOrID string) (*core.ContractListener, error) { ret := _m.Called(ctx, nameOrID) + if len(ret) == 0 { + panic("no return value specified for GetContractListenerByNameOrID") + } + var r0 *core.ContractListener var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.ContractListener, error)); ok { @@ -317,6 +365,10 @@ func (_m *Manager) GetContractListenerByNameOrID(ctx context.Context, nameOrID s func (_m *Manager) GetContractListenerByNameOrIDWithStatus(ctx context.Context, nameOrID string) (*core.ContractListenerWithStatus, error) { ret := _m.Called(ctx, nameOrID) + if len(ret) == 0 { + panic("no return value specified for GetContractListenerByNameOrIDWithStatus") + } + var r0 *core.ContractListenerWithStatus var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.ContractListenerWithStatus, error)); ok { @@ -343,6 +395,10 @@ func (_m *Manager) GetContractListenerByNameOrIDWithStatus(ctx context.Context, func (_m *Manager) GetContractListeners(ctx context.Context, filter ffapi.AndFilter) ([]*core.ContractListener, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetContractListeners") + } + var r0 []*core.ContractListener var r1 *ffapi.FilterResult var r2 error @@ -378,6 +434,10 @@ func (_m *Manager) GetContractListeners(ctx context.Context, filter ffapi.AndFil func (_m *Manager) GetFFI(ctx context.Context, name string, version string) (*fftypes.FFI, error) { ret := _m.Called(ctx, name, version) + if len(ret) == 0 { + panic("no return value specified for GetFFI") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*fftypes.FFI, error)); ok { @@ -404,6 +464,10 @@ func (_m *Manager) GetFFI(ctx context.Context, name string, version string) (*ff func (_m *Manager) GetFFIByID(ctx context.Context, id *fftypes.UUID) (*fftypes.FFI, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetFFIByID") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) (*fftypes.FFI, error)); ok { @@ -430,6 +494,10 @@ func (_m *Manager) GetFFIByID(ctx context.Context, id *fftypes.UUID) (*fftypes.F func (_m *Manager) GetFFIByIDWithChildren(ctx context.Context, id *fftypes.UUID) (*fftypes.FFI, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetFFIByIDWithChildren") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) (*fftypes.FFI, error)); ok { @@ -456,6 +524,10 @@ func (_m *Manager) GetFFIByIDWithChildren(ctx context.Context, id *fftypes.UUID) func (_m *Manager) GetFFIEvents(ctx context.Context, id *fftypes.UUID) ([]*fftypes.FFIEvent, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetFFIEvents") + } + var r0 []*fftypes.FFIEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) ([]*fftypes.FFIEvent, error)); ok { @@ -482,6 +554,10 @@ func (_m *Manager) GetFFIEvents(ctx context.Context, id *fftypes.UUID) ([]*fftyp func (_m *Manager) GetFFIMethods(ctx context.Context, id *fftypes.UUID) ([]*fftypes.FFIMethod, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetFFIMethods") + } + var r0 []*fftypes.FFIMethod var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) ([]*fftypes.FFIMethod, error)); ok { @@ -508,6 +584,10 @@ func (_m *Manager) GetFFIMethods(ctx context.Context, id *fftypes.UUID) ([]*ffty func (_m *Manager) GetFFIWithChildren(ctx context.Context, name string, version string) (*fftypes.FFI, error) { ret := _m.Called(ctx, name, version) + if len(ret) == 0 { + panic("no return value specified for GetFFIWithChildren") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*fftypes.FFI, error)); ok { @@ -534,6 +614,10 @@ func (_m *Manager) GetFFIWithChildren(ctx context.Context, name string, version func (_m *Manager) GetFFIs(ctx context.Context, filter ffapi.AndFilter) ([]*fftypes.FFI, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetFFIs") + } + var r0 []*fftypes.FFI var r1 *ffapi.FilterResult var r2 error @@ -569,6 +653,10 @@ func (_m *Manager) GetFFIs(ctx context.Context, filter ffapi.AndFilter) ([]*ffty func (_m *Manager) InvokeContract(ctx context.Context, req *core.ContractCallRequest, waitConfirm bool) (interface{}, error) { ret := _m.Called(ctx, req, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for InvokeContract") + } + var r0 interface{} var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.ContractCallRequest, bool) (interface{}, error)); ok { @@ -595,6 +683,10 @@ func (_m *Manager) InvokeContract(ctx context.Context, req *core.ContractCallReq func (_m *Manager) InvokeContractAPI(ctx context.Context, apiName string, methodPath string, req *core.ContractCallRequest, waitConfirm bool) (interface{}, error) { ret := _m.Called(ctx, apiName, methodPath, req, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for InvokeContractAPI") + } + var r0 interface{} var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string, *core.ContractCallRequest, bool) (interface{}, error)); ok { @@ -621,6 +713,10 @@ func (_m *Manager) InvokeContractAPI(ctx context.Context, apiName string, method func (_m *Manager) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -635,6 +731,10 @@ func (_m *Manager) Name() string { func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*core.PreparedOperation, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for PrepareOperation") + } + var r0 *core.PreparedOperation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Operation) (*core.PreparedOperation, error)); ok { @@ -661,6 +761,10 @@ func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*c func (_m *Manager) ResolveContractAPI(ctx context.Context, httpServerURL string, api *core.ContractAPI) error { ret := _m.Called(ctx, httpServerURL, api) + if len(ret) == 0 { + panic("no return value specified for ResolveContractAPI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *core.ContractAPI) error); ok { r0 = rf(ctx, httpServerURL, api) @@ -675,6 +779,10 @@ func (_m *Manager) ResolveContractAPI(ctx context.Context, httpServerURL string, func (_m *Manager) ResolveFFI(ctx context.Context, ffi *fftypes.FFI) error { ret := _m.Called(ctx, ffi) + if len(ret) == 0 { + panic("no return value specified for ResolveFFI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFI) error); ok { r0 = rf(ctx, ffi) @@ -689,6 +797,10 @@ func (_m *Manager) ResolveFFI(ctx context.Context, ffi *fftypes.FFI) error { func (_m *Manager) ResolveFFIReference(ctx context.Context, ref *fftypes.FFIReference) error { ret := _m.Called(ctx, ref) + if len(ret) == 0 { + panic("no return value specified for ResolveFFIReference") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFIReference) error); ok { r0 = rf(ctx, ref) @@ -703,6 +815,10 @@ func (_m *Manager) ResolveFFIReference(ctx context.Context, ref *fftypes.FFIRefe func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation) (fftypes.JSONObject, core.OpPhase, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for RunOperation") + } + var r0 fftypes.JSONObject var r1 core.OpPhase var r2 error diff --git a/mocks/coremocks/operation_callbacks.go b/mocks/coremocks/operation_callbacks.go index 9035e4336..c628ce6a4 100644 --- a/mocks/coremocks/operation_callbacks.go +++ b/mocks/coremocks/operation_callbacks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package coremocks diff --git a/mocks/databasemocks/callbacks.go b/mocks/databasemocks/callbacks.go index bbbf7e172..ff790d9eb 100644 --- a/mocks/databasemocks/callbacks.go +++ b/mocks/databasemocks/callbacks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package databasemocks diff --git a/mocks/databasemocks/plugin.go b/mocks/databasemocks/plugin.go index 387f87a6d..ad1c54eb7 100644 --- a/mocks/databasemocks/plugin.go +++ b/mocks/databasemocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package databasemocks @@ -27,6 +27,10 @@ type Plugin struct { func (_m *Plugin) Capabilities() *database.Capabilities { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Capabilities") + } + var r0 *database.Capabilities if rf, ok := ret.Get(0).(func() *database.Capabilities); ok { r0 = rf() @@ -43,6 +47,10 @@ func (_m *Plugin) Capabilities() *database.Capabilities { func (_m *Plugin) DeleteBlob(ctx context.Context, sequence int64) error { ret := _m.Called(ctx, sequence) + if len(ret) == 0 { + panic("no return value specified for DeleteBlob") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, int64) error); ok { r0 = rf(ctx, sequence) @@ -57,6 +65,10 @@ func (_m *Plugin) DeleteBlob(ctx context.Context, sequence int64) error { func (_m *Plugin) DeleteContractAPI(ctx context.Context, namespace string, id *fftypes.UUID) error { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for DeleteContractAPI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) error); ok { r0 = rf(ctx, namespace, id) @@ -71,6 +83,10 @@ func (_m *Plugin) DeleteContractAPI(ctx context.Context, namespace string, id *f func (_m *Plugin) DeleteContractListenerByID(ctx context.Context, namespace string, id *fftypes.UUID) error { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for DeleteContractListenerByID") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) error); ok { r0 = rf(ctx, namespace, id) @@ -85,6 +101,10 @@ func (_m *Plugin) DeleteContractListenerByID(ctx context.Context, namespace stri func (_m *Plugin) DeleteData(ctx context.Context, namespace string, id *fftypes.UUID) error { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for DeleteData") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) error); ok { r0 = rf(ctx, namespace, id) @@ -99,6 +119,10 @@ func (_m *Plugin) DeleteData(ctx context.Context, namespace string, id *fftypes. func (_m *Plugin) DeleteFFI(ctx context.Context, namespace string, id *fftypes.UUID) error { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for DeleteFFI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) error); ok { r0 = rf(ctx, namespace, id) @@ -113,6 +137,10 @@ func (_m *Plugin) DeleteFFI(ctx context.Context, namespace string, id *fftypes.U func (_m *Plugin) DeleteNonce(ctx context.Context, hash *fftypes.Bytes32) error { ret := _m.Called(ctx, hash) + if len(ret) == 0 { + panic("no return value specified for DeleteNonce") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.Bytes32) error); ok { r0 = rf(ctx, hash) @@ -127,6 +155,10 @@ func (_m *Plugin) DeleteNonce(ctx context.Context, hash *fftypes.Bytes32) error func (_m *Plugin) DeleteOffset(ctx context.Context, t fftypes.FFEnum, name string) error { ret := _m.Called(ctx, t, name) + if len(ret) == 0 { + panic("no return value specified for DeleteOffset") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, fftypes.FFEnum, string) error); ok { r0 = rf(ctx, t, name) @@ -141,6 +173,10 @@ func (_m *Plugin) DeleteOffset(ctx context.Context, t fftypes.FFEnum, name strin func (_m *Plugin) DeleteSubscriptionByID(ctx context.Context, namespace string, id *fftypes.UUID) error { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for DeleteSubscriptionByID") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) error); ok { r0 = rf(ctx, namespace, id) @@ -155,6 +191,10 @@ func (_m *Plugin) DeleteSubscriptionByID(ctx context.Context, namespace string, func (_m *Plugin) DeleteTokenApprovals(ctx context.Context, namespace string, poolID *fftypes.UUID) error { ret := _m.Called(ctx, namespace, poolID) + if len(ret) == 0 { + panic("no return value specified for DeleteTokenApprovals") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) error); ok { r0 = rf(ctx, namespace, poolID) @@ -169,6 +209,10 @@ func (_m *Plugin) DeleteTokenApprovals(ctx context.Context, namespace string, po func (_m *Plugin) DeleteTokenBalances(ctx context.Context, namespace string, poolID *fftypes.UUID) error { ret := _m.Called(ctx, namespace, poolID) + if len(ret) == 0 { + panic("no return value specified for DeleteTokenBalances") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) error); ok { r0 = rf(ctx, namespace, poolID) @@ -183,6 +227,10 @@ func (_m *Plugin) DeleteTokenBalances(ctx context.Context, namespace string, poo func (_m *Plugin) DeleteTokenPool(ctx context.Context, namespace string, id *fftypes.UUID) error { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for DeleteTokenPool") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) error); ok { r0 = rf(ctx, namespace, id) @@ -197,6 +245,10 @@ func (_m *Plugin) DeleteTokenPool(ctx context.Context, namespace string, id *fft func (_m *Plugin) DeleteTokenTransfers(ctx context.Context, namespace string, poolID *fftypes.UUID) error { ret := _m.Called(ctx, namespace, poolID) + if len(ret) == 0 { + panic("no return value specified for DeleteTokenTransfers") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) error); ok { r0 = rf(ctx, namespace, poolID) @@ -211,6 +263,10 @@ func (_m *Plugin) DeleteTokenTransfers(ctx context.Context, namespace string, po func (_m *Plugin) GetBatchByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.BatchPersisted, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetBatchByID") + } + var r0 *core.BatchPersisted var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.BatchPersisted, error)); ok { @@ -237,6 +293,10 @@ func (_m *Plugin) GetBatchByID(ctx context.Context, namespace string, id *fftype func (_m *Plugin) GetBatchIDsForDataAttachments(ctx context.Context, namespace string, dataIDs []*fftypes.UUID) ([]*fftypes.UUID, error) { ret := _m.Called(ctx, namespace, dataIDs) + if len(ret) == 0 { + panic("no return value specified for GetBatchIDsForDataAttachments") + } + var r0 []*fftypes.UUID var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, []*fftypes.UUID) ([]*fftypes.UUID, error)); ok { @@ -263,6 +323,10 @@ func (_m *Plugin) GetBatchIDsForDataAttachments(ctx context.Context, namespace s func (_m *Plugin) GetBatchIDsForMessages(ctx context.Context, namespace string, msgIDs []*fftypes.UUID) ([]*fftypes.UUID, error) { ret := _m.Called(ctx, namespace, msgIDs) + if len(ret) == 0 { + panic("no return value specified for GetBatchIDsForMessages") + } + var r0 []*fftypes.UUID var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, []*fftypes.UUID) ([]*fftypes.UUID, error)); ok { @@ -289,6 +353,10 @@ func (_m *Plugin) GetBatchIDsForMessages(ctx context.Context, namespace string, func (_m *Plugin) GetBatches(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.BatchPersisted, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetBatches") + } + var r0 []*core.BatchPersisted var r1 *ffapi.FilterResult var r2 error @@ -324,6 +392,10 @@ func (_m *Plugin) GetBatches(ctx context.Context, namespace string, filter ffapi func (_m *Plugin) GetBlobs(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Blob, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetBlobs") + } + var r0 []*core.Blob var r1 *ffapi.FilterResult var r2 error @@ -359,6 +431,10 @@ func (_m *Plugin) GetBlobs(ctx context.Context, namespace string, filter ffapi.F func (_m *Plugin) GetBlockchainEventByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.BlockchainEvent, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetBlockchainEventByID") + } + var r0 *core.BlockchainEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.BlockchainEvent, error)); ok { @@ -385,6 +461,10 @@ func (_m *Plugin) GetBlockchainEventByID(ctx context.Context, namespace string, func (_m *Plugin) GetBlockchainEventByProtocolID(ctx context.Context, namespace string, listener *fftypes.UUID, protocolID string) (*core.BlockchainEvent, error) { ret := _m.Called(ctx, namespace, listener, protocolID) + if len(ret) == 0 { + panic("no return value specified for GetBlockchainEventByProtocolID") + } + var r0 *core.BlockchainEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, string) (*core.BlockchainEvent, error)); ok { @@ -411,6 +491,10 @@ func (_m *Plugin) GetBlockchainEventByProtocolID(ctx context.Context, namespace func (_m *Plugin) GetBlockchainEvents(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.BlockchainEvent, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetBlockchainEvents") + } + var r0 []*core.BlockchainEvent var r1 *ffapi.FilterResult var r2 error @@ -446,6 +530,10 @@ func (_m *Plugin) GetBlockchainEvents(ctx context.Context, namespace string, fil func (_m *Plugin) GetChartHistogram(ctx context.Context, namespace string, intervals []core.ChartHistogramInterval, collection database.CollectionName) ([]*core.ChartHistogram, error) { ret := _m.Called(ctx, namespace, intervals, collection) + if len(ret) == 0 { + panic("no return value specified for GetChartHistogram") + } + var r0 []*core.ChartHistogram var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, []core.ChartHistogramInterval, database.CollectionName) ([]*core.ChartHistogram, error)); ok { @@ -472,6 +560,10 @@ func (_m *Plugin) GetChartHistogram(ctx context.Context, namespace string, inter func (_m *Plugin) GetContractAPIByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.ContractAPI, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetContractAPIByID") + } + var r0 *core.ContractAPI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.ContractAPI, error)); ok { @@ -498,6 +590,10 @@ func (_m *Plugin) GetContractAPIByID(ctx context.Context, namespace string, id * func (_m *Plugin) GetContractAPIByName(ctx context.Context, namespace string, name string) (*core.ContractAPI, error) { ret := _m.Called(ctx, namespace, name) + if len(ret) == 0 { + panic("no return value specified for GetContractAPIByName") + } + var r0 *core.ContractAPI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.ContractAPI, error)); ok { @@ -524,6 +620,10 @@ func (_m *Plugin) GetContractAPIByName(ctx context.Context, namespace string, na func (_m *Plugin) GetContractAPIByNetworkName(ctx context.Context, namespace string, networkName string) (*core.ContractAPI, error) { ret := _m.Called(ctx, namespace, networkName) + if len(ret) == 0 { + panic("no return value specified for GetContractAPIByNetworkName") + } + var r0 *core.ContractAPI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.ContractAPI, error)); ok { @@ -550,6 +650,10 @@ func (_m *Plugin) GetContractAPIByNetworkName(ctx context.Context, namespace str func (_m *Plugin) GetContractAPIs(ctx context.Context, namespace string, filter ffapi.AndFilter) ([]*core.ContractAPI, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetContractAPIs") + } + var r0 []*core.ContractAPI var r1 *ffapi.FilterResult var r2 error @@ -585,6 +689,10 @@ func (_m *Plugin) GetContractAPIs(ctx context.Context, namespace string, filter func (_m *Plugin) GetContractListener(ctx context.Context, namespace string, name string) (*core.ContractListener, error) { ret := _m.Called(ctx, namespace, name) + if len(ret) == 0 { + panic("no return value specified for GetContractListener") + } + var r0 *core.ContractListener var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.ContractListener, error)); ok { @@ -611,6 +719,10 @@ func (_m *Plugin) GetContractListener(ctx context.Context, namespace string, nam func (_m *Plugin) GetContractListenerByBackendID(ctx context.Context, namespace string, id string) (*core.ContractListener, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetContractListenerByBackendID") + } + var r0 *core.ContractListener var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.ContractListener, error)); ok { @@ -637,6 +749,10 @@ func (_m *Plugin) GetContractListenerByBackendID(ctx context.Context, namespace func (_m *Plugin) GetContractListenerByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.ContractListener, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetContractListenerByID") + } + var r0 *core.ContractListener var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.ContractListener, error)); ok { @@ -663,6 +779,10 @@ func (_m *Plugin) GetContractListenerByID(ctx context.Context, namespace string, func (_m *Plugin) GetContractListeners(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.ContractListener, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetContractListeners") + } + var r0 []*core.ContractListener var r1 *ffapi.FilterResult var r2 error @@ -698,6 +818,10 @@ func (_m *Plugin) GetContractListeners(ctx context.Context, namespace string, fi func (_m *Plugin) GetData(ctx context.Context, namespace string, filter ffapi.Filter) (core.DataArray, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetData") + } + var r0 core.DataArray var r1 *ffapi.FilterResult var r2 error @@ -733,6 +857,10 @@ func (_m *Plugin) GetData(ctx context.Context, namespace string, filter ffapi.Fi func (_m *Plugin) GetDataByID(ctx context.Context, namespace string, id *fftypes.UUID, withValue bool) (*core.Data, error) { ret := _m.Called(ctx, namespace, id, withValue) + if len(ret) == 0 { + panic("no return value specified for GetDataByID") + } + var r0 *core.Data var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, bool) (*core.Data, error)); ok { @@ -759,6 +887,10 @@ func (_m *Plugin) GetDataByID(ctx context.Context, namespace string, id *fftypes func (_m *Plugin) GetDataRefs(ctx context.Context, namespace string, filter ffapi.Filter) (core.DataRefs, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetDataRefs") + } + var r0 core.DataRefs var r1 *ffapi.FilterResult var r2 error @@ -794,6 +926,10 @@ func (_m *Plugin) GetDataRefs(ctx context.Context, namespace string, filter ffap func (_m *Plugin) GetDataSubPaths(ctx context.Context, namespace string, path string) ([]string, error) { ret := _m.Called(ctx, namespace, path) + if len(ret) == 0 { + panic("no return value specified for GetDataSubPaths") + } + var r0 []string var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) ([]string, error)); ok { @@ -820,6 +956,10 @@ func (_m *Plugin) GetDataSubPaths(ctx context.Context, namespace string, path st func (_m *Plugin) GetDatatypeByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.Datatype, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetDatatypeByID") + } + var r0 *core.Datatype var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.Datatype, error)); ok { @@ -846,6 +986,10 @@ func (_m *Plugin) GetDatatypeByID(ctx context.Context, namespace string, id *fft func (_m *Plugin) GetDatatypeByName(ctx context.Context, namespace string, name string, version string) (*core.Datatype, error) { ret := _m.Called(ctx, namespace, name, version) + if len(ret) == 0 { + panic("no return value specified for GetDatatypeByName") + } + var r0 *core.Datatype var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (*core.Datatype, error)); ok { @@ -872,6 +1016,10 @@ func (_m *Plugin) GetDatatypeByName(ctx context.Context, namespace string, name func (_m *Plugin) GetDatatypes(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Datatype, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetDatatypes") + } + var r0 []*core.Datatype var r1 *ffapi.FilterResult var r2 error @@ -907,6 +1055,10 @@ func (_m *Plugin) GetDatatypes(ctx context.Context, namespace string, filter ffa func (_m *Plugin) GetEventByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.Event, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetEventByID") + } + var r0 *core.Event var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.Event, error)); ok { @@ -933,6 +1085,10 @@ func (_m *Plugin) GetEventByID(ctx context.Context, namespace string, id *fftype func (_m *Plugin) GetEvents(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Event, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetEvents") + } + var r0 []*core.Event var r1 *ffapi.FilterResult var r2 error @@ -964,10 +1120,53 @@ func (_m *Plugin) GetEvents(ctx context.Context, namespace string, filter ffapi. return r0, r1, r2 } +// GetEventsInSequenceRange provides a mock function with given fields: ctx, namespace, filter, startSequence, endSequence +func (_m *Plugin) GetEventsInSequenceRange(ctx context.Context, namespace string, filter ffapi.Filter, startSequence int, endSequence int) ([]*core.Event, *ffapi.FilterResult, error) { + ret := _m.Called(ctx, namespace, filter, startSequence, endSequence) + + if len(ret) == 0 { + panic("no return value specified for GetEventsInSequenceRange") + } + + var r0 []*core.Event + var r1 *ffapi.FilterResult + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, ffapi.Filter, int, int) ([]*core.Event, *ffapi.FilterResult, error)); ok { + return rf(ctx, namespace, filter, startSequence, endSequence) + } + if rf, ok := ret.Get(0).(func(context.Context, string, ffapi.Filter, int, int) []*core.Event); ok { + r0 = rf(ctx, namespace, filter, startSequence, endSequence) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*core.Event) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string, ffapi.Filter, int, int) *ffapi.FilterResult); ok { + r1 = rf(ctx, namespace, filter, startSequence, endSequence) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*ffapi.FilterResult) + } + } + + if rf, ok := ret.Get(2).(func(context.Context, string, ffapi.Filter, int, int) error); ok { + r2 = rf(ctx, namespace, filter, startSequence, endSequence) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + // GetFFI provides a mock function with given fields: ctx, namespace, name, version func (_m *Plugin) GetFFI(ctx context.Context, namespace string, name string, version string) (*fftypes.FFI, error) { ret := _m.Called(ctx, namespace, name, version) + if len(ret) == 0 { + panic("no return value specified for GetFFI") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (*fftypes.FFI, error)); ok { @@ -994,6 +1193,10 @@ func (_m *Plugin) GetFFI(ctx context.Context, namespace string, name string, ver func (_m *Plugin) GetFFIByID(ctx context.Context, namespace string, id *fftypes.UUID) (*fftypes.FFI, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetFFIByID") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*fftypes.FFI, error)); ok { @@ -1020,6 +1223,10 @@ func (_m *Plugin) GetFFIByID(ctx context.Context, namespace string, id *fftypes. func (_m *Plugin) GetFFIByNetworkName(ctx context.Context, namespace string, networkName string, version string) (*fftypes.FFI, error) { ret := _m.Called(ctx, namespace, networkName, version) + if len(ret) == 0 { + panic("no return value specified for GetFFIByNetworkName") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (*fftypes.FFI, error)); ok { @@ -1046,6 +1253,10 @@ func (_m *Plugin) GetFFIByNetworkName(ctx context.Context, namespace string, net func (_m *Plugin) GetFFIErrors(ctx context.Context, namespace string, filter ffapi.Filter) ([]*fftypes.FFIError, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetFFIErrors") + } + var r0 []*fftypes.FFIError var r1 *ffapi.FilterResult var r2 error @@ -1081,6 +1292,10 @@ func (_m *Plugin) GetFFIErrors(ctx context.Context, namespace string, filter ffa func (_m *Plugin) GetFFIEvent(ctx context.Context, namespace string, interfaceID *fftypes.UUID, pathName string) (*fftypes.FFIEvent, error) { ret := _m.Called(ctx, namespace, interfaceID, pathName) + if len(ret) == 0 { + panic("no return value specified for GetFFIEvent") + } + var r0 *fftypes.FFIEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, string) (*fftypes.FFIEvent, error)); ok { @@ -1107,6 +1322,10 @@ func (_m *Plugin) GetFFIEvent(ctx context.Context, namespace string, interfaceID func (_m *Plugin) GetFFIEvents(ctx context.Context, namespace string, filter ffapi.Filter) ([]*fftypes.FFIEvent, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetFFIEvents") + } + var r0 []*fftypes.FFIEvent var r1 *ffapi.FilterResult var r2 error @@ -1142,6 +1361,10 @@ func (_m *Plugin) GetFFIEvents(ctx context.Context, namespace string, filter ffa func (_m *Plugin) GetFFIMethod(ctx context.Context, namespace string, interfaceID *fftypes.UUID, pathName string) (*fftypes.FFIMethod, error) { ret := _m.Called(ctx, namespace, interfaceID, pathName) + if len(ret) == 0 { + panic("no return value specified for GetFFIMethod") + } + var r0 *fftypes.FFIMethod var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, string) (*fftypes.FFIMethod, error)); ok { @@ -1168,6 +1391,10 @@ func (_m *Plugin) GetFFIMethod(ctx context.Context, namespace string, interfaceI func (_m *Plugin) GetFFIMethods(ctx context.Context, namespace string, filter ffapi.Filter) ([]*fftypes.FFIMethod, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetFFIMethods") + } + var r0 []*fftypes.FFIMethod var r1 *ffapi.FilterResult var r2 error @@ -1203,6 +1430,10 @@ func (_m *Plugin) GetFFIMethods(ctx context.Context, namespace string, filter ff func (_m *Plugin) GetFFIs(ctx context.Context, namespace string, filter ffapi.Filter) ([]*fftypes.FFI, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetFFIs") + } + var r0 []*fftypes.FFI var r1 *ffapi.FilterResult var r2 error @@ -1238,6 +1469,10 @@ func (_m *Plugin) GetFFIs(ctx context.Context, namespace string, filter ffapi.Fi func (_m *Plugin) GetGroupByHash(ctx context.Context, namespace string, hash *fftypes.Bytes32) (*core.Group, error) { ret := _m.Called(ctx, namespace, hash) + if len(ret) == 0 { + panic("no return value specified for GetGroupByHash") + } + var r0 *core.Group var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.Bytes32) (*core.Group, error)); ok { @@ -1264,6 +1499,10 @@ func (_m *Plugin) GetGroupByHash(ctx context.Context, namespace string, hash *ff func (_m *Plugin) GetGroups(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Group, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetGroups") + } + var r0 []*core.Group var r1 *ffapi.FilterResult var r2 error @@ -1299,6 +1538,10 @@ func (_m *Plugin) GetGroups(ctx context.Context, namespace string, filter ffapi. func (_m *Plugin) GetIdentities(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Identity, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetIdentities") + } + var r0 []*core.Identity var r1 *ffapi.FilterResult var r2 error @@ -1334,6 +1577,10 @@ func (_m *Plugin) GetIdentities(ctx context.Context, namespace string, filter ff func (_m *Plugin) GetIdentityByDID(ctx context.Context, namespace string, did string) (*core.Identity, error) { ret := _m.Called(ctx, namespace, did) + if len(ret) == 0 { + panic("no return value specified for GetIdentityByDID") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.Identity, error)); ok { @@ -1360,6 +1607,10 @@ func (_m *Plugin) GetIdentityByDID(ctx context.Context, namespace string, did st func (_m *Plugin) GetIdentityByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.Identity, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetIdentityByID") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.Identity, error)); ok { @@ -1386,6 +1637,10 @@ func (_m *Plugin) GetIdentityByID(ctx context.Context, namespace string, id *fft func (_m *Plugin) GetIdentityByName(ctx context.Context, iType fftypes.FFEnum, namespace string, name string) (*core.Identity, error) { ret := _m.Called(ctx, iType, namespace, name) + if len(ret) == 0 { + panic("no return value specified for GetIdentityByName") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, fftypes.FFEnum, string, string) (*core.Identity, error)); ok { @@ -1412,6 +1667,10 @@ func (_m *Plugin) GetIdentityByName(ctx context.Context, iType fftypes.FFEnum, n func (_m *Plugin) GetMessageByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.Message, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetMessageByID") + } + var r0 *core.Message var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.Message, error)); ok { @@ -1438,6 +1697,10 @@ func (_m *Plugin) GetMessageByID(ctx context.Context, namespace string, id *ffty func (_m *Plugin) GetMessageIDs(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.IDAndSequence, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetMessageIDs") + } + var r0 []*core.IDAndSequence var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, ffapi.Filter) ([]*core.IDAndSequence, error)); ok { @@ -1464,6 +1727,10 @@ func (_m *Plugin) GetMessageIDs(ctx context.Context, namespace string, filter ff func (_m *Plugin) GetMessages(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Message, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetMessages") + } + var r0 []*core.Message var r1 *ffapi.FilterResult var r2 error @@ -1499,6 +1766,10 @@ func (_m *Plugin) GetMessages(ctx context.Context, namespace string, filter ffap func (_m *Plugin) GetMessagesForData(ctx context.Context, namespace string, dataID *fftypes.UUID, filter ffapi.Filter) ([]*core.Message, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, dataID, filter) + if len(ret) == 0 { + panic("no return value specified for GetMessagesForData") + } + var r0 []*core.Message var r1 *ffapi.FilterResult var r2 error @@ -1534,6 +1805,10 @@ func (_m *Plugin) GetMessagesForData(ctx context.Context, namespace string, data func (_m *Plugin) GetNamespace(ctx context.Context, name string) (*core.Namespace, error) { ret := _m.Called(ctx, name) + if len(ret) == 0 { + panic("no return value specified for GetNamespace") + } + var r0 *core.Namespace var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Namespace, error)); ok { @@ -1560,6 +1835,10 @@ func (_m *Plugin) GetNamespace(ctx context.Context, name string) (*core.Namespac func (_m *Plugin) GetNextPins(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.NextPin, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetNextPins") + } + var r0 []*core.NextPin var r1 *ffapi.FilterResult var r2 error @@ -1595,6 +1874,10 @@ func (_m *Plugin) GetNextPins(ctx context.Context, namespace string, filter ffap func (_m *Plugin) GetNextPinsForContext(ctx context.Context, namespace string, _a2 *fftypes.Bytes32) ([]*core.NextPin, error) { ret := _m.Called(ctx, namespace, _a2) + if len(ret) == 0 { + panic("no return value specified for GetNextPinsForContext") + } + var r0 []*core.NextPin var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.Bytes32) ([]*core.NextPin, error)); ok { @@ -1621,6 +1904,10 @@ func (_m *Plugin) GetNextPinsForContext(ctx context.Context, namespace string, _ func (_m *Plugin) GetNonce(ctx context.Context, hash *fftypes.Bytes32) (*core.Nonce, error) { ret := _m.Called(ctx, hash) + if len(ret) == 0 { + panic("no return value specified for GetNonce") + } + var r0 *core.Nonce var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.Bytes32) (*core.Nonce, error)); ok { @@ -1647,6 +1934,10 @@ func (_m *Plugin) GetNonce(ctx context.Context, hash *fftypes.Bytes32) (*core.No func (_m *Plugin) GetNonces(ctx context.Context, filter ffapi.Filter) ([]*core.Nonce, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetNonces") + } + var r0 []*core.Nonce var r1 *ffapi.FilterResult var r2 error @@ -1682,6 +1973,10 @@ func (_m *Plugin) GetNonces(ctx context.Context, filter ffapi.Filter) ([]*core.N func (_m *Plugin) GetOffset(ctx context.Context, t fftypes.FFEnum, name string) (*core.Offset, error) { ret := _m.Called(ctx, t, name) + if len(ret) == 0 { + panic("no return value specified for GetOffset") + } + var r0 *core.Offset var r1 error if rf, ok := ret.Get(0).(func(context.Context, fftypes.FFEnum, string) (*core.Offset, error)); ok { @@ -1708,6 +2003,10 @@ func (_m *Plugin) GetOffset(ctx context.Context, t fftypes.FFEnum, name string) func (_m *Plugin) GetOffsets(ctx context.Context, filter ffapi.Filter) ([]*core.Offset, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetOffsets") + } + var r0 []*core.Offset var r1 *ffapi.FilterResult var r2 error @@ -1743,6 +2042,10 @@ func (_m *Plugin) GetOffsets(ctx context.Context, filter ffapi.Filter) ([]*core. func (_m *Plugin) GetOperationByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.Operation, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetOperationByID") + } + var r0 *core.Operation var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.Operation, error)); ok { @@ -1769,6 +2072,10 @@ func (_m *Plugin) GetOperationByID(ctx context.Context, namespace string, id *ff func (_m *Plugin) GetOperations(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Operation, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetOperations") + } + var r0 []*core.Operation var r1 *ffapi.FilterResult var r2 error @@ -1804,6 +2111,10 @@ func (_m *Plugin) GetOperations(ctx context.Context, namespace string, filter ff func (_m *Plugin) GetPins(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Pin, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetPins") + } + var r0 []*core.Pin var r1 *ffapi.FilterResult var r2 error @@ -1839,6 +2150,10 @@ func (_m *Plugin) GetPins(ctx context.Context, namespace string, filter ffapi.Fi func (_m *Plugin) GetSubscriptionByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.Subscription, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetSubscriptionByID") + } + var r0 *core.Subscription var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.Subscription, error)); ok { @@ -1865,6 +2180,10 @@ func (_m *Plugin) GetSubscriptionByID(ctx context.Context, namespace string, id func (_m *Plugin) GetSubscriptionByName(ctx context.Context, namespace string, name string) (*core.Subscription, error) { ret := _m.Called(ctx, namespace, name) + if len(ret) == 0 { + panic("no return value specified for GetSubscriptionByName") + } + var r0 *core.Subscription var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.Subscription, error)); ok { @@ -1891,6 +2210,10 @@ func (_m *Plugin) GetSubscriptionByName(ctx context.Context, namespace string, n func (_m *Plugin) GetSubscriptions(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Subscription, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetSubscriptions") + } + var r0 []*core.Subscription var r1 *ffapi.FilterResult var r2 error @@ -1926,6 +2249,10 @@ func (_m *Plugin) GetSubscriptions(ctx context.Context, namespace string, filter func (_m *Plugin) GetTokenAccountPools(ctx context.Context, namespace string, key string, filter ffapi.Filter) ([]*core.TokenAccountPool, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, key, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenAccountPools") + } + var r0 []*core.TokenAccountPool var r1 *ffapi.FilterResult var r2 error @@ -1961,6 +2288,10 @@ func (_m *Plugin) GetTokenAccountPools(ctx context.Context, namespace string, ke func (_m *Plugin) GetTokenAccounts(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.TokenAccount, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenAccounts") + } + var r0 []*core.TokenAccount var r1 *ffapi.FilterResult var r2 error @@ -1996,6 +2327,10 @@ func (_m *Plugin) GetTokenAccounts(ctx context.Context, namespace string, filter func (_m *Plugin) GetTokenApprovalByID(ctx context.Context, namespace string, localID *fftypes.UUID) (*core.TokenApproval, error) { ret := _m.Called(ctx, namespace, localID) + if len(ret) == 0 { + panic("no return value specified for GetTokenApprovalByID") + } + var r0 *core.TokenApproval var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.TokenApproval, error)); ok { @@ -2022,6 +2357,10 @@ func (_m *Plugin) GetTokenApprovalByID(ctx context.Context, namespace string, lo func (_m *Plugin) GetTokenApprovalByProtocolID(ctx context.Context, namespace string, poolID *fftypes.UUID, protocolID string) (*core.TokenApproval, error) { ret := _m.Called(ctx, namespace, poolID, protocolID) + if len(ret) == 0 { + panic("no return value specified for GetTokenApprovalByProtocolID") + } + var r0 *core.TokenApproval var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, string) (*core.TokenApproval, error)); ok { @@ -2048,6 +2387,10 @@ func (_m *Plugin) GetTokenApprovalByProtocolID(ctx context.Context, namespace st func (_m *Plugin) GetTokenApprovals(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.TokenApproval, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenApprovals") + } + var r0 []*core.TokenApproval var r1 *ffapi.FilterResult var r2 error @@ -2083,6 +2426,10 @@ func (_m *Plugin) GetTokenApprovals(ctx context.Context, namespace string, filte func (_m *Plugin) GetTokenBalance(ctx context.Context, namespace string, poolID *fftypes.UUID, tokenIndex string, identity string) (*core.TokenBalance, error) { ret := _m.Called(ctx, namespace, poolID, tokenIndex, identity) + if len(ret) == 0 { + panic("no return value specified for GetTokenBalance") + } + var r0 *core.TokenBalance var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, string, string) (*core.TokenBalance, error)); ok { @@ -2109,6 +2456,10 @@ func (_m *Plugin) GetTokenBalance(ctx context.Context, namespace string, poolID func (_m *Plugin) GetTokenBalances(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.TokenBalance, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenBalances") + } + var r0 []*core.TokenBalance var r1 *ffapi.FilterResult var r2 error @@ -2144,6 +2495,10 @@ func (_m *Plugin) GetTokenBalances(ctx context.Context, namespace string, filter func (_m *Plugin) GetTokenPool(ctx context.Context, namespace string, name string) (*core.TokenPool, error) { ret := _m.Called(ctx, namespace, name) + if len(ret) == 0 { + panic("no return value specified for GetTokenPool") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.TokenPool, error)); ok { @@ -2170,6 +2525,10 @@ func (_m *Plugin) GetTokenPool(ctx context.Context, namespace string, name strin func (_m *Plugin) GetTokenPoolByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.TokenPool, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetTokenPoolByID") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.TokenPool, error)); ok { @@ -2196,6 +2555,10 @@ func (_m *Plugin) GetTokenPoolByID(ctx context.Context, namespace string, id *ff func (_m *Plugin) GetTokenPoolByNetworkName(ctx context.Context, namespace string, networkName string) (*core.TokenPool, error) { ret := _m.Called(ctx, namespace, networkName) + if len(ret) == 0 { + panic("no return value specified for GetTokenPoolByNetworkName") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.TokenPool, error)); ok { @@ -2222,6 +2585,10 @@ func (_m *Plugin) GetTokenPoolByNetworkName(ctx context.Context, namespace strin func (_m *Plugin) GetTokenPools(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.TokenPool, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenPools") + } + var r0 []*core.TokenPool var r1 *ffapi.FilterResult var r2 error @@ -2257,6 +2624,10 @@ func (_m *Plugin) GetTokenPools(ctx context.Context, namespace string, filter ff func (_m *Plugin) GetTokenTransferByID(ctx context.Context, namespace string, localID *fftypes.UUID) (*core.TokenTransfer, error) { ret := _m.Called(ctx, namespace, localID) + if len(ret) == 0 { + panic("no return value specified for GetTokenTransferByID") + } + var r0 *core.TokenTransfer var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.TokenTransfer, error)); ok { @@ -2283,6 +2654,10 @@ func (_m *Plugin) GetTokenTransferByID(ctx context.Context, namespace string, lo func (_m *Plugin) GetTokenTransferByProtocolID(ctx context.Context, namespace string, poolID *fftypes.UUID, protocolID string) (*core.TokenTransfer, error) { ret := _m.Called(ctx, namespace, poolID, protocolID) + if len(ret) == 0 { + panic("no return value specified for GetTokenTransferByProtocolID") + } + var r0 *core.TokenTransfer var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, string) (*core.TokenTransfer, error)); ok { @@ -2309,6 +2684,10 @@ func (_m *Plugin) GetTokenTransferByProtocolID(ctx context.Context, namespace st func (_m *Plugin) GetTokenTransfers(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.TokenTransfer, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetTokenTransfers") + } + var r0 []*core.TokenTransfer var r1 *ffapi.FilterResult var r2 error @@ -2344,6 +2723,10 @@ func (_m *Plugin) GetTokenTransfers(ctx context.Context, namespace string, filte func (_m *Plugin) GetTransactionByID(ctx context.Context, namespace string, id *fftypes.UUID) (*core.Transaction, error) { ret := _m.Called(ctx, namespace, id) + if len(ret) == 0 { + panic("no return value specified for GetTransactionByID") + } + var r0 *core.Transaction var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID) (*core.Transaction, error)); ok { @@ -2370,6 +2753,10 @@ func (_m *Plugin) GetTransactionByID(ctx context.Context, namespace string, id * func (_m *Plugin) GetTransactions(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Transaction, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetTransactions") + } + var r0 []*core.Transaction var r1 *ffapi.FilterResult var r2 error @@ -2405,6 +2792,10 @@ func (_m *Plugin) GetTransactions(ctx context.Context, namespace string, filter func (_m *Plugin) GetVerifierByHash(ctx context.Context, namespace string, hash *fftypes.Bytes32) (*core.Verifier, error) { ret := _m.Called(ctx, namespace, hash) + if len(ret) == 0 { + panic("no return value specified for GetVerifierByHash") + } + var r0 *core.Verifier var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.Bytes32) (*core.Verifier, error)); ok { @@ -2431,6 +2822,10 @@ func (_m *Plugin) GetVerifierByHash(ctx context.Context, namespace string, hash func (_m *Plugin) GetVerifierByValue(ctx context.Context, vType fftypes.FFEnum, namespace string, value string) (*core.Verifier, error) { ret := _m.Called(ctx, vType, namespace, value) + if len(ret) == 0 { + panic("no return value specified for GetVerifierByValue") + } + var r0 *core.Verifier var r1 error if rf, ok := ret.Get(0).(func(context.Context, fftypes.FFEnum, string, string) (*core.Verifier, error)); ok { @@ -2457,6 +2852,10 @@ func (_m *Plugin) GetVerifierByValue(ctx context.Context, vType fftypes.FFEnum, func (_m *Plugin) GetVerifiers(ctx context.Context, namespace string, filter ffapi.Filter) ([]*core.Verifier, *ffapi.FilterResult, error) { ret := _m.Called(ctx, namespace, filter) + if len(ret) == 0 { + panic("no return value specified for GetVerifiers") + } + var r0 []*core.Verifier var r1 *ffapi.FilterResult var r2 error @@ -2492,6 +2891,10 @@ func (_m *Plugin) GetVerifiers(ctx context.Context, namespace string, filter ffa func (_m *Plugin) Init(ctx context.Context, _a1 config.Section) error { ret := _m.Called(ctx, _a1) + if len(ret) == 0 { + panic("no return value specified for Init") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, config.Section) error); ok { r0 = rf(ctx, _a1) @@ -2511,6 +2914,10 @@ func (_m *Plugin) InitConfig(_a0 config.Section) { func (_m *Plugin) InsertBlob(ctx context.Context, blob *core.Blob) error { ret := _m.Called(ctx, blob) + if len(ret) == 0 { + panic("no return value specified for InsertBlob") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Blob) error); ok { r0 = rf(ctx, blob) @@ -2525,6 +2932,10 @@ func (_m *Plugin) InsertBlob(ctx context.Context, blob *core.Blob) error { func (_m *Plugin) InsertBlobs(ctx context.Context, blobs []*core.Blob) error { ret := _m.Called(ctx, blobs) + if len(ret) == 0 { + panic("no return value specified for InsertBlobs") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, []*core.Blob) error); ok { r0 = rf(ctx, blobs) @@ -2546,6 +2957,10 @@ func (_m *Plugin) InsertBlockchainEvents(ctx context.Context, messages []*core.B _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for InsertBlockchainEvents") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, []*core.BlockchainEvent, ...database.PostCompletionHook) error); ok { r0 = rf(ctx, messages, hooks...) @@ -2560,6 +2975,10 @@ func (_m *Plugin) InsertBlockchainEvents(ctx context.Context, messages []*core.B func (_m *Plugin) InsertContractListener(ctx context.Context, sub *core.ContractListener) error { ret := _m.Called(ctx, sub) + if len(ret) == 0 { + panic("no return value specified for InsertContractListener") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.ContractListener) error); ok { r0 = rf(ctx, sub) @@ -2574,6 +2993,10 @@ func (_m *Plugin) InsertContractListener(ctx context.Context, sub *core.Contract func (_m *Plugin) InsertDataArray(ctx context.Context, data core.DataArray) error { ret := _m.Called(ctx, data) + if len(ret) == 0 { + panic("no return value specified for InsertDataArray") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, core.DataArray) error); ok { r0 = rf(ctx, data) @@ -2588,6 +3011,10 @@ func (_m *Plugin) InsertDataArray(ctx context.Context, data core.DataArray) erro func (_m *Plugin) InsertEvent(ctx context.Context, data *core.Event) error { ret := _m.Called(ctx, data) + if len(ret) == 0 { + panic("no return value specified for InsertEvent") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Event) error); ok { r0 = rf(ctx, data) @@ -2609,6 +3036,10 @@ func (_m *Plugin) InsertMessages(ctx context.Context, messages []*core.Message, _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for InsertMessages") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, []*core.Message, ...database.PostCompletionHook) error); ok { r0 = rf(ctx, messages, hooks...) @@ -2623,6 +3054,10 @@ func (_m *Plugin) InsertMessages(ctx context.Context, messages []*core.Message, func (_m *Plugin) InsertNextPin(ctx context.Context, nextpin *core.NextPin) error { ret := _m.Called(ctx, nextpin) + if len(ret) == 0 { + panic("no return value specified for InsertNextPin") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.NextPin) error); ok { r0 = rf(ctx, nextpin) @@ -2637,6 +3072,10 @@ func (_m *Plugin) InsertNextPin(ctx context.Context, nextpin *core.NextPin) erro func (_m *Plugin) InsertNonce(ctx context.Context, nonce *core.Nonce) error { ret := _m.Called(ctx, nonce) + if len(ret) == 0 { + panic("no return value specified for InsertNonce") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Nonce) error); ok { r0 = rf(ctx, nonce) @@ -2658,6 +3097,10 @@ func (_m *Plugin) InsertOperation(ctx context.Context, operation *core.Operation _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for InsertOperation") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Operation, ...database.PostCompletionHook) error); ok { r0 = rf(ctx, operation, hooks...) @@ -2679,6 +3122,10 @@ func (_m *Plugin) InsertOperations(ctx context.Context, ops []*core.Operation, h _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for InsertOperations") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, []*core.Operation, ...database.PostCompletionHook) error); ok { r0 = rf(ctx, ops, hooks...) @@ -2693,6 +3140,10 @@ func (_m *Plugin) InsertOperations(ctx context.Context, ops []*core.Operation, h func (_m *Plugin) InsertOrGetBatch(ctx context.Context, data *core.BatchPersisted) (*core.BatchPersisted, error) { ret := _m.Called(ctx, data) + if len(ret) == 0 { + panic("no return value specified for InsertOrGetBatch") + } + var r0 *core.BatchPersisted var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.BatchPersisted) (*core.BatchPersisted, error)); ok { @@ -2719,6 +3170,10 @@ func (_m *Plugin) InsertOrGetBatch(ctx context.Context, data *core.BatchPersiste func (_m *Plugin) InsertOrGetBlockchainEvent(ctx context.Context, event *core.BlockchainEvent) (*core.BlockchainEvent, error) { ret := _m.Called(ctx, event) + if len(ret) == 0 { + panic("no return value specified for InsertOrGetBlockchainEvent") + } + var r0 *core.BlockchainEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.BlockchainEvent) (*core.BlockchainEvent, error)); ok { @@ -2745,6 +3200,10 @@ func (_m *Plugin) InsertOrGetBlockchainEvent(ctx context.Context, event *core.Bl func (_m *Plugin) InsertOrGetContractAPI(ctx context.Context, api *core.ContractAPI) (*core.ContractAPI, error) { ret := _m.Called(ctx, api) + if len(ret) == 0 { + panic("no return value specified for InsertOrGetContractAPI") + } + var r0 *core.ContractAPI var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.ContractAPI) (*core.ContractAPI, error)); ok { @@ -2771,6 +3230,10 @@ func (_m *Plugin) InsertOrGetContractAPI(ctx context.Context, api *core.Contract func (_m *Plugin) InsertOrGetFFI(ctx context.Context, ffi *fftypes.FFI) (*fftypes.FFI, error) { ret := _m.Called(ctx, ffi) + if len(ret) == 0 { + panic("no return value specified for InsertOrGetFFI") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFI) (*fftypes.FFI, error)); ok { @@ -2797,6 +3260,10 @@ func (_m *Plugin) InsertOrGetFFI(ctx context.Context, ffi *fftypes.FFI) (*fftype func (_m *Plugin) InsertOrGetTokenPool(ctx context.Context, pool *core.TokenPool) (*core.TokenPool, error) { ret := _m.Called(ctx, pool) + if len(ret) == 0 { + panic("no return value specified for InsertOrGetTokenPool") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenPool) (*core.TokenPool, error)); ok { @@ -2823,6 +3290,10 @@ func (_m *Plugin) InsertOrGetTokenPool(ctx context.Context, pool *core.TokenPool func (_m *Plugin) InsertOrGetTokenTransfer(ctx context.Context, approval *core.TokenTransfer) (*core.TokenTransfer, error) { ret := _m.Called(ctx, approval) + if len(ret) == 0 { + panic("no return value specified for InsertOrGetTokenTransfer") + } + var r0 *core.TokenTransfer var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenTransfer) (*core.TokenTransfer, error)); ok { @@ -2849,6 +3320,10 @@ func (_m *Plugin) InsertOrGetTokenTransfer(ctx context.Context, approval *core.T func (_m *Plugin) InsertPins(ctx context.Context, pins []*core.Pin) error { ret := _m.Called(ctx, pins) + if len(ret) == 0 { + panic("no return value specified for InsertPins") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, []*core.Pin) error); ok { r0 = rf(ctx, pins) @@ -2863,6 +3338,10 @@ func (_m *Plugin) InsertPins(ctx context.Context, pins []*core.Pin) error { func (_m *Plugin) InsertTransaction(ctx context.Context, txn *core.Transaction) error { ret := _m.Called(ctx, txn) + if len(ret) == 0 { + panic("no return value specified for InsertTransaction") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Transaction) error); ok { r0 = rf(ctx, txn) @@ -2877,6 +3356,10 @@ func (_m *Plugin) InsertTransaction(ctx context.Context, txn *core.Transaction) func (_m *Plugin) InsertTransactions(ctx context.Context, txns []*core.Transaction) error { ret := _m.Called(ctx, txns) + if len(ret) == 0 { + panic("no return value specified for InsertTransactions") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, []*core.Transaction) error); ok { r0 = rf(ctx, txns) @@ -2891,6 +3374,10 @@ func (_m *Plugin) InsertTransactions(ctx context.Context, txns []*core.Transacti func (_m *Plugin) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -2905,6 +3392,10 @@ func (_m *Plugin) Name() string { func (_m *Plugin) ReplaceMessage(ctx context.Context, message *core.Message) error { ret := _m.Called(ctx, message) + if len(ret) == 0 { + panic("no return value specified for ReplaceMessage") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Message) error); ok { r0 = rf(ctx, message) @@ -2919,6 +3410,10 @@ func (_m *Plugin) ReplaceMessage(ctx context.Context, message *core.Message) err func (_m *Plugin) RunAsGroup(ctx context.Context, fn func(context.Context) error) error { ret := _m.Called(ctx, fn) + if len(ret) == 0 { + panic("no return value specified for RunAsGroup") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, func(context.Context) error) error); ok { r0 = rf(ctx, fn) @@ -2938,6 +3433,10 @@ func (_m *Plugin) SetHandler(namespace string, handler database.Callbacks) { func (_m *Plugin) UpdateBatch(ctx context.Context, namespace string, id *fftypes.UUID, update ffapi.Update) error { ret := _m.Called(ctx, namespace, id, update) + if len(ret) == 0 { + panic("no return value specified for UpdateBatch") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, ffapi.Update) error); ok { r0 = rf(ctx, namespace, id, update) @@ -2952,6 +3451,10 @@ func (_m *Plugin) UpdateBatch(ctx context.Context, namespace string, id *fftypes func (_m *Plugin) UpdateContractListener(ctx context.Context, namespace string, id *fftypes.UUID, update ffapi.Update) error { ret := _m.Called(ctx, namespace, id, update) + if len(ret) == 0 { + panic("no return value specified for UpdateContractListener") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, ffapi.Update) error); ok { r0 = rf(ctx, namespace, id, update) @@ -2966,6 +3469,10 @@ func (_m *Plugin) UpdateContractListener(ctx context.Context, namespace string, func (_m *Plugin) UpdateData(ctx context.Context, namespace string, id *fftypes.UUID, update ffapi.Update) error { ret := _m.Called(ctx, namespace, id, update) + if len(ret) == 0 { + panic("no return value specified for UpdateData") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, ffapi.Update) error); ok { r0 = rf(ctx, namespace, id, update) @@ -2980,6 +3487,10 @@ func (_m *Plugin) UpdateData(ctx context.Context, namespace string, id *fftypes. func (_m *Plugin) UpdateMessage(ctx context.Context, namespace string, id *fftypes.UUID, update ffapi.Update) error { ret := _m.Called(ctx, namespace, id, update) + if len(ret) == 0 { + panic("no return value specified for UpdateMessage") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, ffapi.Update) error); ok { r0 = rf(ctx, namespace, id, update) @@ -2994,6 +3505,10 @@ func (_m *Plugin) UpdateMessage(ctx context.Context, namespace string, id *fftyp func (_m *Plugin) UpdateMessages(ctx context.Context, namespace string, filter ffapi.Filter, update ffapi.Update) error { ret := _m.Called(ctx, namespace, filter, update) + if len(ret) == 0 { + panic("no return value specified for UpdateMessages") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, ffapi.Filter, ffapi.Update) error); ok { r0 = rf(ctx, namespace, filter, update) @@ -3008,6 +3523,10 @@ func (_m *Plugin) UpdateMessages(ctx context.Context, namespace string, filter f func (_m *Plugin) UpdateNextPin(ctx context.Context, namespace string, sequence int64, update ffapi.Update) error { ret := _m.Called(ctx, namespace, sequence, update) + if len(ret) == 0 { + panic("no return value specified for UpdateNextPin") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, int64, ffapi.Update) error); ok { r0 = rf(ctx, namespace, sequence, update) @@ -3022,6 +3541,10 @@ func (_m *Plugin) UpdateNextPin(ctx context.Context, namespace string, sequence func (_m *Plugin) UpdateNonce(ctx context.Context, nonce *core.Nonce) error { ret := _m.Called(ctx, nonce) + if len(ret) == 0 { + panic("no return value specified for UpdateNonce") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Nonce) error); ok { r0 = rf(ctx, nonce) @@ -3036,6 +3559,10 @@ func (_m *Plugin) UpdateNonce(ctx context.Context, nonce *core.Nonce) error { func (_m *Plugin) UpdateOffset(ctx context.Context, rowID int64, update ffapi.Update) error { ret := _m.Called(ctx, rowID, update) + if len(ret) == 0 { + panic("no return value specified for UpdateOffset") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, int64, ffapi.Update) error); ok { r0 = rf(ctx, rowID, update) @@ -3050,6 +3577,10 @@ func (_m *Plugin) UpdateOffset(ctx context.Context, rowID int64, update ffapi.Up func (_m *Plugin) UpdateOperation(ctx context.Context, namespace string, id *fftypes.UUID, filter ffapi.Filter, update ffapi.Update) (bool, error) { ret := _m.Called(ctx, namespace, id, filter, update) + if len(ret) == 0 { + panic("no return value specified for UpdateOperation") + } + var r0 bool var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, ffapi.Filter, ffapi.Update) (bool, error)); ok { @@ -3074,6 +3605,10 @@ func (_m *Plugin) UpdateOperation(ctx context.Context, namespace string, id *fft func (_m *Plugin) UpdatePins(ctx context.Context, namespace string, filter ffapi.Filter, update ffapi.Update) error { ret := _m.Called(ctx, namespace, filter, update) + if len(ret) == 0 { + panic("no return value specified for UpdatePins") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, ffapi.Filter, ffapi.Update) error); ok { r0 = rf(ctx, namespace, filter, update) @@ -3088,6 +3623,10 @@ func (_m *Plugin) UpdatePins(ctx context.Context, namespace string, filter ffapi func (_m *Plugin) UpdateSubscription(ctx context.Context, namespace string, name string, update ffapi.Update) error { ret := _m.Called(ctx, namespace, name, update) + if len(ret) == 0 { + panic("no return value specified for UpdateSubscription") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, string, ffapi.Update) error); ok { r0 = rf(ctx, namespace, name, update) @@ -3102,6 +3641,10 @@ func (_m *Plugin) UpdateSubscription(ctx context.Context, namespace string, name func (_m *Plugin) UpdateTokenApprovals(ctx context.Context, filter ffapi.Filter, update ffapi.Update) error { ret := _m.Called(ctx, filter, update) + if len(ret) == 0 { + panic("no return value specified for UpdateTokenApprovals") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, ffapi.Filter, ffapi.Update) error); ok { r0 = rf(ctx, filter, update) @@ -3116,6 +3659,10 @@ func (_m *Plugin) UpdateTokenApprovals(ctx context.Context, filter ffapi.Filter, func (_m *Plugin) UpdateTokenBalances(ctx context.Context, transfer *core.TokenTransfer) error { ret := _m.Called(ctx, transfer) + if len(ret) == 0 { + panic("no return value specified for UpdateTokenBalances") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenTransfer) error); ok { r0 = rf(ctx, transfer) @@ -3130,6 +3677,10 @@ func (_m *Plugin) UpdateTokenBalances(ctx context.Context, transfer *core.TokenT func (_m *Plugin) UpdateTransaction(ctx context.Context, namespace string, id *fftypes.UUID, update ffapi.Update) error { ret := _m.Called(ctx, namespace, id, update) + if len(ret) == 0 { + panic("no return value specified for UpdateTransaction") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *fftypes.UUID, ffapi.Update) error); ok { r0 = rf(ctx, namespace, id, update) @@ -3144,6 +3695,10 @@ func (_m *Plugin) UpdateTransaction(ctx context.Context, namespace string, id *f func (_m *Plugin) UpsertContractAPI(ctx context.Context, api *core.ContractAPI, optimization database.UpsertOptimization) error { ret := _m.Called(ctx, api, optimization) + if len(ret) == 0 { + panic("no return value specified for UpsertContractAPI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.ContractAPI, database.UpsertOptimization) error); ok { r0 = rf(ctx, api, optimization) @@ -3158,6 +3713,10 @@ func (_m *Plugin) UpsertContractAPI(ctx context.Context, api *core.ContractAPI, func (_m *Plugin) UpsertData(ctx context.Context, data *core.Data, optimization database.UpsertOptimization) error { ret := _m.Called(ctx, data, optimization) + if len(ret) == 0 { + panic("no return value specified for UpsertData") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Data, database.UpsertOptimization) error); ok { r0 = rf(ctx, data, optimization) @@ -3172,6 +3731,10 @@ func (_m *Plugin) UpsertData(ctx context.Context, data *core.Data, optimization func (_m *Plugin) UpsertDatatype(ctx context.Context, datadef *core.Datatype, allowExisting bool) error { ret := _m.Called(ctx, datadef, allowExisting) + if len(ret) == 0 { + panic("no return value specified for UpsertDatatype") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Datatype, bool) error); ok { r0 = rf(ctx, datadef, allowExisting) @@ -3186,6 +3749,10 @@ func (_m *Plugin) UpsertDatatype(ctx context.Context, datadef *core.Datatype, al func (_m *Plugin) UpsertFFI(ctx context.Context, ffi *fftypes.FFI, optimization database.UpsertOptimization) error { ret := _m.Called(ctx, ffi, optimization) + if len(ret) == 0 { + panic("no return value specified for UpsertFFI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFI, database.UpsertOptimization) error); ok { r0 = rf(ctx, ffi, optimization) @@ -3200,6 +3767,10 @@ func (_m *Plugin) UpsertFFI(ctx context.Context, ffi *fftypes.FFI, optimization func (_m *Plugin) UpsertFFIError(ctx context.Context, method *fftypes.FFIError) error { ret := _m.Called(ctx, method) + if len(ret) == 0 { + panic("no return value specified for UpsertFFIError") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFIError) error); ok { r0 = rf(ctx, method) @@ -3214,6 +3785,10 @@ func (_m *Plugin) UpsertFFIError(ctx context.Context, method *fftypes.FFIError) func (_m *Plugin) UpsertFFIEvent(ctx context.Context, method *fftypes.FFIEvent) error { ret := _m.Called(ctx, method) + if len(ret) == 0 { + panic("no return value specified for UpsertFFIEvent") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFIEvent) error); ok { r0 = rf(ctx, method) @@ -3228,6 +3803,10 @@ func (_m *Plugin) UpsertFFIEvent(ctx context.Context, method *fftypes.FFIEvent) func (_m *Plugin) UpsertFFIMethod(ctx context.Context, method *fftypes.FFIMethod) error { ret := _m.Called(ctx, method) + if len(ret) == 0 { + panic("no return value specified for UpsertFFIMethod") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFIMethod) error); ok { r0 = rf(ctx, method) @@ -3242,6 +3821,10 @@ func (_m *Plugin) UpsertFFIMethod(ctx context.Context, method *fftypes.FFIMethod func (_m *Plugin) UpsertGroup(ctx context.Context, data *core.Group, optimization database.UpsertOptimization) error { ret := _m.Called(ctx, data, optimization) + if len(ret) == 0 { + panic("no return value specified for UpsertGroup") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Group, database.UpsertOptimization) error); ok { r0 = rf(ctx, data, optimization) @@ -3256,6 +3839,10 @@ func (_m *Plugin) UpsertGroup(ctx context.Context, data *core.Group, optimizatio func (_m *Plugin) UpsertIdentity(ctx context.Context, data *core.Identity, optimization database.UpsertOptimization) error { ret := _m.Called(ctx, data, optimization) + if len(ret) == 0 { + panic("no return value specified for UpsertIdentity") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Identity, database.UpsertOptimization) error); ok { r0 = rf(ctx, data, optimization) @@ -3277,6 +3864,10 @@ func (_m *Plugin) UpsertMessage(ctx context.Context, message *core.Message, opti _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for UpsertMessage") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Message, database.UpsertOptimization, ...database.PostCompletionHook) error); ok { r0 = rf(ctx, message, optimization, hooks...) @@ -3291,6 +3882,10 @@ func (_m *Plugin) UpsertMessage(ctx context.Context, message *core.Message, opti func (_m *Plugin) UpsertNamespace(ctx context.Context, data *core.Namespace, allowExisting bool) error { ret := _m.Called(ctx, data, allowExisting) + if len(ret) == 0 { + panic("no return value specified for UpsertNamespace") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Namespace, bool) error); ok { r0 = rf(ctx, data, allowExisting) @@ -3305,6 +3900,10 @@ func (_m *Plugin) UpsertNamespace(ctx context.Context, data *core.Namespace, all func (_m *Plugin) UpsertOffset(ctx context.Context, data *core.Offset, allowExisting bool) error { ret := _m.Called(ctx, data, allowExisting) + if len(ret) == 0 { + panic("no return value specified for UpsertOffset") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Offset, bool) error); ok { r0 = rf(ctx, data, allowExisting) @@ -3319,6 +3918,10 @@ func (_m *Plugin) UpsertOffset(ctx context.Context, data *core.Offset, allowExis func (_m *Plugin) UpsertPin(ctx context.Context, parked *core.Pin) error { ret := _m.Called(ctx, parked) + if len(ret) == 0 { + panic("no return value specified for UpsertPin") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Pin) error); ok { r0 = rf(ctx, parked) @@ -3333,6 +3936,10 @@ func (_m *Plugin) UpsertPin(ctx context.Context, parked *core.Pin) error { func (_m *Plugin) UpsertSubscription(ctx context.Context, data *core.Subscription, allowExisting bool) error { ret := _m.Called(ctx, data, allowExisting) + if len(ret) == 0 { + panic("no return value specified for UpsertSubscription") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Subscription, bool) error); ok { r0 = rf(ctx, data, allowExisting) @@ -3347,6 +3954,10 @@ func (_m *Plugin) UpsertSubscription(ctx context.Context, data *core.Subscriptio func (_m *Plugin) UpsertTokenApproval(ctx context.Context, approval *core.TokenApproval) error { ret := _m.Called(ctx, approval) + if len(ret) == 0 { + panic("no return value specified for UpsertTokenApproval") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenApproval) error); ok { r0 = rf(ctx, approval) @@ -3361,6 +3972,10 @@ func (_m *Plugin) UpsertTokenApproval(ctx context.Context, approval *core.TokenA func (_m *Plugin) UpsertTokenPool(ctx context.Context, pool *core.TokenPool, optimization database.UpsertOptimization) error { ret := _m.Called(ctx, pool, optimization) + if len(ret) == 0 { + panic("no return value specified for UpsertTokenPool") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenPool, database.UpsertOptimization) error); ok { r0 = rf(ctx, pool, optimization) @@ -3375,6 +3990,10 @@ func (_m *Plugin) UpsertTokenPool(ctx context.Context, pool *core.TokenPool, opt func (_m *Plugin) UpsertVerifier(ctx context.Context, data *core.Verifier, optimization database.UpsertOptimization) error { ret := _m.Called(ctx, data, optimization) + if len(ret) == 0 { + panic("no return value specified for UpsertVerifier") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Verifier, database.UpsertOptimization) error); ok { r0 = rf(ctx, data, optimization) diff --git a/mocks/dataexchangemocks/callbacks.go b/mocks/dataexchangemocks/callbacks.go index 92df31557..2d11b72f6 100644 --- a/mocks/dataexchangemocks/callbacks.go +++ b/mocks/dataexchangemocks/callbacks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package dataexchangemocks @@ -16,6 +16,10 @@ type Callbacks struct { func (_m *Callbacks) DXEvent(plugin dataexchange.Plugin, event dataexchange.DXEvent) error { ret := _m.Called(plugin, event) + if len(ret) == 0 { + panic("no return value specified for DXEvent") + } + var r0 error if rf, ok := ret.Get(0).(func(dataexchange.Plugin, dataexchange.DXEvent) error); ok { r0 = rf(plugin, event) diff --git a/mocks/dataexchangemocks/dx_event.go b/mocks/dataexchangemocks/dx_event.go index 348dace64..200fe5e71 100644 --- a/mocks/dataexchangemocks/dx_event.go +++ b/mocks/dataexchangemocks/dx_event.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package dataexchangemocks @@ -26,6 +26,10 @@ func (_m *DXEvent) AckWithManifest(manifest string) { func (_m *DXEvent) EventID() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for EventID") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -40,6 +44,10 @@ func (_m *DXEvent) EventID() string { func (_m *DXEvent) MessageReceived() *dataexchange.MessageReceived { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for MessageReceived") + } + var r0 *dataexchange.MessageReceived if rf, ok := ret.Get(0).(func() *dataexchange.MessageReceived); ok { r0 = rf() @@ -56,6 +64,10 @@ func (_m *DXEvent) MessageReceived() *dataexchange.MessageReceived { func (_m *DXEvent) PrivateBlobReceived() *dataexchange.PrivateBlobReceived { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for PrivateBlobReceived") + } + var r0 *dataexchange.PrivateBlobReceived if rf, ok := ret.Get(0).(func() *dataexchange.PrivateBlobReceived); ok { r0 = rf() @@ -72,6 +84,10 @@ func (_m *DXEvent) PrivateBlobReceived() *dataexchange.PrivateBlobReceived { func (_m *DXEvent) Type() dataexchange.DXEventType { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Type") + } + var r0 dataexchange.DXEventType if rf, ok := ret.Get(0).(func() dataexchange.DXEventType); ok { r0 = rf() diff --git a/mocks/dataexchangemocks/plugin.go b/mocks/dataexchangemocks/plugin.go index 4a9343d0f..e0e932143 100644 --- a/mocks/dataexchangemocks/plugin.go +++ b/mocks/dataexchangemocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package dataexchangemocks @@ -27,6 +27,10 @@ type Plugin struct { func (_m *Plugin) AddNode(ctx context.Context, networkNamespace string, nodeName string, peer fftypes.JSONObject) error { ret := _m.Called(ctx, networkNamespace, nodeName, peer) + if len(ret) == 0 { + panic("no return value specified for AddNode") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, string, fftypes.JSONObject) error); ok { r0 = rf(ctx, networkNamespace, nodeName, peer) @@ -41,6 +45,10 @@ func (_m *Plugin) AddNode(ctx context.Context, networkNamespace string, nodeName func (_m *Plugin) Capabilities() *dataexchange.Capabilities { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Capabilities") + } + var r0 *dataexchange.Capabilities if rf, ok := ret.Get(0).(func() *dataexchange.Capabilities); ok { r0 = rf() @@ -57,6 +65,10 @@ func (_m *Plugin) Capabilities() *dataexchange.Capabilities { func (_m *Plugin) DeleteBlob(ctx context.Context, payloadRef string) error { ret := _m.Called(ctx, payloadRef) + if len(ret) == 0 { + panic("no return value specified for DeleteBlob") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { r0 = rf(ctx, payloadRef) @@ -71,6 +83,10 @@ func (_m *Plugin) DeleteBlob(ctx context.Context, payloadRef string) error { func (_m *Plugin) DownloadBlob(ctx context.Context, payloadRef string) (io.ReadCloser, error) { ret := _m.Called(ctx, payloadRef) + if len(ret) == 0 { + panic("no return value specified for DownloadBlob") + } + var r0 io.ReadCloser var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (io.ReadCloser, error)); ok { @@ -97,6 +113,10 @@ func (_m *Plugin) DownloadBlob(ctx context.Context, payloadRef string) (io.ReadC func (_m *Plugin) GetEndpointInfo(ctx context.Context, nodeName string) (fftypes.JSONObject, error) { ret := _m.Called(ctx, nodeName) + if len(ret) == 0 { + panic("no return value specified for GetEndpointInfo") + } + var r0 fftypes.JSONObject var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (fftypes.JSONObject, error)); ok { @@ -123,6 +143,10 @@ func (_m *Plugin) GetEndpointInfo(ctx context.Context, nodeName string) (fftypes func (_m *Plugin) GetPeerID(peer fftypes.JSONObject) string { ret := _m.Called(peer) + if len(ret) == 0 { + panic("no return value specified for GetPeerID") + } + var r0 string if rf, ok := ret.Get(0).(func(fftypes.JSONObject) string); ok { r0 = rf(peer) @@ -137,6 +161,10 @@ func (_m *Plugin) GetPeerID(peer fftypes.JSONObject) string { func (_m *Plugin) Init(ctx context.Context, cancelCtx context.CancelFunc, _a2 config.Section) error { ret := _m.Called(ctx, cancelCtx, _a2) + if len(ret) == 0 { + panic("no return value specified for Init") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, context.CancelFunc, config.Section) error); ok { r0 = rf(ctx, cancelCtx, _a2) @@ -156,6 +184,10 @@ func (_m *Plugin) InitConfig(_a0 config.Section) { func (_m *Plugin) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -170,6 +202,10 @@ func (_m *Plugin) Name() string { func (_m *Plugin) SendMessage(ctx context.Context, nsOpID string, peer fftypes.JSONObject, sender fftypes.JSONObject, data []byte) error { ret := _m.Called(ctx, nsOpID, peer, sender, data) + if len(ret) == 0 { + panic("no return value specified for SendMessage") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, fftypes.JSONObject, fftypes.JSONObject, []byte) error); ok { r0 = rf(ctx, nsOpID, peer, sender, data) @@ -194,6 +230,10 @@ func (_m *Plugin) SetOperationHandler(namespace string, handler core.OperationCa func (_m *Plugin) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -208,6 +248,10 @@ func (_m *Plugin) Start() error { func (_m *Plugin) TransferBlob(ctx context.Context, nsOpID string, peer fftypes.JSONObject, sender fftypes.JSONObject, payloadRef string) error { ret := _m.Called(ctx, nsOpID, peer, sender, payloadRef) + if len(ret) == 0 { + panic("no return value specified for TransferBlob") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, fftypes.JSONObject, fftypes.JSONObject, string) error); ok { r0 = rf(ctx, nsOpID, peer, sender, payloadRef) @@ -222,6 +266,10 @@ func (_m *Plugin) TransferBlob(ctx context.Context, nsOpID string, peer fftypes. func (_m *Plugin) UploadBlob(ctx context.Context, ns string, id fftypes.UUID, content io.Reader) (string, *fftypes.Bytes32, int64, error) { ret := _m.Called(ctx, ns, id, content) + if len(ret) == 0 { + panic("no return value specified for UploadBlob") + } + var r0 string var r1 *fftypes.Bytes32 var r2 int64 diff --git a/mocks/datamocks/manager.go b/mocks/datamocks/manager.go index cbdfa9917..aaf313950 100644 --- a/mocks/datamocks/manager.go +++ b/mocks/datamocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package datamocks @@ -26,6 +26,10 @@ type Manager struct { func (_m *Manager) BlobsEnabled() bool { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for BlobsEnabled") + } + var r0 bool if rf, ok := ret.Get(0).(func() bool); ok { r0 = rf() @@ -40,6 +44,10 @@ func (_m *Manager) BlobsEnabled() bool { func (_m *Manager) CheckDatatype(ctx context.Context, datatype *core.Datatype) error { ret := _m.Called(ctx, datatype) + if len(ret) == 0 { + panic("no return value specified for CheckDatatype") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Datatype) error); ok { r0 = rf(ctx, datatype) @@ -54,6 +62,10 @@ func (_m *Manager) CheckDatatype(ctx context.Context, datatype *core.Datatype) e func (_m *Manager) DeleteData(ctx context.Context, dataID string) error { ret := _m.Called(ctx, dataID) + if len(ret) == 0 { + panic("no return value specified for DeleteData") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { r0 = rf(ctx, dataID) @@ -68,6 +80,10 @@ func (_m *Manager) DeleteData(ctx context.Context, dataID string) error { func (_m *Manager) DownloadBlob(ctx context.Context, dataID string) (*core.Blob, io.ReadCloser, error) { ret := _m.Called(ctx, dataID) + if len(ret) == 0 { + panic("no return value specified for DownloadBlob") + } + var r0 *core.Blob var r1 io.ReadCloser var r2 error @@ -110,6 +126,10 @@ func (_m *Manager) GetMessageDataCached(ctx context.Context, msg *core.Message, _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for GetMessageDataCached") + } + var r0 core.DataArray var r1 bool var r2 error @@ -150,6 +170,10 @@ func (_m *Manager) GetMessageWithDataCached(ctx context.Context, msgID *fftypes. _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for GetMessageWithDataCached") + } + var r0 *core.Message var r1 core.DataArray var r2 bool @@ -192,6 +216,10 @@ func (_m *Manager) GetMessageWithDataCached(ctx context.Context, msgID *fftypes. func (_m *Manager) HydrateBatch(ctx context.Context, persistedBatch *core.BatchPersisted) (*core.Batch, error) { ret := _m.Called(ctx, persistedBatch) + if len(ret) == 0 { + panic("no return value specified for HydrateBatch") + } + var r0 *core.Batch var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.BatchPersisted) (*core.Batch, error)); ok { @@ -225,6 +253,10 @@ func (_m *Manager) PeekMessageCache(ctx context.Context, id *fftypes.UUID, optio _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for PeekMessageCache") + } + var r0 *core.Message var r1 core.DataArray if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, ...data.CacheReadOption) (*core.Message, core.DataArray)); ok { @@ -253,6 +285,10 @@ func (_m *Manager) PeekMessageCache(ctx context.Context, id *fftypes.UUID, optio func (_m *Manager) ResolveInlineData(ctx context.Context, msg *data.NewMessage) error { ret := _m.Called(ctx, msg) + if len(ret) == 0 { + panic("no return value specified for ResolveInlineData") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *data.NewMessage) error); ok { r0 = rf(ctx, msg) @@ -287,6 +323,10 @@ func (_m *Manager) UpdateMessageStateIfCached(ctx context.Context, id *fftypes.U func (_m *Manager) UploadBlob(ctx context.Context, inData *core.DataRefOrValue, blob *ffapi.Multipart, autoMeta bool) (*core.Data, error) { ret := _m.Called(ctx, inData, blob, autoMeta) + if len(ret) == 0 { + panic("no return value specified for UploadBlob") + } + var r0 *core.Data var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.DataRefOrValue, *ffapi.Multipart, bool) (*core.Data, error)); ok { @@ -313,6 +353,10 @@ func (_m *Manager) UploadBlob(ctx context.Context, inData *core.DataRefOrValue, func (_m *Manager) UploadJSON(ctx context.Context, inData *core.DataRefOrValue) (*core.Data, error) { ret := _m.Called(ctx, inData) + if len(ret) == 0 { + panic("no return value specified for UploadJSON") + } + var r0 *core.Data var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.DataRefOrValue) (*core.Data, error)); ok { @@ -339,6 +383,10 @@ func (_m *Manager) UploadJSON(ctx context.Context, inData *core.DataRefOrValue) func (_m *Manager) ValidateAll(ctx context.Context, _a1 core.DataArray) (bool, error) { ret := _m.Called(ctx, _a1) + if len(ret) == 0 { + panic("no return value specified for ValidateAll") + } + var r0 bool var r1 error if rf, ok := ret.Get(0).(func(context.Context, core.DataArray) (bool, error)); ok { @@ -368,6 +416,10 @@ func (_m *Manager) WaitStop() { func (_m *Manager) WriteNewMessage(ctx context.Context, newMsg *data.NewMessage) error { ret := _m.Called(ctx, newMsg) + if len(ret) == 0 { + panic("no return value specified for WriteNewMessage") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *data.NewMessage) error); ok { r0 = rf(ctx, newMsg) diff --git a/mocks/definitionsmocks/handler.go b/mocks/definitionsmocks/handler.go index 7b6d8cd07..c67c6db42 100644 --- a/mocks/definitionsmocks/handler.go +++ b/mocks/definitionsmocks/handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package definitionsmocks @@ -22,6 +22,10 @@ type Handler struct { func (_m *Handler) HandleDefinitionBroadcast(ctx context.Context, state *core.BatchState, msg *core.Message, data core.DataArray, tx *fftypes.UUID) (definitions.HandlerResult, error) { ret := _m.Called(ctx, state, msg, data, tx) + if len(ret) == 0 { + panic("no return value specified for HandleDefinitionBroadcast") + } + var r0 definitions.HandlerResult var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.BatchState, *core.Message, core.DataArray, *fftypes.UUID) (definitions.HandlerResult, error)); ok { diff --git a/mocks/definitionsmocks/sender.go b/mocks/definitionsmocks/sender.go index 96b7bb40f..28fd4736c 100644 --- a/mocks/definitionsmocks/sender.go +++ b/mocks/definitionsmocks/sender.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package definitionsmocks @@ -21,6 +21,10 @@ type Sender struct { func (_m *Sender) ClaimIdentity(ctx context.Context, def *core.IdentityClaim, signingIdentity *core.SignerRef, parentSigner *core.SignerRef) error { ret := _m.Called(ctx, def, signingIdentity, parentSigner) + if len(ret) == 0 { + panic("no return value specified for ClaimIdentity") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.IdentityClaim, *core.SignerRef, *core.SignerRef) error); ok { r0 = rf(ctx, def, signingIdentity, parentSigner) @@ -35,6 +39,10 @@ func (_m *Sender) ClaimIdentity(ctx context.Context, def *core.IdentityClaim, si func (_m *Sender) DefineContractAPI(ctx context.Context, httpServerURL string, api *core.ContractAPI, waitConfirm bool) error { ret := _m.Called(ctx, httpServerURL, api, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for DefineContractAPI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *core.ContractAPI, bool) error); ok { r0 = rf(ctx, httpServerURL, api, waitConfirm) @@ -49,6 +57,10 @@ func (_m *Sender) DefineContractAPI(ctx context.Context, httpServerURL string, a func (_m *Sender) DefineDatatype(ctx context.Context, datatype *core.Datatype, waitConfirm bool) error { ret := _m.Called(ctx, datatype, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for DefineDatatype") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Datatype, bool) error); ok { r0 = rf(ctx, datatype, waitConfirm) @@ -63,6 +75,10 @@ func (_m *Sender) DefineDatatype(ctx context.Context, datatype *core.Datatype, w func (_m *Sender) DefineFFI(ctx context.Context, ffi *fftypes.FFI, waitConfirm bool) error { ret := _m.Called(ctx, ffi, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for DefineFFI") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.FFI, bool) error); ok { r0 = rf(ctx, ffi, waitConfirm) @@ -77,6 +93,10 @@ func (_m *Sender) DefineFFI(ctx context.Context, ffi *fftypes.FFI, waitConfirm b func (_m *Sender) DefineTokenPool(ctx context.Context, pool *core.TokenPool, waitConfirm bool) error { ret := _m.Called(ctx, pool, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for DefineTokenPool") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenPool, bool) error); ok { r0 = rf(ctx, pool, waitConfirm) @@ -91,6 +111,10 @@ func (_m *Sender) DefineTokenPool(ctx context.Context, pool *core.TokenPool, wai func (_m *Sender) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -105,6 +129,10 @@ func (_m *Sender) Name() string { func (_m *Sender) PublishContractAPI(ctx context.Context, httpServerURL string, name string, networkName string, waitConfirm bool) (*core.ContractAPI, error) { ret := _m.Called(ctx, httpServerURL, name, networkName, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for PublishContractAPI") + } + var r0 *core.ContractAPI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string, string, bool) (*core.ContractAPI, error)); ok { @@ -131,6 +159,10 @@ func (_m *Sender) PublishContractAPI(ctx context.Context, httpServerURL string, func (_m *Sender) PublishFFI(ctx context.Context, name string, version string, networkName string, waitConfirm bool) (*fftypes.FFI, error) { ret := _m.Called(ctx, name, version, networkName, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for PublishFFI") + } + var r0 *fftypes.FFI var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string, string, bool) (*fftypes.FFI, error)); ok { @@ -157,6 +189,10 @@ func (_m *Sender) PublishFFI(ctx context.Context, name string, version string, n func (_m *Sender) PublishTokenPool(ctx context.Context, poolNameOrID string, networkName string, waitConfirm bool) (*core.TokenPool, error) { ret := _m.Called(ctx, poolNameOrID, networkName, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for PublishTokenPool") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string, bool) (*core.TokenPool, error)); ok { @@ -183,6 +219,10 @@ func (_m *Sender) PublishTokenPool(ctx context.Context, poolNameOrID string, net func (_m *Sender) UpdateIdentity(ctx context.Context, identity *core.Identity, def *core.IdentityUpdate, signingIdentity *core.SignerRef, waitConfirm bool) error { ret := _m.Called(ctx, identity, def, signingIdentity, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for UpdateIdentity") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Identity, *core.IdentityUpdate, *core.SignerRef, bool) error); ok { r0 = rf(ctx, identity, def, signingIdentity, waitConfirm) diff --git a/mocks/eventmocks/event_manager.go b/mocks/eventmocks/event_manager.go index 0521b7c4c..7514bf1bb 100644 --- a/mocks/eventmocks/event_manager.go +++ b/mocks/eventmocks/event_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package eventmocks @@ -33,6 +33,10 @@ type EventManager struct { func (_m *EventManager) AddSystemEventListener(ns string, el system.EventListener) error { ret := _m.Called(ns, el) + if len(ret) == 0 { + panic("no return value specified for AddSystemEventListener") + } + var r0 error if rf, ok := ret.Get(0).(func(string, system.EventListener) error); ok { r0 = rf(ns, el) @@ -47,6 +51,10 @@ func (_m *EventManager) AddSystemEventListener(ns string, el system.EventListene func (_m *EventManager) BlockchainEventBatch(batch []*blockchain.EventToDispatch) error { ret := _m.Called(batch) + if len(ret) == 0 { + panic("no return value specified for BlockchainEventBatch") + } + var r0 error if rf, ok := ret.Get(0).(func([]*blockchain.EventToDispatch) error); ok { r0 = rf(batch) @@ -61,6 +69,10 @@ func (_m *EventManager) BlockchainEventBatch(batch []*blockchain.EventToDispatch func (_m *EventManager) CreateUpdateDurableSubscription(ctx context.Context, subDef *core.Subscription, mustNew bool) error { ret := _m.Called(ctx, subDef, mustNew) + if len(ret) == 0 { + panic("no return value specified for CreateUpdateDurableSubscription") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Subscription, bool) error); ok { r0 = rf(ctx, subDef, mustNew) @@ -75,6 +87,10 @@ func (_m *EventManager) CreateUpdateDurableSubscription(ctx context.Context, sub func (_m *EventManager) DXEvent(plugin dataexchange.Plugin, event dataexchange.DXEvent) error { ret := _m.Called(plugin, event) + if len(ret) == 0 { + panic("no return value specified for DXEvent") + } + var r0 error if rf, ok := ret.Get(0).(func(dataexchange.Plugin, dataexchange.DXEvent) error); ok { r0 = rf(plugin, event) @@ -89,6 +105,10 @@ func (_m *EventManager) DXEvent(plugin dataexchange.Plugin, event dataexchange.D func (_m *EventManager) DeleteDurableSubscription(ctx context.Context, subDef *core.Subscription) error { ret := _m.Called(ctx, subDef) + if len(ret) == 0 { + panic("no return value specified for DeleteDurableSubscription") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Subscription) error); ok { r0 = rf(ctx, subDef) @@ -103,6 +123,10 @@ func (_m *EventManager) DeleteDurableSubscription(ctx context.Context, subDef *c func (_m *EventManager) DeletedSubscriptions() chan<- *fftypes.UUID { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for DeletedSubscriptions") + } + var r0 chan<- *fftypes.UUID if rf, ok := ret.Get(0).(func() chan<- *fftypes.UUID); ok { r0 = rf() @@ -119,6 +143,10 @@ func (_m *EventManager) DeletedSubscriptions() chan<- *fftypes.UUID { func (_m *EventManager) EnrichEvent(ctx context.Context, event *core.Event) (*core.EnrichedEvent, error) { ret := _m.Called(ctx, event) + if len(ret) == 0 { + panic("no return value specified for EnrichEvent") + } + var r0 *core.EnrichedEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Event) (*core.EnrichedEvent, error)); ok { @@ -141,10 +169,74 @@ func (_m *EventManager) EnrichEvent(ctx context.Context, event *core.Event) (*co return r0, r1 } +// EnrichEvents provides a mock function with given fields: ctx, _a1 +func (_m *EventManager) EnrichEvents(ctx context.Context, _a1 []*core.Event) ([]*core.EnrichedEvent, error) { + ret := _m.Called(ctx, _a1) + + if len(ret) == 0 { + panic("no return value specified for EnrichEvents") + } + + var r0 []*core.EnrichedEvent + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []*core.Event) ([]*core.EnrichedEvent, error)); ok { + return rf(ctx, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, []*core.Event) []*core.EnrichedEvent); ok { + r0 = rf(ctx, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*core.EnrichedEvent) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []*core.Event) error); ok { + r1 = rf(ctx, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FilterHistoricalEventsOnSubscription provides a mock function with given fields: ctx, _a1, sub +func (_m *EventManager) FilterHistoricalEventsOnSubscription(ctx context.Context, _a1 []*core.EnrichedEvent, sub *core.Subscription) ([]*core.EnrichedEvent, error) { + ret := _m.Called(ctx, _a1, sub) + + if len(ret) == 0 { + panic("no return value specified for FilterHistoricalEventsOnSubscription") + } + + var r0 []*core.EnrichedEvent + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []*core.EnrichedEvent, *core.Subscription) ([]*core.EnrichedEvent, error)); ok { + return rf(ctx, _a1, sub) + } + if rf, ok := ret.Get(0).(func(context.Context, []*core.EnrichedEvent, *core.Subscription) []*core.EnrichedEvent); ok { + r0 = rf(ctx, _a1, sub) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*core.EnrichedEvent) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []*core.EnrichedEvent, *core.Subscription) error); ok { + r1 = rf(ctx, _a1, sub) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetPlugins provides a mock function with given fields: func (_m *EventManager) GetPlugins() []*core.NamespaceStatusPlugin { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for GetPlugins") + } + var r0 []*core.NamespaceStatusPlugin if rf, ok := ret.Get(0).(func() []*core.NamespaceStatusPlugin); ok { r0 = rf() @@ -161,6 +253,10 @@ func (_m *EventManager) GetPlugins() []*core.NamespaceStatusPlugin { func (_m *EventManager) NewEvents() chan<- int64 { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for NewEvents") + } + var r0 chan<- int64 if rf, ok := ret.Get(0).(func() chan<- int64); ok { r0 = rf() @@ -177,6 +273,10 @@ func (_m *EventManager) NewEvents() chan<- int64 { func (_m *EventManager) NewPins() chan<- int64 { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for NewPins") + } + var r0 chan<- int64 if rf, ok := ret.Get(0).(func() chan<- int64); ok { r0 = rf() @@ -193,6 +293,10 @@ func (_m *EventManager) NewPins() chan<- int64 { func (_m *EventManager) NewSubscriptions() chan<- *fftypes.UUID { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for NewSubscriptions") + } + var r0 chan<- *fftypes.UUID if rf, ok := ret.Get(0).(func() chan<- *fftypes.UUID); ok { r0 = rf() @@ -214,6 +318,10 @@ func (_m *EventManager) QueueBatchRewind(batchID *fftypes.UUID) { func (_m *EventManager) ResolveTransportAndCapabilities(ctx context.Context, transportName string) (string, *pkgevents.Capabilities, error) { ret := _m.Called(ctx, transportName) + if len(ret) == 0 { + panic("no return value specified for ResolveTransportAndCapabilities") + } + var r0 string var r1 *pkgevents.Capabilities var r2 error @@ -247,6 +355,10 @@ func (_m *EventManager) ResolveTransportAndCapabilities(ctx context.Context, tra func (_m *EventManager) SharedStorageBatchDownloaded(ss sharedstorage.Plugin, payloadRef string, data []byte) (*fftypes.UUID, error) { ret := _m.Called(ss, payloadRef, data) + if len(ret) == 0 { + panic("no return value specified for SharedStorageBatchDownloaded") + } + var r0 *fftypes.UUID var r1 error if rf, ok := ret.Get(0).(func(sharedstorage.Plugin, string, []byte) (*fftypes.UUID, error)); ok { @@ -273,6 +385,10 @@ func (_m *EventManager) SharedStorageBatchDownloaded(ss sharedstorage.Plugin, pa func (_m *EventManager) SharedStorageBlobDownloaded(ss sharedstorage.Plugin, hash fftypes.Bytes32, size int64, payloadRef string, dataID *fftypes.UUID) error { ret := _m.Called(ss, hash, size, payloadRef, dataID) + if len(ret) == 0 { + panic("no return value specified for SharedStorageBlobDownloaded") + } + var r0 error if rf, ok := ret.Get(0).(func(sharedstorage.Plugin, fftypes.Bytes32, int64, string, *fftypes.UUID) error); ok { r0 = rf(ss, hash, size, payloadRef, dataID) @@ -287,6 +403,10 @@ func (_m *EventManager) SharedStorageBlobDownloaded(ss sharedstorage.Plugin, has func (_m *EventManager) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -301,6 +421,10 @@ func (_m *EventManager) Start() error { func (_m *EventManager) SubscriptionUpdates() chan<- *fftypes.UUID { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for SubscriptionUpdates") + } + var r0 chan<- *fftypes.UUID if rf, ok := ret.Get(0).(func() chan<- *fftypes.UUID); ok { r0 = rf() @@ -317,6 +441,10 @@ func (_m *EventManager) SubscriptionUpdates() chan<- *fftypes.UUID { func (_m *EventManager) TokenPoolCreated(ctx context.Context, ti tokens.Plugin, pool *tokens.TokenPool) error { ret := _m.Called(ctx, ti, pool) + if len(ret) == 0 { + panic("no return value specified for TokenPoolCreated") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, tokens.Plugin, *tokens.TokenPool) error); ok { r0 = rf(ctx, ti, pool) @@ -331,6 +459,10 @@ func (_m *EventManager) TokenPoolCreated(ctx context.Context, ti tokens.Plugin, func (_m *EventManager) TokensApproved(ti tokens.Plugin, approval *tokens.TokenApproval) error { ret := _m.Called(ti, approval) + if len(ret) == 0 { + panic("no return value specified for TokensApproved") + } + var r0 error if rf, ok := ret.Get(0).(func(tokens.Plugin, *tokens.TokenApproval) error); ok { r0 = rf(ti, approval) @@ -345,6 +477,10 @@ func (_m *EventManager) TokensApproved(ti tokens.Plugin, approval *tokens.TokenA func (_m *EventManager) TokensTransferred(ti tokens.Plugin, transfer *tokens.TokenTransfer) error { ret := _m.Called(ti, transfer) + if len(ret) == 0 { + panic("no return value specified for TokensTransferred") + } + var r0 error if rf, ok := ret.Get(0).(func(tokens.Plugin, *tokens.TokenTransfer) error); ok { r0 = rf(ti, transfer) diff --git a/mocks/eventsmocks/callbacks.go b/mocks/eventsmocks/callbacks.go index 9223ee394..a018cbb77 100644 --- a/mocks/eventsmocks/callbacks.go +++ b/mocks/eventsmocks/callbacks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package eventsmocks @@ -28,6 +28,10 @@ func (_m *Callbacks) DeliveryResponse(connID string, inflight *core.EventDeliver func (_m *Callbacks) EphemeralSubscription(connID string, namespace string, filter *core.SubscriptionFilter, options *core.SubscriptionOptions) error { ret := _m.Called(connID, namespace, filter, options) + if len(ret) == 0 { + panic("no return value specified for EphemeralSubscription") + } + var r0 error if rf, ok := ret.Get(0).(func(string, string, *core.SubscriptionFilter, *core.SubscriptionOptions) error); ok { r0 = rf(connID, namespace, filter, options) @@ -42,6 +46,10 @@ func (_m *Callbacks) EphemeralSubscription(connID string, namespace string, filt func (_m *Callbacks) RegisterConnection(connID string, matcher events.SubscriptionMatcher) error { ret := _m.Called(connID, matcher) + if len(ret) == 0 { + panic("no return value specified for RegisterConnection") + } + var r0 error if rf, ok := ret.Get(0).(func(string, events.SubscriptionMatcher) error); ok { r0 = rf(connID, matcher) diff --git a/mocks/eventsmocks/plugin.go b/mocks/eventsmocks/plugin.go index 5bc34a37e..72b9b9057 100644 --- a/mocks/eventsmocks/plugin.go +++ b/mocks/eventsmocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package eventsmocks @@ -25,6 +25,10 @@ type Plugin struct { func (_m *Plugin) BatchDeliveryRequest(ctx context.Context, connID string, sub *core.Subscription, _a3 []*core.CombinedEventDataDelivery) error { ret := _m.Called(ctx, connID, sub, _a3) + if len(ret) == 0 { + panic("no return value specified for BatchDeliveryRequest") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *core.Subscription, []*core.CombinedEventDataDelivery) error); ok { r0 = rf(ctx, connID, sub, _a3) @@ -39,6 +43,10 @@ func (_m *Plugin) BatchDeliveryRequest(ctx context.Context, connID string, sub * func (_m *Plugin) Capabilities() *events.Capabilities { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Capabilities") + } + var r0 *events.Capabilities if rf, ok := ret.Get(0).(func() *events.Capabilities); ok { r0 = rf() @@ -55,6 +63,10 @@ func (_m *Plugin) Capabilities() *events.Capabilities { func (_m *Plugin) DeliveryRequest(ctx context.Context, connID string, sub *core.Subscription, event *core.EventDelivery, data core.DataArray) error { ret := _m.Called(ctx, connID, sub, event, data) + if len(ret) == 0 { + panic("no return value specified for DeliveryRequest") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *core.Subscription, *core.EventDelivery, core.DataArray) error); ok { r0 = rf(ctx, connID, sub, event, data) @@ -69,6 +81,10 @@ func (_m *Plugin) DeliveryRequest(ctx context.Context, connID string, sub *core. func (_m *Plugin) Init(ctx context.Context, _a1 config.Section) error { ret := _m.Called(ctx, _a1) + if len(ret) == 0 { + panic("no return value specified for Init") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, config.Section) error); ok { r0 = rf(ctx, _a1) @@ -88,6 +104,10 @@ func (_m *Plugin) InitConfig(_a0 config.Section) { func (_m *Plugin) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -107,6 +127,10 @@ func (_m *Plugin) NamespaceRestarted(ns string, startTime time.Time) { func (_m *Plugin) SetHandler(namespace string, handler events.Callbacks) error { ret := _m.Called(namespace, handler) + if len(ret) == 0 { + panic("no return value specified for SetHandler") + } + var r0 error if rf, ok := ret.Get(0).(func(string, events.Callbacks) error); ok { r0 = rf(namespace, handler) @@ -121,6 +145,10 @@ func (_m *Plugin) SetHandler(namespace string, handler events.Callbacks) error { func (_m *Plugin) ValidateOptions(ctx context.Context, options *core.SubscriptionOptions) error { ret := _m.Called(ctx, options) + if len(ret) == 0 { + panic("no return value specified for ValidateOptions") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.SubscriptionOptions) error); ok { r0 = rf(ctx, options) diff --git a/mocks/identitymanagermocks/manager.go b/mocks/identitymanagermocks/manager.go index 7e573cca2..6a0ed097d 100644 --- a/mocks/identitymanagermocks/manager.go +++ b/mocks/identitymanagermocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package identitymanagermocks @@ -23,6 +23,10 @@ type Manager struct { func (_m *Manager) CachedIdentityLookupByID(ctx context.Context, id *fftypes.UUID) (*core.Identity, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for CachedIdentityLookupByID") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) (*core.Identity, error)); ok { @@ -49,6 +53,10 @@ func (_m *Manager) CachedIdentityLookupByID(ctx context.Context, id *fftypes.UUI func (_m *Manager) CachedIdentityLookupMustExist(ctx context.Context, did string) (*core.Identity, bool, error) { ret := _m.Called(ctx, did) + if len(ret) == 0 { + panic("no return value specified for CachedIdentityLookupMustExist") + } + var r0 *core.Identity var r1 bool var r2 error @@ -82,6 +90,10 @@ func (_m *Manager) CachedIdentityLookupMustExist(ctx context.Context, did string func (_m *Manager) CachedIdentityLookupNilOK(ctx context.Context, did string) (*core.Identity, bool, error) { ret := _m.Called(ctx, did) + if len(ret) == 0 { + panic("no return value specified for CachedIdentityLookupNilOK") + } + var r0 *core.Identity var r1 bool var r2 error @@ -115,6 +127,10 @@ func (_m *Manager) CachedIdentityLookupNilOK(ctx context.Context, did string) (* func (_m *Manager) FindIdentityForVerifier(ctx context.Context, iTypes []fftypes.FFEnum, verifier *core.VerifierRef) (*core.Identity, error) { ret := _m.Called(ctx, iTypes, verifier) + if len(ret) == 0 { + panic("no return value specified for FindIdentityForVerifier") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, []fftypes.FFEnum, *core.VerifierRef) (*core.Identity, error)); ok { @@ -141,6 +157,10 @@ func (_m *Manager) FindIdentityForVerifier(ctx context.Context, iTypes []fftypes func (_m *Manager) GetLocalNode(ctx context.Context) (*core.Identity, error) { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for GetLocalNode") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context) (*core.Identity, error)); ok { @@ -167,6 +187,10 @@ func (_m *Manager) GetLocalNode(ctx context.Context) (*core.Identity, error) { func (_m *Manager) GetRootOrg(ctx context.Context) (*core.Identity, error) { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for GetRootOrg") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context) (*core.Identity, error)); ok { @@ -193,6 +217,10 @@ func (_m *Manager) GetRootOrg(ctx context.Context) (*core.Identity, error) { func (_m *Manager) GetRootOrgDID(ctx context.Context) (string, error) { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for GetRootOrgDID") + } + var r0 string var r1 error if rf, ok := ret.Get(0).(func(context.Context) (string, error)); ok { @@ -217,6 +245,10 @@ func (_m *Manager) GetRootOrgDID(ctx context.Context) (string, error) { func (_m *Manager) ResolveIdentitySigner(ctx context.Context, _a1 *core.Identity) (*core.SignerRef, error) { ret := _m.Called(ctx, _a1) + if len(ret) == 0 { + panic("no return value specified for ResolveIdentitySigner") + } + var r0 *core.SignerRef var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Identity) (*core.SignerRef, error)); ok { @@ -243,6 +275,10 @@ func (_m *Manager) ResolveIdentitySigner(ctx context.Context, _a1 *core.Identity func (_m *Manager) ResolveInputSigningIdentity(ctx context.Context, signerRef *core.SignerRef) error { ret := _m.Called(ctx, signerRef) + if len(ret) == 0 { + panic("no return value specified for ResolveInputSigningIdentity") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.SignerRef) error); ok { r0 = rf(ctx, signerRef) @@ -257,6 +293,10 @@ func (_m *Manager) ResolveInputSigningIdentity(ctx context.Context, signerRef *c func (_m *Manager) ResolveInputSigningKey(ctx context.Context, inputKey string, keyNormalizationMode int) (string, error) { ret := _m.Called(ctx, inputKey, keyNormalizationMode) + if len(ret) == 0 { + panic("no return value specified for ResolveInputSigningKey") + } + var r0 string var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, int) (string, error)); ok { @@ -281,6 +321,10 @@ func (_m *Manager) ResolveInputSigningKey(ctx context.Context, inputKey string, func (_m *Manager) ResolveInputVerifierRef(ctx context.Context, inputKey *core.VerifierRef, intent blockchain.ResolveKeyIntent) (*core.VerifierRef, error) { ret := _m.Called(ctx, inputKey, intent) + if len(ret) == 0 { + panic("no return value specified for ResolveInputVerifierRef") + } + var r0 *core.VerifierRef var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.VerifierRef, blockchain.ResolveKeyIntent) (*core.VerifierRef, error)); ok { @@ -307,6 +351,10 @@ func (_m *Manager) ResolveInputVerifierRef(ctx context.Context, inputKey *core.V func (_m *Manager) ResolveMultipartyRootVerifier(ctx context.Context) (*core.VerifierRef, error) { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for ResolveMultipartyRootVerifier") + } + var r0 *core.VerifierRef var r1 error if rf, ok := ret.Get(0).(func(context.Context) (*core.VerifierRef, error)); ok { @@ -333,6 +381,10 @@ func (_m *Manager) ResolveMultipartyRootVerifier(ctx context.Context) (*core.Ver func (_m *Manager) ResolveQuerySigningKey(ctx context.Context, inputKey string, keyNormalizationMode int) (string, error) { ret := _m.Called(ctx, inputKey, keyNormalizationMode) + if len(ret) == 0 { + panic("no return value specified for ResolveQuerySigningKey") + } + var r0 string var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, int) (string, error)); ok { @@ -357,6 +409,10 @@ func (_m *Manager) ResolveQuerySigningKey(ctx context.Context, inputKey string, func (_m *Manager) ValidateNodeOwner(ctx context.Context, node *core.Identity, _a2 *core.Identity) (bool, error) { ret := _m.Called(ctx, node, _a2) + if len(ret) == 0 { + panic("no return value specified for ValidateNodeOwner") + } + var r0 bool var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Identity, *core.Identity) (bool, error)); ok { @@ -381,6 +437,10 @@ func (_m *Manager) ValidateNodeOwner(ctx context.Context, node *core.Identity, _ func (_m *Manager) VerifyIdentityChain(ctx context.Context, _a1 *core.Identity) (*core.Identity, bool, error) { ret := _m.Called(ctx, _a1) + if len(ret) == 0 { + panic("no return value specified for VerifyIdentityChain") + } + var r0 *core.Identity var r1 bool var r2 error diff --git a/mocks/identitymocks/callbacks.go b/mocks/identitymocks/callbacks.go index 1c41342ab..d3445fa43 100644 --- a/mocks/identitymocks/callbacks.go +++ b/mocks/identitymocks/callbacks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package identitymocks diff --git a/mocks/identitymocks/plugin.go b/mocks/identitymocks/plugin.go index cb022730b..0d2c8e6b6 100644 --- a/mocks/identitymocks/plugin.go +++ b/mocks/identitymocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package identitymocks @@ -21,6 +21,10 @@ type Plugin struct { func (_m *Plugin) Capabilities() *identity.Capabilities { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Capabilities") + } + var r0 *identity.Capabilities if rf, ok := ret.Get(0).(func() *identity.Capabilities); ok { r0 = rf() @@ -37,6 +41,10 @@ func (_m *Plugin) Capabilities() *identity.Capabilities { func (_m *Plugin) Init(ctx context.Context, _a1 config.Section) error { ret := _m.Called(ctx, _a1) + if len(ret) == 0 { + panic("no return value specified for Init") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, config.Section) error); ok { r0 = rf(ctx, _a1) @@ -56,6 +64,10 @@ func (_m *Plugin) InitConfig(_a0 config.Section) { func (_m *Plugin) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -75,6 +87,10 @@ func (_m *Plugin) SetHandler(namespace string, handler identity.Callbacks) { func (_m *Plugin) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() diff --git a/mocks/metricsmocks/manager.go b/mocks/metricsmocks/manager.go index d7ab0d295..9e59f8fd4 100644 --- a/mocks/metricsmocks/manager.go +++ b/mocks/metricsmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package metricsmocks @@ -55,6 +55,10 @@ func (_m *Manager) DeleteTime(id string) { func (_m *Manager) GetTime(id string) time.Time { ret := _m.Called(id) + if len(ret) == 0 { + panic("no return value specified for GetTime") + } + var r0 time.Time if rf, ok := ret.Get(0).(func(string) time.Time); ok { r0 = rf(id) @@ -69,6 +73,10 @@ func (_m *Manager) GetTime(id string) time.Time { func (_m *Manager) IsMetricsEnabled() bool { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for IsMetricsEnabled") + } + var r0 bool if rf, ok := ret.Get(0).(func() bool); ok { r0 = rf() diff --git a/mocks/multipartymocks/manager.go b/mocks/multipartymocks/manager.go index b5a072978..c968b0bd1 100644 --- a/mocks/multipartymocks/manager.go +++ b/mocks/multipartymocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package multipartymocks @@ -25,6 +25,10 @@ type Manager struct { func (_m *Manager) ConfigureContract(ctx context.Context) error { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for ConfigureContract") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context) error); ok { r0 = rf(ctx) @@ -39,6 +43,10 @@ func (_m *Manager) ConfigureContract(ctx context.Context) error { func (_m *Manager) GetNetworkVersion() int { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for GetNetworkVersion") + } + var r0 int if rf, ok := ret.Get(0).(func() int); ok { r0 = rf() @@ -53,6 +61,10 @@ func (_m *Manager) GetNetworkVersion() int { func (_m *Manager) LocalNode() multiparty.LocalNode { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for LocalNode") + } + var r0 multiparty.LocalNode if rf, ok := ret.Get(0).(func() multiparty.LocalNode); ok { r0 = rf() @@ -67,6 +79,10 @@ func (_m *Manager) LocalNode() multiparty.LocalNode { func (_m *Manager) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -81,6 +97,10 @@ func (_m *Manager) Name() string { func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*core.PreparedOperation, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for PrepareOperation") + } + var r0 *core.PreparedOperation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Operation) (*core.PreparedOperation, error)); ok { @@ -107,6 +127,10 @@ func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*c func (_m *Manager) RootOrg() multiparty.RootOrg { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for RootOrg") + } + var r0 multiparty.RootOrg if rf, ok := ret.Get(0).(func() multiparty.RootOrg); ok { r0 = rf() @@ -121,6 +145,10 @@ func (_m *Manager) RootOrg() multiparty.RootOrg { func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation) (fftypes.JSONObject, core.OpPhase, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for RunOperation") + } + var r0 fftypes.JSONObject var r1 core.OpPhase var r2 error @@ -154,6 +182,10 @@ func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation) func (_m *Manager) SubmitBatchPin(ctx context.Context, batch *core.BatchPersisted, contexts []*fftypes.Bytes32, payloadRef string, idempotentSubmit bool) error { ret := _m.Called(ctx, batch, contexts, payloadRef, idempotentSubmit) + if len(ret) == 0 { + panic("no return value specified for SubmitBatchPin") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.BatchPersisted, []*fftypes.Bytes32, string, bool) error); ok { r0 = rf(ctx, batch, contexts, payloadRef, idempotentSubmit) @@ -168,6 +200,10 @@ func (_m *Manager) SubmitBatchPin(ctx context.Context, batch *core.BatchPersiste func (_m *Manager) SubmitNetworkAction(ctx context.Context, signingKey string, action *core.NetworkAction, idempotentSubmit bool) error { ret := _m.Called(ctx, signingKey, action, idempotentSubmit) + if len(ret) == 0 { + panic("no return value specified for SubmitNetworkAction") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *core.NetworkAction, bool) error); ok { r0 = rf(ctx, signingKey, action, idempotentSubmit) @@ -182,6 +218,10 @@ func (_m *Manager) SubmitNetworkAction(ctx context.Context, signingKey string, a func (_m *Manager) TerminateContract(ctx context.Context, location *fftypes.JSONAny, termination *blockchain.Event) error { ret := _m.Called(ctx, location, termination) + if len(ret) == 0 { + panic("no return value specified for TerminateContract") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.JSONAny, *blockchain.Event) error); ok { r0 = rf(ctx, location, termination) diff --git a/mocks/namespacemocks/manager.go b/mocks/namespacemocks/manager.go index f9d7e9414..b28d3e587 100644 --- a/mocks/namespacemocks/manager.go +++ b/mocks/namespacemocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package namespacemocks @@ -24,6 +24,10 @@ type Manager struct { func (_m *Manager) Authorize(ctx context.Context, authReq *fftypes.AuthReq) error { ret := _m.Called(ctx, authReq) + if len(ret) == 0 { + panic("no return value specified for Authorize") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.AuthReq) error); ok { r0 = rf(ctx, authReq) @@ -38,6 +42,10 @@ func (_m *Manager) Authorize(ctx context.Context, authReq *fftypes.AuthReq) erro func (_m *Manager) GetNamespaces(ctx context.Context, includeInitializing bool) ([]*core.NamespaceWithInitStatus, error) { ret := _m.Called(ctx, includeInitializing) + if len(ret) == 0 { + panic("no return value specified for GetNamespaces") + } + var r0 []*core.NamespaceWithInitStatus var r1 error if rf, ok := ret.Get(0).(func(context.Context, bool) ([]*core.NamespaceWithInitStatus, error)); ok { @@ -64,6 +72,10 @@ func (_m *Manager) GetNamespaces(ctx context.Context, includeInitializing bool) func (_m *Manager) GetOperationByNamespacedID(ctx context.Context, nsOpID string) (*core.Operation, error) { ret := _m.Called(ctx, nsOpID) + if len(ret) == 0 { + panic("no return value specified for GetOperationByNamespacedID") + } + var r0 *core.Operation var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Operation, error)); ok { @@ -90,6 +102,10 @@ func (_m *Manager) GetOperationByNamespacedID(ctx context.Context, nsOpID string func (_m *Manager) Init(ctx context.Context, cancelCtx context.CancelFunc, reset chan bool, reloadConfig func() error) error { ret := _m.Called(ctx, cancelCtx, reset, reloadConfig) + if len(ret) == 0 { + panic("no return value specified for Init") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, context.CancelFunc, chan bool, func() error) error); ok { r0 = rf(ctx, cancelCtx, reset, reloadConfig) @@ -104,6 +120,10 @@ func (_m *Manager) Init(ctx context.Context, cancelCtx context.CancelFunc, reset func (_m *Manager) MustOrchestrator(ns string) orchestrator.Orchestrator { ret := _m.Called(ns) + if len(ret) == 0 { + panic("no return value specified for MustOrchestrator") + } + var r0 orchestrator.Orchestrator if rf, ok := ret.Get(0).(func(string) orchestrator.Orchestrator); ok { r0 = rf(ns) @@ -120,6 +140,10 @@ func (_m *Manager) MustOrchestrator(ns string) orchestrator.Orchestrator { func (_m *Manager) Orchestrator(ctx context.Context, ns string, includeInitializing bool) (orchestrator.Orchestrator, error) { ret := _m.Called(ctx, ns, includeInitializing) + if len(ret) == 0 { + panic("no return value specified for Orchestrator") + } + var r0 orchestrator.Orchestrator var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, bool) (orchestrator.Orchestrator, error)); ok { @@ -146,6 +170,10 @@ func (_m *Manager) Orchestrator(ctx context.Context, ns string, includeInitializ func (_m *Manager) Reset(ctx context.Context) error { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for Reset") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context) error); ok { r0 = rf(ctx) @@ -160,6 +188,10 @@ func (_m *Manager) Reset(ctx context.Context) error { func (_m *Manager) ResolveOperationByNamespacedID(ctx context.Context, nsOpID string, op *core.OperationUpdateDTO) error { ret := _m.Called(ctx, nsOpID, op) + if len(ret) == 0 { + panic("no return value specified for ResolveOperationByNamespacedID") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, *core.OperationUpdateDTO) error); ok { r0 = rf(ctx, nsOpID, op) @@ -174,6 +206,10 @@ func (_m *Manager) ResolveOperationByNamespacedID(ctx context.Context, nsOpID st func (_m *Manager) SPIEvents() spievents.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for SPIEvents") + } + var r0 spievents.Manager if rf, ok := ret.Get(0).(func() spievents.Manager); ok { r0 = rf() @@ -190,6 +226,10 @@ func (_m *Manager) SPIEvents() spievents.Manager { func (_m *Manager) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() diff --git a/mocks/networkmapmocks/manager.go b/mocks/networkmapmocks/manager.go index 39a205c09..178021acc 100644 --- a/mocks/networkmapmocks/manager.go +++ b/mocks/networkmapmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package networkmapmocks @@ -22,6 +22,10 @@ type Manager struct { func (_m *Manager) GetDIDDocForIndentityByDID(ctx context.Context, did string) (*networkmap.DIDDocument, error) { ret := _m.Called(ctx, did) + if len(ret) == 0 { + panic("no return value specified for GetDIDDocForIndentityByDID") + } + var r0 *networkmap.DIDDocument var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*networkmap.DIDDocument, error)); ok { @@ -48,6 +52,10 @@ func (_m *Manager) GetDIDDocForIndentityByDID(ctx context.Context, did string) ( func (_m *Manager) GetDIDDocForIndentityByID(ctx context.Context, id string) (*networkmap.DIDDocument, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetDIDDocForIndentityByID") + } + var r0 *networkmap.DIDDocument var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*networkmap.DIDDocument, error)); ok { @@ -74,6 +82,10 @@ func (_m *Manager) GetDIDDocForIndentityByID(ctx context.Context, id string) (*n func (_m *Manager) GetIdentities(ctx context.Context, filter ffapi.AndFilter) ([]*core.Identity, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetIdentities") + } + var r0 []*core.Identity var r1 *ffapi.FilterResult var r2 error @@ -109,6 +121,10 @@ func (_m *Manager) GetIdentities(ctx context.Context, filter ffapi.AndFilter) ([ func (_m *Manager) GetIdentitiesWithVerifiers(ctx context.Context, filter ffapi.AndFilter) ([]*core.IdentityWithVerifiers, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetIdentitiesWithVerifiers") + } + var r0 []*core.IdentityWithVerifiers var r1 *ffapi.FilterResult var r2 error @@ -144,6 +160,10 @@ func (_m *Manager) GetIdentitiesWithVerifiers(ctx context.Context, filter ffapi. func (_m *Manager) GetIdentityByDID(ctx context.Context, did string) (*core.Identity, error) { ret := _m.Called(ctx, did) + if len(ret) == 0 { + panic("no return value specified for GetIdentityByDID") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Identity, error)); ok { @@ -170,6 +190,10 @@ func (_m *Manager) GetIdentityByDID(ctx context.Context, did string) (*core.Iden func (_m *Manager) GetIdentityByDIDWithVerifiers(ctx context.Context, did string) (*core.IdentityWithVerifiers, error) { ret := _m.Called(ctx, did) + if len(ret) == 0 { + panic("no return value specified for GetIdentityByDIDWithVerifiers") + } + var r0 *core.IdentityWithVerifiers var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.IdentityWithVerifiers, error)); ok { @@ -196,6 +220,10 @@ func (_m *Manager) GetIdentityByDIDWithVerifiers(ctx context.Context, did string func (_m *Manager) GetIdentityByID(ctx context.Context, id string) (*core.Identity, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetIdentityByID") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Identity, error)); ok { @@ -222,6 +250,10 @@ func (_m *Manager) GetIdentityByID(ctx context.Context, id string) (*core.Identi func (_m *Manager) GetIdentityByIDWithVerifiers(ctx context.Context, id string) (*core.IdentityWithVerifiers, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetIdentityByIDWithVerifiers") + } + var r0 *core.IdentityWithVerifiers var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.IdentityWithVerifiers, error)); ok { @@ -248,6 +280,10 @@ func (_m *Manager) GetIdentityByIDWithVerifiers(ctx context.Context, id string) func (_m *Manager) GetIdentityVerifiers(ctx context.Context, id string, filter ffapi.AndFilter) ([]*core.Verifier, *ffapi.FilterResult, error) { ret := _m.Called(ctx, id, filter) + if len(ret) == 0 { + panic("no return value specified for GetIdentityVerifiers") + } + var r0 []*core.Verifier var r1 *ffapi.FilterResult var r2 error @@ -283,6 +319,10 @@ func (_m *Manager) GetIdentityVerifiers(ctx context.Context, id string, filter f func (_m *Manager) GetNodeByNameOrID(ctx context.Context, nameOrID string) (*core.Identity, error) { ret := _m.Called(ctx, nameOrID) + if len(ret) == 0 { + panic("no return value specified for GetNodeByNameOrID") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Identity, error)); ok { @@ -309,6 +349,10 @@ func (_m *Manager) GetNodeByNameOrID(ctx context.Context, nameOrID string) (*cor func (_m *Manager) GetNodes(ctx context.Context, filter ffapi.AndFilter) ([]*core.Identity, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetNodes") + } + var r0 []*core.Identity var r1 *ffapi.FilterResult var r2 error @@ -344,6 +388,10 @@ func (_m *Manager) GetNodes(ctx context.Context, filter ffapi.AndFilter) ([]*cor func (_m *Manager) GetOrganizationByNameOrID(ctx context.Context, nameOrID string) (*core.Identity, error) { ret := _m.Called(ctx, nameOrID) + if len(ret) == 0 { + panic("no return value specified for GetOrganizationByNameOrID") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Identity, error)); ok { @@ -370,6 +418,10 @@ func (_m *Manager) GetOrganizationByNameOrID(ctx context.Context, nameOrID strin func (_m *Manager) GetOrganizations(ctx context.Context, filter ffapi.AndFilter) ([]*core.Identity, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetOrganizations") + } + var r0 []*core.Identity var r1 *ffapi.FilterResult var r2 error @@ -405,6 +457,10 @@ func (_m *Manager) GetOrganizations(ctx context.Context, filter ffapi.AndFilter) func (_m *Manager) GetOrganizationsWithVerifiers(ctx context.Context, filter ffapi.AndFilter) ([]*core.IdentityWithVerifiers, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetOrganizationsWithVerifiers") + } + var r0 []*core.IdentityWithVerifiers var r1 *ffapi.FilterResult var r2 error @@ -440,6 +496,10 @@ func (_m *Manager) GetOrganizationsWithVerifiers(ctx context.Context, filter ffa func (_m *Manager) GetVerifierByHash(ctx context.Context, hash string) (*core.Verifier, error) { ret := _m.Called(ctx, hash) + if len(ret) == 0 { + panic("no return value specified for GetVerifierByHash") + } + var r0 *core.Verifier var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Verifier, error)); ok { @@ -466,6 +526,10 @@ func (_m *Manager) GetVerifierByHash(ctx context.Context, hash string) (*core.Ve func (_m *Manager) GetVerifiers(ctx context.Context, filter ffapi.AndFilter) ([]*core.Verifier, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetVerifiers") + } + var r0 []*core.Verifier var r1 *ffapi.FilterResult var r2 error @@ -501,6 +565,10 @@ func (_m *Manager) GetVerifiers(ctx context.Context, filter ffapi.AndFilter) ([] func (_m *Manager) RegisterIdentity(ctx context.Context, dto *core.IdentityCreateDTO, waitConfirm bool) (*core.Identity, error) { ret := _m.Called(ctx, dto, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for RegisterIdentity") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.IdentityCreateDTO, bool) (*core.Identity, error)); ok { @@ -527,6 +595,10 @@ func (_m *Manager) RegisterIdentity(ctx context.Context, dto *core.IdentityCreat func (_m *Manager) RegisterNode(ctx context.Context, waitConfirm bool) (*core.Identity, error) { ret := _m.Called(ctx, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for RegisterNode") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, bool) (*core.Identity, error)); ok { @@ -553,6 +625,10 @@ func (_m *Manager) RegisterNode(ctx context.Context, waitConfirm bool) (*core.Id func (_m *Manager) RegisterNodeOrganization(ctx context.Context, waitConfirm bool) (*core.Identity, error) { ret := _m.Called(ctx, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for RegisterNodeOrganization") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, bool) (*core.Identity, error)); ok { @@ -579,6 +655,10 @@ func (_m *Manager) RegisterNodeOrganization(ctx context.Context, waitConfirm boo func (_m *Manager) RegisterOrganization(ctx context.Context, org *core.IdentityCreateDTO, waitConfirm bool) (*core.Identity, error) { ret := _m.Called(ctx, org, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for RegisterOrganization") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.IdentityCreateDTO, bool) (*core.Identity, error)); ok { @@ -605,6 +685,10 @@ func (_m *Manager) RegisterOrganization(ctx context.Context, org *core.IdentityC func (_m *Manager) UpdateIdentity(ctx context.Context, id string, dto *core.IdentityUpdateDTO, waitConfirm bool) (*core.Identity, error) { ret := _m.Called(ctx, id, dto, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for UpdateIdentity") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *core.IdentityUpdateDTO, bool) (*core.Identity, error)); ok { diff --git a/mocks/operationmocks/manager.go b/mocks/operationmocks/manager.go index 65963faba..7035ec6b9 100644 --- a/mocks/operationmocks/manager.go +++ b/mocks/operationmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package operationmocks @@ -31,6 +31,10 @@ func (_m *Manager) AddOrReuseOperation(ctx context.Context, op *core.Operation, _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for AddOrReuseOperation") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Operation, ...database.PostCompletionHook) error); ok { r0 = rf(ctx, op, hooks...) @@ -52,6 +56,10 @@ func (_m *Manager) BulkInsertOperations(ctx context.Context, ops ...*core.Operat _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for BulkInsertOperations") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, ...*core.Operation) error); ok { r0 = rf(ctx, ops...) @@ -66,6 +74,10 @@ func (_m *Manager) BulkInsertOperations(ctx context.Context, ops ...*core.Operat func (_m *Manager) GetOperationByIDCached(ctx context.Context, opID *fftypes.UUID) (*core.Operation, error) { ret := _m.Called(ctx, opID) + if len(ret) == 0 { + panic("no return value specified for GetOperationByIDCached") + } + var r0 *core.Operation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) (*core.Operation, error)); ok { @@ -92,6 +104,10 @@ func (_m *Manager) GetOperationByIDCached(ctx context.Context, opID *fftypes.UUI func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*core.PreparedOperation, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for PrepareOperation") + } + var r0 *core.PreparedOperation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Operation) (*core.PreparedOperation, error)); ok { @@ -123,6 +139,10 @@ func (_m *Manager) RegisterHandler(ctx context.Context, handler operations.Opera func (_m *Manager) ResolveOperationByID(ctx context.Context, opID *fftypes.UUID, op *core.OperationUpdateDTO) error { ret := _m.Called(ctx, opID, op) + if len(ret) == 0 { + panic("no return value specified for ResolveOperationByID") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, *core.OperationUpdateDTO) error); ok { r0 = rf(ctx, opID, op) @@ -137,6 +157,10 @@ func (_m *Manager) ResolveOperationByID(ctx context.Context, opID *fftypes.UUID, func (_m *Manager) ResubmitOperations(ctx context.Context, txID *fftypes.UUID) (int, []*core.Operation, error) { ret := _m.Called(ctx, txID) + if len(ret) == 0 { + panic("no return value specified for ResubmitOperations") + } + var r0 int var r1 []*core.Operation var r2 error @@ -170,6 +194,10 @@ func (_m *Manager) ResubmitOperations(ctx context.Context, txID *fftypes.UUID) ( func (_m *Manager) RetryOperation(ctx context.Context, opID *fftypes.UUID) (*core.Operation, error) { ret := _m.Called(ctx, opID) + if len(ret) == 0 { + panic("no return value specified for RetryOperation") + } + var r0 *core.Operation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) (*core.Operation, error)); ok { @@ -196,6 +224,10 @@ func (_m *Manager) RetryOperation(ctx context.Context, opID *fftypes.UUID) (*cor func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation, idempotentSubmit bool) (fftypes.JSONObject, error) { ret := _m.Called(ctx, op, idempotentSubmit) + if len(ret) == 0 { + panic("no return value specified for RunOperation") + } + var r0 fftypes.JSONObject var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.PreparedOperation, bool) (fftypes.JSONObject, error)); ok { @@ -222,6 +254,10 @@ func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation, func (_m *Manager) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() diff --git a/mocks/orchestratormocks/orchestrator.go b/mocks/orchestratormocks/orchestrator.go index f9589bbc4..1ece33919 100644 --- a/mocks/orchestratormocks/orchestrator.go +++ b/mocks/orchestratormocks/orchestrator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package orchestratormocks @@ -48,6 +48,10 @@ type Orchestrator struct { func (_m *Orchestrator) Assets() assets.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Assets") + } + var r0 assets.Manager if rf, ok := ret.Get(0).(func() assets.Manager); ok { r0 = rf() @@ -64,6 +68,10 @@ func (_m *Orchestrator) Assets() assets.Manager { func (_m *Orchestrator) Authorize(ctx context.Context, authReq *fftypes.AuthReq) error { ret := _m.Called(ctx, authReq) + if len(ret) == 0 { + panic("no return value specified for Authorize") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.AuthReq) error); ok { r0 = rf(ctx, authReq) @@ -78,6 +86,10 @@ func (_m *Orchestrator) Authorize(ctx context.Context, authReq *fftypes.AuthReq) func (_m *Orchestrator) BatchManager() batch.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for BatchManager") + } + var r0 batch.Manager if rf, ok := ret.Get(0).(func() batch.Manager); ok { r0 = rf() @@ -94,6 +106,10 @@ func (_m *Orchestrator) BatchManager() batch.Manager { func (_m *Orchestrator) Broadcast() broadcast.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Broadcast") + } + var r0 broadcast.Manager if rf, ok := ret.Get(0).(func() broadcast.Manager); ok { r0 = rf() @@ -110,6 +126,10 @@ func (_m *Orchestrator) Broadcast() broadcast.Manager { func (_m *Orchestrator) Contracts() contracts.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Contracts") + } + var r0 contracts.Manager if rf, ok := ret.Get(0).(func() contracts.Manager); ok { r0 = rf() @@ -126,6 +146,10 @@ func (_m *Orchestrator) Contracts() contracts.Manager { func (_m *Orchestrator) CreateSubscription(ctx context.Context, subDef *core.Subscription) (*core.Subscription, error) { ret := _m.Called(ctx, subDef) + if len(ret) == 0 { + panic("no return value specified for CreateSubscription") + } + var r0 *core.Subscription var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Subscription) (*core.Subscription, error)); ok { @@ -152,6 +176,10 @@ func (_m *Orchestrator) CreateSubscription(ctx context.Context, subDef *core.Sub func (_m *Orchestrator) CreateUpdateSubscription(ctx context.Context, subDef *core.Subscription) (*core.Subscription, error) { ret := _m.Called(ctx, subDef) + if len(ret) == 0 { + panic("no return value specified for CreateUpdateSubscription") + } + var r0 *core.Subscription var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Subscription) (*core.Subscription, error)); ok { @@ -178,6 +206,10 @@ func (_m *Orchestrator) CreateUpdateSubscription(ctx context.Context, subDef *co func (_m *Orchestrator) Data() data.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Data") + } + var r0 data.Manager if rf, ok := ret.Get(0).(func() data.Manager); ok { r0 = rf() @@ -194,6 +226,10 @@ func (_m *Orchestrator) Data() data.Manager { func (_m *Orchestrator) DefinitionSender() definitions.Sender { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for DefinitionSender") + } + var r0 definitions.Sender if rf, ok := ret.Get(0).(func() definitions.Sender); ok { r0 = rf() @@ -210,6 +246,10 @@ func (_m *Orchestrator) DefinitionSender() definitions.Sender { func (_m *Orchestrator) DeleteSubscription(ctx context.Context, id string) error { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for DeleteSubscription") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { r0 = rf(ctx, id) @@ -224,6 +264,10 @@ func (_m *Orchestrator) DeleteSubscription(ctx context.Context, id string) error func (_m *Orchestrator) Events() events.EventManager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Events") + } + var r0 events.EventManager if rf, ok := ret.Get(0).(func() events.EventManager); ok { r0 = rf() @@ -240,6 +284,10 @@ func (_m *Orchestrator) Events() events.EventManager { func (_m *Orchestrator) GetBatchByID(ctx context.Context, id string) (*core.BatchPersisted, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetBatchByID") + } + var r0 *core.BatchPersisted var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.BatchPersisted, error)); ok { @@ -266,6 +314,10 @@ func (_m *Orchestrator) GetBatchByID(ctx context.Context, id string) (*core.Batc func (_m *Orchestrator) GetBatches(ctx context.Context, filter ffapi.AndFilter) ([]*core.BatchPersisted, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetBatches") + } + var r0 []*core.BatchPersisted var r1 *ffapi.FilterResult var r2 error @@ -301,6 +353,10 @@ func (_m *Orchestrator) GetBatches(ctx context.Context, filter ffapi.AndFilter) func (_m *Orchestrator) GetBlockchainEventByID(ctx context.Context, id string) (*core.BlockchainEvent, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetBlockchainEventByID") + } + var r0 *core.BlockchainEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.BlockchainEvent, error)); ok { @@ -327,6 +383,10 @@ func (_m *Orchestrator) GetBlockchainEventByID(ctx context.Context, id string) ( func (_m *Orchestrator) GetBlockchainEvents(ctx context.Context, filter ffapi.AndFilter) ([]*core.BlockchainEvent, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetBlockchainEvents") + } + var r0 []*core.BlockchainEvent var r1 *ffapi.FilterResult var r2 error @@ -362,6 +422,10 @@ func (_m *Orchestrator) GetBlockchainEvents(ctx context.Context, filter ffapi.An func (_m *Orchestrator) GetChartHistogram(ctx context.Context, startTime int64, endTime int64, buckets int64, tableName database.CollectionName) ([]*core.ChartHistogram, error) { ret := _m.Called(ctx, startTime, endTime, buckets, tableName) + if len(ret) == 0 { + panic("no return value specified for GetChartHistogram") + } + var r0 []*core.ChartHistogram var r1 error if rf, ok := ret.Get(0).(func(context.Context, int64, int64, int64, database.CollectionName) ([]*core.ChartHistogram, error)); ok { @@ -388,6 +452,10 @@ func (_m *Orchestrator) GetChartHistogram(ctx context.Context, startTime int64, func (_m *Orchestrator) GetData(ctx context.Context, filter ffapi.AndFilter) (core.DataArray, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetData") + } + var r0 core.DataArray var r1 *ffapi.FilterResult var r2 error @@ -423,6 +491,10 @@ func (_m *Orchestrator) GetData(ctx context.Context, filter ffapi.AndFilter) (co func (_m *Orchestrator) GetDataByID(ctx context.Context, id string) (*core.Data, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetDataByID") + } + var r0 *core.Data var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Data, error)); ok { @@ -449,6 +521,10 @@ func (_m *Orchestrator) GetDataByID(ctx context.Context, id string) (*core.Data, func (_m *Orchestrator) GetDataSubPaths(ctx context.Context, path string) ([]string, error) { ret := _m.Called(ctx, path) + if len(ret) == 0 { + panic("no return value specified for GetDataSubPaths") + } + var r0 []string var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) ([]string, error)); ok { @@ -475,6 +551,10 @@ func (_m *Orchestrator) GetDataSubPaths(ctx context.Context, path string) ([]str func (_m *Orchestrator) GetDatatypeByID(ctx context.Context, id string) (*core.Datatype, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetDatatypeByID") + } + var r0 *core.Datatype var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Datatype, error)); ok { @@ -501,6 +581,10 @@ func (_m *Orchestrator) GetDatatypeByID(ctx context.Context, id string) (*core.D func (_m *Orchestrator) GetDatatypeByName(ctx context.Context, name string, version string) (*core.Datatype, error) { ret := _m.Called(ctx, name, version) + if len(ret) == 0 { + panic("no return value specified for GetDatatypeByName") + } + var r0 *core.Datatype var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, string) (*core.Datatype, error)); ok { @@ -527,6 +611,10 @@ func (_m *Orchestrator) GetDatatypeByName(ctx context.Context, name string, vers func (_m *Orchestrator) GetDatatypes(ctx context.Context, filter ffapi.AndFilter) ([]*core.Datatype, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetDatatypes") + } + var r0 []*core.Datatype var r1 *ffapi.FilterResult var r2 error @@ -562,6 +650,10 @@ func (_m *Orchestrator) GetDatatypes(ctx context.Context, filter ffapi.AndFilter func (_m *Orchestrator) GetEventByID(ctx context.Context, id string) (*core.Event, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetEventByID") + } + var r0 *core.Event var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Event, error)); ok { @@ -588,6 +680,10 @@ func (_m *Orchestrator) GetEventByID(ctx context.Context, id string) (*core.Even func (_m *Orchestrator) GetEventByIDWithReference(ctx context.Context, id string) (*core.EnrichedEvent, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetEventByIDWithReference") + } + var r0 *core.EnrichedEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.EnrichedEvent, error)); ok { @@ -614,6 +710,10 @@ func (_m *Orchestrator) GetEventByIDWithReference(ctx context.Context, id string func (_m *Orchestrator) GetEvents(ctx context.Context, filter ffapi.AndFilter) ([]*core.Event, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetEvents") + } + var r0 []*core.Event var r1 *ffapi.FilterResult var r2 error @@ -649,6 +749,10 @@ func (_m *Orchestrator) GetEvents(ctx context.Context, filter ffapi.AndFilter) ( func (_m *Orchestrator) GetEventsWithReferences(ctx context.Context, filter ffapi.AndFilter) ([]*core.EnrichedEvent, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetEventsWithReferences") + } + var r0 []*core.EnrichedEvent var r1 *ffapi.FilterResult var r2 error @@ -684,6 +788,10 @@ func (_m *Orchestrator) GetEventsWithReferences(ctx context.Context, filter ffap func (_m *Orchestrator) GetMessageByID(ctx context.Context, id string) (*core.Message, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetMessageByID") + } + var r0 *core.Message var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Message, error)); ok { @@ -710,6 +818,10 @@ func (_m *Orchestrator) GetMessageByID(ctx context.Context, id string) (*core.Me func (_m *Orchestrator) GetMessageByIDWithData(ctx context.Context, id string) (*core.MessageInOut, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetMessageByIDWithData") + } + var r0 *core.MessageInOut var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.MessageInOut, error)); ok { @@ -736,6 +848,10 @@ func (_m *Orchestrator) GetMessageByIDWithData(ctx context.Context, id string) ( func (_m *Orchestrator) GetMessageData(ctx context.Context, id string) (core.DataArray, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetMessageData") + } + var r0 core.DataArray var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (core.DataArray, error)); ok { @@ -762,6 +878,10 @@ func (_m *Orchestrator) GetMessageData(ctx context.Context, id string) (core.Dat func (_m *Orchestrator) GetMessageEvents(ctx context.Context, id string, filter ffapi.AndFilter) ([]*core.Event, *ffapi.FilterResult, error) { ret := _m.Called(ctx, id, filter) + if len(ret) == 0 { + panic("no return value specified for GetMessageEvents") + } + var r0 []*core.Event var r1 *ffapi.FilterResult var r2 error @@ -797,6 +917,10 @@ func (_m *Orchestrator) GetMessageEvents(ctx context.Context, id string, filter func (_m *Orchestrator) GetMessageTransaction(ctx context.Context, id string) (*core.Transaction, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetMessageTransaction") + } + var r0 *core.Transaction var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Transaction, error)); ok { @@ -823,6 +947,10 @@ func (_m *Orchestrator) GetMessageTransaction(ctx context.Context, id string) (* func (_m *Orchestrator) GetMessages(ctx context.Context, filter ffapi.AndFilter) ([]*core.Message, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetMessages") + } + var r0 []*core.Message var r1 *ffapi.FilterResult var r2 error @@ -858,6 +986,10 @@ func (_m *Orchestrator) GetMessages(ctx context.Context, filter ffapi.AndFilter) func (_m *Orchestrator) GetMessagesForData(ctx context.Context, dataID string, filter ffapi.AndFilter) ([]*core.Message, *ffapi.FilterResult, error) { ret := _m.Called(ctx, dataID, filter) + if len(ret) == 0 { + panic("no return value specified for GetMessagesForData") + } + var r0 []*core.Message var r1 *ffapi.FilterResult var r2 error @@ -893,6 +1025,10 @@ func (_m *Orchestrator) GetMessagesForData(ctx context.Context, dataID string, f func (_m *Orchestrator) GetMessagesWithData(ctx context.Context, filter ffapi.AndFilter) ([]*core.MessageInOut, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetMessagesWithData") + } + var r0 []*core.MessageInOut var r1 *ffapi.FilterResult var r2 error @@ -928,6 +1064,10 @@ func (_m *Orchestrator) GetMessagesWithData(ctx context.Context, filter ffapi.An func (_m *Orchestrator) GetNamespace(ctx context.Context) *core.Namespace { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for GetNamespace") + } + var r0 *core.Namespace if rf, ok := ret.Get(0).(func(context.Context) *core.Namespace); ok { r0 = rf(ctx) @@ -944,6 +1084,10 @@ func (_m *Orchestrator) GetNamespace(ctx context.Context) *core.Namespace { func (_m *Orchestrator) GetNextPins(ctx context.Context, filter ffapi.AndFilter) ([]*core.NextPin, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetNextPins") + } + var r0 []*core.NextPin var r1 *ffapi.FilterResult var r2 error @@ -979,6 +1123,10 @@ func (_m *Orchestrator) GetNextPins(ctx context.Context, filter ffapi.AndFilter) func (_m *Orchestrator) GetOperationByID(ctx context.Context, id string) (*core.Operation, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetOperationByID") + } + var r0 *core.Operation var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Operation, error)); ok { @@ -1005,6 +1153,10 @@ func (_m *Orchestrator) GetOperationByID(ctx context.Context, id string) (*core. func (_m *Orchestrator) GetOperationByIDWithStatus(ctx context.Context, id string) (*core.OperationWithDetail, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetOperationByIDWithStatus") + } + var r0 *core.OperationWithDetail var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.OperationWithDetail, error)); ok { @@ -1031,6 +1183,10 @@ func (_m *Orchestrator) GetOperationByIDWithStatus(ctx context.Context, id strin func (_m *Orchestrator) GetOperations(ctx context.Context, filter ffapi.AndFilter) ([]*core.Operation, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetOperations") + } + var r0 []*core.Operation var r1 *ffapi.FilterResult var r2 error @@ -1066,6 +1222,10 @@ func (_m *Orchestrator) GetOperations(ctx context.Context, filter ffapi.AndFilte func (_m *Orchestrator) GetPins(ctx context.Context, filter ffapi.AndFilter) ([]*core.Pin, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetPins") + } + var r0 []*core.Pin var r1 *ffapi.FilterResult var r2 error @@ -1101,6 +1261,10 @@ func (_m *Orchestrator) GetPins(ctx context.Context, filter ffapi.AndFilter) ([] func (_m *Orchestrator) GetStatus(ctx context.Context) (*core.NamespaceStatus, error) { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for GetStatus") + } + var r0 *core.NamespaceStatus var r1 error if rf, ok := ret.Get(0).(func(context.Context) (*core.NamespaceStatus, error)); ok { @@ -1127,6 +1291,10 @@ func (_m *Orchestrator) GetStatus(ctx context.Context) (*core.NamespaceStatus, e func (_m *Orchestrator) GetSubscriptionByID(ctx context.Context, id string) (*core.Subscription, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetSubscriptionByID") + } + var r0 *core.Subscription var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Subscription, error)); ok { @@ -1153,6 +1321,10 @@ func (_m *Orchestrator) GetSubscriptionByID(ctx context.Context, id string) (*co func (_m *Orchestrator) GetSubscriptionByIDWithStatus(ctx context.Context, id string) (*core.SubscriptionWithStatus, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetSubscriptionByIDWithStatus") + } + var r0 *core.SubscriptionWithStatus var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.SubscriptionWithStatus, error)); ok { @@ -1175,10 +1347,53 @@ func (_m *Orchestrator) GetSubscriptionByIDWithStatus(ctx context.Context, id st return r0, r1 } +// GetSubscriptionEventsHistorical provides a mock function with given fields: ctx, subscription, filter, startSequence, endSequence +func (_m *Orchestrator) GetSubscriptionEventsHistorical(ctx context.Context, subscription *core.Subscription, filter ffapi.AndFilter, startSequence int, endSequence int) ([]*core.EnrichedEvent, *ffapi.FilterResult, error) { + ret := _m.Called(ctx, subscription, filter, startSequence, endSequence) + + if len(ret) == 0 { + panic("no return value specified for GetSubscriptionEventsHistorical") + } + + var r0 []*core.EnrichedEvent + var r1 *ffapi.FilterResult + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, *core.Subscription, ffapi.AndFilter, int, int) ([]*core.EnrichedEvent, *ffapi.FilterResult, error)); ok { + return rf(ctx, subscription, filter, startSequence, endSequence) + } + if rf, ok := ret.Get(0).(func(context.Context, *core.Subscription, ffapi.AndFilter, int, int) []*core.EnrichedEvent); ok { + r0 = rf(ctx, subscription, filter, startSequence, endSequence) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*core.EnrichedEvent) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *core.Subscription, ffapi.AndFilter, int, int) *ffapi.FilterResult); ok { + r1 = rf(ctx, subscription, filter, startSequence, endSequence) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*ffapi.FilterResult) + } + } + + if rf, ok := ret.Get(2).(func(context.Context, *core.Subscription, ffapi.AndFilter, int, int) error); ok { + r2 = rf(ctx, subscription, filter, startSequence, endSequence) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + // GetSubscriptions provides a mock function with given fields: ctx, filter func (_m *Orchestrator) GetSubscriptions(ctx context.Context, filter ffapi.AndFilter) ([]*core.Subscription, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetSubscriptions") + } + var r0 []*core.Subscription var r1 *ffapi.FilterResult var r2 error @@ -1214,6 +1429,10 @@ func (_m *Orchestrator) GetSubscriptions(ctx context.Context, filter ffapi.AndFi func (_m *Orchestrator) GetTransactionBlockchainEvents(ctx context.Context, id string) ([]*core.BlockchainEvent, *ffapi.FilterResult, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetTransactionBlockchainEvents") + } + var r0 []*core.BlockchainEvent var r1 *ffapi.FilterResult var r2 error @@ -1249,6 +1468,10 @@ func (_m *Orchestrator) GetTransactionBlockchainEvents(ctx context.Context, id s func (_m *Orchestrator) GetTransactionByID(ctx context.Context, id string) (*core.Transaction, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetTransactionByID") + } + var r0 *core.Transaction var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Transaction, error)); ok { @@ -1275,6 +1498,10 @@ func (_m *Orchestrator) GetTransactionByID(ctx context.Context, id string) (*cor func (_m *Orchestrator) GetTransactionOperations(ctx context.Context, id string) ([]*core.Operation, *ffapi.FilterResult, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetTransactionOperations") + } + var r0 []*core.Operation var r1 *ffapi.FilterResult var r2 error @@ -1310,6 +1537,10 @@ func (_m *Orchestrator) GetTransactionOperations(ctx context.Context, id string) func (_m *Orchestrator) GetTransactionStatus(ctx context.Context, id string) (*core.TransactionStatus, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetTransactionStatus") + } + var r0 *core.TransactionStatus var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.TransactionStatus, error)); ok { @@ -1336,6 +1567,10 @@ func (_m *Orchestrator) GetTransactionStatus(ctx context.Context, id string) (*c func (_m *Orchestrator) GetTransactions(ctx context.Context, filter ffapi.AndFilter) ([]*core.Transaction, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetTransactions") + } + var r0 []*core.Transaction var r1 *ffapi.FilterResult var r2 error @@ -1371,6 +1606,10 @@ func (_m *Orchestrator) GetTransactions(ctx context.Context, filter ffapi.AndFil func (_m *Orchestrator) Identity() identity.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Identity") + } + var r0 identity.Manager if rf, ok := ret.Get(0).(func() identity.Manager); ok { r0 = rf() @@ -1387,6 +1626,10 @@ func (_m *Orchestrator) Identity() identity.Manager { func (_m *Orchestrator) Init() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Init") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -1401,6 +1644,10 @@ func (_m *Orchestrator) Init() error { func (_m *Orchestrator) MultiParty() multiparty.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for MultiParty") + } + var r0 multiparty.Manager if rf, ok := ret.Get(0).(func() multiparty.Manager); ok { r0 = rf() @@ -1417,6 +1664,10 @@ func (_m *Orchestrator) MultiParty() multiparty.Manager { func (_m *Orchestrator) NetworkMap() networkmap.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for NetworkMap") + } + var r0 networkmap.Manager if rf, ok := ret.Get(0).(func() networkmap.Manager); ok { r0 = rf() @@ -1433,6 +1684,10 @@ func (_m *Orchestrator) NetworkMap() networkmap.Manager { func (_m *Orchestrator) Operations() operations.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Operations") + } + var r0 operations.Manager if rf, ok := ret.Get(0).(func() operations.Manager); ok { r0 = rf() @@ -1454,6 +1709,10 @@ func (_m *Orchestrator) PreInit(ctx context.Context, cancelCtx context.CancelFun func (_m *Orchestrator) PrivateMessaging() privatemessaging.Manager { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for PrivateMessaging") + } + var r0 privatemessaging.Manager if rf, ok := ret.Get(0).(func() privatemessaging.Manager); ok { r0 = rf() @@ -1470,6 +1729,10 @@ func (_m *Orchestrator) PrivateMessaging() privatemessaging.Manager { func (_m *Orchestrator) RequestReply(ctx context.Context, msg *core.MessageInOut) (*core.MessageInOut, error) { ret := _m.Called(ctx, msg) + if len(ret) == 0 { + panic("no return value specified for RequestReply") + } + var r0 *core.MessageInOut var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.MessageInOut) (*core.MessageInOut, error)); ok { @@ -1496,6 +1759,10 @@ func (_m *Orchestrator) RequestReply(ctx context.Context, msg *core.MessageInOut func (_m *Orchestrator) RewindPins(ctx context.Context, rewind *core.PinRewind) (*core.PinRewind, error) { ret := _m.Called(ctx, rewind) + if len(ret) == 0 { + panic("no return value specified for RewindPins") + } + var r0 *core.PinRewind var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.PinRewind) (*core.PinRewind, error)); ok { @@ -1522,6 +1789,10 @@ func (_m *Orchestrator) RewindPins(ctx context.Context, rewind *core.PinRewind) func (_m *Orchestrator) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -1536,6 +1807,10 @@ func (_m *Orchestrator) Start() error { func (_m *Orchestrator) SubmitNetworkAction(ctx context.Context, action *core.NetworkAction) error { ret := _m.Called(ctx, action) + if len(ret) == 0 { + panic("no return value specified for SubmitNetworkAction") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.NetworkAction) error); ok { r0 = rf(ctx, action) diff --git a/mocks/privatemessagingmocks/manager.go b/mocks/privatemessagingmocks/manager.go index 20510a704..1d051d1f6 100644 --- a/mocks/privatemessagingmocks/manager.go +++ b/mocks/privatemessagingmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package privatemessagingmocks @@ -24,6 +24,10 @@ type Manager struct { func (_m *Manager) EnsureLocalGroup(ctx context.Context, group *core.Group, creator *core.Member) (bool, error) { ret := _m.Called(ctx, group, creator) + if len(ret) == 0 { + panic("no return value specified for EnsureLocalGroup") + } + var r0 bool var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Group, *core.Member) (bool, error)); ok { @@ -48,6 +52,10 @@ func (_m *Manager) EnsureLocalGroup(ctx context.Context, group *core.Group, crea func (_m *Manager) GetGroupByID(ctx context.Context, id string) (*core.Group, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetGroupByID") + } + var r0 *core.Group var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (*core.Group, error)); ok { @@ -74,6 +82,10 @@ func (_m *Manager) GetGroupByID(ctx context.Context, id string) (*core.Group, er func (_m *Manager) GetGroups(ctx context.Context, filter ffapi.AndFilter) ([]*core.Group, *ffapi.FilterResult, error) { ret := _m.Called(ctx, filter) + if len(ret) == 0 { + panic("no return value specified for GetGroups") + } + var r0 []*core.Group var r1 *ffapi.FilterResult var r2 error @@ -109,6 +121,10 @@ func (_m *Manager) GetGroups(ctx context.Context, filter ffapi.AndFilter) ([]*co func (_m *Manager) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -123,6 +139,10 @@ func (_m *Manager) Name() string { func (_m *Manager) NewMessage(msg *core.MessageInOut) syncasync.Sender { ret := _m.Called(msg) + if len(ret) == 0 { + panic("no return value specified for NewMessage") + } + var r0 syncasync.Sender if rf, ok := ret.Get(0).(func(*core.MessageInOut) syncasync.Sender); ok { r0 = rf(msg) @@ -139,6 +159,10 @@ func (_m *Manager) NewMessage(msg *core.MessageInOut) syncasync.Sender { func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*core.PreparedOperation, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for PrepareOperation") + } + var r0 *core.PreparedOperation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Operation) (*core.PreparedOperation, error)); ok { @@ -165,6 +189,10 @@ func (_m *Manager) PrepareOperation(ctx context.Context, op *core.Operation) (*c func (_m *Manager) RequestReply(ctx context.Context, request *core.MessageInOut) (*core.MessageInOut, error) { ret := _m.Called(ctx, request) + if len(ret) == 0 { + panic("no return value specified for RequestReply") + } + var r0 *core.MessageInOut var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.MessageInOut) (*core.MessageInOut, error)); ok { @@ -191,6 +219,10 @@ func (_m *Manager) RequestReply(ctx context.Context, request *core.MessageInOut) func (_m *Manager) ResolveInitGroup(ctx context.Context, msg *core.Message, creator *core.Member) (*core.Group, error) { ret := _m.Called(ctx, msg, creator) + if len(ret) == 0 { + panic("no return value specified for ResolveInitGroup") + } + var r0 *core.Group var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.Message, *core.Member) (*core.Group, error)); ok { @@ -217,6 +249,10 @@ func (_m *Manager) ResolveInitGroup(ctx context.Context, msg *core.Message, crea func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation) (fftypes.JSONObject, core.OpPhase, error) { ret := _m.Called(ctx, op) + if len(ret) == 0 { + panic("no return value specified for RunOperation") + } + var r0 fftypes.JSONObject var r1 core.OpPhase var r2 error @@ -250,6 +286,10 @@ func (_m *Manager) RunOperation(ctx context.Context, op *core.PreparedOperation) func (_m *Manager) SendMessage(ctx context.Context, in *core.MessageInOut, waitConfirm bool) (*core.Message, error) { ret := _m.Called(ctx, in, waitConfirm) + if len(ret) == 0 { + panic("no return value specified for SendMessage") + } + var r0 *core.Message var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.MessageInOut, bool) (*core.Message, error)); ok { diff --git a/mocks/shareddownloadmocks/callbacks.go b/mocks/shareddownloadmocks/callbacks.go index c321d921b..4348a9b63 100644 --- a/mocks/shareddownloadmocks/callbacks.go +++ b/mocks/shareddownloadmocks/callbacks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package shareddownloadmocks @@ -16,6 +16,10 @@ type Callbacks struct { func (_m *Callbacks) SharedStorageBatchDownloaded(payloadRef string, data []byte) (*fftypes.UUID, error) { ret := _m.Called(payloadRef, data) + if len(ret) == 0 { + panic("no return value specified for SharedStorageBatchDownloaded") + } + var r0 *fftypes.UUID var r1 error if rf, ok := ret.Get(0).(func(string, []byte) (*fftypes.UUID, error)); ok { @@ -42,6 +46,10 @@ func (_m *Callbacks) SharedStorageBatchDownloaded(payloadRef string, data []byte func (_m *Callbacks) SharedStorageBlobDownloaded(hash fftypes.Bytes32, size int64, payloadRef string, dataID *fftypes.UUID) error { ret := _m.Called(hash, size, payloadRef, dataID) + if len(ret) == 0 { + panic("no return value specified for SharedStorageBlobDownloaded") + } + var r0 error if rf, ok := ret.Get(0).(func(fftypes.Bytes32, int64, string, *fftypes.UUID) error); ok { r0 = rf(hash, size, payloadRef, dataID) diff --git a/mocks/shareddownloadmocks/manager.go b/mocks/shareddownloadmocks/manager.go index 7d1841809..aad3eedb3 100644 --- a/mocks/shareddownloadmocks/manager.go +++ b/mocks/shareddownloadmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package shareddownloadmocks @@ -18,6 +18,10 @@ type Manager struct { func (_m *Manager) InitiateDownloadBatch(ctx context.Context, tx *fftypes.UUID, payloadRef string, idempotentSubmit bool) error { ret := _m.Called(ctx, tx, payloadRef, idempotentSubmit) + if len(ret) == 0 { + panic("no return value specified for InitiateDownloadBatch") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, string, bool) error); ok { r0 = rf(ctx, tx, payloadRef, idempotentSubmit) @@ -32,6 +36,10 @@ func (_m *Manager) InitiateDownloadBatch(ctx context.Context, tx *fftypes.UUID, func (_m *Manager) InitiateDownloadBlob(ctx context.Context, tx *fftypes.UUID, dataID *fftypes.UUID, payloadRef string, idempotentSubmit bool) error { ret := _m.Called(ctx, tx, dataID, payloadRef, idempotentSubmit) + if len(ret) == 0 { + panic("no return value specified for InitiateDownloadBlob") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, *fftypes.UUID, string, bool) error); ok { r0 = rf(ctx, tx, dataID, payloadRef, idempotentSubmit) @@ -46,6 +54,10 @@ func (_m *Manager) InitiateDownloadBlob(ctx context.Context, tx *fftypes.UUID, d func (_m *Manager) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() diff --git a/mocks/sharedstoragemocks/callbacks.go b/mocks/sharedstoragemocks/callbacks.go index e9562a513..002173b5f 100644 --- a/mocks/sharedstoragemocks/callbacks.go +++ b/mocks/sharedstoragemocks/callbacks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package sharedstoragemocks diff --git a/mocks/sharedstoragemocks/plugin.go b/mocks/sharedstoragemocks/plugin.go index 6665d8285..44f92f32d 100644 --- a/mocks/sharedstoragemocks/plugin.go +++ b/mocks/sharedstoragemocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package sharedstoragemocks @@ -23,6 +23,10 @@ type Plugin struct { func (_m *Plugin) Capabilities() *sharedstorage.Capabilities { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Capabilities") + } + var r0 *sharedstorage.Capabilities if rf, ok := ret.Get(0).(func() *sharedstorage.Capabilities); ok { r0 = rf() @@ -39,6 +43,10 @@ func (_m *Plugin) Capabilities() *sharedstorage.Capabilities { func (_m *Plugin) DownloadData(ctx context.Context, payloadRef string) (io.ReadCloser, error) { ret := _m.Called(ctx, payloadRef) + if len(ret) == 0 { + panic("no return value specified for DownloadData") + } + var r0 io.ReadCloser var r1 error if rf, ok := ret.Get(0).(func(context.Context, string) (io.ReadCloser, error)); ok { @@ -65,6 +73,10 @@ func (_m *Plugin) DownloadData(ctx context.Context, payloadRef string) (io.ReadC func (_m *Plugin) Init(ctx context.Context, _a1 config.Section) error { ret := _m.Called(ctx, _a1) + if len(ret) == 0 { + panic("no return value specified for Init") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, config.Section) error); ok { r0 = rf(ctx, _a1) @@ -84,6 +96,10 @@ func (_m *Plugin) InitConfig(_a0 config.Section) { func (_m *Plugin) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -103,6 +119,10 @@ func (_m *Plugin) SetHandler(namespace string, handler sharedstorage.Callbacks) func (_m *Plugin) UploadData(ctx context.Context, data io.Reader) (string, error) { ret := _m.Called(ctx, data) + if len(ret) == 0 { + panic("no return value specified for UploadData") + } + var r0 string var r1 error if rf, ok := ret.Get(0).(func(context.Context, io.Reader) (string, error)); ok { diff --git a/mocks/spieventsmocks/manager.go b/mocks/spieventsmocks/manager.go index c577914d4..7286e9b58 100644 --- a/mocks/spieventsmocks/manager.go +++ b/mocks/spieventsmocks/manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package spieventsmocks diff --git a/mocks/syncasyncmocks/bridge.go b/mocks/syncasyncmocks/bridge.go index 7936e1adc..57b9fcded 100644 --- a/mocks/syncasyncmocks/bridge.go +++ b/mocks/syncasyncmocks/bridge.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package syncasyncmocks @@ -29,6 +29,10 @@ func (_m *Bridge) Init(sysevents system.EventInterface) { func (_m *Bridge) WaitForDeployOperation(ctx context.Context, id *fftypes.UUID, send syncasync.SendFunction) (*core.Operation, error) { ret := _m.Called(ctx, id, send) + if len(ret) == 0 { + panic("no return value specified for WaitForDeployOperation") + } + var r0 *core.Operation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, syncasync.SendFunction) (*core.Operation, error)); ok { @@ -55,6 +59,10 @@ func (_m *Bridge) WaitForDeployOperation(ctx context.Context, id *fftypes.UUID, func (_m *Bridge) WaitForIdentity(ctx context.Context, id *fftypes.UUID, send syncasync.SendFunction) (*core.Identity, error) { ret := _m.Called(ctx, id, send) + if len(ret) == 0 { + panic("no return value specified for WaitForIdentity") + } + var r0 *core.Identity var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, syncasync.SendFunction) (*core.Identity, error)); ok { @@ -81,6 +89,10 @@ func (_m *Bridge) WaitForIdentity(ctx context.Context, id *fftypes.UUID, send sy func (_m *Bridge) WaitForInvokeOperation(ctx context.Context, id *fftypes.UUID, send syncasync.SendFunction) (*core.Operation, error) { ret := _m.Called(ctx, id, send) + if len(ret) == 0 { + panic("no return value specified for WaitForInvokeOperation") + } + var r0 *core.Operation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, syncasync.SendFunction) (*core.Operation, error)); ok { @@ -107,6 +119,10 @@ func (_m *Bridge) WaitForInvokeOperation(ctx context.Context, id *fftypes.UUID, func (_m *Bridge) WaitForMessage(ctx context.Context, id *fftypes.UUID, send syncasync.SendFunction) (*core.Message, error) { ret := _m.Called(ctx, id, send) + if len(ret) == 0 { + panic("no return value specified for WaitForMessage") + } + var r0 *core.Message var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, syncasync.SendFunction) (*core.Message, error)); ok { @@ -133,6 +149,10 @@ func (_m *Bridge) WaitForMessage(ctx context.Context, id *fftypes.UUID, send syn func (_m *Bridge) WaitForReply(ctx context.Context, id *fftypes.UUID, send syncasync.SendFunction) (*core.MessageInOut, error) { ret := _m.Called(ctx, id, send) + if len(ret) == 0 { + panic("no return value specified for WaitForReply") + } + var r0 *core.MessageInOut var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, syncasync.SendFunction) (*core.MessageInOut, error)); ok { @@ -159,6 +179,10 @@ func (_m *Bridge) WaitForReply(ctx context.Context, id *fftypes.UUID, send synca func (_m *Bridge) WaitForTokenApproval(ctx context.Context, id *fftypes.UUID, send syncasync.SendFunction) (*core.TokenApproval, error) { ret := _m.Called(ctx, id, send) + if len(ret) == 0 { + panic("no return value specified for WaitForTokenApproval") + } + var r0 *core.TokenApproval var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, syncasync.SendFunction) (*core.TokenApproval, error)); ok { @@ -185,6 +209,10 @@ func (_m *Bridge) WaitForTokenApproval(ctx context.Context, id *fftypes.UUID, se func (_m *Bridge) WaitForTokenPool(ctx context.Context, id *fftypes.UUID, send syncasync.SendFunction) (*core.TokenPool, error) { ret := _m.Called(ctx, id, send) + if len(ret) == 0 { + panic("no return value specified for WaitForTokenPool") + } + var r0 *core.TokenPool var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, syncasync.SendFunction) (*core.TokenPool, error)); ok { @@ -211,6 +239,10 @@ func (_m *Bridge) WaitForTokenPool(ctx context.Context, id *fftypes.UUID, send s func (_m *Bridge) WaitForTokenTransfer(ctx context.Context, id *fftypes.UUID, send syncasync.SendFunction) (*core.TokenTransfer, error) { ret := _m.Called(ctx, id, send) + if len(ret) == 0 { + panic("no return value specified for WaitForTokenTransfer") + } + var r0 *core.TokenTransfer var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, syncasync.SendFunction) (*core.TokenTransfer, error)); ok { diff --git a/mocks/syncasyncmocks/sender.go b/mocks/syncasyncmocks/sender.go index 694bd5746..8f68f26c9 100644 --- a/mocks/syncasyncmocks/sender.go +++ b/mocks/syncasyncmocks/sender.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package syncasyncmocks @@ -17,6 +17,10 @@ type Sender struct { func (_m *Sender) Prepare(ctx context.Context) error { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for Prepare") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context) error); ok { r0 = rf(ctx) @@ -31,6 +35,10 @@ func (_m *Sender) Prepare(ctx context.Context) error { func (_m *Sender) Send(ctx context.Context) error { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for Send") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context) error); ok { r0 = rf(ctx) @@ -45,6 +53,10 @@ func (_m *Sender) Send(ctx context.Context) error { func (_m *Sender) SendAndWait(ctx context.Context) error { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for SendAndWait") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context) error); ok { r0 = rf(ctx) diff --git a/mocks/systemeventmocks/event_interface.go b/mocks/systemeventmocks/event_interface.go index 99c7cbc6e..23db5f205 100644 --- a/mocks/systemeventmocks/event_interface.go +++ b/mocks/systemeventmocks/event_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package systemeventmocks @@ -16,6 +16,10 @@ type EventInterface struct { func (_m *EventInterface) AddSystemEventListener(ns string, el system.EventListener) error { ret := _m.Called(ns, el) + if len(ret) == 0 { + panic("no return value specified for AddSystemEventListener") + } + var r0 error if rf, ok := ret.Get(0).(func(string, system.EventListener) error); ok { r0 = rf(ns, el) diff --git a/mocks/tokenmocks/callbacks.go b/mocks/tokenmocks/callbacks.go index d34dd7d3d..17104d652 100644 --- a/mocks/tokenmocks/callbacks.go +++ b/mocks/tokenmocks/callbacks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package tokenmocks @@ -18,6 +18,10 @@ type Callbacks struct { func (_m *Callbacks) TokenPoolCreated(ctx context.Context, plugin tokens.Plugin, pool *tokens.TokenPool) error { ret := _m.Called(ctx, plugin, pool) + if len(ret) == 0 { + panic("no return value specified for TokenPoolCreated") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, tokens.Plugin, *tokens.TokenPool) error); ok { r0 = rf(ctx, plugin, pool) @@ -32,6 +36,10 @@ func (_m *Callbacks) TokenPoolCreated(ctx context.Context, plugin tokens.Plugin, func (_m *Callbacks) TokensApproved(plugin tokens.Plugin, approval *tokens.TokenApproval) error { ret := _m.Called(plugin, approval) + if len(ret) == 0 { + panic("no return value specified for TokensApproved") + } + var r0 error if rf, ok := ret.Get(0).(func(tokens.Plugin, *tokens.TokenApproval) error); ok { r0 = rf(plugin, approval) @@ -46,6 +54,10 @@ func (_m *Callbacks) TokensApproved(plugin tokens.Plugin, approval *tokens.Token func (_m *Callbacks) TokensTransferred(plugin tokens.Plugin, transfer *tokens.TokenTransfer) error { ret := _m.Called(plugin, transfer) + if len(ret) == 0 { + panic("no return value specified for TokensTransferred") + } + var r0 error if rf, ok := ret.Get(0).(func(tokens.Plugin, *tokens.TokenTransfer) error); ok { r0 = rf(plugin, transfer) diff --git a/mocks/tokenmocks/plugin.go b/mocks/tokenmocks/plugin.go index 50ff57f28..03a5e09cf 100644 --- a/mocks/tokenmocks/plugin.go +++ b/mocks/tokenmocks/plugin.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package tokenmocks @@ -25,6 +25,10 @@ type Plugin struct { func (_m *Plugin) ActivateTokenPool(ctx context.Context, pool *core.TokenPool) (core.OpPhase, error) { ret := _m.Called(ctx, pool) + if len(ret) == 0 { + panic("no return value specified for ActivateTokenPool") + } + var r0 core.OpPhase var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenPool) (core.OpPhase, error)); ok { @@ -49,6 +53,10 @@ func (_m *Plugin) ActivateTokenPool(ctx context.Context, pool *core.TokenPool) ( func (_m *Plugin) BurnTokens(ctx context.Context, nsOpID string, poolLocator string, burn *core.TokenTransfer, methods *fftypes.JSONAny) error { ret := _m.Called(ctx, nsOpID, poolLocator, burn, methods) + if len(ret) == 0 { + panic("no return value specified for BurnTokens") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, string, *core.TokenTransfer, *fftypes.JSONAny) error); ok { r0 = rf(ctx, nsOpID, poolLocator, burn, methods) @@ -63,6 +71,10 @@ func (_m *Plugin) BurnTokens(ctx context.Context, nsOpID string, poolLocator str func (_m *Plugin) Capabilities() *tokens.Capabilities { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Capabilities") + } + var r0 *tokens.Capabilities if rf, ok := ret.Get(0).(func() *tokens.Capabilities); ok { r0 = rf() @@ -79,6 +91,10 @@ func (_m *Plugin) Capabilities() *tokens.Capabilities { func (_m *Plugin) CheckInterface(ctx context.Context, pool *core.TokenPool, methods []*fftypes.FFIMethod) (*fftypes.JSONAny, error) { ret := _m.Called(ctx, pool, methods) + if len(ret) == 0 { + panic("no return value specified for CheckInterface") + } + var r0 *fftypes.JSONAny var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenPool, []*fftypes.FFIMethod) (*fftypes.JSONAny, error)); ok { @@ -105,6 +121,10 @@ func (_m *Plugin) CheckInterface(ctx context.Context, pool *core.TokenPool, meth func (_m *Plugin) CreateTokenPool(ctx context.Context, nsOpID string, pool *core.TokenPool) (core.OpPhase, error) { ret := _m.Called(ctx, nsOpID, pool) + if len(ret) == 0 { + panic("no return value specified for CreateTokenPool") + } + var r0 core.OpPhase var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *core.TokenPool) (core.OpPhase, error)); ok { @@ -129,6 +149,10 @@ func (_m *Plugin) CreateTokenPool(ctx context.Context, nsOpID string, pool *core func (_m *Plugin) DeactivateTokenPool(ctx context.Context, pool *core.TokenPool) error { ret := _m.Called(ctx, pool) + if len(ret) == 0 { + panic("no return value specified for DeactivateTokenPool") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.TokenPool) error); ok { r0 = rf(ctx, pool) @@ -143,6 +167,10 @@ func (_m *Plugin) DeactivateTokenPool(ctx context.Context, pool *core.TokenPool) func (_m *Plugin) Init(ctx context.Context, cancelCtx context.CancelFunc, name string, _a3 config.Section) error { ret := _m.Called(ctx, cancelCtx, name, _a3) + if len(ret) == 0 { + panic("no return value specified for Init") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, context.CancelFunc, string, config.Section) error); ok { r0 = rf(ctx, cancelCtx, name, _a3) @@ -162,6 +190,10 @@ func (_m *Plugin) InitConfig(_a0 config.Section) { func (_m *Plugin) MintTokens(ctx context.Context, nsOpID string, poolLocator string, mint *core.TokenTransfer, methods *fftypes.JSONAny) error { ret := _m.Called(ctx, nsOpID, poolLocator, mint, methods) + if len(ret) == 0 { + panic("no return value specified for MintTokens") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, string, *core.TokenTransfer, *fftypes.JSONAny) error); ok { r0 = rf(ctx, nsOpID, poolLocator, mint, methods) @@ -176,6 +208,10 @@ func (_m *Plugin) MintTokens(ctx context.Context, nsOpID string, poolLocator str func (_m *Plugin) Name() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Name") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() @@ -200,6 +236,10 @@ func (_m *Plugin) SetOperationHandler(namespace string, handler core.OperationCa func (_m *Plugin) Start() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Start") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -214,6 +254,10 @@ func (_m *Plugin) Start() error { func (_m *Plugin) TokensApproval(ctx context.Context, nsOpID string, poolLocator string, approval *core.TokenApproval, methods *fftypes.JSONAny) error { ret := _m.Called(ctx, nsOpID, poolLocator, approval, methods) + if len(ret) == 0 { + panic("no return value specified for TokensApproval") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, string, *core.TokenApproval, *fftypes.JSONAny) error); ok { r0 = rf(ctx, nsOpID, poolLocator, approval, methods) @@ -228,6 +272,10 @@ func (_m *Plugin) TokensApproval(ctx context.Context, nsOpID string, poolLocator func (_m *Plugin) TransferTokens(ctx context.Context, nsOpID string, poolLocator string, transfer *core.TokenTransfer, methods *fftypes.JSONAny) error { ret := _m.Called(ctx, nsOpID, poolLocator, transfer, methods) + if len(ret) == 0 { + panic("no return value specified for TransferTokens") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, string, *core.TokenTransfer, *fftypes.JSONAny) error); ok { r0 = rf(ctx, nsOpID, poolLocator, transfer, methods) diff --git a/mocks/txcommonmocks/helper.go b/mocks/txcommonmocks/helper.go index 86037dc0d..083bf6c9b 100644 --- a/mocks/txcommonmocks/helper.go +++ b/mocks/txcommonmocks/helper.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package txcommonmocks @@ -22,6 +22,10 @@ type Helper struct { func (_m *Helper) AddBlockchainTX(ctx context.Context, tx *core.Transaction, blockchainTXID string) error { ret := _m.Called(ctx, tx, blockchainTXID) + if len(ret) == 0 { + panic("no return value specified for AddBlockchainTX") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, *core.Transaction, string) error); ok { r0 = rf(ctx, tx, blockchainTXID) @@ -36,6 +40,10 @@ func (_m *Helper) AddBlockchainTX(ctx context.Context, tx *core.Transaction, blo func (_m *Helper) FindOperationInTransaction(ctx context.Context, tx *fftypes.UUID, opType fftypes.FFEnum) (*core.Operation, error) { ret := _m.Called(ctx, tx, opType) + if len(ret) == 0 { + panic("no return value specified for FindOperationInTransaction") + } + var r0 *core.Operation var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, fftypes.FFEnum) (*core.Operation, error)); ok { @@ -62,6 +70,10 @@ func (_m *Helper) FindOperationInTransaction(ctx context.Context, tx *fftypes.UU func (_m *Helper) GetBlockchainEventByIDCached(ctx context.Context, id *fftypes.UUID) (*core.BlockchainEvent, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetBlockchainEventByIDCached") + } + var r0 *core.BlockchainEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) (*core.BlockchainEvent, error)); ok { @@ -88,6 +100,10 @@ func (_m *Helper) GetBlockchainEventByIDCached(ctx context.Context, id *fftypes. func (_m *Helper) GetTransactionByIDCached(ctx context.Context, id *fftypes.UUID) (*core.Transaction, error) { ret := _m.Called(ctx, id) + if len(ret) == 0 { + panic("no return value specified for GetTransactionByIDCached") + } + var r0 *core.Transaction var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID) (*core.Transaction, error)); ok { @@ -114,6 +130,10 @@ func (_m *Helper) GetTransactionByIDCached(ctx context.Context, id *fftypes.UUID func (_m *Helper) InsertNewBlockchainEvents(ctx context.Context, events []*core.BlockchainEvent) ([]*core.BlockchainEvent, error) { ret := _m.Called(ctx, events) + if len(ret) == 0 { + panic("no return value specified for InsertNewBlockchainEvents") + } + var r0 []*core.BlockchainEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, []*core.BlockchainEvent) ([]*core.BlockchainEvent, error)); ok { @@ -140,6 +160,10 @@ func (_m *Helper) InsertNewBlockchainEvents(ctx context.Context, events []*core. func (_m *Helper) InsertOrGetBlockchainEvent(ctx context.Context, event *core.BlockchainEvent) (*core.BlockchainEvent, error) { ret := _m.Called(ctx, event) + if len(ret) == 0 { + panic("no return value specified for InsertOrGetBlockchainEvent") + } + var r0 *core.BlockchainEvent var r1 error if rf, ok := ret.Get(0).(func(context.Context, *core.BlockchainEvent) (*core.BlockchainEvent, error)); ok { @@ -166,6 +190,10 @@ func (_m *Helper) InsertOrGetBlockchainEvent(ctx context.Context, event *core.Bl func (_m *Helper) PersistTransaction(ctx context.Context, id *fftypes.UUID, txType fftypes.FFEnum, blockchainTXID string) (bool, error) { ret := _m.Called(ctx, id, txType, blockchainTXID) + if len(ret) == 0 { + panic("no return value specified for PersistTransaction") + } + var r0 bool var r1 error if rf, ok := ret.Get(0).(func(context.Context, *fftypes.UUID, fftypes.FFEnum, string) (bool, error)); ok { @@ -190,6 +218,10 @@ func (_m *Helper) PersistTransaction(ctx context.Context, id *fftypes.UUID, txTy func (_m *Helper) SubmitNewTransaction(ctx context.Context, txType fftypes.FFEnum, idempotencyKey core.IdempotencyKey) (*fftypes.UUID, error) { ret := _m.Called(ctx, txType, idempotencyKey) + if len(ret) == 0 { + panic("no return value specified for SubmitNewTransaction") + } + var r0 *fftypes.UUID var r1 error if rf, ok := ret.Get(0).(func(context.Context, fftypes.FFEnum, core.IdempotencyKey) (*fftypes.UUID, error)); ok { @@ -216,6 +248,10 @@ func (_m *Helper) SubmitNewTransaction(ctx context.Context, txType fftypes.FFEnu func (_m *Helper) SubmitNewTransactionBatch(ctx context.Context, namespace string, batch []*txcommon.BatchedTransactionInsert) error { ret := _m.Called(ctx, namespace, batch) + if len(ret) == 0 { + panic("no return value specified for SubmitNewTransactionBatch") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, string, []*txcommon.BatchedTransactionInsert) error); ok { r0 = rf(ctx, namespace, batch) diff --git a/mocks/txwritermocks/writer.go b/mocks/txwritermocks/writer.go index ea8586c05..7facf76e6 100644 --- a/mocks/txwritermocks/writer.go +++ b/mocks/txwritermocks/writer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package txwritermocks @@ -37,6 +37,10 @@ func (_m *Writer) WriteTransactionAndOps(ctx context.Context, txType fftypes.FFE _ca = append(_ca, _va...) ret := _m.Called(_ca...) + if len(ret) == 0 { + panic("no return value specified for WriteTransactionAndOps") + } + var r0 *core.Transaction var r1 error if rf, ok := ret.Get(0).(func(context.Context, fftypes.FFEnum, core.IdempotencyKey, ...*core.Operation) (*core.Transaction, error)); ok { diff --git a/mocks/websocketsmocks/web_sockets_namespaced.go b/mocks/websocketsmocks/web_sockets_namespaced.go new file mode 100644 index 000000000..9c1e94c04 --- /dev/null +++ b/mocks/websocketsmocks/web_sockets_namespaced.go @@ -0,0 +1,33 @@ +// Code generated by mockery v2.38.0. DO NOT EDIT. + +package websocketsmocks + +import ( + http "net/http" + + mock "github.com/stretchr/testify/mock" +) + +// WebSocketsNamespaced is an autogenerated mock type for the WebSocketsNamespaced type +type WebSocketsNamespaced struct { + mock.Mock +} + +// ServeHTTPNamespaced provides a mock function with given fields: namespace, res, req +func (_m *WebSocketsNamespaced) ServeHTTPNamespaced(namespace string, res http.ResponseWriter, req *http.Request) { + _m.Called(namespace, res, req) +} + +// NewWebSocketsNamespaced creates a new instance of WebSocketsNamespaced. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewWebSocketsNamespaced(t interface { + mock.TestingT + Cleanup(func()) +}) *WebSocketsNamespaced { + mock := &WebSocketsNamespaced{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/wsmocks/ws_client.go b/mocks/wsmocks/ws_client.go index f7f440f0b..00bbbcfaa 100644 --- a/mocks/wsmocks/ws_client.go +++ b/mocks/wsmocks/ws_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.2. DO NOT EDIT. +// Code generated by mockery v2.38.0. DO NOT EDIT. package wsmocks @@ -23,6 +23,10 @@ func (_m *WSClient) Close() { func (_m *WSClient) Connect() error { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Connect") + } + var r0 error if rf, ok := ret.Get(0).(func() error); ok { r0 = rf() @@ -37,6 +41,10 @@ func (_m *WSClient) Connect() error { func (_m *WSClient) Receive() <-chan []byte { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for Receive") + } + var r0 <-chan []byte if rf, ok := ret.Get(0).(func() <-chan []byte); ok { r0 = rf() @@ -53,6 +61,10 @@ func (_m *WSClient) Receive() <-chan []byte { func (_m *WSClient) ReceiveExt() <-chan *wsclient.WSPayload { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for ReceiveExt") + } + var r0 <-chan *wsclient.WSPayload if rf, ok := ret.Get(0).(func() <-chan *wsclient.WSPayload); ok { r0 = rf() @@ -69,6 +81,10 @@ func (_m *WSClient) ReceiveExt() <-chan *wsclient.WSPayload { func (_m *WSClient) Send(ctx context.Context, message []byte) error { ret := _m.Called(ctx, message) + if len(ret) == 0 { + panic("no return value specified for Send") + } + var r0 error if rf, ok := ret.Get(0).(func(context.Context, []byte) error); ok { r0 = rf(ctx, message) @@ -79,6 +95,11 @@ func (_m *WSClient) Send(ctx context.Context, message []byte) error { return r0 } +// SetHeader provides a mock function with given fields: header, value +func (_m *WSClient) SetHeader(header string, value string) { + _m.Called(header, value) +} + // SetURL provides a mock function with given fields: url func (_m *WSClient) SetURL(url string) { _m.Called(url) @@ -88,6 +109,10 @@ func (_m *WSClient) SetURL(url string) { func (_m *WSClient) URL() string { ret := _m.Called() + if len(ret) == 0 { + panic("no return value specified for URL") + } + var r0 string if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() diff --git a/pkg/blockchain/plugin.go b/pkg/blockchain/plugin.go index 5417368bd..cd576772a 100644 --- a/pkg/blockchain/plugin.go +++ b/pkg/blockchain/plugin.go @@ -78,7 +78,7 @@ type Plugin interface { SubmitNetworkAction(ctx context.Context, nsOpID, signingKey string, action core.NetworkActionType, location *fftypes.JSONAny) error // DeployContract submits a new transaction to deploy a new instance of a smart contract - DeployContract(ctx context.Context, nsOpID, signingKey string, definition, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) error + DeployContract(ctx context.Context, nsOpID, signingKey string, definition, contract *fftypes.JSONAny, input []interface{}, options map[string]interface{}) (submissionRejected bool, err error) // ParseInterface processes an FFIMethod and FFIError array into a blockchain specific object, that will be // cached for this given interface, and passed back on all future invocations. @@ -88,7 +88,7 @@ type Plugin interface { ValidateInvokeRequest(ctx context.Context, parsedMethod interface{}, input map[string]interface{}, hasMessage bool) error // InvokeContract submits a new transaction to be executed by custom on-chain logic - InvokeContract(ctx context.Context, nsOpID, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *BatchPin) error + InvokeContract(ctx context.Context, nsOpID, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}, batch *BatchPin) (submissionRejected bool, err error) // QueryContract executes a method via custom on-chain logic and returns the result QueryContract(ctx context.Context, signingKey string, location *fftypes.JSONAny, parsedMethod interface{}, input map[string]interface{}, options map[string]interface{}) (interface{}, error) diff --git a/pkg/core/subscription.go b/pkg/core/subscription.go index 7af6fc85e..e9e789d1d 100644 --- a/pkg/core/subscription.go +++ b/pkg/core/subscription.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -88,6 +88,7 @@ const ( ) // SubscriptionCoreOptions are the core options that apply across all transports +// REMEMBER TO ADD OPTIONS HERE TO MarshalJSON() type SubscriptionCoreOptions struct { FirstEvent *SubOptsFirstEvent `ffstruct:"SubscriptionCoreOptions" json:"firstEvent,omitempty"` ReadAhead *uint16 `ffstruct:"SubscriptionCoreOptions" json:"readAhead,omitempty"` @@ -167,6 +168,12 @@ func (so SubscriptionOptions) MarshalJSON() ([]byte, error) { if so.TLSConfigName != "" { so.additionalOptions["tlsConfigName"] = so.TLSConfigName } + if so.Batch != nil { + so.additionalOptions["batch"] = so.Batch + } + if so.BatchTimeout != nil { + so.additionalOptions["batchTimeout"] = so.BatchTimeout + } return json.Marshal(&so.additionalOptions) } diff --git a/pkg/core/subscription_test.go b/pkg/core/subscription_test.go index 0165dc593..45d1ebf00 100644 --- a/pkg/core/subscription_test.go +++ b/pkg/core/subscription_test.go @@ -28,12 +28,15 @@ func TestSubscriptionOptionsDatabaseSerialization(t *testing.T) { firstEvent := SubOptsFirstEventNewest readAhead := uint16(50) yes := true + oneSec := "1s" sub1 := &Subscription{ Options: SubscriptionOptions{ SubscriptionCoreOptions: SubscriptionCoreOptions{ - FirstEvent: &firstEvent, - ReadAhead: &readAhead, - WithData: &yes, + FirstEvent: &firstEvent, + ReadAhead: &readAhead, + WithData: &yes, + Batch: &yes, + BatchTimeout: &oneSec, }, WebhookSubOptions: WebhookSubOptions{ TLSConfigName: "myconfig", @@ -49,7 +52,18 @@ func TestSubscriptionOptionsDatabaseSerialization(t *testing.T) { // Verify it serializes as bytes to the database b1, err := sub1.Options.Value() assert.NoError(t, err) - assert.Equal(t, `{"firstEvent":"newest","my-nested-opts":{"myopt1":12345,"myopt2":"test"},"readAhead":50,"tlsConfigName":"myconfig","withData":true}`, string(b1.([]byte))) + assert.JSONEq(t, `{ + "firstEvent":"newest", + "my-nested-opts":{ + "myopt1":12345, + "myopt2":"test" + }, + "readAhead":50, + "tlsConfigName":"myconfig", + "withData":true, + "batch":true, + "batchTimeout":"1s" + }`, string(b1.([]byte))) f1, err := sub1.Filter.Value() assert.NoError(t, err) diff --git a/pkg/core/websocket_actions.go b/pkg/core/websocket_actions.go index d02fb9940..551148946 100644 --- a/pkg/core/websocket_actions.go +++ b/pkg/core/websocket_actions.go @@ -1,4 +1,4 @@ -// Copyright © 2022 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -29,6 +29,9 @@ var ( // WSProtocolErrorEventType is a special event "type" field for server to send the client, if it performs a ProtocolError WSProtocolErrorEventType = fftypes.FFEnumValue("wstype", "protocol_error") + + // WSEventBatchType is the type set when the message contains an array of events + WSEventBatchType = fftypes.FFEnumValue("wstype", "event_batch") ) // WSActionBase is the base fields of all client actions sent on the websocket @@ -61,3 +64,12 @@ type WSError struct { Type WSClientPayloadType `ffstruct:"WSAck" json:"type" ffenum:"wstype"` Error string `ffstruct:"WSAck" json:"error"` } + +// WSEventBatch is used when batched delivery is enabled over the websocket, allowing +// an array of events to be ack'd as a whole (rather than ack'ing individually) +type WSEventBatch struct { + Type WSClientPayloadType `ffstruct:"WSEventBatch" json:"type" ffenum:"wstype"` + ID *fftypes.UUID `ffstruct:"WSEventBatch" json:"id"` + Subscription SubscriptionRef `ffstruct:"WSEventBatch" json:"subscription"` + Events []*EventDelivery `ffstruct:"WSEventBatch" json:"events"` +} diff --git a/pkg/database/plugin.go b/pkg/database/plugin.go index cd6fcac7f..367d2c963 100644 --- a/pkg/database/plugin.go +++ b/pkg/database/plugin.go @@ -1,4 +1,4 @@ -// Copyright © 2023 Kaleido, Inc. +// Copyright © 2024 Kaleido, Inc. // // SPDX-License-Identifier: Apache-2.0 // @@ -268,6 +268,9 @@ type iEventCollection interface { // GetEvents - Get events GetEvents(ctx context.Context, namespace string, filter ffapi.Filter) (message []*core.Event, res *ffapi.FilterResult, err error) + + // GetEventsInSequenceRange - Get a range of events between 2 sequence values + GetEventsInSequenceRange(ctx context.Context, namespace string, filter ffapi.Filter, startSequence int, endSequence int) (message []*core.Event, res *ffapi.FilterResult, err error) } type iIdentitiesCollection interface { diff --git a/smart_contracts/ethereum/solidity_firefly/contracts/firefly.json b/smart_contracts/ethereum/solidity_firefly/contracts/firefly.json new file mode 100644 index 000000000..fdb5c7476 --- /dev/null +++ b/smart_contracts/ethereum/solidity_firefly/contracts/firefly.json @@ -0,0 +1,226 @@ +{ + "contracts": { + "Firefly.sol:Firefly": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "author", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "action", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "uuids", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "batchHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "payloadRef", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes32[]", + "name": "contexts", + "type": "bytes32[]" + } + ], + "name": "BatchPin", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "action", + "type": "string" + }, + { + "internalType": "string", + "name": "payload", + "type": "string" + } + ], + "name": "networkAction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "networkVersion", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "uuids", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "batchHash", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "payloadRef", + "type": "string" + }, + { + "internalType": "bytes32[]", + "name": "contexts", + "type": "bytes32[]" + } + ], + "name": "pinBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "pinBatchData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bin": "608060405234801561001057600080fd5b50610a5e806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806348ce1dcc146100515780635766032e1461006d57806397eacfe614610089578063fb9066c1146100a7575b600080fd5b61006b60048036038101906100669190610424565b6100c3565b005b6100876004803603810190610082919061051e565b61010a565b005b610091610178565b60405161009e9190610587565b60405180910390f35b6100c160048036038101906100bc91906105a2565b610181565b005b7f805721bc246bccc732581be0c0aa2dd8f7ec93e97ba4b307be84428c98b0a12f3242868686866040516100fc9695949392919061080c565b60405180910390a150505050565b600080606080858581019061011f9190610424565b809450819550829650839750505050507f805721bc246bccc732581be0c0aa2dd8f7ec93e97ba4b307be84428c98b0a12f324286868686604051610168969594939291906108da565b60405180910390a1505050505050565b60006002905090565b60607f805721bc246bccc732581be0c0aa2dd8f7ec93e97ba4b307be84428c98b0a12f32428560008087876040516101bf97969594939291906109a4565b60405180910390a1505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6101f3816101e0565b81146101fe57600080fd5b50565b600081359050610210816101ea565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61026982610220565b810181811067ffffffffffffffff8211171561028857610287610231565b5b80604052505050565b600061029b6101cc565b90506102a78282610260565b919050565b600067ffffffffffffffff8211156102c7576102c6610231565b5b6102d082610220565b9050602081019050919050565b82818337600083830152505050565b60006102ff6102fa846102ac565b610291565b90508281526020810184848401111561031b5761031a61021b565b5b6103268482856102dd565b509392505050565b600082601f83011261034357610342610216565b5b81356103538482602086016102ec565b91505092915050565b600067ffffffffffffffff82111561037757610376610231565b5b602082029050602081019050919050565b600080fd5b60006103a061039b8461035c565b610291565b905080838252602082019050602084028301858111156103c3576103c2610388565b5b835b818110156103ec57806103d88882610201565b8452602084019350506020810190506103c5565b5050509392505050565b600082601f83011261040b5761040a610216565b5b813561041b84826020860161038d565b91505092915050565b6000806000806080858703121561043e5761043d6101d6565b5b600061044c87828801610201565b945050602061045d87828801610201565b935050604085013567ffffffffffffffff81111561047e5761047d6101db565b5b61048a8782880161032e565b925050606085013567ffffffffffffffff8111156104ab576104aa6101db565b5b6104b7878288016103f6565b91505092959194509250565b600080fd5b60008083601f8401126104de576104dd610216565b5b8235905067ffffffffffffffff8111156104fb576104fa6104c3565b5b60208301915083600182028301111561051757610516610388565b5b9250929050565b60008060208385031215610535576105346101d6565b5b600083013567ffffffffffffffff811115610553576105526101db565b5b61055f858286016104c8565b92509250509250929050565b600060ff82169050919050565b6105818161056b565b82525050565b600060208201905061059c6000830184610578565b92915050565b600080604083850312156105b9576105b86101d6565b5b600083013567ffffffffffffffff8111156105d7576105d66101db565b5b6105e38582860161032e565b925050602083013567ffffffffffffffff811115610604576106036101db565b5b6106108582860161032e565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006106458261061a565b9050919050565b6106558161063a565b82525050565b6000819050919050565b61066e8161065b565b82525050565b600082825260208201905092915050565b7f66697265666c793a62617463685f70696e000000000000000000000000000000600082015250565b60006106bb601183610674565b91506106c682610685565b602082019050919050565b6106da816101e0565b82525050565b600081519050919050565b60005b838110156107095780820151818401526020810190506106ee565b60008484015250505050565b6000610720826106e0565b61072a8185610674565b935061073a8185602086016106eb565b61074381610220565b840191505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b610783816101e0565b82525050565b6000610795838361077a565b60208301905092915050565b6000602082019050919050565b60006107b98261074e565b6107c38185610759565b93506107ce8361076a565b8060005b838110156107ff5781516107e68882610789565b97506107f1836107a1565b9250506001810190506107d2565b5085935050505092915050565b600060e082019050610821600083018961064c565b61082e6020830188610665565b818103604083015261083f816106ae565b905061084e60608301876106d1565b61085b60808301866106d1565b81810360a083015261086d8185610715565b905081810360c083015261088181846107ae565b9050979650505050505050565b7f66697265666c793a636f6e74726163745f696e766f6b655f70696e0000000000600082015250565b60006108c4601b83610674565b91506108cf8261088e565b602082019050919050565b600060e0820190506108ef600083018961064c565b6108fc6020830188610665565b818103604083015261090d816108b7565b905061091c60608301876106d1565b61092960808301866106d1565b81810360a083015261093b8185610715565b905081810360c083015261094f81846107ae565b9050979650505050505050565b6000819050919050565b60008160001b9050919050565b600061098e6109896109848461095c565b610966565b6101e0565b9050919050565b61099e81610973565b82525050565b600060e0820190506109b9600083018a61064c565b6109c66020830189610665565b81810360408301526109d88188610715565b90506109e76060830187610995565b6109f46080830186610995565b81810360a0830152610a068185610715565b905081810360c0830152610a1a81846107ae565b90509897505050505050505056fea2646970667358221220d526f293310bf005fbf14d326584a76cbac3457f73b68185768d541f4170dcf264736f6c63430008150033" + }, + "IBatchPin.sol:IBatchPin": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "author", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "action", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "uuids", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "batchHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "payloadRef", + "type": "string" + }, + { + "indexed": false, + "internalType": "bytes32[]", + "name": "contexts", + "type": "bytes32[]" + } + ], + "name": "BatchPin", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "uuids", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "batchHash", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "payloadRef", + "type": "string" + }, + { + "internalType": "bytes32[]", + "name": "contexts", + "type": "bytes32[]" + } + ], + "name": "pinBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "pinBatchData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bin": "" + } + }, + "version": "0.8.21+commit.d9974bed.Darwin.appleclang" +} diff --git a/smart_contracts/fabric/custompin-sample/go.mod b/smart_contracts/fabric/custompin-sample/go.mod index 5f65fa123..5577683eb 100644 --- a/smart_contracts/fabric/custompin-sample/go.mod +++ b/smart_contracts/fabric/custompin-sample/go.mod @@ -1,39 +1,41 @@ module github.com/hyperledger/firefly/custompin_sample -go 1.18 +go 1.21 require ( - github.com/hyperledger/fabric-chaincode-go v0.0.0-20210718160520-38d29fabecb9 - github.com/hyperledger/fabric-contract-api-go v1.1.1 - github.com/hyperledger/fabric-protos-go v0.0.0-20210722220057-aa0602706126 - github.com/stretchr/testify v1.5.1 - google.golang.org/protobuf v1.23.0 + github.com/hyperledger/fabric-chaincode-go v0.0.0-20240124143825-7dec3c7e7d45 + github.com/hyperledger/fabric-contract-api-go v1.2.2 + github.com/hyperledger/fabric-protos-go v0.3.3 + github.com/stretchr/testify v1.8.4 + google.golang.org/protobuf v1.32.0 ) require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-openapi/jsonpointer v0.19.3 // indirect - github.com/go-openapi/jsonreference v0.19.2 // indirect - github.com/go-openapi/spec v0.19.4 // indirect - github.com/go-openapi/swag v0.19.5 // indirect - github.com/gobuffalo/envy v1.7.0 // indirect - github.com/gobuffalo/packd v0.3.0 // indirect + github.com/go-openapi/jsonpointer v0.20.2 // indirect + github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/spec v0.20.14 // indirect + github.com/go-openapi/swag v0.22.9 // indirect + github.com/gobuffalo/envy v1.10.2 // indirect + github.com/gobuffalo/packd v1.0.2 // indirect github.com/gobuffalo/packr v1.30.1 // indirect - github.com/joho/godotenv v1.3.0 // indirect - github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rogpeppe/go-internal v1.3.0 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect - golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 // indirect - golang.org/x/text v0.3.2 // indirect - google.golang.org/genproto v0.0.0-20180831171423-11092d34479b // indirect - google.golang.org/grpc v1.23.0 // indirect - gopkg.in/yaml.v2 v2.2.8 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/grpc v1.61.0 // indirect ) -require github.com/golang/protobuf v1.4.3 // indirect +require ( + github.com/golang/protobuf v1.5.3 + github.com/josharian/intern v1.0.0 // indirect + golang.org/x/mod v0.14.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/smart_contracts/fabric/custompin-sample/go.sum b/smart_contracts/fabric/custompin-sample/go.sum index 1f25dd116..b6c804998 100644 --- a/smart_contracts/fabric/custompin-sample/go.sum +++ b/smart_contracts/fabric/custompin-sample/go.sum @@ -1,92 +1,75 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/DATA-DOG/go-txdb v0.1.3/go.mod h1:DhAhxMXZpUJVGnT+p9IbzJoRKvlArO2pkHjnGX7o0n0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cucumber/godog v0.8.0/go.mod h1:Cp3tEV1LRAyH/RuCThcxHS/+9ORZ+FMzPva2AZ5Ki+A= 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= -github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= +github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= +github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.10.2 h1:EIi03p9c3yeuRCFPOKcSfajzkLb3hrRjEpHGI8I2Wo4= +github.com/gobuffalo/envy v1.10.2/go.mod h1:qGAGwdvDsaEtPhfBzb3o0SfDea8ByGn9j8bKmVft9z8= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packd v1.0.2 h1:Yg523YqnOxGIWCp69W12yYBKsoChwI7mtu6ceM9Bwfw= +github.com/gobuffalo/packd v1.0.2/go.mod h1:sUc61tDqGMXON80zpKGp92lDb86Km28jfvX7IAyxFT8= github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg= github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk= github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212/go.mod h1:N7H3sA7Tx4k/YzFq7U0EPdqJtqvM4Kild0JoCc7C0Dc= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20210718160520-38d29fabecb9 h1:1cAZHHrBYFrX3bwQGhOZtOB4sCM9QWVppd81O8vsPXs= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20210718160520-38d29fabecb9/go.mod h1:N7H3sA7Tx4k/YzFq7U0EPdqJtqvM4Kild0JoCc7C0Dc= -github.com/hyperledger/fabric-contract-api-go v1.1.1 h1:gDhOC18gjgElNZ85kFWsbCQq95hyUP/21n++m0Sv6B0= -github.com/hyperledger/fabric-contract-api-go v1.1.1/go.mod h1:+39cWxbh5py3NtXpRA63rAH7NzXyED+QJx1EZr0tJPo= -github.com/hyperledger/fabric-protos-go v0.0.0-20190919234611-2a87503ac7c9/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= -github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= -github.com/hyperledger/fabric-protos-go v0.0.0-20210722220057-aa0602706126 h1:jjppcoV8XfVpJzClSuN0aREBYPi4EuRInDCeE6fNnjg= -github.com/hyperledger/fabric-protos-go v0.0.0-20210722220057-aa0602706126/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= +github.com/hyperledger/fabric-chaincode-go v0.0.0-20240124143825-7dec3c7e7d45 h1:tZeJCTwbAE3cwi6XId+dYd/gTtfTKzZ3uEb1ksvQf7I= +github.com/hyperledger/fabric-chaincode-go v0.0.0-20240124143825-7dec3c7e7d45/go.mod h1:YZBt6/ZlJCzyPoWecbfFp34G+ZIYKodTQA46c0sxHIk= +github.com/hyperledger/fabric-contract-api-go v1.2.2 h1:zun9/BmaIWFSSOkfQXikdepK0XDb7MkJfc/lb5j3ku8= +github.com/hyperledger/fabric-contract-api-go v1.2.2/go.mod h1:UnFLlRFn8GvXE7mXxWtU+bESM7fb5YzsKo1DA16vvaE= +github.com/hyperledger/fabric-protos-go v0.3.3 h1:0nssqz8QWJNVNBVQz+IIfAd2j1ku7QPKFSM/1anKizI= +github.com/hyperledger/fabric-protos-go v0.3.3/go.mod h1:BPXse9gIOQwyAePQrwQVUcc44bTW4bB5V3tujuvyArk= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/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= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= 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/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -97,15 +80,17 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= @@ -113,54 +98,40 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 h1:6ZQFf1D2YYDDI7eSwW8adlkkavTB9sw5I24FVtEvNUQ= -golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b h1:lohp5blsw53GBXtLyLNaTXPXS9pJ1tiTw61ZHUoE9Qw= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +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.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/smart_contracts/fabric/firefly-go/Dockerfile b/smart_contracts/fabric/firefly-go/Dockerfile index 4329d558e..ff5b3391e 100644 --- a/smart_contracts/fabric/firefly-go/Dockerfile +++ b/smart_contracts/fabric/firefly-go/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.18 +FROM golang:1.21 WORKDIR /app COPY firefly.go go.mod go.sum ./ diff --git a/smart_contracts/fabric/firefly-go/go.mod b/smart_contracts/fabric/firefly-go/go.mod index 7c7d520ab..11f2be79f 100644 --- a/smart_contracts/fabric/firefly-go/go.mod +++ b/smart_contracts/fabric/firefly-go/go.mod @@ -1,38 +1,38 @@ module github.com/hyperledger/firefly/chaincode-go -go 1.18 +go 1.21 require ( - github.com/golang/protobuf v1.4.3 - github.com/hyperledger/fabric-chaincode-go v0.0.0-20210718160520-38d29fabecb9 - github.com/hyperledger/fabric-contract-api-go v1.1.1 - github.com/hyperledger/fabric-protos-go v0.0.0-20210722220057-aa0602706126 - github.com/stretchr/testify v1.5.1 - google.golang.org/protobuf v1.23.0 + github.com/golang/protobuf v1.5.3 + github.com/hyperledger/fabric-chaincode-go v0.0.0-20240124143825-7dec3c7e7d45 + github.com/hyperledger/fabric-contract-api-go v1.2.2 + github.com/hyperledger/fabric-protos-go v0.3.3 + github.com/stretchr/testify v1.8.4 + google.golang.org/protobuf v1.32.0 ) require ( - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/go-openapi/jsonpointer v0.19.3 // indirect - github.com/go-openapi/jsonreference v0.19.2 // indirect - github.com/go-openapi/spec v0.19.4 // indirect - github.com/go-openapi/swag v0.19.5 // indirect - github.com/gobuffalo/envy v1.7.0 // indirect - github.com/gobuffalo/packd v0.3.0 // indirect + github.com/go-openapi/jsonpointer v0.20.2 // indirect + github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/spec v0.20.14 // indirect + github.com/go-openapi/swag v0.22.9 // indirect + github.com/gobuffalo/envy v1.10.2 // indirect + github.com/gobuffalo/packd v1.0.2 // indirect github.com/gobuffalo/packr v1.30.1 // indirect - github.com/joho/godotenv v1.3.0 // indirect - github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rogpeppe/go-internal v1.3.0 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect - golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 // indirect - golang.org/x/text v0.3.2 // indirect - google.golang.org/genproto v0.0.0-20180831171423-11092d34479b // indirect - google.golang.org/grpc v1.23.0 // indirect - gopkg.in/yaml.v2 v2.2.8 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + google.golang.org/grpc v1.61.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/smart_contracts/fabric/firefly-go/go.sum b/smart_contracts/fabric/firefly-go/go.sum index 1f25dd116..b6c804998 100644 --- a/smart_contracts/fabric/firefly-go/go.sum +++ b/smart_contracts/fabric/firefly-go/go.sum @@ -1,92 +1,75 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/DATA-DOG/go-txdb v0.1.3/go.mod h1:DhAhxMXZpUJVGnT+p9IbzJoRKvlArO2pkHjnGX7o0n0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cucumber/godog v0.8.0/go.mod h1:Cp3tEV1LRAyH/RuCThcxHS/+9ORZ+FMzPva2AZ5Ki+A= 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= -github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= +github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= +github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.10.2 h1:EIi03p9c3yeuRCFPOKcSfajzkLb3hrRjEpHGI8I2Wo4= +github.com/gobuffalo/envy v1.10.2/go.mod h1:qGAGwdvDsaEtPhfBzb3o0SfDea8ByGn9j8bKmVft9z8= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packd v1.0.2 h1:Yg523YqnOxGIWCp69W12yYBKsoChwI7mtu6ceM9Bwfw= +github.com/gobuffalo/packd v1.0.2/go.mod h1:sUc61tDqGMXON80zpKGp92lDb86Km28jfvX7IAyxFT8= github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg= github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk= github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212/go.mod h1:N7H3sA7Tx4k/YzFq7U0EPdqJtqvM4Kild0JoCc7C0Dc= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20210718160520-38d29fabecb9 h1:1cAZHHrBYFrX3bwQGhOZtOB4sCM9QWVppd81O8vsPXs= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20210718160520-38d29fabecb9/go.mod h1:N7H3sA7Tx4k/YzFq7U0EPdqJtqvM4Kild0JoCc7C0Dc= -github.com/hyperledger/fabric-contract-api-go v1.1.1 h1:gDhOC18gjgElNZ85kFWsbCQq95hyUP/21n++m0Sv6B0= -github.com/hyperledger/fabric-contract-api-go v1.1.1/go.mod h1:+39cWxbh5py3NtXpRA63rAH7NzXyED+QJx1EZr0tJPo= -github.com/hyperledger/fabric-protos-go v0.0.0-20190919234611-2a87503ac7c9/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= -github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= -github.com/hyperledger/fabric-protos-go v0.0.0-20210722220057-aa0602706126 h1:jjppcoV8XfVpJzClSuN0aREBYPi4EuRInDCeE6fNnjg= -github.com/hyperledger/fabric-protos-go v0.0.0-20210722220057-aa0602706126/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= +github.com/hyperledger/fabric-chaincode-go v0.0.0-20240124143825-7dec3c7e7d45 h1:tZeJCTwbAE3cwi6XId+dYd/gTtfTKzZ3uEb1ksvQf7I= +github.com/hyperledger/fabric-chaincode-go v0.0.0-20240124143825-7dec3c7e7d45/go.mod h1:YZBt6/ZlJCzyPoWecbfFp34G+ZIYKodTQA46c0sxHIk= +github.com/hyperledger/fabric-contract-api-go v1.2.2 h1:zun9/BmaIWFSSOkfQXikdepK0XDb7MkJfc/lb5j3ku8= +github.com/hyperledger/fabric-contract-api-go v1.2.2/go.mod h1:UnFLlRFn8GvXE7mXxWtU+bESM7fb5YzsKo1DA16vvaE= +github.com/hyperledger/fabric-protos-go v0.3.3 h1:0nssqz8QWJNVNBVQz+IIfAd2j1ku7QPKFSM/1anKizI= +github.com/hyperledger/fabric-protos-go v0.3.3/go.mod h1:BPXse9gIOQwyAePQrwQVUcc44bTW4bB5V3tujuvyArk= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/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= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= 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/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -97,15 +80,17 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= @@ -113,54 +98,40 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 h1:6ZQFf1D2YYDDI7eSwW8adlkkavTB9sw5I24FVtEvNUQ= -golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b h1:lohp5blsw53GBXtLyLNaTXPXS9pJ1tiTw61ZHUoE9Qw= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +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.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/test/data/contracts/assetcreator/go.mod b/test/data/contracts/assetcreator/go.mod index 598aa0736..a90777bf1 100644 --- a/test/data/contracts/assetcreator/go.mod +++ b/test/data/contracts/assetcreator/go.mod @@ -1,11 +1,35 @@ module github.com/hyperledger/firefly/test/data/assetcreator -go 1.14 +go 1.21 + +toolchain go1.21.0 + +require github.com/hyperledger/fabric-contract-api-go v1.2.2 require ( - github.com/golang/protobuf v1.3.2 - github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212 - github.com/hyperledger/fabric-contract-api-go v1.1.0 - github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e - github.com/stretchr/testify v1.5.1 + github.com/go-openapi/jsonpointer v0.20.2 // indirect + github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/spec v0.20.14 // indirect + github.com/go-openapi/swag v0.22.9 // indirect + github.com/gobuffalo/envy v1.10.2 // indirect + github.com/gobuffalo/packd v1.0.2 // indirect + github.com/gobuffalo/packr v1.30.1 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/hyperledger/fabric-chaincode-go v0.0.0-20240124143825-7dec3c7e7d45 // indirect + github.com/hyperledger/fabric-protos-go v0.3.3 // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe // indirect + google.golang.org/grpc v1.61.0 // indirect + google.golang.org/protobuf v1.32.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/test/data/contracts/assetcreator/go.sum b/test/data/contracts/assetcreator/go.sum index 5a92905ba..b6c804998 100644 --- a/test/data/contracts/assetcreator/go.sum +++ b/test/data/contracts/assetcreator/go.sum @@ -1,80 +1,75 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/DATA-DOG/go-txdb v0.1.3/go.mod h1:DhAhxMXZpUJVGnT+p9IbzJoRKvlArO2pkHjnGX7o0n0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cucumber/godog v0.8.0/go.mod h1:Cp3tEV1LRAyH/RuCThcxHS/+9ORZ+FMzPva2AZ5Ki+A= 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/spec v0.19.4 h1:ixzUSnHTd6hCemgtAJgluaTSGYpLNpJY4mA2DIkdOAo= -github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= +github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= +github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= +github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.10.2 h1:EIi03p9c3yeuRCFPOKcSfajzkLb3hrRjEpHGI8I2Wo4= +github.com/gobuffalo/envy v1.10.2/go.mod h1:qGAGwdvDsaEtPhfBzb3o0SfDea8ByGn9j8bKmVft9z8= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= +github.com/gobuffalo/packd v1.0.2 h1:Yg523YqnOxGIWCp69W12yYBKsoChwI7mtu6ceM9Bwfw= +github.com/gobuffalo/packd v1.0.2/go.mod h1:sUc61tDqGMXON80zpKGp92lDb86Km28jfvX7IAyxFT8= github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg= github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk= github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212 h1:1i4lnpV8BDgKOLi1hgElfBqdHXjXieSuj8629mwBZ8o= -github.com/hyperledger/fabric-chaincode-go v0.0.0-20200424173110-d7076418f212/go.mod h1:N7H3sA7Tx4k/YzFq7U0EPdqJtqvM4Kild0JoCc7C0Dc= -github.com/hyperledger/fabric-contract-api-go v1.1.0 h1:K9uucl/6eX3NF0/b+CGIiO1IPm1VYQxBkpnVGJur2S4= -github.com/hyperledger/fabric-contract-api-go v1.1.0/go.mod h1:nHWt0B45fK53owcFpLtAe8DH0Q5P068mnzkNXMPSL7E= -github.com/hyperledger/fabric-protos-go v0.0.0-20190919234611-2a87503ac7c9/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= -github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e h1:9PS5iezHk/j7XriSlNuSQILyCOfcZ9wZ3/PiucmSE8E= -github.com/hyperledger/fabric-protos-go v0.0.0-20200424173316-dd554ba3746e/go.mod h1:xVYTjK4DtZRBxZ2D9aE4y6AbLaPwue2o/criQyQbVD0= +github.com/hyperledger/fabric-chaincode-go v0.0.0-20240124143825-7dec3c7e7d45 h1:tZeJCTwbAE3cwi6XId+dYd/gTtfTKzZ3uEb1ksvQf7I= +github.com/hyperledger/fabric-chaincode-go v0.0.0-20240124143825-7dec3c7e7d45/go.mod h1:YZBt6/ZlJCzyPoWecbfFp34G+ZIYKodTQA46c0sxHIk= +github.com/hyperledger/fabric-contract-api-go v1.2.2 h1:zun9/BmaIWFSSOkfQXikdepK0XDb7MkJfc/lb5j3ku8= +github.com/hyperledger/fabric-contract-api-go v1.2.2/go.mod h1:UnFLlRFn8GvXE7mXxWtU+bESM7fb5YzsKo1DA16vvaE= +github.com/hyperledger/fabric-protos-go v0.3.3 h1:0nssqz8QWJNVNBVQz+IIfAd2j1ku7QPKFSM/1anKizI= +github.com/hyperledger/fabric-protos-go v0.3.3/go.mod h1:BPXse9gIOQwyAePQrwQVUcc44bTW4bB5V3tujuvyArk= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/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= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= 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/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -85,15 +80,17 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= @@ -101,45 +98,40 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542 h1:6ZQFf1D2YYDDI7eSwW8adlkkavTB9sw5I24FVtEvNUQ= -golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b h1:lohp5blsw53GBXtLyLNaTXPXS9pJ1tiTw61ZHUoE9Qw= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= +google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +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.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/test/data/contracts/reverter/reverter.json b/test/data/contracts/reverter/reverter.json new file mode 100644 index 000000000..7084eb751 --- /dev/null +++ b/test/data/contracts/reverter/reverter.json @@ -0,0 +1 @@ +{"contracts":{"reverter.sol:Reverter":{"abi":[{"inputs":[],"name":"goBang","outputs":[],"stateMutability":"pure","type":"function"}],"bin":"608060405234801561001057600080fd5b5061011b806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063060846fb14602d575b600080fd5b60336035565b005b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040160659060c7565b60405180910390fd5b600082825260208201905092915050565b7f42616e6721000000000000000000000000000000000000000000000000000000600082015250565b600060b3600583606e565b915060bc82607f565b602082019050919050565b6000602082019050818103600083015260de8160a8565b905091905056fea26469706673582212204c5a121fa1ad563532a26d368380482d34f0eee629e860671f518ec7af2fc2c064736f6c63430008170033"}},"version":"0.8.23+commit.f704f362.Darwin.appleclang"} diff --git a/test/data/contracts/reverter/reverter.sol b/test/data/contracts/reverter/reverter.sol new file mode 100644 index 000000000..4628d5efb --- /dev/null +++ b/test/data/contracts/reverter/reverter.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity >=0.6.0 <0.9.0; + +contract Reverter { + function goBang() pure public { + revert("Bang!"); + } +} \ No newline at end of file diff --git a/test/e2e/client/restclient.go b/test/e2e/client/restclient.go index ac9499e54..abd5c368a 100644 --- a/test/e2e/client/restclient.go +++ b/test/e2e/client/restclient.go @@ -824,15 +824,20 @@ func (client *FireFlyClient) DeleteContractListener(t *testing.T, id *fftypes.UU func (client *FireFlyClient) InvokeContractMethod(t *testing.T, req *core.ContractCallRequest, expectedStatus ...int) (interface{}, error) { var res interface{} path := client.namespaced(urlContractInvoke) + var errResult fftypes.RESTError resp, err := client.Client.R(). SetBody(req). SetResult(&res). + SetError(&errResult). Post(path) require.NoError(t, err) if len(expectedStatus) == 0 { expectedStatus = []int{202} } require.Equal(t, expectedStatus[0], resp.StatusCode(), "POST %s [%d]: %s", path, resp.StatusCode(), resp.String()) + if err == nil && errResult.Error != "" { + return res, fmt.Errorf(errResult.Error) + } return res, err } diff --git a/test/e2e/deploy_chaincode.sh b/test/e2e/deploy_chaincode.sh index 5282a5cc9..e40151739 100755 --- a/test/e2e/deploy_chaincode.sh +++ b/test/e2e/deploy_chaincode.sh @@ -39,7 +39,7 @@ VOLUMES="\ " CA_PARAMS="--tls --cafile ${ORDERER_DIR}/orderers/fabric_orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -RUN="docker run --rm --network=${NETWORK} ${ENV_VARS} ${VOLUMES} hyperledger/fabric-tools:2.4" +RUN="docker run --rm --network=${NETWORK} ${ENV_VARS} ${VOLUMES} hyperledger/fabric-tools:2.5" echo "Using name ${CHAINCODE_NAME}" echo "Installing chaincode from ${CHAINCODE}..." diff --git a/test/e2e/e2e.go b/test/e2e/e2e.go index 04c45221d..41cfe1658 100644 --- a/test/e2e/e2e.go +++ b/test/e2e/e2e.go @@ -138,7 +138,7 @@ func WaitForEvent(t *testing.T, c chan *core.EventDelivery, eventType core.Event t.Logf("Detected '%s' event for ref '%s'", ed.Type, ed.Reference) return } - t.Logf("Ignored event '%s'", ed.ID) + t.Logf("Ignored event '%s' [%s]", ed.ID, ed.Type) } } @@ -149,7 +149,7 @@ func WaitForMessageConfirmed(t *testing.T, c chan *core.EventDelivery, msgType c t.Logf("Detected '%s' event for message '%s' of type '%s'", ed.Type, ed.Message.Header.ID, msgType) return ed } - t.Logf("Ignored event '%s'", ed.ID) + t.Logf("Ignored event '%s' [%s]", ed.ID, ed.Type) } } @@ -160,7 +160,7 @@ func WaitForMessageRejected(t *testing.T, c chan *core.EventDelivery, msgType co t.Logf("Detected '%s' event for message '%s' of type '%s'", ed.Type, ed.Message.Header.ID, msgType) return ed } - t.Logf("Ignored event '%s'", ed.ID) + t.Logf("Ignored event '%s' [%s]", ed.ID, ed.Type) } } @@ -171,7 +171,7 @@ func WaitForIdentityConfirmed(t *testing.T, c chan *core.EventDelivery) *core.Ev t.Logf("Detected '%s' event for identity '%s'", ed.Type, ed.Reference) return ed } - t.Logf("Ignored event '%s'", ed.ID) + t.Logf("Ignored event '%s' [%s]", ed.ID, ed.Type) } } @@ -256,3 +256,17 @@ func VerifyAllOperationsSucceeded(t *testing.T, clients []*client.FireFlyClient, assert.Fail(t, pending) } + +func VerifyOperationsAlreadyMarkedFailed(t *testing.T, clients []*client.FireFlyClient, startTime time.Time) { + // Note we do NOT wait in this function - use this function when failure should already have been recorded, + // and the work has been done in FF Core to ensure that is reflected in the operation cache. + pending := "" + for _, client := range clients { + for _, op := range client.GetOperations(t, startTime) { + if op.Status != core.OpStatusFailed { + pending += fmt.Sprintf("Operation '%s' (%s) on '%s' status=%s\n", op.ID, op.Type, client.Client.BaseURL, op.Status) + } + } + } + assert.Empty(t, pending, pending) +} diff --git a/test/e2e/gateway/ethereum_revert.go b/test/e2e/gateway/ethereum_revert.go new file mode 100644 index 000000000..f5f72034b --- /dev/null +++ b/test/e2e/gateway/ethereum_revert.go @@ -0,0 +1,97 @@ +// Copyright © 2023 Kaleido, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gateway + +import ( + "encoding/json" + "fmt" + + "github.com/go-resty/resty/v2" + "github.com/hyperledger/firefly-common/pkg/fftypes" + "github.com/hyperledger/firefly/pkg/core" + "github.com/hyperledger/firefly/test/e2e" + "github.com/hyperledger/firefly/test/e2e/client" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/suite" +) + +type EthereumRevertTestSuite struct { + suite.Suite + testState *testState + contractAddress string + ethClient *resty.Client + ethIdentity string + abi *fftypes.JSONAny +} + +func (suite *EthereumRevertTestSuite) SetupSuite() { + suite.testState = beforeE2ETest(suite.T()) + stack := e2e.ReadStack(suite.T()) + stackState := e2e.ReadStackState(suite.T()) + suite.ethClient = client.NewResty(suite.T()) + suite.ethClient.SetBaseURL(fmt.Sprintf("http://localhost:%d", stack.Members[0].ExposedConnectorPort)) + account := stackState.Accounts[0].(map[string]interface{}) + suite.ethIdentity = account["address"].(string) + suite.abi, suite.contractAddress = deployTestContractFromCompiledJSON(suite.T(), stack.Name, "reverter/reverter.json") +} + +func (suite *EthereumRevertTestSuite) BeforeTest(suiteName, testName string) { + suite.testState = beforeE2ETest(suite.T()) +} + +func (suite *EthereumRevertTestSuite) AfterTest(suiteName, testName string) { + // Important part of the test - the status of the operation must go to Failed - immediately. + // We should not encounter an "Initialized" status + e2e.VerifyOperationsAlreadyMarkedFailed(suite.T(), []*client.FireFlyClient{suite.testState.client1}, suite.testState.startTime) +} + +func (suite *EthereumRevertTestSuite) TestRevertTransitionsToFailed() { + defer suite.testState.Done() + + type generateInput struct { + ABI *fftypes.JSONAny `json:"abi"` + } + inputBytes, err := json.Marshal(&generateInput{ABI: suite.abi}) + assert.NoError(suite.T(), err) + + ffi := suite.testState.client1.GenerateFFIFromABI(suite.T(), &fftypes.FFIGenerationRequest{ + Input: fftypes.JSONAnyPtrBytes(inputBytes), + }) + assert.NoError(suite.T(), err) + var goBang *fftypes.FFIMethod + for _, m := range ffi.Methods { + if m.Name == "goBang" { + goBang = m + } + } + assert.NotNil(suite.T(), goBang) + + location := map[string]interface{}{ + "address": suite.contractAddress, + } + locationBytes, _ := json.Marshal(location) + invokeContractRequest := &core.ContractCallRequest{ + IdempotencyKey: core.IdempotencyKey(fftypes.NewUUID().String()), + Location: fftypes.JSONAnyPtrBytes(locationBytes), + Method: goBang, + Input: map[string]interface{}{}, + } + + // Check we get the revert error all the way back through the API on the invoke, due to the gas estimation + _, err = suite.testState.client1.InvokeContractMethod(suite.T(), invokeContractRequest, 500) + assert.Regexp(suite.T(), "FF10111.*Bang!", err) +} diff --git a/test/e2e/gateway/ethereum_simplestorage.go b/test/e2e/gateway/ethereum_simplestorage.go index e1d277e1e..f691f4aba 100644 --- a/test/e2e/gateway/ethereum_simplestorage.go +++ b/test/e2e/gateway/ethereum_simplestorage.go @@ -19,6 +19,7 @@ package gateway import ( "encoding/json" "fmt" + "os" "os/exec" "testing" @@ -93,16 +94,40 @@ func simpleStorageFFIGet() *fftypes.FFIMethod { } } -func deploySimpleStorageContract(t *testing.T, stackName, contract string) string { +func deployTestContractFromCompiledJSON(t *testing.T, stackName, contract string) (*fftypes.JSONAny, string) { path := "../../data/contracts/" + contract out, err := exec.Command("ff", "deploy", "ethereum", stackName, path).Output() - require.NoError(t, err) + var stderr []byte + if err != nil { + stderr = err.(*exec.ExitError).Stderr + } + require.NoError(t, err, fmt.Sprintf("ff deploy failed: %s", stderr)) var output map[string]interface{} err = json.Unmarshal(out, &output) require.NoError(t, err) address := output["address"].(string) t.Logf("Contract address: %s", address) - return address + + type solcJSON struct { + Contracts map[string]struct { + ABI *fftypes.JSONAny `json:"abi"` + } `json:"contracts"` + } + b, err := os.ReadFile(path) + assert.NoError(t, err) + var contractJSON solcJSON + err = json.Unmarshal(b, &contractJSON) + assert.NoError(t, err) + + var abiBytes *fftypes.JSONAny + for _, contract := range contractJSON.Contracts { + abiBytes = contract.ABI + if abiBytes != nil { + break + } + } + assert.NotNil(t, abiBytes) + return abiBytes, address } type EthereumSimpleStorageTestSuite struct { @@ -122,7 +147,7 @@ func (suite *EthereumSimpleStorageTestSuite) SetupSuite() { suite.ethClient.SetBaseURL(fmt.Sprintf("http://localhost:%d", stack.Members[0].ExposedConnectorPort)) account := stackState.Accounts[0].(map[string]interface{}) suite.ethIdentity = account["address"].(string) - suite.contractAddress = deploySimpleStorageContract(suite.T(), stack.Name, "simplestorage/simple_storage.json") + _, suite.contractAddress = deployTestContractFromCompiledJSON(suite.T(), stack.Name, "simplestorage/simple_storage.json") res, err := suite.testState.client1.CreateFFI(suite.T(), simpleStorageFFI(), false) suite.interfaceID = res.ID diff --git a/test/e2e/multiparty/contract_migration.go b/test/e2e/multiparty/contract_migration.go index 864af34e5..e9ec6ae0e 100644 --- a/test/e2e/multiparty/contract_migration.go +++ b/test/e2e/multiparty/contract_migration.go @@ -108,7 +108,7 @@ func runMigrationTest(suite *ContractMigrationTestSuite, address1, address2 stri e2e.PollForUp(suite.T(), client1) e2e.PollForUp(suite.T(), client2) - eventNames := "message_confirmed|blockchain_event_received" + eventNames := "message_confirmed|blockchain_event_received|identity_confirmed" queryString := fmt.Sprintf("namespace=%s&ephemeral&autoack&filter.events=%s", testNamespace, eventNames) received1 := e2e.WsReader(client1.WebSocket(suite.T(), queryString, nil)) received2 := e2e.WsReader(client2.WebSocket(suite.T(), queryString, nil)) @@ -149,6 +149,15 @@ func runMigrationTest(suite *ContractMigrationTestSuite, address1, address2 stri client2.RegisterSelfOrg(suite.T(), true) client2.RegisterSelfNode(suite.T(), true) + // Wait for the orgs to propagate (org2 to node1, and org1 to node 2) + orgConfs := append([]*core.EventDelivery{}, e2e.WaitForIdentityConfirmed(suite.T(), received1)) + orgConfs = append(orgConfs, e2e.WaitForIdentityConfirmed(suite.T(), received1)) + orgConfs = append(orgConfs, e2e.WaitForIdentityConfirmed(suite.T(), received2)) + orgConfs = append(orgConfs, e2e.WaitForIdentityConfirmed(suite.T(), received2)) + for _, oc := range orgConfs { + assert.Regexp(suite.T(), fmt.Sprintf("%s|%s", suite.testState.org1.Name, suite.testState.org2.Name), oc.Identity.DID) + } + // Migrate to the new contract client1.NetworkAction(suite.T(), core.NetworkActionTerminate) e2e.WaitForContractEvent(suite.T(), client1, received1, map[string]interface{}{ diff --git a/test/e2e/multiparty/ethereum_contracts.go b/test/e2e/multiparty/ethereum_contracts.go index 0cd68972d..06a605395 100644 --- a/test/e2e/multiparty/ethereum_contracts.go +++ b/test/e2e/multiparty/ethereum_contracts.go @@ -233,7 +233,7 @@ func (suite *EthereumContractTestSuite) TestFFIInvokeMethod() { // Idempotency check _, err = suite.testState.client1.InvokeContractMethod(suite.T(), invokeContractRequest, 409) - assert.NoError(suite.T(), err) + assert.Regexp(suite.T(), "FF10431|FF10458" /* idempotency check could come from FF or blockchain connector, depending on the operation update that is async */, err) match := map[string]interface{}{ "info": map[string]interface{}{ diff --git a/test/e2e/runners/ethereum_gateway_test.go b/test/e2e/runners/ethereum_gateway_test.go index dc26864f2..00aca2d4c 100644 --- a/test/e2e/runners/ethereum_gateway_test.go +++ b/test/e2e/runners/ethereum_gateway_test.go @@ -24,6 +24,16 @@ import ( ) func TestEthereumGatewayE2ESuite(t *testing.T) { + suite.Run(t, new(gateway.TokensTestSuite)) + suite.Run(t, new(gateway.EthereumCouponTestSuite)) + suite.Run(t, new(gateway.EthereumSimpleStorageTestSuite)) + suite.Run(t, new(gateway.EthereumRevertTestSuite)) + suite.Run(t, new(gateway.TokensOnlyTestSuite)) +} + +func TestEthereumGatewayLegacyEthE2ESuite(t *testing.T) { + // Note EthereumRevertTestSuite does not work with legacy EthConnect, as the + // submissionRejected boolean is only supported by the EVMConnect (FFTM) generation. suite.Run(t, new(gateway.TokensTestSuite)) suite.Run(t, new(gateway.EthereumCouponTestSuite)) suite.Run(t, new(gateway.EthereumSimpleStorageTestSuite))