diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 000000000..e5b6d8d6a --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 000000000..634bfce58 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@2.0.0/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..6751428a9 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,20 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + } +} diff --git a/.github/actions/build-test-image/action.yml b/.github/actions/build-test-image/action.yml new file mode 100644 index 000000000..29c5fa853 --- /dev/null +++ b/.github/actions/build-test-image/action.yml @@ -0,0 +1,53 @@ +name: Build Test Image +description: A composite action that allows building and publishing the test remote runner image + +inputs: + tag: + description: The tag to use by default and to use for checking image existance + default: ${{ github.sha }} + required: false + other_tags: + description: Other tags to push if needed + required: false + QA_AWS_ROLE_TO_ASSUME: + description: The AWS role to assume as the CD user, if any. Used in configuring the docker/login-action + required: true + QA_AWS_REGION: + description: The AWS region the ECR repository is located in, should only be needed for public ECR repositories, used in configuring docker/login-action + required: true + QA_AWS_ACCOUNT_NUMBER: + description: The AWS region the ECR repository is located in, should only be needed for public ECR repositories, used in configuring docker/login-action + required: true + +runs: + using: composite + steps: + - name: Install Cairo + uses: ./.github/actions/install-cairo + - name: Check if image exists + id: check-image + uses: smartcontractkit/chainlink-github-actions/docker/image-exists@fc3e0df622521019f50d772726d6bf8dc919dd38 # v2.3.19 + with: + repository: chainlink-starknet-tests + tag: ${{ inputs.tag }} + AWS_REGION: ${{ inputs.QA_AWS_REGION }} + AWS_ROLE_TO_ASSUME: ${{ inputs.QA_AWS_ROLE_TO_ASSUME }} + - name: Build and Publish Test Runner + if: steps.check-image.outputs.exists == 'false' + uses: smartcontractkit/chainlink-github-actions/docker/build-push@fc3e0df622521019f50d772726d6bf8dc919dd38 # v2.3.19 + with: + tags: | + ${{ inputs.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ inputs.QA_AWS_REGION }}.amazonaws.com/chainlink-starknet-tests:${{ inputs.tag }} + ${{ inputs.other_tags }} + file: ./integration-tests/test.Dockerfile + build-args: | + SUITES="smoke soak" + AWS_REGION: ${{ inputs.QA_AWS_REGION }} + AWS_ROLE_TO_ASSUME: ${{ inputs.QA_AWS_ROLE_TO_ASSUME }} + - name: Print Image Built + env: + INPUTS_TAG: ${{ inputs.tag }} + shell: sh + run: | + echo "### chainlink-starknet-tests image tag for this test run :ship:" >> $GITHUB_STEP_SUMMARY + echo "\`${INPUTS_TAG}\`" >> $GITHUB_STEP_SUMMARY diff --git a/.github/actions/install-cairo/action.yml b/.github/actions/install-cairo/action.yml new file mode 100644 index 000000000..d3f1524d6 --- /dev/null +++ b/.github/actions/install-cairo/action.yml @@ -0,0 +1,33 @@ +name: Install Cairo and Scarb +description: A composite action that installs cairo and scarb binaries + +inputs: + cairo_version: + description: Cairo release version + default: "v2.6.4" + required: false + scarb_version: + description: Scarb release version + default: "v2.6.5" + required: false + +runs: + using: composite + steps: + - name: Setup Cairo for Linux + id: install-cairo + shell: bash + run: | + wget https://github.com/starkware-libs/cairo/releases/download/${{ inputs.cairo_version }}/release-x86_64-unknown-linux-musl.tar.gz + tar -xvzf release-x86_64-unknown-linux-musl.tar.gz + mv -vf cairo cairo-build + echo "$GITHUB_WORKSPACE/cairo-build/bin" >> $GITHUB_PATH + + - name: Setup Scarb for Linux + id: install-scarb + shell: bash + run: | + wget https://github.com/software-mansion/scarb/releases/download/${{ inputs.scarb_version }}/scarb-${{ inputs.scarb_version }}-x86_64-unknown-linux-musl.tar.gz + tar -xvzf scarb-${{ inputs.scarb_version }}-x86_64-unknown-linux-musl.tar.gz + mv -vf scarb-${{ inputs.scarb_version }}-x86_64-unknown-linux-musl scarb-build + echo "$GITHUB_WORKSPACE/scarb-build/bin" >> $GITHUB_PATH diff --git a/.github/actions/install-starknet-foundry/action.yml b/.github/actions/install-starknet-foundry/action.yml new file mode 100644 index 000000000..02b9b59dc --- /dev/null +++ b/.github/actions/install-starknet-foundry/action.yml @@ -0,0 +1,19 @@ +name: Install Starknet Foundry (snforge and sncast) +description: A composite action that installs the snforge and sncast binaries + +inputs: + starknet_foundry_version: + description: Starknet Foundry release version + default: "0.21.0" + required: false + +runs: + using: composite + steps: + - name: Setup Starknet Foundry for Linux + id: install-starknet-foundry + shell: bash + run: | + curl -L https://raw.githubusercontent.com/foundry-rs/starknet-foundry/master/scripts/install.sh | sh + snfoundryup -v ${{ inputs.starknet_foundry_version }} + diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..ec19129b5 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,9 @@ +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/changesets.yml b/.github/workflows/changesets.yml new file mode 100644 index 000000000..f50209903 --- /dev/null +++ b/.github/workflows/changesets.yml @@ -0,0 +1,46 @@ +name: Changesets + +on: + push: + branches: + - main + +jobs: + changesets: + name: Changesets + runs-on: ubuntu-latest + steps: + # Checkout this repository + - name: Checkout Repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + # Install nix + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + # Install dependencies using yarn + - name: Install Dependencies + run: nix develop -c yarn install --frozen-lockfile + # Create PR that will update versions or trigger publish + - name: Create Release Pull Request + uses: changesets/action@aba318e9165b45b7948c60273e0b72fce0a64eb9 # v1.4.7 + id: changesets + with: + publish: nix develop -c yarn release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + # Dispatch Relayer release + - name: Release relayer + run: gh workflow run .github/workflows/release/starknet-relayer.yml + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Dispatch Gauntlet CLI build & release + - name: Build and release Gauntlet CLI + run: gh workflow run .github/workflows/release/starknet-gauntlet-cli.yml + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml new file mode 100644 index 000000000..58e06e4bc --- /dev/null +++ b/.github/workflows/contracts.yml @@ -0,0 +1,45 @@ +name: Contracts + +on: + push: + branches: + - develop + - main + pull_request: + +jobs: + contracts_run_ts_tests: + name: Run Typescript Tests + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + + - name: Install Cairo + uses: ./.github/actions/install-cairo + + - name: Test + run: nix develop -c make test-ts-contracts + + contracts_run_cairo_tests: + name: Run Cairo Tests + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + + - name: Install Cairo + uses: ./.github/actions/install-cairo + + - name: Test + run: nix develop -c make test-cairo-contracts diff --git a/.github/workflows/e2e_custom_cl.yml b/.github/workflows/e2e_custom_cl.yml deleted file mode 100644 index 02ceb83c7..000000000 --- a/.github/workflows/e2e_custom_cl.yml +++ /dev/null @@ -1,89 +0,0 @@ -name: E2E Custom image build tests -on: - push: - workflow_dispatch: - inputs: - cl_branch_ref: - description: Chainlink repo branch to integrate with - required: true - default: develop - type: string - -jobs: - e2e_custom_build_custom_chainlink_image: - name: E2E Custom Build Custom CL Image - # target branch can't be set as var, it's from where we getting pipeline code - uses: smartcontractkit/chainlink/.github/workflows/build-custom.yml@develop - with: - cl_repo: smartcontractkit/chainlink - cl_ref: ${{ github.event.inputs.cl_branch_ref }} - # commit of the caller branch - dep_starknet_sha: ${{ github.sha }} - secrets: - AWS_ACCESS_KEY_ID: ${{ secrets.QA_AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.QA_AWS_SECRET_KEY }} - AWS_REGION: ${{ secrets.QA_AWS_REGION }} - AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} - QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }} - QA_PRIVATE_GHA_PULL: ${{ secrets.QA_PRIVATE_GHA_PULL }} - e2e_cutsom_run_smoke_tests: - name: E2E Custom Run Smoke Tests - runs-on: ubuntu-latest - needs: [e2e_custom_build_custom_chainlink_image] - env: - CGO_ENABLED: 1 - steps: - - name: Checkout the repo - uses: actions/checkout@v2 - - name: Setup go ${{ steps.tool-versions.outputs.golang_version }} - uses: actions/setup-go@v2 - with: - go-version: '1.18' - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.QA_AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.QA_AWS_SECRET_KEY }} - aws-region: ${{ secrets.QA_AWS_REGION }} - role-to-assume: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} - role-duration-seconds: 3600 - - name: Set Kubernetes Context - uses: azure/k8s-set-context@v1 - with: - method: kubeconfig - kubeconfig: ${{ secrets.QA_KUBECONFIG }} - - name: Cache Vendor Packages - uses: actions/cache@v2 - id: cache-packages - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - - name: Download Go Vendor Packages - if: steps.cache-packages.outputs.cache-hit != 'true' - run: go mod download - - name: Install Ginkgo CLI - run: go install github.com/onsi/ginkgo/v2/ginkgo@v2.1.3 - - name: Run Tests - env: - CHAINLINK_IMAGE: 795953128386.dkr.ecr.us-west-2.amazonaws.com/chainlink - CHAINLINK_VERSION: custom.${{ github.sha }} - run: | - export PATH=$PATH:$(go env GOPATH)/bin - make e2e_test - - name: Publish Test Results - uses: mikepenz/action-junit-report@v2 - if: always() - with: - report_paths: "./tests-smoke-report.xml" - github_token: ${{ secrets.GITHUB_TOKEN }} - check_name: Smoke Test Results - - name: Publish Artifacts - if: failure() - uses: actions/upload-artifact@v2.2.4 - with: - name: test-logs - path: /home/runner/work/chainlink-starknet/chainlink-starknet/tests/e2e/logs \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml new file mode 100644 index 000000000..4a15c9c6a --- /dev/null +++ b/.github/workflows/examples.yml @@ -0,0 +1,30 @@ +name: Example Contracts + +on: + push: + branches: + - develop + - main + pull_request: + +jobs: + run_examples_tests: + name: Run Tests + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + + - name: Install Cairo + uses: ./.github/actions/install-cairo + + - name: Install Starknet Foundry + uses: ./.github/actions/install-starknet-foundry + + - name: Test + run: nix develop -c make test-examples diff --git a/.github/workflows/gauntlet.yml b/.github/workflows/gauntlet.yml deleted file mode 100644 index a6e89bd11..000000000 --- a/.github/workflows/gauntlet.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: gauntlet - -on: - push: - -jobs: - gauntlet_build: - name: Gauntlet Build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@f25a3a9f25bd5f4c5d77189cab02ff357b5aedeb # v2.4.1 - - uses: smartcontractkit/tool-versions-to-env-action@v1.0.7 - id: tool-versions - - name: Setup Node ${{ steps.tool-versions.outputs.nodejs_version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ steps.tool-versions.outputs.nodejs_version }} - - name: Install - run: yarn install --frozen-lockfile - - name: Build - run: yarn build - - name: Run Gauntlet - run: yarn gauntlet - - gauntlet_format: - name: Gauntlet Format - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@f25a3a9f25bd5f4c5d77189cab02ff357b5aedeb # v2.4.1 - - uses: smartcontractkit/tool-versions-to-env-action@v1.0.7 - id: tool-versions - - name: Setup Node ${{ steps.tool-versions.outputs.nodejs_version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ steps.tool-versions.outputs.nodejs_version }} - - name: Install - run: yarn install --frozen-lockfile - - name: Lint - run: yarn lint:format - - gauntlet_run_tests: - name: Gauntlet Run Tests - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@f25a3a9f25bd5f4c5d77189cab02ff357b5aedeb # v2.4.1 - - uses: smartcontractkit/tool-versions-to-env-action@v1.0.7 - id: tool-versions - - name: Setup Node ${{ steps.tool-versions.outputs.nodejs_version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ steps.tool-versions.outputs.nodejs_version }} - - name: Install - run: yarn install --frozen-lockfile - - name: test:ci - run: yarn test:ci diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml new file mode 100644 index 000000000..4bce6fcbc --- /dev/null +++ b/.github/workflows/golangci-lint.yml @@ -0,0 +1,107 @@ +name: golangci_lint + +on: + push: + +jobs: + golangci-lint-version: + name: Get golangci-lint version to from nix + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + - name: Parse version + id: parse + run: | + long=$(nix develop -c golangci-lint version | grep "golangci-lint has version") + stringArray=($long) + version=$(echo "${stringArray[3]}") + echo "version found: ${version}" + echo "version=${version}" >>$GITHUB_OUTPUT + outputs: + version: ${{ steps.parse.outputs.version }} + + golang_lint_relayer: + name: Golang Lint Relayer + runs-on: ubuntu-latest + needs: [golangci-lint-version] + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + - name: Lint relayer + run: nix develop -c make lint-go-relayer + - name: Print Report + if: failure() + run: cat ./relayer/golangci-lint-relayer-report.xml + - name: Store Golangci lint relayer report artifact + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: golangci-lint-relayer-report + path: ./relayer/golangci-lint-relayer-report.xml + + golang_lint_ops: + name: Golang Lint Ops + runs-on: ubuntu-latest + needs: [golangci-lint-version] + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + - name: Lint ops + run: nix develop -c make lint-go-ops + - name: Print Report + if: failure() + run: cat ./ops/golangci-lint-ops-report.xml + - name: Store Golangci lint ops report artifact + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: golangci-lint-ops-report + path: ./ops/golangci-lint-ops-report.xml + + golang_lint_integration_tests: + name: Golang Lint Integration Tests + runs-on: ubuntu-latest + needs: [golangci-lint-version] + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + - name: Lint integration-tests + run: nix develop -c make lint-go-test + - name: Print Report + if: failure() + run: cat ./integration-tests/golangci-lint-integration-tests-report.xml + - name: Store Golangci lint integration tests report artifact + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: golangci-lint-integration-tests-report + path: ./integration-tests/golangci-lint-integration-tests-report.xml + # Note: I could not figure out why the golangci-lint-action would not work even though it is technically running the same as above, error message is this: + # Running [/home/runner/golangci-lint-1.50.1-linux-amd64/golangci-lint run --out-format=github-actions --path-prefix=integration-tests --exclude=dot-imports] in [/home/runner/work/chainlink-starknet/chainlink-starknet/integration-tests] ... + # level=warning msg="[runner] Can't run linter goanalysis_metalinter: inspect: failed to load package client: could not load export data: no export data for \"github.com/smartcontractkit/chainlink-testing-framework/client\"" + # level=error msg="Running error: 1 error occurred:\n\t* can't run linter goanalysis_metalinter: inspect: failed to load package client: could not load export data: no export data for \"github.com/smartcontractkit/chainlink-testing-framework/client\"\n\n" + # - name: golangci-lint + # uses: golangci/golangci-lint-action@v3 + # env: + # CGO_ENABLED: 1 + # with: + # version: v${{ needs.golangci-lint-version.outputs.version }} + # working-directory: integration-tests + # args: --exclude=dot-imports diff --git a/.github/workflows/integration-tests-publish.yml b/.github/workflows/integration-tests-publish.yml new file mode 100644 index 000000000..3bbd36fc8 --- /dev/null +++ b/.github/workflows/integration-tests-publish.yml @@ -0,0 +1,48 @@ +name: Integration Tests Publish +# Publish the compiled integration tests + +on: + push: + branches: + - develop + +env: + ECR_TAG: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-starknet-tests:develop + +jobs: + publish-integration-test-image: + environment: integration + permissions: + id-token: write + contents: read + name: Publish Integration Test Image + runs-on: ubuntu-latest + steps: + - name: Collect Metrics + id: collect-gha-metrics + uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1 + with: + id: starknet-e2e-publish + org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} + basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} + hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} + this-job-name: Publish Integration Test Image + continue-on-error: true + - name: Checkout the repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Build Image + uses: ./.github/actions/build-test-image + with: + other_tags: ${{ env.ECR_TAG }} + QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} + QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} + QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} + - name: Notify Slack + # Only run this notification for merge to develop failures + if: failure() && github.event_name != 'workflow_dispatch' + uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 + env: + SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }} + with: + channel-id: "#team-test-tooling-internal" + slack-message: ":x: :mild-panic-intensifies: Publish Integration Test Image failed: \n${{ format('https://github.com/{0}/actions/runs/{1}', github.repository, github.run_id) }}\nRepository: Starknet\n${{ format('Notifying ', secrets.GUARDIAN_SLACK_NOTIFICATION_HANDLE)}}" diff --git a/.github/workflows/integration-tests-smoke.yml b/.github/workflows/integration-tests-smoke.yml new file mode 100644 index 000000000..df06af620 --- /dev/null +++ b/.github/workflows/integration-tests-smoke.yml @@ -0,0 +1,186 @@ +name: Integration Tests - Smoke + +on: + pull_request: + workflow_dispatch: + inputs: + cl_branch_ref: + description: Chainlink repo branch to integrate with + required: true + default: develop + type: string + +# Only run 1 of this workflow at a time per PR +concurrency: + group: integration-tests-starknet-${{ github.ref }} + cancel-in-progress: true + +env: + TEST_LOG_LEVEL: debug + CL_ECR: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink + ENV_JOB_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-starknet-tests:${{ github.sha }} + +jobs: + build_chainlink_image: + name: Build Chainlink Image ${{matrix.image.name}} + runs-on: ubuntu-latest + environment: integration + permissions: + id-token: write + contents: read + strategy: + matrix: + image: + - name: "" + dockerfile: core/chainlink.Dockerfile + tag-suffix: "" + - name: (plugins) + dockerfile: plugins/chainlink.Dockerfile + tag-suffix: -plugins + steps: + - name: Collect Metrics + id: collect-gha-metrics + uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1 + with: + id: starknet-e2e-build${{ matrix.image.tag-suffix }} + org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} + basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} + hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} + this-job-name: Build Chainlink Image${{matrix.image.name}} + continue-on-error: true + - name: Check if image exists + id: check-image + uses: smartcontractkit/chainlink-github-actions/docker/image-exists@fc3e0df622521019f50d772726d6bf8dc919dd38 # v2.3.19 + with: + repository: chainlink + tag: starknet.${{ github.sha }}${{ matrix.image.tag-suffix }} + AWS_REGION: ${{ secrets.QA_AWS_REGION }} + AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} + - name: Build Image ${{ matrix.image.name }} + if: steps.check-image.outputs.exists == 'false' + uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-image@fc3e0df622521019f50d772726d6bf8dc919dd38 # v2.3.19 + with: + cl_repo: smartcontractkit/chainlink + cl_ref: ${{ github.event.inputs.cl_branch_ref }} + should_checkout: true + cl_dockerfile: ${{ matrix.image.dockerfile }} + # commit of the caller branch + dep_starknet_sha: ${{ github.event.pull_request.head.sha || github.sha }} + push_tag: ${{ env.CL_ECR }}:starknet.${{ github.sha }}${{ matrix.image.tag-suffix }} + QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} + QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} + QA_PRIVATE_GHA_PULL: ${{ secrets.QA_PRIVATE_GHA_PULL }} + - name: Print Chainlink Image Built + run: | + echo "### chainlink image tag used for this test run :link:" >> $GITHUB_STEP_SUMMARY + echo "\`starknet.${{ github.sha }}${{ matrix.image.tag-suffix }}\`" >> $GITHUB_STEP_SUMMARY + + build_test_image: + environment: integration + permissions: + id-token: write + contents: read + name: Build Test Image + runs-on: ubuntu20.04-32cores-128GB + steps: + - name: Collect Metrics + id: collect-gha-metrics + uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1 + with: + id: starknet-e2e-build-test-image + org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} + basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} + hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} + this-job-name: Build Test Image + continue-on-error: true + - name: Checkout the repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + ref: ${{ github.sha }} + - name: Build Image + uses: ./.github/actions/build-test-image + with: + QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} + QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} + QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} + + run_tests: + name: Run Smoke Tests ${{matrix.image.name}} + runs-on: ubuntu20.04-16cores-64GB + needs: [ build_chainlink_image, build_test_image ] + environment: integration + # these values need to match those used to build the chainlink image + strategy: + matrix: + image: + - name: "" + tag-suffix: "" + test-name: embedded + - name: plugins + tag-suffix: -plugins + test-name: plugins + env: + INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com + permissions: + checks: write + pull-requests: write + id-token: write + contents: read + steps: + - name: Collect Metrics + id: collect-gha-metrics + uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1 + with: + id: starknet-e2e-smoke${{ matrix.image.name }} + org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} + basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} + hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} + this-job-name: Run Smoke Tests ${{ matrix.image.name }} + test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}' + continue-on-error: true + - name: Checkout the repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + - name: Install Cairo + uses: ./.github/actions/install-cairo + - name: Build contracts + run: | + cd contracts && scarb --profile release build + - name: Build gauntlet + run: | + yarn install && yarn build + - name: Generate config overrides + run: | # https://github.com/smartcontractkit/chainlink-testing-framework/blob/main/config/README.md + cat << EOF > config.toml + [ChainlinkImage] + image="${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink" + version="starknet.${{ github.sha }}${{ matrix.image.tag-suffix }}" + [Network] + selected_networks=["SIMULATED"] + [Common] + internal_docker_repo = "${{ env.INTERNAL_DOCKER_REPO }}" + stateful_db = false + EOF + # shellcheck disable=SC2002 + BASE64_CONFIG_OVERRIDE=$(cat config.toml | base64 -w 0) + # shellcheck disable=SC2086 + echo ::add-mask::$BASE64_CONFIG_OVERRIDE + # shellcheck disable=SC2086 + echo "BASE64_CONFIG_OVERRIDE=$BASE64_CONFIG_OVERRIDE" >> $GITHUB_ENV + - name: Run Tests ${{ matrix.image.name }} + uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@fc3e0df622521019f50d772726d6bf8dc919dd38 # v2.3.19 + with: + aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} + test_command_to_run: nix develop -c sh -c "make test=${{ matrix.image.test-name }} test-integration-smoke-ci" + test_download_vendor_packages_command: cd integration-tests && nix develop -c go mod download + cl_repo: ${{ env.CL_ECR }} + cl_image_tag: starknet.${{ github.sha }}${{ matrix.image.tag-suffix }} + token: ${{ secrets.GITHUB_TOKEN }} + go_mod_path: ./integration-tests/go.mod + QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} + QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} + QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }} + artifacts_location: /home/runner/work/chainlink-starknet/chainlink-starknet/integration-tests/smoke/logs diff --git a/.github/workflows/integration-tests-soak.yml b/.github/workflows/integration-tests-soak.yml new file mode 100644 index 000000000..dd8eef97a --- /dev/null +++ b/.github/workflows/integration-tests-soak.yml @@ -0,0 +1,83 @@ +name: Integration Tests - Soak +on: + workflow_dispatch: + inputs: + base64_config: + description: Your .toml file as base64 + required: true + cl_image_tag: + description: Core image tag + required: true + default: develop + type: string + test_runner_tag: + description: Remote runner tag that will run the tests + default: develop + required: true + type: string + +env: + TEST_LOG_LEVEL: debug + CL_ECR: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink + ENV_JOB_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-starknet-tests:${{ inputs.test_runner_tag }} + +jobs: + run_tests: + name: Run soak Tests + runs-on: ubuntu20.04-16cores-64GB + environment: integration + env: + TEST_SUITE: soak + DETACH_RUNNER: true + INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com + permissions: + checks: write + pull-requests: write + id-token: write + contents: read + steps: + - name: Collect Metrics + id: collect-gha-metrics + uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1 + with: + id: starknet-e2e-soak + org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} + basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} + hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} + this-job-name: Run soak Tests + test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}' + continue-on-error: true + - name: Checkout the repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + - name: Install Cairo + uses: ./.github/actions/install-cairo + - name: Build contracts + run: | + cd contracts && scarb --profile release build + - name: Build gauntlet + run: | + yarn install && yarn build + - name: Mask base64 config + # shellcheck disable=SC2086 + run: | + BASE64_CONFIG_OVERRIDE=$(jq -r '.inputs.base64_config' "$GITHUB_EVENT_PATH") + echo "::add-mask::$BASE64_CONFIG_OVERRIDE" + echo "BASE64_CONFIG_OVERRIDE=$BASE64_CONFIG_OVERRIDE" >> "$GITHUB_ENV" + - name: Run Tests + uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@fc3e0df622521019f50d772726d6bf8dc919dd38 # v2.3.19 + with: + aws_registries: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }} + test_command_to_run: cd ./integration-tests && go test -timeout 24h -count=1 -run TestOCRBasicSoak/embedded ./soak + test_download_vendor_packages_command: cd integration-tests && nix develop -c go mod download + cl_repo: ${{ env.CL_ECR }} + token: ${{ secrets.GITHUB_TOKEN }} + go_mod_path: ./integration-tests/go.mod + QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} + QA_AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} + QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }} + artifacts_location: /home/runner/work/chainlink-starknet/chainlink-starknet/integration-tests/soak/logs + diff --git a/.github/workflows/integration_gauntlet.yml b/.github/workflows/integration_gauntlet.yml new file mode 100644 index 000000000..069bd92c8 --- /dev/null +++ b/.github/workflows/integration_gauntlet.yml @@ -0,0 +1,65 @@ +name: Integration Gauntlet + +on: + push: + branches: + - develop + - main + pull_request: + +jobs: + gauntlet_eslint: + name: Gauntlet ESLint + env: + CI: true + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + extra_nix_config: "sandbox = false" + - name: Cache Nix + uses: cachix/cachix-action@v15 + with: + name: chainlink-cosmos + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + - run: nix develop -c yarn install --frozen-lockfile + - run: nix develop -c yarn eslint + - name: Upload eslint report + if: always() + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: gauntlet-eslint-report + path: ./eslint-report.json + + integration_gauntlet_run_tests: + name: Run Integration Gauntlet Tests + runs-on: ubuntu-latest + steps: + - name: Collect Metrics + id: collect-gha-metrics + uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1 + with: + id: starknet-integration-gauntlet + org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} + basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} + hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} + this-job-name: Run Integration Gauntlet Tests + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + + - name: Install Cairo + uses: ./.github/actions/install-cairo + + - name: Test + run: nix develop -c make test-integration-gauntlet + + - name: Test - Run Gauntlet CLI via Yarn + run: nix develop -c yarn gauntlet diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..f88be643a --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,34 @@ +name: Lint + +on: + push: + branches: + - develop + - main + pull_request: + +jobs: + lint_format_check: + name: Format Check + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + + - name: Install Cairo + uses: ./.github/actions/install-cairo + + - name: Install + run: nix develop -c yarn install --frozen-lockfile + + # NOTE: Runs outside the nix environment because starknet-devnet still pulls in 0.x cairo which ends up taking precedence. + - name: Check Cairo + run: make format-cairo-check + + - name: Check Typescript + run: nix develop -c make format-ts-check diff --git a/.github/workflows/monitoring-build-push-ecr.yml b/.github/workflows/monitoring-build-push-ecr.yml new file mode 100644 index 000000000..7f0becd91 --- /dev/null +++ b/.github/workflows/monitoring-build-push-ecr.yml @@ -0,0 +1,53 @@ +name: "Build and push on-chain monitor image to ECR" + +on: + push: + branches: + - develop + paths: + - monitoring/** + - relayer/** + +jobs: + build-and-publish-monitoring: + runs-on: ubuntu-latest + environment: publish + permissions: + id-token: write + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + with: + role-to-assume: ${{ secrets.AWS_OIDC_IAM_ROLE_ARN }} + role-duration-seconds: ${{ secrets.AWS_ROLE_DURATION_SECONDS }} + aws-region: ${{ secrets.AWS_REGION }} + + - name: Login to ECR + uses: docker/login-action@0d4c9c5ea7693da7b068278f7b52bda2a190a446 # v3.2.0 + with: + registry: ${{ secrets.MONITORING_ECR_HOSTNAME }} + + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 + + - name: Generate docker metadata + id: docker_meta + uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + with: + flavor: | # prevent auto tagging with latest + latest=false + images: ${{ secrets.MONITORING_ECR_HOSTNAME }} + tags: type=sha,format=long + + - name: Build and push docker image + uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5.4.0 + with: + push: true + context: ./ + file: monitoring/ops/Dockerfile + tags: ${{ steps.docker_meta.outputs.tags }} + labels: ${{ steps.docker_meta.outputs.labels }} diff --git a/.github/workflows/relayer.yml b/.github/workflows/relayer.yml new file mode 100644 index 000000000..d7dba57d0 --- /dev/null +++ b/.github/workflows/relayer.yml @@ -0,0 +1,77 @@ +name: Relayer + +on: + push: + branches: + - develop + - main + pull_request: + +jobs: + relayer_run_unit_tests: + name: Run Unit Tests ${{ matrix.test-type.name }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + test-type: + - name: test-unit-go + id: unit + - name: test-unit-go-race + id: race + - name: test-integration-go + id: integration + steps: + - name: Collect Metrics + if: matrix.test-type.id != 'race' + id: collect-gha-metrics + uses: smartcontractkit/push-gha-metrics-action@d9da21a2747016b3e13de58c7d4115a3d5c97935 # v3.0.1 + with: + id: starknet-relay-unit-${{ matrix.test-type.id }} + org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }} + basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }} + hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }} + this-job-name: Run Unit Tests ${{ matrix.test-type.name }} + test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}' + - name: Checkout sources + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - name: Install Nix + uses: cachix/install-nix-action@ba0dd844c9180cbf77aa72a116d6fbc515d0e87b # v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + + - name: Build + run: nix develop -c sh -c "make build-go-relayer" + + - name: Run ${{ matrix.test-type.name }} + run: nix develop -c sh -c "make ${{ matrix.test-type.name }} LOG_PATH=/tmp/gotest.log" + + - name: Upload Golangci relayer results + if: always() + uses: actions/upload-artifact@v4 + with: + name: go-unit-tests-results-${{ matrix.test-type.id }} + path: | + /tmp/gotest.log + ./relayer/output.txt + ./relayer/coverage.txt + ./relayer/race_coverage.txt + + check-tidy: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - name: Set up Go + uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 + with: + go-version-file: "relayer/go.mod" + - name: Ensure "make gomodtidy" has been run + run: | + make gomodtidy + git diff --exit-code + - name: Ensure "make generate" has been run + run: | + make rm-mocked + make generate + git diff --stat --exit-code diff --git a/.github/workflows/release/starknet-gauntlet-cli.yml b/.github/workflows/release/starknet-gauntlet-cli.yml new file mode 100644 index 000000000..b99bca69f --- /dev/null +++ b/.github/workflows/release/starknet-gauntlet-cli.yml @@ -0,0 +1,37 @@ +name: Starknet Gauntlet CLI Release + +on: + workflow_dispatch: + +jobs: + starknet-gauntlet-cli-release: + name: Starknet Gauntlet CLI Release + runs-on: ubuntu-latest + steps: + # Checkout this repository + - name: Checkout Repo + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + # Install nix + - name: Install Nix + uses: cachix/install-nix-action@29bd9290ef037a3ecbdafe83cbd2185e9dd0fa0a # v20 + with: + nix_path: nixpkgs=channel:nixos-unstable + # Install dependencies using yarn + - name: Install Dependencies + run: nix develop -c yarn install --frozen-lockfile + # Build gauntlet binary + - name: Build Gauntlet + run: nix develop -c yarn bundle + # Store gauntlet-cli version + - name: Set Env Variables + run: echo "STARKNET_GAUNTLET_CLI=$(npm info @chainlink/starknet-gauntlet-cli version)" >> $GITHUB_ENV + # Upload gauntlet binary to gauntlet-cli release + - name: Upload Gauntlet Binary + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: bin/chainlink-starknet-* + file_glob: true + tag: | + @chainlink/starknet-gauntlet-cli@${{ env.STARKNET_GAUNTLET_CLI }} + overwrite: false diff --git a/.github/workflows/release/starknet-relayer.yml b/.github/workflows/release/starknet-relayer.yml new file mode 100644 index 000000000..3ecb7abd9 --- /dev/null +++ b/.github/workflows/release/starknet-relayer.yml @@ -0,0 +1,31 @@ +name: Starknet Relayer Release + +on: + workflow_dispatch: + +jobs: + starknet-relayer-release: + name: Release Starknet Relayer + runs-on: ubuntu-latest + steps: + # Checkout this repository + - name: Checkout Repo + uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + # Store starknet version + - name: Set Env Variables + run: echo "STARKNET_RELAYER=$(npm info @chainlink/starknet-relayer version)" >> $GITHUB_ENV + # Check if release tag exists + - name: Check release tag + uses: mukunku/tag-exists-action@5dfe2bf779fe5259360bb10b2041676713dcc8a3 # v1.1.0 + id: checkTag + with: + tag: relayer/v${{ env.STARKNET_RELAYER }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Release code under vX.X.X + - name: Release Code + if: steps.checkTag.outputs.exists == 'false' + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v1 + with: + tag_name: relayer/v${{ env.STARKNET_RELAYER }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/sonar-scan.yml b/.github/workflows/sonar-scan.yml new file mode 100644 index 000000000..21ef33d19 --- /dev/null +++ b/.github/workflows/sonar-scan.yml @@ -0,0 +1,110 @@ +name: SonarQube Scan + +on: + pull_request: + +jobs: + wait_for_workflows: + name: Wait for workflows + runs-on: ubuntu-latest + if: always() + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }} + + - name: Wait for Workflows + id: wait + uses: smartcontractkit/chainlink-github-actions/utils/wait-for-workflows@main + with: + max-timeout: "1200" + polling-interval: "30" + exclude-workflow-names: "Amarna Analysis,Changesets,Integration Contracts (Vendor, Examples),Integration Tests Publish,Integration Tests - Smoke,Integration Tests - Soak,Build and push on-chain monitor image to ECR,Contracts,Lint" + exclude-workflow-ids: "" + github-token: ${{ secrets.GITHUB_TOKEN }} + env: + DEBUG: "true" + + sonarqube: + name: SonarQube Scan + needs: [ wait_for_workflows ] + runs-on: ubuntu-latest + if: always() + steps: + - name: Checkout the repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 # fetches all history for all tags and branches to provide more metadata for sonar reports + + - name: Download Golangci unit tests reports + uses: dawidd6/action-download-artifact@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11 # v6 + with: + workflow: relayer.yml + workflow_conclusion: "" + name_is_regexp: true + name: go-unit-tests-results + if_no_artifact_found: warn + + - name: Download Golangci Relayer report + uses: dawidd6/action-download-artifact@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11 # v6 + with: + workflow: golangci-lint.yml + workflow_conclusion: "" + name_is_regexp: true + name: golangci-lint-relayer-report + if_no_artifact_found: warn + + - name: Download Golangcio Ops report + uses: dawidd6/action-download-artifact@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11 # v6 + with: + workflow: golangci-lint.yml + workflow_conclusion: "" + name_is_regexp: true + name: golangci-lint-ops-report + if_no_artifact_found: warn + + - name: Download Golangci-lint Integration tests report + uses: dawidd6/action-download-artifact@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11 # v6 + with: + workflow: golangci-lint.yml + workflow_conclusion: "" + name_is_regexp: true + name: golangci-lint-integration-tests-report + if_no_artifact_found: warn + + - name: Download gauntlet eslint reports + uses: dawidd6/action-download-artifact@bf251b5aa9c2f7eeb574a96ee720e24f801b7c11 # v6 + with: + workflow: integration_gauntlet.yml + workflow_conclusion: "" + name_is_regexp: true + name: gauntlet-eslint-report + if_no_artifact_found: warn + + - name: Set SonarQube Report Paths + id: sonarqube_report_paths + shell: bash + run: | + { + echo "sonarqube_tests_report_paths=$(find . -type f -name output.txt | paste -sd "," -)" + echo "sonarqube_coverage_report_paths=$(find . -type f -name '*coverage.txt' | paste -sd "," -)" + echo "sonarqube_golangci_report_paths=$(find . -type f -name 'golangci-*-report.xml' -printf "%p,")" + echo "sonarqube_eslint_report_paths=$(find -type f -name 'eslint-report.json' -printf "%p")" >> $GITHUB_OUTPUT + } >> "$GITHUB_OUTPUT" + + - name: Update ESLint report symlinks + continue-on-error: true + run: sed -i 's+/home/runner/work/feeds-manager/feeds-manager/+/github/workspace/+g' ${{ steps.sonarqube_report_paths.outputs.sonarqube_eslint_report_paths }} + + - name: SonarQube Scan + uses: sonarsource/sonarqube-scan-action@86fe81775628f1c6349c28baab87881a2170f495 # v2.1.0 + with: + args: > + -Dsonar.go.tests.reportPaths=${{ steps.sonarqube_report_paths.outputs.sonarqube_tests_report_paths }} + -Dsonar.go.coverage.reportPaths=${{ steps.sonarqube_report_paths.outputs.sonarqube_coverage_report_paths }} + -Dsonar.go.golangci-lint.reportPaths=${{ steps.sonarqube_report_paths.outputs.sonarqube_golangci_report_paths }} + -Dsonar.eslint.reportPaths=${{ steps.sonarqube_report_paths.outputs.sonarqube_eslint_report_paths }} + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} diff --git a/.gitignore b/.gitignore index e07cb5ba7..1ec5b7415 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,13 @@ .direnv artifacts/ +vendor/ accounts.json node.json package-lock.json node_modules/ flow-report.json .env +.idea/ report.json bin **/tsconfig.tsbuildinfo @@ -56,11 +58,13 @@ pip-delete-this-directory.txt htmlcov/ .tox/ .nox/ -.coverage -.coverage.* +*report.xml +*report.json +*.out +*coverage* +testdata/ .cache nosetests.xml -coverage.xml *.cover *.py,cover .hypothesis/ @@ -145,3 +149,21 @@ dmypy.json # vscode project settings .vscode/ + +# go workspace settings +go.work +go.work.sum + +.env.test* +tmp-manifest-* + +# Test log files +integration-tests/logs +integration-tests/smoke/logs +integration-tests/soak/logs +remote.test +ztarrepo.tar.gz +eslint-report.json +.run.id +.local-mock-server +override*.toml diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..82a63fcda --- /dev/null +++ b/.gitmodules @@ -0,0 +1,7 @@ +[submodule "vendor/cairo"] + path = vendor/cairo + url = https://github.com/starkware-libs/cairo +[submodule "vendor/scarb"] + path = vendor/scarb + url = https://github.com/software-mansion/scarb + ignore = dirty diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..824bcbe72 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,150 @@ +run: + timeout: 10m0s +linters: + enable: + - exhaustive + - exportloopref + - revive + - goimports + - gosec + - misspell + - rowserrcheck + - errorlint + - unconvert + - sqlclosecheck + - noctx + - whitespace + - depguard + - containedctx + - fatcontext + - mirror + - loggercheck +linters-settings: + exhaustive: + default-signifies-exhaustive: true + goimports: + local-prefixes: github.com/smartcontractkit/chainlink-starknet + golint: + min-confidence: 1.0 + gosec: + excludes: + - G101 + - G104 + # - G204 + # - G304 + # - G404 + govet: + enable: + - shadow + settings: + printf: + # Additionally check custom logger + funcs: + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Debugf + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Infof + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Warnf + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Errorf + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Panicf + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Fatalf + - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).AssumptionViolationf + - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Tracef + - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Criticalf + errorlint: + # Allow formatting of errors without %w + errorf: false + revive: + confidence: 0.8 + rules: + - name: blank-imports + - name: context-as-argument + - name: context-keys-type + - name: dot-imports + - name: error-return + - name: error-strings + - name: error-naming + - name: exported + - name: if-return + - name: increment-decrement + - name: var-naming + - name: var-declaration + - name: package-comments + - name: range + - name: receiver-naming + - name: time-naming + # - name: unexported-return + - name: indent-error-flow + - name: errorf + - name: empty-block + - name: superfluous-else + # - name: unused-parameter + - name: unreachable-code + - name: redefines-builtin-id + - name: waitgroup-by-value + - name: unconditional-recursion + - name: struct-tag + # - name: string-format + - name: string-of-int + - name: range-val-address + - name: range-val-in-closure + - name: modifies-value-receiver + - name: modifies-parameter + - name: identical-branches + - name: get-return + # - name: flag-parameter + - name: early-return + - name: defer + - name: constant-logical-expr + # - name: confusing-naming + # - name: confusing-results + - name: bool-literal-in-expr + - name: atomic + depguard: + rules: + main: + list-mode: lax + deny: + - pkg: "cosmossdk.io/errors" + desc: Use the standard library instead + - pkg: "github.com/go-gorm/gorm" + desc: Use github.com/jmoiron/sqlx directly instead + - pkg: "github.com/gofrs/uuid" + desc: Use github.com/google/uuid instead + - pkg: "github.com/pkg/errors" + desc: Use the standard library instead, for example https://pkg.go.dev/errors#Join + - pkg: "github.com/satori/go.uuid" + desc: Use github.com/google/uuid instead + - pkg: "github.com/test-go/testify/assert" + desc: Use github.com/stretchr/testify/assert instead + - pkg: "github.com/test-go/testify/mock" + desc: Use github.com/stretchr/testify/mock instead + - pkg: "github.com/test-go/testify/require" + desc: Use github.com/stretchr/testify/require instead + - pkg: "go.uber.org/multierr" + desc: Use the standard library instead, for example https://pkg.go.dev/errors#Join + - pkg: "gopkg.in/guregu/null.v1" + desc: Use gopkg.in/guregu/null.v4 instead + - pkg: "gopkg.in/guregu/null.v2" + desc: Use gopkg.in/guregu/null.v4 instead + - pkg: "gopkg.in/guregu/null.v3" + desc: Use gopkg.in/guregu/null.v4 instead + - pkg: github.com/go-gorm/gorm + desc: Use github.com/jmoiron/sqlx directly instead + loggercheck: + # Check that *w logging functions have even number of args (i.e., well formed key-value pairs). + rules: + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Debugw + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Infow + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Warnw + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Errorw + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Panicw + - (github.com/smartcontractkit/chainlink-common/pkg/logger.Logger).Fatalw + - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).AssumptionViolationw + - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Tracew + - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).Criticalw + - (github.com/smartcontractkit/chainlink-common/pkg/logger.SugaredLogger).With +issues: + exclude-rules: + - path: test + text: "^G404:" + linters: + - gosec \ No newline at end of file diff --git a/.helm-repositories.yaml b/.helm-repositories.yaml new file mode 100644 index 000000000..4f875a2b7 --- /dev/null +++ b/.helm-repositories.yaml @@ -0,0 +1,30 @@ +apiVersion: '' +generated: '0001-01-01T00:00:00Z' +repositories: + - caFile: '' + certFile: '' + insecure_skip_tls_verify: false + keyFile: '' + name: bitnami + pass_credentials_all: false + password: '' + url: https://charts.bitnami.com/bitnami + username: '' + - caFile: '' + certFile: '' + insecure_skip_tls_verify: false + keyFile: '' + name: chainlink-qa + pass_credentials_all: false + password: '' + url: https://raw.githubusercontent.com/smartcontractkit/qa-charts/gh-pages/ + username: '' + - caFile: '' + certFile: '' + insecure_skip_tls_verify: false + keyFile: '' + name: grafana + pass_credentials_all: false + password: '' + url: https://grafana.github.io/helm-charts + username: '' diff --git a/.prettierignore b/.prettierignore index 27b70c8d5..2e470776f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,10 +1,18 @@ migrations -programs tests ops packages-rs -relay target *.json dist *.yml +typechain-types +*.html +*.md + +# Vendor files (contracts) +vendor + +# Python virtual env +.venv +.direnv diff --git a/.prettierrc.json b/.prettierrc.json index f110a9d79..e4769df15 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,7 +1,21 @@ { "semi": false, "singleQuote": true, - "printWidth": 120, + "printWidth": 100, "endOfLine": "auto", - "trailingComma": "all" + "tabWidth": 2, + "trailingComma": "all", + "overrides": [ + { + "files": "*.sol", + "options": { + "printWidth": 120, + "tabWidth": 2, + "useTabs": false, + "singleQuote": false, + "bracketSpacing": false, + "explicitTypes": "always" + } + } + ] } diff --git a/.tool-versions b/.tool-versions index f7aaf9ffa..b00c44d37 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,8 +1,20 @@ -nodejs 14.19.1 -golang 1.18 -helmenv 1.0.75 -golangci-lint 1.45.2 -pulumi 3.25.1 -ginkgo 2.1.3 +# Languages +nodejs 18.6.0 +yarn 1.22.19 +golang 1.21.5 +python 3.9.13 + +# Tools +mockery 2.22.1 +golangci-lint 1.55.0 actionlint 1.6.12 -shellcheck 0.8.0 \ No newline at end of file +shellcheck 0.8.0 +scarb 2.6.5 +postgres 15.1 + +# Kubernetes +k3d 5.4.4 +kubectl 1.25.5 +k9s 0.26.3 +helm 3.9.3 +helmenv 1.2.7 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..9f9fa4c6d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "starkware.cairo", + "ericglau.cairo-ls", + "dbaeumer.vscode-eslint" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..bb4c99574 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "editor.formatOnSave": true, + "editor.formatOnSaveTimeout": 1500, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "files.insertFinalNewline": true +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..bdbefb7e6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,19 @@ +# Changelog Index + +This repository adheres to [Semantic Versioning](http://semver.org/). + +Chainlink-Starknet contains a number of projects, all individually versioned and released. Please consult the following changelogs for more information: + +- [@chainlink/starknet-relayer](/relayer/) +- [@chainlink/starknet-gauntlet](/packages-ts/starknet-gauntlet/) +- [@chainlink/starknet-gauntlet-cli](/packages-ts/starknet-gauntlet-cli/) +- [@chainlink/starknet-gauntlet-ocr2](/packages-ts/starknet-gauntlet-ocr2/) +- [@chainlink/starknet-gauntlet-oz](/packages-ts/starknet-gauntlet-oz/) +- [@chainlink/starknet-gauntlet-argent](/packages-ts/starknet-gauntlet-argent/) +- [@chainlink/starknet-gauntlet-token](/packages-ts/starknet-gauntlet-token/) +- [@chainlink/starknet-contracts](/contracts/) +- [@chainlink/starknet-integration-tests](/integration-tests/) + +If a project is pre-v1.0, minor version bumps may cause breaking changes. All breaking changes are noted in changelogs. + +Official project releases can be found here: https://github.com/smartcontractkit/chainlink-starknet/releases diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..396eb3896 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,43 @@ +# Chainlink Starknet monorepo contributing guide + +🎈 Thanks for your help improving the project! We are so happy to have you! + +## Workflow for Pull Requests + +🚨 Before making any non-trivial change, please first open an issue describing the change to solicit feedback and guidance. This will increase the likelihood of the PR getting merged. + +In general, the smaller the diff the easier it will be for us to review quickly. + +In order to contribute, fork the appropriate branch, for non-breaking changes to production that is `develop` and for the next release that is normally `release/X.X.X` branch. + +Additionally, if you are writing a new feature, please ensure you add appropriate test cases. + +Follow the [Getting Started](./docs/getting-started.md) guide to set up your local development environment. + +We recommend using the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format on commit messages. + +Unless your PR is ready for immediate review and merging, please mark it as 'draft' (or simply do not open a PR yet). + +**Bonus:** Add comments to the diff under the "Files Changed" tab on the PR page to clarify any sections where you think we might have questions about the approach taken. + +### Response time: + +We aim to provide a meaningful response to all PRs and issues from external contributors within 5 business days. + +### Changesets + +We use [changesets](https://github.com/atlassian/changesets) to manage releases of our various packages. +You _must_ include a `changeset` file in your PR when making a change that would require a new package release. + +Adding a `changeset` file is easy: + +1. Navigate to the root of the monorepo. +2. Run `yarn changeset`. You'll be prompted to select packages to include in the changeset. Use the arrow keys to move the cursor up and down, hit the `spacebar` to select a package, and hit `enter` to confirm your selection. Select _all_ packages that require a new release as a result of your PR. +3. Once you hit `enter` you'll be prompted to decide whether your selected packages need a `major`, `minor`, or `patch` release. We follow the [Semantic Versioning](https://semver.org/) scheme. Please avoid using `major` releases for any packages that are still in version `0.y.z`. +4. Commit your changeset and push it into your PR. The changeset bot will notice your changeset file and leave a little comment to this effect on GitHub. + +### Rebasing + +We use the `git rebase` command to keep our commit history tidy. +Rebasing is an easy way to make sure that each PR includes a series of clean commits with descriptive commit messages +See [this tutorial](https://docs.gitlab.com/ee/topics/git/git_rebase.html) for a detailed explanation of `git rebase` and how you should use it to maintain a clean commit history. diff --git a/Makefile b/Makefile index aab76b3a2..7cdd24af0 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -BIN_DIR = bin +BIN_DIR = $(abspath bin) export GOPATH ?= $(shell go env GOPATH) export GO111MODULE ?= on @@ -21,30 +21,263 @@ endif .PHONY: install install: ifeq ($(OSFLAG),$(WINDOWS)) - echo "If you are running windows and know how to install what is needed, please contribute by adding it here!" + @echo "Windows system detected - no automated setup available." + @echo "Please install your developer enviroment manually (@see .tool-versions)." + @echo exit 1 endif ifeq ($(OSFLAG),$(OSX)) - curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash + @echo "MacOS system detected - installing the required toolchain via asdf (@see .tool-versions)." + @echo brew install asdf - asdf plugin-add nodejs || true - asdf plugin-add golang || true - asdf plugin-add golangci-lint || true - asdf plugin-add ginkgo || true - asdf plugin-add pulumi || true + asdf plugin add golang || true + asdf plugin add nodejs || true + asdf plugin add python || true + asdf plugin add mockery || true + asdf plugin add golangci-lint || true asdf plugin add actionlint || true asdf plugin add shellcheck || true + asdf plugin add k3d || true + asdf plugin add kubectl || true + asdf plugin add k9s || true + asdf plugin add helm || true + asdf plugin add helmenv https://github.com/smartcontractkit/asdf-helmenv.git || true + @echo asdf install endif ifeq ($(OSFLAG),$(LINUX)) - curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash + @echo "Linux system detected - please install and use NIX (@see shell.nix)." + @echo ifneq ($(CI),true) # install nix sh <(curl -L https://nixos-nix-install-tests.cachix.org/serve/vij683ly7sl95nnhb67bdjjfabclr85m/install) --daemon --tarball-url-prefix https://nixos-nix-install-tests.cachix.org/serve --nix-extra-conf-file ./nix.conf endif - go install github.com/onsi/ginkgo/v2/ginkgo@v$(shell cat ./.tool-versions | grep ginkgo | sed -En "s/ginkgo.(.*)/\1/p") endif -.PHONY: e2e_test -e2e_test: - ginkgo -r integration-tests/smoke \ No newline at end of file +.PHONY: nix-container +nix-container: + docker run -it --rm -v $(shell pwd):/repo -e NIX_USER_CONF_FILES=/repo/nix.conf --workdir /repo nixos/nix:latest /bin/sh + +.PHONY: nix-flake-update +nix-flake-update: + docker run -it --rm -v $(shell pwd):/repo -e NIX_USER_CONF_FILES=/repo/nix.conf --workdir /repo nixos/nix:latest /bin/sh -c "nix flake update" + +.PHONY: build +build: build-go build-ts + +.PHONY: build-go +build-go: build-go-relayer build-go-ops build-go-integration-tests + +.PHONY: build-go-relayer +build-go-relayer: + cd relayer/ && go build ./... + +.PHONY: build-go-ops +build-go-ops: + cd ops/ && go build ./... + +.PHONY: build-go-integration-tests +build-go-integration-tests: + cd integration-tests/ && go build ./... + +# TODO: fix and readd build-ts-examples +.PHONY: build-ts +build-ts: build-ts-workspace build-cairo-contracts build-sol-contracts + +.PHONY: build-ts-workspace +build-ts-workspace: + yarn install --frozen-lockfile + yarn build + +# TODO: use yarn workspaces features instead of managing separately like this +# https://yarnpkg.com/cli/workspaces/foreach +.PHONY: build-sol-contracts +build-sol-contracts: + cd contracts/ && \ + yarn install --frozen-lockfile && \ + yarn compile:solidity + +# TODO: this should build cairo contracts when they are rewritten +.PHONY: build-ts-examples +build-ts-examples: + cd examples/contracts/aggregator-consumer && \ + yarn install --frozen-lockfile && \ + yarn compile:solidity + +.PHONY: gowork +gowork: + go work init + go work use ./ops + go work use ./relayer + go work use ./integration-tests + +.PHONY: gowork_rm +gowork_rm: + rm go.work* + +.PHONY: format +format: format-go format-cairo format-ts + +.PHONY: format-check +format-check: format-cairo-check format-ts-check + +.PHONY: format-go +format-go: format-go-fmt gomodtidy + +.PHONY: format-go-fmt +format-go-fmt: + cd ./relayer && go fmt ./... + cd ./ops && go fmt ./... + cd ./integration-tests && go fmt ./... + +.PHONY: gomods +gomods: ## Install gomods + go install github.com/jmank88/gomods@v0.1.3 + +.PHONY: gomodtidy +gomodtidy: gomods + gomods tidy + +.PHONY: mockery +mockery: $(mockery) ## Install mockery. + go install github.com/vektra/mockery/v2@v2.43.2 + +.PHONY: rm-mocked +rm-mocked: + grep -rl "^// Code generated by mockery" | grep .go$ | xargs -r rm + +.PHONY: generate +generate: mockery gomods + gomods -w go generate -x ./... + +.PHONY: format-cairo +format-cairo: + cairo-format -i ./contracts/src/**/*.cairo + cairo-format -i ./examples/**/*.cairo + +.PHONY: format-cairo-check +format-cairo-check: + cairo-format -c ./contracts/src/**/*.cairo + cairo-format -c ./examples/**/*.cairo + +.PHONY: format-ts +format-ts: + yarn format + +.PHONY: format-ts-check +format-ts-check: + yarn format:check + +.PHONY: lint-go-ops +lint-go-ops: + cd ./ops && golangci-lint --color=always --out-format checkstyle:golangci-lint-ops-report.xml run + +.PHONY: lint-go-relayer +lint-go-relayer: + cd ./relayer && golangci-lint --color=always --out-format checkstyle:golangci-lint-relayer-report.xml run + +.PHONY: lint-go-test +lint-go-test: + cd ./integration-tests && golangci-lint --color=always --exclude=dot-imports --out-format checkstyle:golangci-lint-integration-tests-report.xml run + +.PHONY: test-go +test-go: test-unit-go test-unit-go-race test-integration-go + +.PHONY: test-unit +test-unit: test-unit-go test-unit-go-race + +LOG_PATH ?= ./gotest.log +.PHONY: test-unit-go +test-unit-go: + cd ./relayer && go test -json ./... -covermode=atomic -coverpkg=./... -coverprofile=coverage.txt 2>&1 | tee $(LOG_PATH) | gotestloghelper -ci + +.PHONY: test-unit-go-race +test-unit-go-race: + cd ./relayer && CGO_ENABLED=1 go test -v ./... -race -count=10 -coverpkg=./... -coverprofile=race_coverage.txt + +.PHONY: test-integration-go +# only runs tests with TestIntegration_* + //go:build integration +test-integration-go: env-devnet-hardhat + cd ./relayer && go test -json ./... -run TestIntegration -tags integration 2>&1 | tee $(LOG_PATH) | gotestloghelper -ci + +.PHONY: test-integration-prep +test-integration-prep: + cd ./contracts + make build + +.PHONY: test-integration +test-integration: test-integration-smoke test-integration-contracts test-integration-gauntlet + +.PHONY: test-integration-smoke +test-integration-smoke: test-integration-prep + cd integration-tests/ && \ + go test --timeout=2h -v ./smoke + +# CI Already has already ran test-integration-prep +.PHONY: test-integration-smoke-ci +test-integration-smoke-ci: + cd integration-tests/ && \ + go test --timeout=2h -v -count=1 -run TestOCRBasic/$(test) -json ./smoke | tee /tmp/gotest.log | gotestloghelper -ci -singlepackage + +.PHONY: test-integration-soak +test-integration-soak: test-integration-prep + cd integration-tests/ && \ + go test --timeout=1h -v -json ./soak + +# CI Already has already ran test-integration-prep +.PHONY: test-integration-soak-ci +test-integration-soak-ci: + cd integration-tests/ && \ + go test --timeout=1h -v -count=1 -json ./soak + +.PHONY: test-examples +test-examples: + cd ./examples/contracts/aggregator_consumer && \ + snforge test + +.PHONY: test-integration-gauntlet +# TODO: fix example +# cd packages-ts/starknet-gauntlet-example/ && \ +# yarn test +test-integration-gauntlet: build-ts env-devnet-hardhat + cd packages-ts/starknet-gauntlet/ && \ + yarn test + cd packages-ts/starknet-gauntlet-argent/ && \ + yarn test + cd packages-ts/starknet-gauntlet-cli/ && \ + yarn test + cd packages-ts/starknet-gauntlet-multisig/ && \ + yarn test + cd packages-ts/starknet-gauntlet-ocr2/ && \ + yarn test + cd packages-ts/starknet-gauntlet-oz/ && \ + yarn test + cd packages-ts/starknet-gauntlet-token/ && \ + yarn test + cd packages-ts/starknet-gauntlet-emergency-protocol/ && \ + yarn test + +.PHONY: test-ts +test-ts: test-ts-contracts test-integration-contracts test-integration-gauntlet + +.PHONY: test-ts-contracts +test-ts-contracts: build-ts env-devnet-hardhat + cd contracts/ && \ + yarn test + +.PHONY: build-cairo-contracts +build-cairo-contracts: + cd contracts && scarb --profile release build + +.PHONY: test-cairo-contracts +test-cairo-contracts: + cd contracts && scarb test + +# TODO: this script needs to be replaced with a predefined K8s enviroment +.PHONY: env-devnet-hardhat +env-devnet-hardhat: + ./ops/scripts/devnet-hardhat.sh + +.PHONY: env-devnet-hardhat-down +env-devnet-hardhat-down: + ./ops/scripts/devnet-hardhat-down.sh diff --git a/README.md b/README.md new file mode 100644 index 000000000..41282ed2c --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Chainlink Starknet + +For more information, see the [Chainlink Starknet Documentation](./docs). diff --git a/contracts/.gitattributes b/contracts/.gitattributes new file mode 100644 index 000000000..0792ac6ad --- /dev/null +++ b/contracts/.gitattributes @@ -0,0 +1 @@ +*.cairo linguist-language=rust \ No newline at end of file diff --git a/contracts/.gitignore b/contracts/.gitignore new file mode 100644 index 000000000..0cca96d9f --- /dev/null +++ b/contracts/.gitignore @@ -0,0 +1,4 @@ +starknet-artifacts/ +cache/ +target/ +node_modules/ diff --git a/contracts/.helix/languages.toml b/contracts/.helix/languages.toml deleted file mode 100644 index 70f2df901..000000000 --- a/contracts/.helix/languages.toml +++ /dev/null @@ -1,5 +0,0 @@ -[[language]] -name = "cairo" -language-server = { command = "node", args = ["node_modules/cairo-ls/out/server.js", "--stdio"] } -[language.config] -cairols = { venvCommand = ". .venv/bin/activate", sourceDir = "contracts" } diff --git a/contracts/Makefile b/contracts/Makefile deleted file mode 100644 index a1c04eaeb..000000000 --- a/contracts/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -# Build and test -build :; nile compile -test :; pytest tests/ \ No newline at end of file diff --git a/contracts/README.md b/contracts/README.md new file mode 100644 index 000000000..6a3a810dd --- /dev/null +++ b/contracts/README.md @@ -0,0 +1,141 @@ +# Minimal Cairo 1.0 Template ![PRs Welcome](https://img.shields.io/badge/PRs-welcome-green.svg) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/auditless/cairo-template/blob/main/LICENSE) CI Badge + +[Built with **`auditless/cairo-template`**](https://github.com/auditless/cairo-template) + +A minimal template for building smart contracts with Cairo 1.0 +using the [Quaireaux](https://github.com/keep-starknet-strange/quaireaux) project defaults. + +## How it works + +- No submodules, forks or other heavy machinery +- Uses the [`cairo-test-runner`](https://github.com/starkware-libs/cairo/blob/main/crates/cairo-lang-test-runner/README.md) binary for running tests +- Built as a [Scarb](https://github.com/software-mansion/scarb) package for reusability and uses Scarb dependencies for libraries +- Has reproducible builds using GitHub Actions +- Uses Scarb scripts natively for custom commands +- Includes advanced debugging views like the Sierra intermediate representation + +## Installing dependencies + +### Step 1: Install Cairo 1.0 (guide by [Abdel](https://github.com/abdelhamidbakhta)) + +If you are on an x86 Linux system and able to use the release binary, +you can download Cairo here https://github.com/starkware-libs/cairo/releases. + +For everyone, else, we recommend compiling Cairo from source like so: + +```bash +# Install stable Rust +$ rustup override set stable && rustup update + +# Clone the Cairo compiler in $HOME/Bin +$ cd ~/Bin && git clone git@github.com:starkware-libs/cairo.git && cd cairo + +# Generate release binaries +$ cargo build --all --release +``` + +**NOTE: Keeping Cairo up to date** + +Now that your Cairo compiler is in a cloned repository, all you will need to do +is pull the latest changes and rebuild as follows: + +```bash +$ cd ~/Bin/cairo && git fetch && git pull && cargo build --all --release +``` + +### Step 2: Add Cairo 1.0 executables to your path + +```bash +export PATH="$HOME/Bin/cairo/target/release:$PATH" +``` + +**NOTE: If installing from a Linux binary, adapt the destination path accordingly.** + +This will make available several binaries. The one we use is called `cairo-test`. + +### Step 3: Install the Cairo package manager Scarb + +Follow the installation guide in [Scarb's Repository](https://github.com/software-mansion/scarb). + +### Step 4: Setup Language Server + +#### VS Code Extension + +- Disable previous Cairo 0.x extension +- Install the Cairo 1 extension for proper syntax highlighting and code navigation. +Just follow the steps indicated [here](https://github.com/starkware-libs/cairo/blob/main/vscode-cairo/README.md). + +#### Cairo Language Server + +From [Step 1](#step-1-install-cairo-10-guide-by-abdel), the `cairo-language-server` binary should be built and executing this command will copy its path into your clipboard. + +```bash +$ which cairo-language-server | pbcopy +``` + +Update the `languageServerPath` of the Cairo 1.0 extension by pasting the path. + +## How to use this template + +First you will need to clone the repository or click the `Use this template` button +at the top of the page to create a new repository based on the template. + +Next, you will want to update the configuration files with the name of your project: + +``` +├── .cairo_project.toml +└── .Scarb.toml +``` + +## Working with your project + +The Cairo template currently supports building and testing contracts. + +### Build + +Build the contracts. + +```bash +$ scarb build +``` + +### Test + +Run the tests in `src/test`: + +```bash +$ scarb run test +``` + +### Format + +Format the Cairo source code (using Scarb): + +```bash +$ scarb fmt +``` + +### Sierra (advanced) + +View the compiled Sierra output of your Cairo code: + +```bash +$ scarb run sierra +``` + +## Thanks to + +- The [Quaireaux](https://github.com/keep-starknet-strange/quaireaux) team for coming up with +this configuration and especially [Abdel](https://github.com/abdelhamidbakhta) for helping me with Cairo 1.0 installation +- [Paul Berg](https://github.com/PaulRBerg) and the [foundry-template](https://github.com/paulrberg/foundry-template) project which served as inspiration +- Last but not least, the StarkWare team for building the first smart contract language that is a joy to use + +## Other templates + +- [ArgentX template](https://github.com/argentlabs/starknet-build/tree/main/cairo1.0) is built as a fork of the compiler +- [Eni's cairo1-template](https://github.com/msaug/cairo1-template) uses git submodules for installation +- [Shramee's Starklings](https://github.com/shramee/starklings-cairo1) use the cairo1 crates as libraries and builds its own framework + +## License + +[MIT](https://github.com/auditless/cairo-template/blob/main/LICENSE) © [Auditless Limited](https://www.auditless.com) diff --git a/contracts/Scarb.lock b/contracts/Scarb.lock new file mode 100644 index 000000000..88a112553 --- /dev/null +++ b/contracts/Scarb.lock @@ -0,0 +1,14 @@ +# Code generated by scarb DO NOT EDIT. +version = 1 + +[[package]] +name = "chainlink" +version = "0.1.0" +dependencies = [ + "openzeppelin", +] + +[[package]] +name = "openzeppelin" +version = "0.10.0" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.10.0#d77082732daab2690ba50742ea41080eb23299d3" diff --git a/contracts/Scarb.toml b/contracts/Scarb.toml new file mode 100644 index 000000000..69c519dfd --- /dev/null +++ b/contracts/Scarb.toml @@ -0,0 +1,30 @@ +[package] +name = "chainlink" +version = "0.1.0" +cairo-version = "2.6.3" +description = "Chainlink contracts for Starknet" +homepage = "https://github.com/smartcontractkit/chainlink-starknet" + +[scripts] +sierra = "cairo-compile . -r" +# Add your own custom commands and run them with scarb run + +# Uncomment if you want to use dependencies +# Note: currently testing doesn't work with dependencies +[dependencies] +starknet = ">=2.6.3" +openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.10.0" } + +[lib] + +[[target.starknet-contract]] +sierra = true +casm = true +# pythonic hints are necessary for cairo-lang to parse the casm file: +# Unsupported compiled class format. Cairo 1.0 compiled class must contain the attribute `pythonic_hints`. +casm-add-pythonic-hints = true + +# this elevates the severity of disallowed libfuncs to compilation errors +# https://docs.swmansion.com/scarb/docs/starknet/contract-target#allowed-libfuncs-validation +allowed-libfuncs-deny = true +allowed-libfuncs-list.name = "audited" diff --git a/contracts/cairo_project.toml b/contracts/cairo_project.toml new file mode 100644 index 000000000..df050dd0c --- /dev/null +++ b/contracts/cairo_project.toml @@ -0,0 +1,2 @@ +[crate_roots] +chainlink = "src" diff --git a/contracts/constraints.txt b/contracts/constraints.txt deleted file mode 100644 index 7ecf2e0c1..000000000 --- a/contracts/constraints.txt +++ /dev/null @@ -1 +0,0 @@ -marshmallow-dataclass==8.5.3 \ No newline at end of file diff --git a/contracts/contracts/access_controller.cairo b/contracts/contracts/access_controller.cairo deleted file mode 100644 index 83cff870b..000000000 --- a/contracts/contracts/access_controller.cairo +++ /dev/null @@ -1,81 +0,0 @@ -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.bool import TRUE, FALSE - -@storage_var -func access_list_(address: felt) -> (bool: felt): -end - -from contracts.ownable import ( - Ownable_initializer, - Ownable_only_owner, - Ownable_get_owner, - Ownable_transfer_ownership -) - -@constructor -func constructor{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - owner: felt, -): - Ownable_initializer(owner) - return () -end - -@view -func has_access{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - address: felt -) -> (bool: felt): - let (bool) = access_list_.read(address) - return (bool) -end - - -@view -func check_access{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - address: felt -): - let (bool) = access_list_.read(address) - with_attr error_message("AccessController: address does not have access"): - assert bool = TRUE - end - return () -end - -@external -func add_access{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - address: felt -): - Ownable_only_owner() - access_list_.write(address, TRUE) - return () -end - -@external -func remove_access{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - address: felt -): - Ownable_only_owner() - access_list_.write(address, FALSE) - return () -end \ No newline at end of file diff --git a/contracts/contracts/account.cairo b/contracts/contracts/account.cairo deleted file mode 100644 index 9159a8ab6..000000000 --- a/contracts/contracts/account.cairo +++ /dev/null @@ -1,3 +0,0 @@ -%lang starknet - -from openzeppelin.account.Account import constructor \ No newline at end of file diff --git a/contracts/contracts/aggregator.cairo b/contracts/contracts/aggregator.cairo deleted file mode 100644 index 87dfea0eb..000000000 --- a/contracts/contracts/aggregator.cairo +++ /dev/null @@ -1,1345 +0,0 @@ -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin, BitwiseBuiltin -from starkware.cairo.common.alloc import alloc -from starkware.cairo.common.hash import hash2 -from starkware.cairo.common.hash_state import ( - hash_init, hash_finalize, hash_update, hash_update_single -) -from starkware.cairo.common.signature import verify_ecdsa_signature -from starkware.cairo.common.bitwise import bitwise_and -from starkware.cairo.common.math import ( - abs_value, - split_felt, - assert_lt_felt, - assert_le_felt, - assert_lt, - assert_le, - assert_not_zero, assert_not_equal, assert_nn_le, assert_nn, assert_in_range, unsigned_div_rem -) -from starkware.cairo.common.math_cmp import ( - is_not_zero, -) -from starkware.cairo.common.pow import pow -from starkware.cairo.common.uint256 import ( - Uint256, - uint256_sub, -) -from starkware.cairo.common.bool import TRUE, FALSE - -from starkware.starknet.common.syscalls import ( - get_caller_address, - get_contract_address, - get_block_timestamp, - get_block_number, - get_tx_info, -) - -from openzeppelin.utils.constants import UINT8_MAX - -from openzeppelin.token.erc20.interfaces.IERC20 import IERC20 - -from contracts.interfaces.IAccessController import IAccessController - -from contracts.ownable import ( - Ownable_initializer, - Ownable_only_owner, - Ownable_get_owner, - Ownable_transfer_ownership, - Ownable_accept_ownership -) - -# --- - -const MAX_ORACLES = 31 - -const GIGA = 10 ** 9 - -const UINT32_MAX = 2 ** 32 -const INT192_MAX = 2 ** (192 - 1) -const INT192_MIN = -2 ** (192 - 1) - -func felt_to_uint256{range_check_ptr}(x) -> (uint_x : Uint256): - let (high, low) = split_felt(x) - return (Uint256(low=low, high=high)) -end - -func uint256_to_felt{range_check_ptr}(value : Uint256) -> (value : felt): - assert_lt_felt(value.high, 2 ** 123) - return (value.high * (2 ** 128) + value.low) -end - -# Maximum number of faulty oracles -@storage_var -func f_() -> (f: felt): -end - -@storage_var -func latest_epoch_and_round_() -> (res: felt): -end - -@storage_var -func latest_aggregator_round_id_() -> (round_id: felt): -end - -using Range = (min: felt, max: felt) - -@storage_var -func answer_range_() -> (range: Range): -end - -@storage_var -func decimals_() -> (decimals: felt): -end - -@storage_var -func description_() -> (description: felt): -end - -# - -@storage_var -func latest_config_block_number_() -> (block: felt): -end - -@storage_var -func config_count_() -> (count: felt): -end - -@storage_var -func latest_config_digest_() -> (digest: felt): -end - -@storage_var -func oracles_len_() -> (len: felt): -end - -# TODO: should we pack into (index, payment) = split_felt()? index is u8, payment is u128 -struct Oracle: - member index: felt - - # entire supply of LINK always fits into u96, so felt is safe to use - member payment_juels: felt -end - -@storage_var -func transmitters_(pkey: felt) -> (index: Oracle): -end - -@storage_var -func signers_(pkey: felt) -> (index: felt): -end - -@storage_var -func signers_list_(index: felt) -> (pkey: felt): -end - -@storage_var -func transmitters_list_(index: felt) -> (pkey: felt): -end - -@storage_var -func reward_from_aggregator_round_id_(index: felt) -> (round_id: felt): -end - -# --- - -struct Transmission: - member answer: felt - member block_num: felt - member observation_timestamp: felt - member transmission_timestamp: felt -end - -@storage_var -func transmissions_(round_id: felt) -> (transmission: Transmission): -end - -# --- - -@constructor -func constructor{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - owner: felt, - link: felt, - min_answer: felt, - max_answer: felt, - billing_access_controller: felt, - decimals: felt, - description: felt -): - Ownable_initializer(owner) - link_token_.write(link) - billing_access_controller_.write(billing_access_controller) - - assert_lt(min_answer, max_answer) - let range : Range = (min=min_answer, max=max_answer) - answer_range_.write(range) - - with_attr error_message("decimals exceed 2^8"): - assert_lt(decimals, UINT8_MAX) - end - decimals_.write(decimals) - description_.write(description) - # TODO: initialize vars to defaults - return () -end - -# --- Ownership --- - -@view -func owner{pedersen_ptr : HashBuiltin*, syscall_ptr : felt*, range_check_ptr}() -> (owner : felt): - let (owner) = Ownable_get_owner() - return (owner=owner) -end - -@external -func transfer_ownership{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}(new_owner: felt) -> (): - return Ownable_transfer_ownership(new_owner) -end - -@external -func accept_ownership{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}() -> (new_owner: felt): - return Ownable_accept_ownership() -end - -# --- Validation --- - -# TODO: disable validation + flags in the initial release -# TODO: document decision in repo/docs/contracts/ocr2 - -@contract_interface -namespace IValidator: - func validate(prev_round_id: felt, prev_answer: felt, round_id: felt, answer: felt) -> (valid: felt): - end -end - -# TODO: can't set gas limit -@storage_var -func validator_() -> (validator: felt): -end - -@view -func validator_config{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (validator: felt): - let (validator) = validator_.read() - return (validator) -end - -@external -func set_validator_config{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(validator: felt): - Ownable_only_owner() - # TODO: use openzeppelin's ERC165 to validate - validator_.write(validator) - - # TODO: emit event - - return () -end - -# --- Configuration - -@event -func config_set( - previous_config_block_number: felt, - latest_config_digest: felt, - config_count: felt, - oracles_len: felt, - oracles: OracleConfig*, - f: felt, - onchain_config: felt, # TODO - offchain_config_version: felt, - offchain_config_len: felt, - offchain_config: felt*, -): -end - - -struct OracleConfig: - member signer: felt - member transmitter: felt -end - -@external -func set_config{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}( - oracles_len: felt, - oracles: OracleConfig*, - f: felt, - onchain_config: felt, # TODO - offchain_config_version: felt, - offchain_config_len: felt, - offchain_config: felt*, -) -> (digest: felt): - alloc_locals - # Ownable_only_owner() TODO: reenable - - assert_nn_le(oracles_len, MAX_ORACLES) # oracles_len <= MAX_ORACLES - assert_lt(3 * f, oracles_len) # 3 * f < oracles_len - assert_nn(f) # f is positive - - # pay out existing oracles - pay_oracles() - - # remove old signers/transmitters - let (len) = oracles_len_.read() - remove_oracles(len) - - let (latest_round_id) = latest_aggregator_round_id_.read() - - # add new oracles (also sets oracle_len_) - add_oracles(oracles, 0, oracles_len, latest_round_id) - - f_.write(f) - let (block_num : felt) = get_block_number() - let (prev_block_num) = latest_config_block_number_.read() - latest_config_block_number_.write(block_num) - # update config count - let (config_count) = config_count_.read() - let config_count = config_count + 1 - config_count_.write(config_count) - # calculate and store config digest - let (contract_address) = get_contract_address() - let (tx_info) = get_tx_info() - let (digest) = config_digest_from_data( - tx_info.chain_id, - contract_address, - config_count, - oracles_len, - oracles, - f, - onchain_config, - offchain_config_version, - offchain_config_len, - offchain_config - ) - latest_config_digest_.write(digest) - - # reset epoch & round - latest_epoch_and_round_.write(0) - - config_set.emit( - previous_config_block_number=prev_block_num, - latest_config_digest=digest, - config_count=config_count, - oracles_len=oracles_len, - oracles=oracles, - f=f, - onchain_config=onchain_config, - offchain_config_version=offchain_config_version, - offchain_config_len=offchain_config_len, - offchain_config=offchain_config, - ) - - return (digest) -end - -func remove_oracles{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(n: felt): - alloc_locals - - if n == 0: - oracles_len_.write(0) - return () - end - - # delete oracle from all maps - let (signer) = signers_list_.read(n) - signers_.write(signer, 0) - - let (transmitter) = transmitters_list_.read(n) - transmitters_.write(transmitter, Oracle(index=0, payment_juels=0)) - - return remove_oracles(n - 1) -end - -func add_oracles{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(oracles: OracleConfig*, index: felt, len: felt, latest_round_id: felt): - alloc_locals - - if len == 0: - oracles_len_.write(index) - return () - end - - # NOTE: index should start with 1 here because storage is 0-initialized. - # That way signers(pkey) => 0 indicates "not present" - let index = index + 1 - - signers_.write(oracles.signer, index) - signers_list_.write(index, oracles.signer) - - transmitters_.write(oracles.transmitter, Oracle(index=index, payment_juels=0)) - transmitters_list_.write(index, oracles.transmitter) - - reward_from_aggregator_round_id_.write(index, latest_round_id) - - return add_oracles(oracles + OracleConfig.SIZE, index, len - 1, latest_round_id) -end - -func config_digest_from_data{ - pedersen_ptr : HashBuiltin*, -}( - chain_id: felt, - contract_address: felt, - config_count: felt, - oracles_len: felt, - oracles: OracleConfig*, - f: felt, - onchain_config: felt, # TODO - offchain_config_version: felt, - offchain_config_len: felt, - offchain_config: felt*, -) -> (hash: felt): - let hash_ptr = pedersen_ptr - with hash_ptr: - let (hash_state_ptr) = hash_init() - let (hash_state_ptr) = hash_update_single(hash_state_ptr, chain_id) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, contract_address) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, config_count) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, oracles_len) - let (hash_state_ptr) = hash_update(hash_state_ptr, oracles, oracles_len * OracleConfig.SIZE) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, f) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, onchain_config) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, offchain_config_version) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, offchain_config_len) - let (hash_state_ptr) = hash_update(hash_state_ptr, offchain_config, offchain_config_len) - - let (hash) = hash_finalize(hash_state_ptr) - let pedersen_ptr = hash_ptr - return (hash=hash) - end -end - -@view -func latest_config_details{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> ( - config_count: felt, - block_number: felt, - config_digest: felt -): - let (config_count) = config_count_.read() - let (block_number) = latest_config_block_number_.read() - let (config_digest) = latest_config_digest_.read() - return(config_count=config_count, block_number=block_number, config_digest=config_digest) -end - -@view -func transmitters{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (transmitters_len: felt, transmitters: felt*): - alloc_locals - - let (result: felt*) = alloc() - let (len) = oracles_len_.read() - - transmitters_inner(len, 0, result) - - return (transmitters_len=len, transmitters=result) -end - -# unroll transmitter list into a continuous array -func transmitters_inner{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(len: felt, index: felt, result: felt*): - if len == 0: - return () - end - - let index = index + 1 - - let (transmitter) = transmitters_list_.read(index) - assert result[0] = transmitter - - return transmitters_inner(len - 1, index, result + 1) -end - -# --- Transmission --- - -@event -func new_transmission( - round_id: felt, - answer: felt, - transmitter: felt, - observation_timestamp: felt, - observers: felt, - observations_len: felt, - observations: felt*, - juels_per_fee_coin: felt, - config_digest: felt, - epoch_and_round: felt, - reimbursement: felt, -): -end - -struct Signature: - member r : felt - member s : felt - # TODO: can further compress by using signer index instead of pubkey? - # TODO: observers[i] = n => signers[n] => public_key - member public_key: felt -end - -struct ReportContext: - member config_digest : felt - member epoch_and_round : felt - member extra_hash : felt -end - -# TODO we can base64 encode inputs, but we could also pre-split the inputs (so instead of a binary report, -# it's already split into observers, len and observations). Encoding would shrink the input size since each observation -# wouldn't have to be felt-sized. -@external -func transmit{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - ecdsa_ptr : SignatureBuiltin*, - bitwise_ptr : BitwiseBuiltin*, - range_check_ptr -}( - report_context: ReportContext, - observation_timestamp: felt, - observers: felt, - observations_len: felt, - observations: felt*, - juels_per_fee_coin: felt, - signatures_len: felt, - signatures: Signature*, -): - alloc_locals - - let (epoch_and_round) = latest_epoch_and_round_.read() - with_attr error_message("stale report"): - assert_lt(epoch_and_round, report_context.epoch_and_round) - end - - # validate transmitter - let (caller) = get_caller_address() - let (oracle: Oracle) = transmitters_.read(caller) - assert_not_equal(oracle.index, 0) # 0 index = uninitialized - # ERROR: caller seems to be the account contract address, not the underlying transmitter key - - # Validate config digest matches latest_config_digest - let (config_digest) = latest_config_digest_.read() - with_attr error_message("config digest mismatch"): - assert report_context.config_digest = config_digest - end - - let (f) = f_.read() - with_attr error_message("wrong number of signatures f={f}"): - assert signatures_len = (f + 1) - end - - let (msg) = hash_report( - report_context, - observation_timestamp, - observers, - observations_len, - observations, - juels_per_fee_coin - ) - verify_signatures(msg, signatures, signatures_len, signed_count=0) - - # report(): - - assert_nn_le(observations_len, MAX_ORACLES) # len <= MAX_ORACLES - assert_lt(f, observations_len) # f < len - - latest_epoch_and_round_.write(report_context.epoch_and_round) - - let (median_idx : felt, _) = unsigned_div_rem(observations_len, 2) - let median = observations[median_idx] - - # Check abs(median) is in i192 range. - # NOTE: (assert_lt_felt(-i192::MAX, median) doesn't work correctly so we have to use abs!) - let (value) = abs_value(median) - with_attr error_message("value not in int192 range: {median}"): - assert_lt_felt(value, INT192_MAX) - end - - # Validate median in min-max range - let (answer_range : Range) = answer_range_.read() - assert_in_range(median, answer_range.min, answer_range.max) - # TODO: needs to handle negative values correctly, add test - - let (local prev_round_id) = latest_aggregator_round_id_.read() - # let (prev_round_id) = latest_aggregator_round_id_.read() - let round_id = prev_round_id + 1 - latest_aggregator_round_id_.write(round_id) - - let (timestamp : felt) = get_block_timestamp() - let (block_num : felt) = get_block_number() - - # write to storage - transmissions_.write(round_id, Transmission( - answer=median, - block_num=block_num, - observation_timestamp=observation_timestamp, - transmission_timestamp=timestamp, - )) - - # validate via validator - let (validator) = validator_.read() - - if validator != 0: - let (prev_transmission) = transmissions_.read(prev_round_id) - IValidator.validate( - contract_address=validator, - prev_round_id=prev_round_id, - prev_answer=prev_transmission.answer, - round_id=round_id, - answer=median - ) - - tempvar syscall_ptr = syscall_ptr - tempvar range_check_ptr = range_check_ptr - tempvar pedersen_ptr = pedersen_ptr - else: - tempvar syscall_ptr = syscall_ptr - tempvar range_check_ptr = range_check_ptr - tempvar pedersen_ptr = pedersen_ptr - end - tempvar syscall_ptr = syscall_ptr - tempvar range_check_ptr = range_check_ptr - tempvar pedersen_ptr = pedersen_ptr - - let (reimbursement_juels) = calculate_reimbursement() - - # end report() - - new_transmission.emit( - round_id=round_id, - answer=median, - transmitter=caller, - observation_timestamp=observation_timestamp, - observers=observers, - observations_len=observations_len, - observations=observations, - juels_per_fee_coin=juels_per_fee_coin, - config_digest=report_context.config_digest, - epoch_and_round=report_context.epoch_and_round, - reimbursement=reimbursement_juels, - ) - - # pay transmitter - let (billing: Billing) = billing_.read() - let payment = reimbursement_juels + (billing.transmission_payment_gjuels * GIGA) - # TODO: check overflow - - transmitters_.write(caller, Oracle( - index=oracle.index, - payment_juels=oracle.payment_juels + payment - )) - - return () -end - -func hash_report{ - pedersen_ptr : HashBuiltin*, -}( - report_context: ReportContext, - observation_timestamp: felt, - observers: felt, - observations_len: felt, - observations: felt*, - juels_per_fee_coin: felt, -) -> (hash: felt): - let hash_ptr = pedersen_ptr - with hash_ptr: - let (hash_state_ptr) = hash_init() - let (hash_state_ptr) = hash_update_single(hash_state_ptr, report_context.config_digest) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, report_context.epoch_and_round) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, report_context.extra_hash) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, observation_timestamp) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, observers) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, observations_len) - let (hash_state_ptr) = hash_update(hash_state_ptr, observations, observations_len) - let (hash_state_ptr) = hash_update_single(hash_state_ptr, juels_per_fee_coin) - - let (hash) = hash_finalize(hash_state_ptr) - let pedersen_ptr = hash_ptr - return (hash=hash) - end -end - -func verify_signatures{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - ecdsa_ptr : SignatureBuiltin*, - bitwise_ptr : BitwiseBuiltin*, - range_check_ptr, -}( - msg: felt, - signatures: Signature*, - signatures_len: felt, - signed_count: felt # used for tracking duplicate signatures -): - alloc_locals - - if signatures_len == 0: - # Check all signatures are unique (we only saw each pubkey once) - let (masked) = bitwise_and( - signed_count, - 0x01010101010101010101010101010101010101010101010101010101010101 - ) - with_attr error_message("duplicate signer"): - assert signed_count = masked - end - return () - end - - let signature = signatures[0] - - # Validate the signer key actually belongs to an oracle - let (index) = signers_.read(signature.public_key) - with_attr error_message("invalid signer {signature.public_key}"): - assert_not_equal(index, 0) # 0 index = uninitialized - end - - verify_ecdsa_signature( - message=msg, - public_key=signature.public_key, - signature_r=signature.r, - signature_s=signature.s - ) - - # TODO: Using shifts here might be expensive due to pow()? - # evaluate using alloc() to allocate a signed_count[oracles_len] instead - - # signed_count + 1 << (8 * index) - let (shift) = pow(2, 8 * index) - let signed_count = signed_count + shift - - return verify_signatures( - msg, - signatures + Signature.SIZE, - signatures_len - 1, - signed_count - ) -end - -# --- RequestNewRound - -# --- Queries - -@view -func description{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (description: felt): - let (description) = description_.read() - return (description) -end - -@view -func decimals{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (decimals: felt): - let (decimals) = decimals_.read() - return (decimals) -end - -struct Round: - member round_id: felt - member answer: felt - member block_num: felt - member observation_timestamp: felt - member transmission_timestamp: felt -end - -@view -func round_data{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(round_id: felt) -> (round: Round): - # TODO: assert round_id fits in u32 - - let (transmission: Transmission) = transmissions_.read(round_id) - - let round = Round( - round_id=round_id, - answer=transmission.answer, - block_num=transmission.block_num, - observation_timestamp=transmission.observation_timestamp, - transmission_timestamp=transmission.transmission_timestamp, - ) - return (round) -end - -@view -func latest_round_data{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (round: Round): - let (latest_round_id) = latest_aggregator_round_id_.read() - let (transmission: Transmission) = transmissions_.read(latest_round_id) - - let round = Round( - round_id=latest_round_id, - answer=transmission.answer, - block_num=transmission.block_num, - observation_timestamp=transmission.observation_timestamp, - transmission_timestamp=transmission.transmission_timestamp, - ) - return (round) -end - - -# --- Set LINK Token - -@storage_var -func link_token_() -> (token: felt): -end - -@event -func link_token_set( - old_link_token: felt, - new_link_token: felt -): -end - - -@external -func set_link_token{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(link_token: felt, recipient: felt): - alloc_locals - Ownable_only_owner() - - let (old_token) = link_token_.read() - if link_token == old_token: - return () - end - - let (contract_address) = get_contract_address() - - # call balanceOf as a sanity check to confirm we're talking to a token - IERC20.balanceOf( - contract_address=link_token, - account=contract_address, - ) - - pay_oracles() - - # transfer remaining balance to recipient - let (amount: Uint256) = IERC20.balanceOf( - contract_address=link_token, - account=contract_address, - ) - IERC20.transfer( - contract_address=old_token, - recipient=recipient, - amount=amount, - ) - - link_token_.write(link_token) - - link_token_set.emit( - old_link_token=old_token, - new_link_token=link_token, - ) - - return () -end - -@view -func link_token{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (link_token: felt): - let (link_token) = link_token_.read() - return (link_token) -end - -# --- Billing Access Controller - -@storage_var -func billing_access_controller_() -> (access_controller: felt): -end - -@event -func billing_access_controller_set( - old_controller: felt, - new_controller: felt, -): -end - -@external -func set_billing_access_controller{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(access_controller: felt): - Ownable_only_owner() - - let (old_controller) = billing_access_controller_.read() - if access_controller != old_controller: - billing_access_controller_.write(access_controller) - - billing_access_controller_set.emit( - old_controller=old_controller, - new_controller=access_controller, - ) - - return () - end - - return () -end - -@view -func billing_access_controller{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (access_controller: felt): - let (access_controller) = billing_access_controller_.read() - return (access_controller) -end - -# --- Billing Config - -struct Billing: - # TODO: use a single felt via (observation_payment, transmission_payment) = split_felt()? - member observation_payment_gjuels : felt - member transmission_payment_gjuels : felt -end - -@storage_var -func billing_() -> (config: Billing): -end - -@view -func billing{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (config: Billing): - let (config: Billing) = billing_.read() - return (config) -end - -@event -func billing_set( - config: Billing, -): -end - -@external -func set_billing{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(config: Billing): - has_billing_access() - - # Pay out oracles using existing settings for rounds up to now - pay_oracles() - - # check payment value ranges within u32 bounds - assert_nn_le(config.observation_payment_gjuels, UINT32_MAX) - assert_nn_le(config.transmission_payment_gjuels, UINT32_MAX) - - billing_.write(config) - - billing_set.emit(config=config) - - return () -end - -func has_billing_access{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (bool: felt): - let (caller) = get_caller_address() - let (owner) = Ownable_get_owner() - - # owner always has access - if caller == owner: - return (TRUE) - end - - let (access_controller) = billing_access_controller_.read() - - let (has_access: felt) = IAccessController.has_access( - contract_address=access_controller, - address=caller - ) - return (has_access) -end - -# --- Payments and Withdrawals - -@event -func oracle_paid( - transmitter: felt, - payee: felt, - amount: Uint256, - link_token: felt, -): -end - -@external -func withdraw_payment{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(transmitter: felt): - alloc_locals - let (caller) = get_caller_address() - let (payee) = payees_.read(transmitter) - with_attr error_message("only payee can withdraw"): - assert caller = payee - end - - pay_oracle(transmitter) - return () -end - -@external -func owed_payment{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(transmitter: felt) -> (amount: felt): - let (oracle: Oracle) = transmitters_.read(transmitter) - - if oracle.index == 0: - return (0) - end - - let (billing: Billing) = billing_.read() - - let (latest_round_id) = latest_aggregator_round_id_.read() - let (from_round_id) = reward_from_aggregator_round_id_.read(transmitter) - let rounds = latest_round_id - from_round_id - - let amount = (rounds * billing.observation_payment_gjuels * GIGA) + oracle.payment_juels - return (amount) -end - -func pay_oracle{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(transmitter: felt): - alloc_locals - - let (oracle: Oracle) = transmitters_.read(transmitter) - - if oracle.index == 0: - return () - end - - let (amount_: felt) = owed_payment(transmitter) - assert_nn(amount_) - - # if zero, fastpath return to avoid empty transfers - let (not_zero) = is_not_zero(amount_) - if not_zero == FALSE: - return () - end - - let (amount: Uint256) = felt_to_uint256(amount_) - let (payee) = payees_.read(transmitter) - - let (link_token) = link_token_.read() - - # TODO: do something with the return value? - IERC20.transfer( - contract_address=link_token, - recipient=payee, - amount=amount, - ) - - oracle_paid.emit( - transmitter=transmitter, - payee=payee, - amount=amount, - link_token=link_token - ) - - return () -end - -func pay_oracles{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(): - let (len) = oracles_len_.read() - pay_oracles_(len) - return () -end - -func pay_oracles_{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(index: felt): - if index == 0: - return () - end - - # TODO: share link_token & last_round_id between pay_oracle calls - let (transmitter) = transmitters_list_.read(index) - pay_oracle(transmitter) - - return pay_oracles_(index - 1) -end - -@external -func withdraw_funds{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(recipient: felt, amount: Uint256): - has_billing_access() - - return () -end - -func total_link_due{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (due: felt): - let (len) = oracles_len_.read() - let (latest_round_id) = latest_aggregator_round_id_.read() - - let (amount) = total_link_due_(len, latest_round_id, 0, 0) - return (amount) -end - -func total_link_due_{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(index: felt, latest_round_id: felt, total_rounds: felt, payments_juels: felt) -> (due: felt): - if index == 0: - let (billing: Billing) = billing_.read() - let amount = (total_rounds * billing.observation_payment_gjuels * GIGA) + payments_juels - return (amount) - end - - let (transmitter) = transmitters_list_.read(index) - let (oracle: Oracle) = transmitters_.read(transmitter) - assert_not_zero(oracle.index) # 0 == undefined - - let (from_round_id) = reward_from_aggregator_round_id_.read(transmitter) - let rounds = latest_round_id - from_round_id - - let total_rounds = total_rounds + rounds - let payments_juels = payments_juels + oracle.payment_juels - - return total_link_due_(index - 1, latest_round_id, total_rounds, payments_juels) -end - -@view -func link_available_for_payment{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}() -> (available: felt): - alloc_locals - let (link_token) = link_token_.read() - let (contract_address) = get_contract_address() - - let (balance_: Uint256) = IERC20.balanceOf( - contract_address=link_token, - account=contract_address, - ) - # entire link supply fits into u96 so this should not fail - let (balance) = uint256_to_felt(balance_) - - let (due) = total_link_due() - let amount = balance - due - - return (available=amount) -end - -# --- Transmitter Payment - -func calculate_reimbursement() -> (amount: felt): - # TODO: - let amount = 0 - return (amount) -end - -# --- Payee Management - -@storage_var -func payees_(transmitter: felt) -> (payment_address: felt): -end - -@storage_var -func proposed_payees_(transmitter: felt) -> (payment_address: felt): -end - -@event -func payeeship_transfer_requested( - transmitter: felt, - current: felt, - proposed: felt, -): -end - -@event -func payeeship_transferred( - transmitter: felt, - previous: felt, - current: felt, -): -end - -struct PayeeConfig: - member transmitter: felt - member payee: felt -end - -@external -func set_payees{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}(payees_len: felt, payees: PayeeConfig*): - Ownable_only_owner() - - set_payee(payees, payees_len) - - return () -end - - -# Returns 1 if value == 0. Returns 1 otherwise. -func is_zero(value) -> (res): - if value == 0: - return (res=1) - end - - return (res=0) -end - -func set_payee{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}(payees: PayeeConfig*, len: felt): - if len == 0: - return () - end - - let (current_payee) = payees_.read(payees.transmitter) - - # a more convoluted way of saying - # require(current_payee == 0 || current_payee == payee, "payee already set") - let (is_unset) = is_zero(current_payee) - let (is_same) = is_zero(current_payee - payees.payee) - with_attr error_message("payee already set"): - assert (is_unset - 1) * (is_same - 1) = 0 - end - - payees_.write(payees.transmitter, payees.payee) - - payeeship_transferred.emit( - transmitter=payees.transmitter, - previous=current_payee, - current=payees.payee - ) - - return set_payee(payees + PayeeConfig.SIZE, len - 1) -end - -@external -func transfer_payeeship{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(transmitter: felt, proposed: felt): - let (caller) = get_caller_address() - let (payee) = payees_.read(transmitter) - with_attr error_message("only current payee can update"): - assert caller = payee - end - with_attr error_message("cannot transfer to self"): - assert_not_equal(caller, proposed) - end - - proposed_payees_.write(transmitter, proposed) - - payeeship_transfer_requested.emit( - transmitter=transmitter, - current=payee, - proposed=proposed - ) - - return () -end - -@external -func accept_payeeship{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}(transmitter: felt): - let (caller) = get_caller_address() - let (proposed) = proposed_payees_.read(transmitter) - with_attr error_message("only proposed payee can accept"): - assert caller = proposed - end - - let (previous) = payees_.read(transmitter) - payees_.write(transmitter, caller) - proposed_payees_.write(transmitter, 0) - - payeeship_transferred.emit( - transmitter=transmitter, - previous=previous, - current=caller - ) - - return () -end diff --git a/contracts/contracts/interfaces/IAccessController.cairo b/contracts/contracts/interfaces/IAccessController.cairo deleted file mode 100644 index c7b19d25c..000000000 --- a/contracts/contracts/interfaces/IAccessController.cairo +++ /dev/null @@ -1,10 +0,0 @@ -%lang starknet - -@contract_interface -namespace IAccessController: - func has_access(address: felt) -> (bool: felt): - end - - func check_access(address: felt): - end -end \ No newline at end of file diff --git a/contracts/contracts/ownable.cairo b/contracts/contracts/ownable.cairo deleted file mode 100644 index 20ab08ec3..000000000 --- a/contracts/contracts/ownable.cairo +++ /dev/null @@ -1,69 +0,0 @@ -# Equivalent to openzeppelin/Ownable except it's a two step process to transfer ownership. -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.starknet.common.syscalls import get_caller_address - -@storage_var -func Ownable_owner() -> (owner_address : felt): -end - -@storage_var -func Ownable_proposed_owner() -> (proposed_owner_address : felt): -end - -func Ownable_initializer{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}(owner: felt): - Ownable_owner.write(owner) - return () -end - -func Ownable_only_owner{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}(): - let (owner) = Ownable_owner.read() - let (caller) = get_caller_address() - with_attr error_message("Ownable: caller is not the owner"): - assert owner = caller - end - return () -end - -func Ownable_get_owner{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}() -> (owner: felt): - let (owner) = Ownable_owner.read() - return (owner=owner) -end - -func Ownable_transfer_ownership{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}(new_owner: felt) -> (): - Ownable_only_owner() - Ownable_proposed_owner.write(new_owner) - return () -end - -func Ownable_accept_ownership{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr -}() -> (new_owner: felt): - let (proposed_owner) = Ownable_proposed_owner.read() - let (caller) = get_caller_address() - with_attr error_message("Ownable: caller is not the proposed owner"): - assert proposed_owner = caller - end - Ownable_owner.write(proposed_owner) - return (new_owner=proposed_owner) -end - diff --git a/contracts/contracts/token.cairo b/contracts/contracts/token.cairo deleted file mode 100644 index 00c0ad5af..000000000 --- a/contracts/contracts/token.cairo +++ /dev/null @@ -1,3 +0,0 @@ -%lang starknet - -from openzeppelin.token.erc20.ERC20_Mintable import constructor \ No newline at end of file diff --git a/contracts/contracts/validator.cairo b/contracts/contracts/validator.cairo deleted file mode 100644 index 396692aa4..000000000 --- a/contracts/contracts/validator.cairo +++ /dev/null @@ -1,150 +0,0 @@ -%lang starknet - -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.cairo.common.bool import TRUE, FALSE -from starkware.cairo.common.math import split_felt -from starkware.cairo.common.math_cmp import is_le -from starkware.cairo.common.uint256 import ( - Uint256, - uint256_sub, - uint256_mul, - uint256_eq, - uint256_signed_div_rem, - uint256_cond_neg, - uint256_le -) - -const THRESHOLD_MULTIPLIER = 100000 - -from contracts.ownable import ( - Ownable_initializer, - Ownable_only_owner, -) - -@storage_var -func flags_() -> (address: felt): -end - -@storage_var -func threshold_() -> (threshold: felt): -end - -@constructor -func constructor{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - owner: felt, - flags: felt, - threshold: felt, -): - Ownable_initializer(owner) - flags_.write(flags) - threshold_.write(threshold) - return () -end - -@external -func validate{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - prev_round_id: felt, - prev_answer: felt, - round_id: felt, - answer: felt -) -> (valid: felt): - alloc_locals - - let (valid) = is_valid(prev_answer, answer) - - if valid == FALSE: - # Do stuff - let a = 1 - end - - return (valid) -end - -# TODO: set_ events - -@external -func set_flagging_threshold{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - threshold: felt -): - Ownable_only_owner() - threshold_.write(threshold) - return () -end - -@external -func set_flags_address{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - flags: felt -): - Ownable_only_owner() - flags_.write(flags) - return () -end - -# --- - -func felt_to_uint256{range_check_ptr}(x) -> (uint_x : Uint256): - let (high, low) = split_felt(x) - return (Uint256(low=low, high=high)) -end - -# TODO: quadruple test the logic in this method to ensure it can never fail & revert -func is_valid{ - syscall_ptr : felt*, - pedersen_ptr : HashBuiltin*, - range_check_ptr, -}( - _prev_answer: felt, - _answer: felt -) -> (valid: felt): - alloc_locals - - if _prev_answer == 0: - # TODO: I'd rather check round_id - return (valid=TRUE) - end - - let (prev_answer: Uint256) = felt_to_uint256(_prev_answer) - let (answer: Uint256) = felt_to_uint256(_answer) - - # TODO: how is underflow/overflow handled here? - let (change: Uint256) = uint256_sub(prev_answer, answer) - let (multiplier: Uint256) = felt_to_uint256(THRESHOLD_MULTIPLIER) - - let (numerator: Uint256, overflow: Uint256) = uint256_mul(change, multiplier) - let (zero) = uint256_eq(overflow, Uint256(0, 0)) - # If overflow is not zero then we overflowed - if zero != TRUE: - return (valid=FALSE) - end - - let (ratio: Uint256, _remainder) = uint256_signed_div_rem(numerator, prev_answer) - - # Take the absolute value of ratio. - # https://github.com/starkware-libs/cairo-lang/blob/b614d1867c64f3fb2cf4a4879348cfcf87c3a5a7/src/starkware/cairo/common/uint256.cairo#L261-L264= - let (local ratio_sign) = is_le(2 ** 127, ratio.high) - local range_check_ptr = range_check_ptr - let (local ratio) = uint256_cond_neg(ratio, should_neg=ratio_sign) - # TODO: can it be simplified via sign()? - - let (threshold_felt) = threshold_.read() - let (threshold: Uint256) = felt_to_uint256(threshold_felt) - # ratio <= threshold - let (is_le_) = uint256_le(ratio, threshold) - return (valid=is_le_) -end \ No newline at end of file diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts new file mode 100644 index 000000000..391b13487 --- /dev/null +++ b/contracts/hardhat.config.ts @@ -0,0 +1,55 @@ +import { HardhatUserConfig } from 'hardhat/types' +import '@nomiclabs/hardhat-ethers' +import '@nomicfoundation/hardhat-chai-matchers' +import 'solidity-coverage' +import { prepareHardhatArtifacts } from './test/setup' + +const COMPILER_SETTINGS = { + optimizer: { + enabled: true, + runs: 1000000, + }, + metadata: { + bytecodeHash: 'none', + }, +} + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +const config: HardhatUserConfig = { + // NOTE: hardhat comes with a special built-in network called 'harhdat'. This network is automatically created and + // used if no networks are defined in our config: https://hardhat.org/hardhat-runner/docs/config#hardhat-network. It + // is important to note that we DO NOT want to use this network. Our testing scripts already spawn a hardhat node in + // a container, so we should use this for the l1 <> l2 messaging tests rather than the auto-generated one from hardhat. + // To achieve this, the 'defaultNetwork' and 'networks' properties have been adjusted such that they reference the + // containerized hardhat node. + defaultNetwork: 'localhost', + networks: { + localhost: { + url: 'http://127.0.0.1:8545', + }, + }, + solidity: { + compilers: [ + { + version: '0.8.15', + settings: COMPILER_SETTINGS, + }, + ], + }, + mocha: { + timeout: 10000000, + rootHooks: { + beforeAll: prepareHardhatArtifacts, + }, + }, + paths: { + sources: './solidity', + starknetSources: './src', + starknetArtifacts: './target/release', + cairoPaths: [], + }, +} + +export default config diff --git a/contracts/package.json b/contracts/package.json index 8468826d3..b8a109c9e 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,5 +1,29 @@ { + "name": "@chainlink/starknet-contracts", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "compile:solidity": "hardhat compile", + "test": "hardhat test" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "@ethereum-waffle/mock-contract": "^4.0.4", + "@nomicfoundation/hardhat-chai-matchers": "^1.0.3", + "@nomiclabs/hardhat-ethers": "^2.0.5", + "@types/chai": "^4.3.3", + "@types/elliptic": "^6.4.14", + "@types/mocha": "^9.1.1", + "chai": "^4.3.6", + "ethers": "^5.6.8", + "hardhat": "^2.16.1", + "solidity-coverage": "^0.8.2" + }, "dependencies": { - "cairo-ls": "^0.0.4" + "@chainlink/contracts": "^0.4.2", + "@openzeppelin/contracts": "^4.7.3", + "axios": "^0.24.0" } } diff --git a/contracts/pytest.ini b/contracts/pytest.ini deleted file mode 100644 index d280de047..000000000 --- a/contracts/pytest.ini +++ /dev/null @@ -1,2 +0,0 @@ -[pytest] -asyncio_mode = auto \ No newline at end of file diff --git a/contracts/requirements.txt b/contracts/requirements.txt deleted file mode 100644 index 80892a14e..000000000 --- a/contracts/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -ecdsa -fastecdsa -sympy -cairo-lang -cairo-nile -openzeppelin-cairo-contracts \ No newline at end of file diff --git a/contracts/solidity/emergency/StarknetValidator.sol b/contracts/solidity/emergency/StarknetValidator.sol new file mode 100644 index 000000000..cf4191646 --- /dev/null +++ b/contracts/solidity/emergency/StarknetValidator.sol @@ -0,0 +1,316 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@chainlink/contracts/src/v0.8/interfaces/AggregatorValidatorInterface.sol"; +import "@chainlink/contracts/src/v0.8/interfaces/TypeAndVersionInterface.sol"; +import "@chainlink/contracts/src/v0.8/interfaces/AccessControllerInterface.sol"; +import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; +import "@chainlink/contracts/src/v0.8/SimpleWriteAccessController.sol"; +import "@chainlink/contracts/src/v0.8/dev/vendor/openzeppelin-solidity/v4.3.1/contracts/utils/Address.sol"; +import "../../vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/IStarknetMessaging.sol"; + +/// @title StarknetValidator - makes cross chain calls to update the Sequencer Uptime Feed on L2 +contract StarknetValidator is TypeAndVersionInterface, AggregatorValidatorInterface, SimpleWriteAccessController { + // Config for L1 -> L2 message cost approximation + // Message Cost = gasAdjustment * gasEstimate * gasPriceL1Feed / 100 + struct GasConfig { + // gas units derived from starknet estimate_message_fee + // recommended value is 17300 at time of writing + uint256 gasEstimate; + address gasPriceL1Feed; + // gasAdjustment of 100 equals 1x (see setGasConfig for more info) + // recommended value is 130 (or 1.3x) because at time of writing + // L2 gas price is equal to L1 gas price + some margin + uint32 gasAdjustment; + } + + int256 private constant ANSWER_SEQ_OFFLINE = 1; + + uint256 public immutable SELECTOR_STARK_UPDATE_STATUS = _selectorStarknet("update_status"); + uint256 public immutable L2_UPTIME_FEED_ADDR; + + IStarknetMessaging public immutable STARKNET_CROSS_DOMAIN_MESSENGER; + + AggregatorV3Interface private s_source; + AccessControllerInterface private s_configAC; + GasConfig private s_gasConfig; + + /// @notice Starknet messaging contract address - the address is 0. + error InvalidStarknetMessagingAddress(); + /// @notice Starknet uptime feed address - the address is 0. + error InvalidL2FeedAddress(); + /// @notice Error thrown when the source aggregator address is 0 + error InvalidSourceAggregatorAddress(); + /// @notice Error thrown when the access controller address is 0 + error InvalidAccessControllerAddress(); + /// @notice Error thrown when the l1 gas price feed address is 0 + error InvalidGasPriceL1FeedAddress(); + /// @notice Error thrown when caller is not the owner and does not have access + error AccessForbidden(); + + /// @notice This event is emitted when the gas config is set. + event GasConfigSet(uint256 gasEstimate, address indexed gasPriceL1Feed, uint32 gasAdjustment); + /// @notice emitted when a new gas access-control contract is set + event ConfigACSet(address indexed previous, address indexed current); + /// @notice emitted when a new source aggregator contract is set + event SourceAggregatorSet(address indexed previous, address indexed current); + /// @notice emitted when withdrawFunds or withdrawFundsTo is call + event FundsWithdrawn(address indexed recipient, uint256 amount); + + /** + * @param starknetMessaging the address of the Starknet Messaging contract + * @param configAC the address of the AccessController contract managing config access + * @param gasPriceL1Feed address of the L1 gas price feed (used to approximate bridge L1 -> L2 message cost) + * @param source the source aggregator that we'll read data from (on retries) + * @param l2Feed the address of the target L2 contract (Sequencer Uptime Feed) + * @param gasEstimate the initial gas estimate for sending a message from L1 -> L2 + */ + constructor( + address starknetMessaging, + address configAC, + address gasPriceL1Feed, + address source, + uint256 l2Feed, + uint256 gasEstimate, + uint32 gasAdjustment + ) { + if (starknetMessaging == address(0)) { + revert InvalidStarknetMessagingAddress(); + } + + if (l2Feed == 0) { + revert InvalidL2FeedAddress(); + } + + STARKNET_CROSS_DOMAIN_MESSENGER = IStarknetMessaging(starknetMessaging); + L2_UPTIME_FEED_ADDR = l2Feed; + + _setSourceAggregator(source); + _setConfigAC(configAC); + _setGasConfig(gasEstimate, gasPriceL1Feed, gasAdjustment); + } + + /// @notice converts a bool to uint256. + function toUInt256(bool x) internal pure returns (uint256 r) { + assembly { + r := x + } + } + + /** + * @notice versions: + * + * - StarknetValidator 0.1.0: initial release + * @inheritdoc TypeAndVersionInterface + */ + function typeAndVersion() external pure virtual override returns (string memory) { + return "StarknetValidator 0.1.0"; + } + + /// @notice Returns the gas configuration for sending cross chain messages. + function getGasConfig() external view returns (GasConfig memory) { + return s_gasConfig; + } + + /// @return address AccessControllerInterface contract address + function getConfigAC() external view returns (address) { + return address(s_configAC); + } + + /// @return address Aggregator contract address + function getSourceAggregator() external view returns (address) { + return address(s_source); + } + + /** + * @notice validate method sends an xDomain L2 tx to update Uptime Feed contract on L2. + * @dev A message is sent using the L1CrossDomainMessenger. This method is accessed controlled. + * @param currentAnswer new aggregator answer - value of 1 considers the sequencer offline. + * @return bool true if transaction succeeds. + */ + function validate( + uint256 /* previousRoundId */, + int256 /* previousAnswer */, + uint256 /* currentRoundId */, + int256 currentAnswer + ) external override checkAccess returns (bool) { + return _sendUpdateMessageToL2(currentAnswer); + } + + /** + * @notice retries to send the latest answer as update message to L2 + * @dev only with access, useful in cases where a previous x-domain message was handeled unsuccessfully. + */ + function retry() external checkAccess returns (bool) { + (, int256 latestAnswer, , , ) = AggregatorV3Interface(s_source).latestRoundData(); + return _sendUpdateMessageToL2(latestAnswer); + } + + /** + * @notice sends the 'update_status(answer, timestamp)' message + * via the L1 -> L2 bridge to the L2 feed contract + * @param answer The latest Sequencer status. 0 if the Sequencer is up and + * 1 if it is down. + */ + function _sendUpdateMessageToL2(int256 answer) internal returns (bool) { + // Bridge fees are paid on L1 + uint256 fee = _approximateFee(); + + // Fill payload with `status` and `timestamp` + uint256[] memory payload = new uint256[](2); + bool status = answer == ANSWER_SEQ_OFFLINE; + payload[0] = toUInt256(status); + payload[1] = block.timestamp; + + // Make the Starknet x-domain call. + // NOTICE: we ignore the output of this call (msgHash, nonce). + // We also don't raise any events as the 'LogMessageToL2' event will be emitted from the messaging contract. + STARKNET_CROSS_DOMAIN_MESSENGER.sendMessageToL2{value: fee}( + L2_UPTIME_FEED_ADDR, + SELECTOR_STARK_UPDATE_STATUS, + payload + ); + return true; + } + + /// @notice L1 oracle is asked for a fast L1 gas price, and the price multiplied by the configured gas estimate + function _approximateFee() internal view returns (uint256) { + uint256 gasPrice = approximateGasPrice(); + return gasPrice * s_gasConfig.gasEstimate; + } + + /// @notice calculates the gas price accounting for the gasAdjustment values + function approximateGasPrice() public view returns (uint256) { + (, int256 fastGasPriceInWei, , , ) = AggregatorV3Interface(s_gasConfig.gasPriceL1Feed).latestRoundData(); + return (uint256(fastGasPriceInWei) * uint256(s_gasConfig.gasAdjustment)) / 100; + } + + /** + * @notice The selector is the starknet_keccak hash of the function name + * @dev Starknet keccak is defined as the first 250 bits of the Keccak256 hash. + * This is just Keccak256 augmented in order to fit into a field element. + * @param fn string function name + */ + function _selectorStarknet(string memory fn) internal pure returns (uint256) { + bytes32 digest = keccak256(abi.encodePacked(fn)); + return uint256(digest) % 2 ** 250; // get last 250 bits + } + + /** + * @notice Sets the gas configuration for sending cross chain messages + * @param gasEstimate The estimated units of gas to execute the transaction on L2. + * This value should include any buffer to include. + * @param gasPriceL1Feed The address of the fast gas L1 feed on L1. + * @param gasAdjustment Percentage of the the cost to use. Ex: gasAdjustment of 120 + * means 120% of original value, 1.2x multiplier, or 20% increase (all mean the same thing) + */ + function setGasConfig( + uint256 gasEstimate, + address gasPriceL1Feed, + uint32 gasAdjustment + ) external onlyOwnerOrConfigAccess { + _setGasConfig(gasEstimate, gasPriceL1Feed, gasAdjustment); + } + + /** + * @notice Sets the gas configuration for sending cross chain messages + * @param gasEstimate The estimated units of gas to execute the transaction on L2. + * This value should include any buffer to include. + * @param gasPriceL1Feed The address of the fast gas L1 feed on L1. + * @param gasAdjustment Percentage of the the cost to use. Ex: gasAdjustment of 120 + * means 120% of original value, 1.2x multiplier, or 20% increase (all mean the same thing) + */ + function _setGasConfig(uint256 gasEstimate, address gasPriceL1Feed, uint32 gasAdjustment) internal { + if (gasPriceL1Feed == address(0)) { + revert InvalidGasPriceL1FeedAddress(); + } + s_gasConfig = GasConfig(gasEstimate, gasPriceL1Feed, gasAdjustment); + emit GasConfigSet(gasEstimate, gasPriceL1Feed, gasAdjustment); + } + + /** + * @notice sets config AccessControllerInterface contract + * @dev only owner can call this + * @param accessController new AccessControllerInterface contract address + */ + function setConfigAC(address accessController) external onlyOwner { + _setConfigAC(accessController); + } + + /** + * @notice Internal method that stores the configuration access controller + * @param accessController The address of the Access Controller for this contract + */ + function _setConfigAC(address accessController) internal { + if (accessController == address(0)) { + revert InvalidAccessControllerAddress(); + } + + address previousAccessController = address(s_configAC); + if (accessController != previousAccessController) { + // NOTICE: we don't give access to the new source aggregator + // It is not always the case that the source aggregator is also the sender for the 'validate' invocation + // as we usually deploy an additional proxy in between (owner can give access): + // https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/ValidatorProxy.sol + s_configAC = AccessControllerInterface(accessController); + emit ConfigACSet(previousAccessController, accessController); + } + } + + /** + * @notice sets the source aggregator AggregatorInterface contract + * @dev only owner can call this + * @param source the source aggregator that we'll read data from (on retries) + */ + function setSourceAggregator(address source) external onlyOwner { + _setSourceAggregator(source); + } + + /// @notice Internal method that sets the source aggregator AggregatorInterface contract + function _setSourceAggregator(address source) internal { + if (source == address(0)) { + revert InvalidSourceAggregatorAddress(); + } + address previousSource = address(s_source); + if (source != previousSource) { + s_source = AggregatorV3Interface(source); + emit SourceAggregatorSet(previousSource, source); + } + } + + /// @dev reverts if the caller does not have access to change the configuration + modifier onlyOwnerOrConfigAccess() { + if (msg.sender != owner() && (address(s_configAC) != address(0) && !s_configAC.hasAccess(msg.sender, msg.data))) { + revert AccessForbidden(); + } + _; + } + + /** + * @notice makes this contract payable + * @dev funds are used to pay the bridge for x-domain messages to L2 + */ + receive() external payable {} + + /** + * @notice withdraws all funds available in this contract to the msg.sender + * @dev only owner can call this + */ + function withdrawFunds() external onlyOwner { + address payable recipient = payable(msg.sender); + uint256 amount = address(this).balance; + Address.sendValue(recipient, amount); + emit FundsWithdrawn(recipient, amount); + } + + /** + * @notice withdraws all funds available in this contract to the address specified + * @dev only owner can call this + * @param recipient address where to send the funds + */ + function withdrawFundsTo(address payable recipient) external onlyOwner { + uint256 amount = address(this).balance; + Address.sendValue(recipient, amount); + emit FundsWithdrawn(recipient, amount); + } +} diff --git a/contracts/solidity/mocks/MockStarknetMessaging.sol b/contracts/solidity/mocks/MockStarknetMessaging.sol new file mode 100644 index 000000000..84ca1c3c1 --- /dev/null +++ b/contracts/solidity/mocks/MockStarknetMessaging.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: Apache-2.0. +pragma solidity ^0.8.0; + +import '../../vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/StarknetMessaging.sol'; + +/** + * @title MockStarknetMessaging make cross chain call. + For Devnet L1 <> L2 communication testing, we have to replace IStarknetCore with the MockStarknetMessaging.sol contract + */ +contract MockStarknetMessaging is StarknetMessaging { + constructor(uint256 MessageCancellationDelay) { + messageCancellationDelay(MessageCancellationDelay); + } + + /** + Mocks a message from L2 to L1. + */ + function mockSendMessageFromL2( + uint256 fromAddress, + uint256 toAddress, + uint256[] calldata payload + ) external { + bytes32 msgHash = keccak256( + abi.encodePacked(fromAddress, toAddress, payload.length, payload) + ); + l2ToL1Messages()[msgHash] += 1; + } + + /** + Mocks consumption of a message from L1 to L2. + */ + function mockConsumeMessageToL2( + uint256 fromAddress, + uint256 toAddress, + uint256 selector, + uint256[] calldata payload, + uint256 nonce + ) external { + bytes32 msgHash = keccak256( + abi.encodePacked(fromAddress, toAddress, nonce, selector, payload.length, payload) + ); + + require(l1ToL2Messages()[msgHash] > 0, "INVALID_MESSAGE_TO_CONSUME"); + l1ToL2Messages()[msgHash] = 0; + } +} diff --git a/contracts/src/access_control.cairo b/contracts/src/access_control.cairo new file mode 100644 index 000000000..f66d52735 --- /dev/null +++ b/contracts/src/access_control.cairo @@ -0,0 +1 @@ +mod access_controller; diff --git a/contracts/src/access_control/access_controller.cairo b/contracts/src/access_control/access_controller.cairo new file mode 100644 index 000000000..37d9ef909 --- /dev/null +++ b/contracts/src/access_control/access_controller.cairo @@ -0,0 +1,61 @@ +#[starknet::contract] +mod AccessController { + use starknet::ContractAddress; + use starknet::class_hash::ClassHash; + + use openzeppelin::access::ownable::OwnableComponent; + + use chainlink::libraries::access_control::{AccessControlComponent, IAccessController}; + use chainlink::libraries::type_and_version::ITypeAndVersion; + use chainlink::libraries::upgradeable::{Upgradeable, IUpgradeable}; + + component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent); + + #[abi(embed_v0)] + impl OwnableImpl = OwnableComponent::OwnableTwoStepImpl; + impl OwnableInternalImpl = OwnableComponent::InternalImpl; + + #[abi(embed_v0)] + impl AccessControlImpl = + AccessControlComponent::AccessControlImpl; + impl AccessControlInternalImpl = AccessControlComponent::InternalImpl; + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + OwnableEvent: OwnableComponent::Event, + #[flat] + AccessControlEvent: AccessControlComponent::Event, + } + + #[storage] + struct Storage { + #[substorage(v0)] + ownable: OwnableComponent::Storage, + #[substorage(v0)] + access_control: AccessControlComponent::Storage, + } + + #[constructor] + fn constructor(ref self: ContractState, owner_address: ContractAddress) { + self.ownable.initializer(owner_address); + self.access_control.initializer(); + } + + #[abi(embed_v0)] + impl TypeAndVersionImpl of ITypeAndVersion { + fn type_and_version(self: @ContractState) -> felt252 { + 'AccessController 1.0.0' + } + } + + #[abi(embed_v0)] + impl UpgradeableImpl of IUpgradeable { + fn upgrade(ref self: ContractState, new_impl: ClassHash) { + self.ownable.assert_only_owner(); + Upgradeable::upgrade(new_impl); + } + } +} diff --git a/contracts/src/account.cairo b/contracts/src/account.cairo new file mode 100644 index 000000000..dcda746e8 --- /dev/null +++ b/contracts/src/account.cairo @@ -0,0 +1,57 @@ +// copied from https://raw.githubusercontent.com/OpenZeppelin/cairo-contracts/861fc416f87addbe23a3b47f9d19ab27c10d5dc8/src/presets/account.cairo (0.9.0) + +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts for Cairo v0.9.0 (presets/account.cairo) + +/// # Account Preset +/// +/// OpenZeppelin's basic account which can change its public key and declare, deploy, or call contracts. +#[starknet::contract(account)] +mod Account { + use openzeppelin::account::AccountComponent; + use openzeppelin::introspection::src5::SRC5Component; + + component!(path: AccountComponent, storage: account, event: AccountEvent); + component!(path: SRC5Component, storage: src5, event: SRC5Event); + + // Account + #[abi(embed_v0)] + impl SRC6Impl = AccountComponent::SRC6Impl; + #[abi(embed_v0)] + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl; + #[abi(embed_v0)] + impl PublicKeyImpl = AccountComponent::PublicKeyImpl; + #[abi(embed_v0)] + impl PublicKeyCamelImpl = AccountComponent::PublicKeyCamelImpl; + #[abi(embed_v0)] + impl DeclarerImpl = AccountComponent::DeclarerImpl; + #[abi(embed_v0)] + impl DeployableImpl = AccountComponent::DeployableImpl; + impl AccountInternalImpl = AccountComponent::InternalImpl; + + // SRC5 + #[abi(embed_v0)] + impl SRC5Impl = SRC5Component::SRC5Impl; + + #[storage] + struct Storage { + #[substorage(v0)] + account: AccountComponent::Storage, + #[substorage(v0)] + src5: SRC5Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + AccountEvent: AccountComponent::Event, + #[flat] + SRC5Event: SRC5Component::Event + } + + #[constructor] + fn constructor(ref self: ContractState, public_key: felt252) { + self.account.initializer(public_key); + } +} diff --git a/contracts/src/cairo_project.toml b/contracts/src/cairo_project.toml new file mode 100644 index 000000000..df2c45c01 --- /dev/null +++ b/contracts/src/cairo_project.toml @@ -0,0 +1,2 @@ +[crate_roots] +chainlink = "." diff --git a/contracts/src/emergency.cairo b/contracts/src/emergency.cairo new file mode 100644 index 000000000..5d04f312d --- /dev/null +++ b/contracts/src/emergency.cairo @@ -0,0 +1 @@ +mod sequencer_uptime_feed; diff --git a/contracts/src/emergency/sequencer_uptime_feed.cairo b/contracts/src/emergency/sequencer_uptime_feed.cairo new file mode 100644 index 000000000..fad5ad8f7 --- /dev/null +++ b/contracts/src/emergency/sequencer_uptime_feed.cairo @@ -0,0 +1,318 @@ +use starknet::EthAddress; + +#[starknet::interface] +trait ISequencerUptimeFeed { + fn l1_sender(self: @TContractState) -> EthAddress; + fn set_l1_sender(ref self: TContractState, address: EthAddress); +} + +#[starknet::contract] +mod SequencerUptimeFeed { + use starknet::EthAddress; + use starknet::EthAddressSerde; + use starknet::EthAddressIntoFelt252; + use starknet::Felt252TryIntoEthAddress; + use starknet::EthAddressZeroable; + use starknet::ContractAddress; + use starknet::StorageBaseAddress; + use starknet::SyscallResult; + use starknet::storage_read_syscall; + use starknet::storage_write_syscall; + use starknet::storage_address_from_base_and_offset; + use starknet::class_hash::ClassHash; + + use box::BoxTrait; + use traits::Into; + use traits::TryInto; + use option::OptionTrait; + use zeroable::Zeroable; + + use openzeppelin::access::ownable::OwnableComponent; + + use chainlink::libraries::access_control::{AccessControlComponent, IAccessController}; + use chainlink::libraries::access_control::AccessControlComponent::InternalTrait as AccessControlInternalTrait; + use chainlink::libraries::type_and_version::ITypeAndVersion; + use chainlink::ocr2::aggregator::Round; + use chainlink::ocr2::aggregator::IAggregator; + use chainlink::ocr2::aggregator::{Transmission}; + use chainlink::libraries::upgradeable::Upgradeable; + + component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent); + + #[abi(embed_v0)] + impl OwnableImpl = OwnableComponent::OwnableTwoStepImpl; + impl OwnableInternalImpl = OwnableComponent::InternalImpl; + + #[abi(embed_v0)] + impl AccessControlImpl = + AccessControlComponent::AccessControlImpl; + impl AccessControlInternalImpl = AccessControlComponent::InternalImpl; + + #[storage] + struct Storage { + #[substorage(v0)] + ownable: OwnableComponent::Storage, + #[substorage(v0)] + access_control: AccessControlComponent::Storage, + // l1 sender is an starknet validator ethereum address + _l1_sender: EthAddress, + // maps round id to round transmission + _round_transmissions: LegacyMap, + _latest_round_id: u128, + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + OwnableEvent: OwnableComponent::Event, + #[flat] + AccessControlEvent: AccessControlComponent::Event, + RoundUpdated: RoundUpdated, + NewRound: NewRound, + AnswerUpdated: AnswerUpdated, + UpdateIgnored: UpdateIgnored, + L1SenderTransferred: L1SenderTransferred, + } + + #[derive(Drop, starknet::Event)] + struct RoundUpdated { + status: u128, + #[key] + updated_at: u64 + } + + #[derive(Drop, starknet::Event)] + struct NewRound { + #[key] + round_id: u128, + #[key] + started_by: EthAddress, + started_at: u64 + } + + #[derive(Drop, starknet::Event)] + struct AnswerUpdated { + current: u128, + #[key] + round_id: u128, + #[key] + timestamp: u64 + } + + #[derive(Drop, starknet::Event)] + struct UpdateIgnored { + latest_status: u128, + #[key] + latest_timestamp: u64, + incoming_status: u128, + #[key] + incoming_timestamp: u64 + } + + #[derive(Drop, starknet::Event)] + struct L1SenderTransferred { + #[key] + from_address: EthAddress, + #[key] + to_address: EthAddress + } + + #[abi(embed_v0)] + impl TypeAndVersion of ITypeAndVersion { + fn type_and_version(self: @ContractState) -> felt252 { + 'SequencerUptimeFeed 1.0.0' + } + } + + #[abi(embed_v0)] + impl AggregatorImpl of IAggregator { + fn latest_round_data(self: @ContractState) -> Round { + self._require_read_access(); + let latest_round_id = self._latest_round_id.read(); + let round_transmission = self._round_transmissions.read(latest_round_id); + Round { + round_id: latest_round_id.into(), + answer: round_transmission.answer, + block_num: round_transmission.block_num, + started_at: round_transmission.observation_timestamp, + updated_at: round_transmission.transmission_timestamp, + } + } + + fn round_data(self: @ContractState, round_id: u128) -> Round { + self._require_read_access(); + assert(round_id <= self._latest_round_id.read(), 'invalid round id'); + let round_transmission = self._round_transmissions.read(round_id); + Round { + round_id: round_id.into(), + answer: round_transmission.answer, + block_num: round_transmission.block_num, + started_at: round_transmission.observation_timestamp, + updated_at: round_transmission.transmission_timestamp, + } + } + + fn description(self: @ContractState) -> felt252 { + 'L2 Sequencer Uptime Status Feed' + } + + fn decimals(self: @ContractState) -> u8 { + 0_u8 + } + + fn latest_answer(self: @ContractState) -> u128 { + self._require_read_access(); + let latest_round_id = self._latest_round_id.read(); + let round_transmission = self._round_transmissions.read(latest_round_id); + round_transmission.answer + } + } + + #[constructor] + fn constructor(ref self: ContractState, initial_status: u128, owner_address: ContractAddress) { + self._initializer(initial_status, owner_address); + } + + #[l1_handler] + fn update_status(ref self: ContractState, from_address: felt252, status: u128, timestamp: u64) { + // Cairo enforces from_address to be a felt252 on the method signature, but we can cast it right after + let from_address: EthAddress = from_address.try_into().unwrap(); + assert(self._l1_sender.read() == from_address, 'EXPECTED_FROM_BRIDGE_ONLY'); + + let latest_round_id = self._latest_round_id.read(); + let latest_round = self._round_transmissions.read(latest_round_id); + + if timestamp <= latest_round.observation_timestamp { + self + .emit( + Event::UpdateIgnored( + UpdateIgnored { + latest_status: latest_round.answer, + latest_timestamp: latest_round.transmission_timestamp, + incoming_status: status, + incoming_timestamp: timestamp + } + ) + ); + return (); + } + + if latest_round.answer == status { + self._update_round(latest_round_id, latest_round); + } else { + // only increment round when status flips + let round_id = latest_round_id + 1_u128; + self._record_round(from_address, round_id, status, timestamp); + } + } + + #[abi(embed_v0)] + impl SequencerUptimeFeedImpl of super::ISequencerUptimeFeed { + fn set_l1_sender(ref self: ContractState, address: EthAddress) { + self.ownable.assert_only_owner(); + + assert(!address.is_zero(), '0 address not allowed'); + + let old_address = self._l1_sender.read(); + + if old_address != address { + self._l1_sender.write(address); + self + .emit( + Event::L1SenderTransferred( + L1SenderTransferred { from_address: old_address, to_address: address } + ) + ); + } + } + + fn l1_sender(self: @ContractState) -> EthAddress { + self._l1_sender.read() + } + } + + /// + /// Upgradeable + /// + + #[abi(embed_v0)] + fn upgrade(ref self: ContractState, new_impl: ClassHash) { + self.ownable.assert_only_owner(); + Upgradeable::upgrade(new_impl) + } + + /// + /// Internals + /// + + #[generate_trait] + impl Internals of InternalTrait { + fn _require_read_access(self: @ContractState) { + let sender = starknet::info::get_caller_address(); + self.access_control.check_read_access(sender); + } + + fn _initializer( + ref self: ContractState, initial_status: u128, owner_address: ContractAddress + ) { + self.ownable.initializer(owner_address); + self.access_control.initializer(); + let round_id = 1_u128; + let timestamp = starknet::info::get_block_timestamp(); + let from_address = EthAddress { + address: 0 + }; // initial round is set by the constructor, not by an L1 sender + self._record_round(from_address, round_id, initial_status, timestamp); + } + + fn _record_round( + ref self: ContractState, + sender: EthAddress, + round_id: u128, + status: u128, + timestamp: u64 + ) { + self._latest_round_id.write(round_id); + let block_info = starknet::info::get_block_info().unbox(); + let block_number = block_info.block_number; + let block_timestamp = block_info.block_timestamp; + + let round = Transmission { + answer: status, + block_num: block_number, + observation_timestamp: timestamp, + transmission_timestamp: block_timestamp, + }; + self._round_transmissions.write(round_id, round); + + self + .emit( + Event::NewRound( + NewRound { round_id: round_id, started_by: sender, started_at: timestamp } + ) + ); + self + .emit( + Event::AnswerUpdated( + AnswerUpdated { current: status, round_id: round_id, timestamp: timestamp } + ) + ); + } + + fn _update_round(ref self: ContractState, round_id: u128, mut round: Transmission) { + round.transmission_timestamp = starknet::info::get_block_timestamp(); + self._round_transmissions.write(round_id, round); + + self + .emit( + Event::RoundUpdated( + RoundUpdated { + status: round.answer, updated_at: round.transmission_timestamp + } + ) + ); + } + } +} diff --git a/contracts/src/lib.cairo b/contracts/src/lib.cairo new file mode 100644 index 000000000..eef049d8c --- /dev/null +++ b/contracts/src/lib.cairo @@ -0,0 +1,13 @@ +// All modules must be present here + +mod account; +mod ocr2; +mod libraries; +mod utils; +mod emergency; +mod multisig; +mod token; +mod access_control; + +#[cfg(test)] +mod tests; diff --git a/contracts/src/libraries.cairo b/contracts/src/libraries.cairo new file mode 100644 index 000000000..02d62120e --- /dev/null +++ b/contracts/src/libraries.cairo @@ -0,0 +1,5 @@ +mod access_control; +mod token; +mod upgradeable; +mod mocks; +mod type_and_version; diff --git a/contracts/src/libraries/access_control.cairo b/contracts/src/libraries/access_control.cairo new file mode 100644 index 000000000..b0a910d55 --- /dev/null +++ b/contracts/src/libraries/access_control.cairo @@ -0,0 +1,154 @@ +use starknet::ContractAddress; +#[starknet::interface] +trait IAccessController { + fn has_access(self: @TContractState, user: ContractAddress, data: Array) -> bool; + fn has_read_access(self: @TContractState, user: ContractAddress, data: Array) -> bool; + fn add_access(ref self: TContractState, user: ContractAddress); + fn remove_access(ref self: TContractState, user: ContractAddress); + fn enable_access_check(ref self: TContractState); + fn disable_access_check(ref self: TContractState); +} + +// Requires Ownable subcomponent. +#[starknet::component] +mod AccessControlComponent { + use starknet::ContractAddress; + use starknet::class_hash::ClassHash; + use zeroable::Zeroable; + + use openzeppelin::access::ownable::OwnableComponent; + + use OwnableComponent::InternalImpl as OwnableInternalImpl; + + #[storage] + struct Storage { + _check_enabled: bool, + _access_list: LegacyMap, + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + AddedAccess: AddedAccess, + RemovedAccess: RemovedAccess, + AccessControlEnabled: AccessControlEnabled, + AccessControlDisabled: AccessControlDisabled, + } + + #[derive(Drop, starknet::Event)] + struct AddedAccess { + #[key] + user: ContractAddress + } + + #[derive(Drop, starknet::Event)] + struct RemovedAccess { + #[key] + user: ContractAddress + } + + #[derive(Drop, starknet::Event)] + struct AccessControlEnabled {} + + #[derive(Drop, starknet::Event)] + struct AccessControlDisabled {} + + #[embeddable_as(AccessControlImpl)] + impl AccessControl< + TContractState, + +HasComponent, + impl Ownable: OwnableComponent::HasComponent, + +Drop, + > of super::IAccessController> { + fn has_access( + self: @ComponentState, user: ContractAddress, data: Array + ) -> bool { + let has_access = self._access_list.read(user); + if has_access { + return true; + } + + let check_enabled = self._check_enabled.read(); + if !check_enabled { + return true; + } + + false + } + + fn has_read_access( + self: @ComponentState, user: ContractAddress, data: Array + ) -> bool { + let _has_access = self.has_access(user, data); + if _has_access { + return true; + } + + // NOTICE: read access is granted to direct calls, to enable off-chain reads. + if user.is_zero() { + return true; + } + + false + } + + fn add_access(ref self: ComponentState, user: ContractAddress) { + get_dep_component!(@self, Ownable).assert_only_owner(); + let has_access = self._access_list.read(user); + if !has_access { + self._access_list.write(user, true); + self.emit(Event::AddedAccess(AddedAccess { user: user })); + } + } + + fn remove_access(ref self: ComponentState, user: ContractAddress) { + get_dep_component!(@self, Ownable).assert_only_owner(); + let has_access = self._access_list.read(user); + if has_access { + self._access_list.write(user, false); + self.emit(Event::RemovedAccess(RemovedAccess { user: user })); + } + } + + fn enable_access_check(ref self: ComponentState) { + get_dep_component!(@self, Ownable).assert_only_owner(); + let check_enabled = self._check_enabled.read(); + if !check_enabled { + self._check_enabled.write(true); + self.emit(Event::AccessControlEnabled(AccessControlEnabled {})); + } + } + + fn disable_access_check(ref self: ComponentState) { + get_dep_component!(@self, Ownable).assert_only_owner(); + let check_enabled = self._check_enabled.read(); + if check_enabled { + self._check_enabled.write(false); + self.emit(Event::AccessControlDisabled(AccessControlDisabled {})); + } + } + } + + #[generate_trait] + impl InternalImpl< + TContractState, + +HasComponent, + impl Ownable: OwnableComponent::HasComponent, + +Drop, + > of InternalTrait { + fn initializer(ref self: ComponentState) { + self._check_enabled.write(true); + self.emit(Event::AccessControlEnabled(AccessControlEnabled {})); + } + + fn check_access(self: @ComponentState, user: ContractAddress) { + let allowed = AccessControl::has_access(self, user, ArrayTrait::new()); + assert(allowed, 'user does not have access'); + } + + fn check_read_access(self: @ComponentState, user: ContractAddress) { + let allowed = AccessControl::has_read_access(self, user, ArrayTrait::new()); + assert(allowed, 'user does not have read access'); + } + } +} diff --git a/contracts/src/libraries/mocks.cairo b/contracts/src/libraries/mocks.cairo new file mode 100644 index 000000000..9a58bab7d --- /dev/null +++ b/contracts/src/libraries/mocks.cairo @@ -0,0 +1,2 @@ +mod mock_upgradeable; +mod mock_non_upgradeable; diff --git a/contracts/src/libraries/mocks/mock_non_upgradeable.cairo b/contracts/src/libraries/mocks/mock_non_upgradeable.cairo new file mode 100644 index 000000000..921943ea3 --- /dev/null +++ b/contracts/src/libraries/mocks/mock_non_upgradeable.cairo @@ -0,0 +1,20 @@ +#[starknet::interface] +trait IMockNonUpgradeable { + fn bar(self: @TContractState) -> bool; +} + +#[starknet::contract] +mod MockNonUpgradeable { + #[storage] + struct Storage {} + + #[constructor] + fn constructor(ref self: ContractState) {} + + #[abi(embed_v0)] + impl MockNonUpgradeableImpl of super::IMockNonUpgradeable { + fn bar(self: @ContractState) -> bool { + true + } + } +} diff --git a/contracts/src/libraries/mocks/mock_upgradeable.cairo b/contracts/src/libraries/mocks/mock_upgradeable.cairo new file mode 100644 index 000000000..b83fa7f84 --- /dev/null +++ b/contracts/src/libraries/mocks/mock_upgradeable.cairo @@ -0,0 +1,31 @@ +use starknet::class_hash::ClassHash; + +#[starknet::interface] +trait IMockUpgradeable { + fn foo(self: @TContractState) -> bool; + fn upgrade(ref self: TContractState, new_impl: ClassHash); +} + +#[starknet::contract] +mod MockUpgradeable { + use starknet::class_hash::ClassHash; + + use chainlink::libraries::upgradeable::Upgradeable; + + #[storage] + struct Storage {} + + #[constructor] + fn constructor(ref self: ContractState) {} + + #[abi(embed_v0)] + impl MockUpgradeableImpl of super::IMockUpgradeable { + fn foo(self: @ContractState) -> bool { + true + } + + fn upgrade(ref self: ContractState, new_impl: ClassHash) { + Upgradeable::upgrade(new_impl) + } + } +} diff --git a/contracts/src/libraries/token.cairo b/contracts/src/libraries/token.cairo new file mode 100644 index 000000000..b6b4d8df3 --- /dev/null +++ b/contracts/src/libraries/token.cairo @@ -0,0 +1 @@ +mod erc677; diff --git a/contracts/src/libraries/token/erc677.cairo b/contracts/src/libraries/token/erc677.cairo new file mode 100644 index 000000000..20fd6c54a --- /dev/null +++ b/contracts/src/libraries/token/erc677.cairo @@ -0,0 +1,86 @@ +use starknet::ContractAddress; + +#[starknet::interface] +trait IERC677 { + fn transfer_and_call( + ref self: TContractState, to: ContractAddress, value: u256, data: Array + ) -> bool; +} + +#[starknet::interface] +trait IERC677Receiver { + fn on_token_transfer( + ref self: TContractState, sender: ContractAddress, value: u256, data: Array + ); + // implements EIP-165, where function selectors are defined by Ethereum ABI using the ethereum function signatures + fn supports_interface(ref self: TContractState, interface_id: u32) -> bool; +} + +#[starknet::component] +mod ERC677Component { + use starknet::ContractAddress; + use openzeppelin::token::erc20::interface::IERC20; + use array::ArrayTrait; + use array::SpanTrait; + use clone::Clone; + use array::ArrayTCloneImpl; + + use super::IERC677ReceiverDispatcher; + use super::IERC677ReceiverDispatcherTrait; + + // ethereum function selector of "onTokenTransfer(address,uint256,bytes)" + const IERC677_RECEIVER_ID: u32 = 0xa4c0ed36_u32; + + #[storage] + struct Storage {} + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + TransferAndCall: TransferAndCall, + } + + #[derive(Drop, starknet::Event)] + struct TransferAndCall { + #[key] + from: ContractAddress, + #[key] + to: ContractAddress, + value: u256, + data: Array + } + + #[embeddable_as(ERC677Impl)] + impl ERC677< + TContractState, + +HasComponent, + +IERC20, + +Drop, + > of super::IERC677> { + fn transfer_and_call( + ref self: ComponentState, + to: ContractAddress, + value: u256, + data: Array + ) -> bool { + let sender = starknet::info::get_caller_address(); + + let mut contract = self.get_contract_mut(); + contract.transfer(to, value); + self + .emit( + Event::TransferAndCall( + TransferAndCall { from: sender, to: to, value: value, data: data.clone(), } + ) + ); + + let receiver = IERC677ReceiverDispatcher { contract_address: to }; + + let supports = receiver.supports_interface(IERC677_RECEIVER_ID); + if supports { + receiver.on_token_transfer(sender, value, data); + } + true + } + } +} diff --git a/contracts/src/libraries/type_and_version.cairo b/contracts/src/libraries/type_and_version.cairo new file mode 100644 index 000000000..b0481055d --- /dev/null +++ b/contracts/src/libraries/type_and_version.cairo @@ -0,0 +1,4 @@ +#[starknet::interface] +trait ITypeAndVersion { + fn type_and_version(self: @TContractState) -> felt252; +} diff --git a/contracts/src/libraries/upgradeable.cairo b/contracts/src/libraries/upgradeable.cairo new file mode 100644 index 000000000..6b9e6af73 --- /dev/null +++ b/contracts/src/libraries/upgradeable.cairo @@ -0,0 +1,35 @@ +use starknet::class_hash::ClassHash; + +// TODO: drop for OZ upgradeable + +#[starknet::interface] +trait IUpgradeable { + // note: any contract that uses this module will have a mutable reference to contract state + fn upgrade(ref self: TContractState, new_impl: ClassHash); +} + +#[derive(Drop, starknet::Event)] +struct Upgraded { + #[key] + new_impl: ClassHash +} + +mod Upgradeable { + use zeroable::Zeroable; + + use starknet::SyscallResult; + use starknet::SyscallResultTrait; + use starknet::syscalls::replace_class_syscall; + use starknet::class_hash::ClassHash; + use starknet::class_hash::ClassHashZeroable; + + // this method assumes replace_class_syscall has a very low possibility of being deprecated + // but if it does, we will either have upgraded the contract to be non-upgradeable by then + // because the starknet ecosystem has stabilized or we will be able to upgrade the contract to the proxy pattern + // #[internal] + fn upgrade(new_impl: ClassHash) { + assert(!new_impl.is_zero(), 'Class hash cannot be zero'); + replace_class_syscall(new_impl).unwrap_syscall(); + // TODO: Upgraded(new_impl); + } +} diff --git a/contracts/src/multisig.cairo b/contracts/src/multisig.cairo new file mode 100644 index 000000000..b1422df45 --- /dev/null +++ b/contracts/src/multisig.cairo @@ -0,0 +1,551 @@ +use array::ArrayTrait; +use option::OptionTrait; +use starknet::ContractAddress; +use starknet::class_hash::ClassHash; + +fn assert_unique_values< + T, impl TCopy: Copy, impl TDrop: Drop, impl TPartialEq: PartialEq, +>( + a: @Array:: +) { + let len = a.len(); + _assert_unique_values_loop(a, len, 0_usize, 1_usize); +} + +fn _assert_unique_values_loop< + T, impl TCopy: Copy, impl TDrop: Drop, impl TPartialEq: PartialEq, +>( + a: @Array::, len: usize, j: usize, k: usize +) { + if j >= len { + return (); + } + if k >= len { + _assert_unique_values_loop(a, len, j + 1_usize, j + 2_usize); + return (); + } + let j_val = *a.at(j); + let k_val = *a.at(k); + assert(j_val != k_val, 'duplicate values'); + _assert_unique_values_loop(a, len, j, k + 1_usize); +} + +#[derive(Copy, Drop, Serde, starknet::Store)] +struct Transaction { + to: ContractAddress, + function_selector: felt252, + calldata_len: usize, + executed: bool, + confirmations: usize, +} + +#[starknet::interface] +trait IMultisig { + fn is_signer(self: @TContractState, address: ContractAddress) -> bool; + fn get_signers_len(self: @TContractState) -> usize; + fn get_signers(self: @TContractState) -> Array; + fn get_threshold(self: @TContractState) -> usize; + fn get_transactions_len(self: @TContractState) -> u128; + fn is_confirmed(self: @TContractState, nonce: u128, signer: ContractAddress) -> bool; + fn is_executed(self: @TContractState, nonce: u128) -> bool; + fn get_transaction(self: @TContractState, nonce: u128) -> (Transaction, Array::); + fn submit_transaction( + ref self: TContractState, + to: ContractAddress, + function_selector: felt252, + calldata: Array + ); + fn confirm_transaction(ref self: TContractState, nonce: u128); + fn revoke_confirmation(ref self: TContractState, nonce: u128); + fn execute_transaction(ref self: TContractState, nonce: u128) -> Array; + fn set_threshold(ref self: TContractState, threshold: usize); + fn set_signers(ref self: TContractState, signers: Array); + fn set_signers_and_threshold( + ref self: TContractState, signers: Array, threshold: usize + ); +} + +#[starknet::contract] +mod Multisig { + use super::assert_unique_values; + use super::{Transaction}; + + use traits::Into; + use traits::TryInto; + use zeroable::Zeroable; + use array::ArrayTrait; + use array::ArrayTCloneImpl; + use option::OptionTrait; + + use starknet::ContractAddress; + use starknet::ContractAddressIntoFelt252; + use starknet::Felt252TryIntoContractAddress; + use starknet::StorageBaseAddress; + use starknet::SyscallResult; + use starknet::SyscallResultTrait; + use starknet::call_contract_syscall; + use starknet::get_caller_address; + use starknet::get_contract_address; + use starknet::storage_address_from_base_and_offset; + use starknet::storage_read_syscall; + use starknet::storage_write_syscall; + use starknet::class_hash::ClassHash; + + use chainlink::libraries::type_and_version::ITypeAndVersion; + use chainlink::libraries::upgradeable::{Upgradeable, IUpgradeable}; + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + TransactionSubmitted: TransactionSubmitted, + TransactionConfirmed: TransactionConfirmed, + ConfirmationRevoked: ConfirmationRevoked, + TransactionExecuted: TransactionExecuted, + SignersSet: SignersSet, + ThresholdSet: ThresholdSet, + } + + #[derive(Drop, starknet::Event)] + struct TransactionSubmitted { + #[key] + signer: ContractAddress, + #[key] + nonce: u128, + #[key] + to: ContractAddress + } + + #[derive(Drop, starknet::Event)] + struct TransactionConfirmed { + #[key] + signer: ContractAddress, + #[key] + nonce: u128 + } + + #[derive(Drop, starknet::Event)] + struct ConfirmationRevoked { + #[key] + signer: ContractAddress, + #[key] + nonce: u128 + } + + #[derive(Drop, starknet::Event)] + struct TransactionExecuted { + #[key] + executor: ContractAddress, + #[key] + nonce: u128 + } + + #[derive(Drop, starknet::Event)] + struct SignersSet { + #[key] + signers: Array + } + + #[derive(Drop, starknet::Event)] + struct ThresholdSet { + #[key] + threshold: usize + } + + #[storage] + struct Storage { + _threshold: usize, + _signers: LegacyMap, + _is_signer: LegacyMap, + _signers_len: usize, + _tx_valid_since: u128, + _next_nonce: u128, + _transactions: LegacyMap, + _transaction_calldata: LegacyMap<(u128, usize), felt252>, + _is_confirmed: LegacyMap<(u128, ContractAddress), bool>, + } + + #[constructor] + fn constructor(ref self: ContractState, signers: Array, threshold: usize) { + let signers_len = signers.len(); + self._require_valid_threshold(threshold, signers_len); + self._set_signers(signers, signers_len); + self._set_threshold(threshold); + } + + #[abi(embed_v0)] + impl TypeAndVersionImpl of ITypeAndVersion { + fn type_and_version(self: @ContractState,) -> felt252 { + 'Multisig 1.0.0' + } + } + + #[abi(embed_v0)] + impl UpgradeableImpl of IUpgradeable { + fn upgrade(ref self: ContractState, new_impl: ClassHash) { + self._require_multisig(); + Upgradeable::upgrade(new_impl) + } + } + + #[abi(embed_v0)] + impl MultisigImpl of super::IMultisig { + /// Views + + fn is_signer(self: @ContractState, address: ContractAddress) -> bool { + self._is_signer.read(address) + } + + fn get_signers_len(self: @ContractState,) -> usize { + self._signers_len.read() + } + + fn get_signers(self: @ContractState) -> Array { + let signers_len = self._signers_len.read(); + let mut signers = ArrayTrait::new(); + self._get_signers_range(0_usize, signers_len, ref signers); + signers + } + + fn get_threshold(self: @ContractState,) -> usize { + self._threshold.read() + } + + fn get_transactions_len(self: @ContractState,) -> u128 { + self._next_nonce.read() + } + + fn is_confirmed(self: @ContractState, nonce: u128, signer: ContractAddress) -> bool { + self._is_confirmed.read((nonce, signer)) + } + + fn is_executed(self: @ContractState, nonce: u128) -> bool { + let transaction = self._transactions.read(nonce); + transaction.executed + } + + fn get_transaction(self: @ContractState, nonce: u128) -> (Transaction, Array::) { + let transaction = self._transactions.read(nonce); + + let mut calldata = ArrayTrait::new(); + let calldata_len = transaction.calldata_len; + self._get_transaction_calldata_range(nonce, 0_usize, calldata_len, ref calldata); + + (transaction, calldata) + } + + /// Externals + + fn submit_transaction( + ref self: ContractState, + to: ContractAddress, + function_selector: felt252, + calldata: Array, + ) { + self._require_signer(); + + let nonce = self._next_nonce.read(); + let calldata_len = calldata.len(); + + let transaction = Transaction { + to: to, + function_selector: function_selector, + calldata_len: calldata_len, + executed: false, + confirmations: 0_usize + }; + self._transactions.write(nonce, transaction); + + self._set_transaction_calldata_range(nonce, 0_usize, calldata_len, @calldata); + + let caller = get_caller_address(); + self + .emit( + Event::TransactionSubmitted( + TransactionSubmitted { signer: caller, nonce: nonce, to: to } + ) + ); + self._next_nonce.write(nonce + 1_u128); + } + + fn confirm_transaction(ref self: ContractState, nonce: u128) { + self._require_signer(); + self._require_tx_exists(nonce); + self._require_tx_valid(nonce); + self._require_not_executed(nonce); + self._require_not_confirmed(nonce); + + // TODO: write a single field instead of the whole transaction? + let mut transaction = self._transactions.read(nonce); + transaction.confirmations += 1_usize; + self._transactions.write(nonce, transaction); + + let caller = get_caller_address(); + self._is_confirmed.write((nonce, caller), true); + + self + .emit( + Event::TransactionConfirmed( + TransactionConfirmed { signer: caller, nonce: nonce } + ) + ); + } + + fn revoke_confirmation(ref self: ContractState, nonce: u128) { + self._require_signer(); + self._require_tx_exists(nonce); + self._require_tx_valid(nonce); + self._require_not_executed(nonce); + self._require_confirmed(nonce); + + // TODO: write a single field instead of the whole transaction? + let mut transaction = self._transactions.read(nonce); + transaction.confirmations -= 1_usize; + self._transactions.write(nonce, transaction); + + let caller = get_caller_address(); + self._is_confirmed.write((nonce, caller), false); + + self + .emit( + Event::ConfirmationRevoked(ConfirmationRevoked { signer: caller, nonce: nonce }) + ); + } + + fn execute_transaction(ref self: ContractState, nonce: u128) -> Array { + self._require_signer(); + self._require_tx_exists(nonce); + self._require_tx_valid(nonce); + self._require_not_executed(nonce); + + let mut transaction = self._transactions.read(nonce); + + let threshold = self._threshold.read(); + assert(threshold <= transaction.confirmations, 'more confirmations required'); + + let mut calldata = ArrayTrait::new(); + let calldata_len = transaction.calldata_len; + self._get_transaction_calldata_range(nonce, 0_usize, calldata_len, ref calldata); + + transaction.executed = true; + self._transactions.write(nonce, transaction); + + let caller = get_caller_address(); + self + .emit( + Event::TransactionExecuted( + TransactionExecuted { executor: caller, nonce: nonce } + ) + ); + + let response = call_contract_syscall( + transaction.to, transaction.function_selector, calldata.span() + ) + .unwrap_syscall(); + + // TODO: this shouldn't be necessary. call_contract_syscall returns a Span, which + // is a serialized result, but returning a Span results in an error: + // + // Trait has no implementation in context: core::serde::Serde::> + // + // Cairo docs also have an example that returns a Span: + // https://github.com/starkware-libs/cairo/blob/fe425d0893ff93a936bb3e8bbbac771033074bdb/docs/reference/src/components/cairo/modules/language_constructs/pages/contracts.adoc#L226 + ArrayTCloneImpl::clone(response.snapshot) + } + + fn set_threshold(ref self: ContractState, threshold: usize) { + self._require_multisig(); + + let signers_len = self._signers_len.read(); + self._require_valid_threshold(threshold, signers_len); + + self._update_tx_valid_since(); + + self._set_threshold(threshold); + } + + fn set_signers(ref self: ContractState, signers: Array) { + self._require_multisig(); + + self._update_tx_valid_since(); + + let signers_len = signers.len(); + self._set_signers(signers, signers_len); + + let threshold = self._threshold.read(); + + if signers_len < threshold { + self._require_valid_threshold(signers_len, signers_len); + self._set_threshold(signers_len); + } + } + + fn set_signers_and_threshold( + ref self: ContractState, signers: Array, threshold: usize + ) { + self._require_multisig(); + + let signers_len = signers.len(); + self._require_valid_threshold(threshold, signers_len); + + self._update_tx_valid_since(); + + self._set_signers(signers, signers_len); + self._set_threshold(threshold); + } + } + + /// Internals + #[generate_trait] + impl InternalImpl of InternalTrait { + fn _set_signers( + ref self: ContractState, signers: Array, signers_len: usize + ) { + self._require_unique_signers(@signers); + + let old_signers_len = self._signers_len.read(); + self._clean_signers_range(0_usize, old_signers_len); + + self._signers_len.write(signers_len); + self._set_signers_range(0_usize, signers_len, @signers); + + self.emit(Event::SignersSet(SignersSet { signers: signers })); + } + + fn _clean_signers_range(ref self: ContractState, index: usize, len: usize) { + if index >= len { + return (); + } + + let signer = self._signers.read(index); + self._is_signer.write(signer, false); + self._signers.write(index, Zeroable::zero()); + + self._clean_signers_range(index + 1_usize, len); + } + + fn _set_signers_range( + ref self: ContractState, index: usize, len: usize, signers: @Array + ) { + if index >= len { + return (); + } + + let signer = *signers.at(index); + self._signers.write(index, signer); + self._is_signer.write(signer, true); + + self._set_signers_range(index + 1_usize, len, signers); + } + + fn _get_signers_range( + self: @ContractState, index: usize, len: usize, ref signers: Array + ) { + if index >= len { + return (); + } + + let signer = self._signers.read(index); + signers.append(signer); + + self._get_signers_range(index + 1_usize, len, ref signers); + } + + fn _set_transaction_calldata_range( + ref self: ContractState, + nonce: u128, + index: usize, + len: usize, + calldata: @Array + ) { + if index >= len { + return (); + } + + let calldata_arg = *calldata.at(index); + self._transaction_calldata.write((nonce, index), calldata_arg); + + self._set_transaction_calldata_range(nonce, index + 1_usize, len, calldata); + } + + fn _get_transaction_calldata_range( + self: @ContractState, + nonce: u128, + index: usize, + len: usize, + ref calldata: Array + ) { + if index >= len { + return (); + } + + let calldata_arg = self._transaction_calldata.read((nonce, index)); + calldata.append(calldata_arg); + + self._get_transaction_calldata_range(nonce, index + 1_usize, len, ref calldata); + } + + fn _set_threshold(ref self: ContractState, threshold: usize) { + self._threshold.write(threshold); + self.emit(Event::ThresholdSet(ThresholdSet { threshold: threshold })); + } + + fn _update_tx_valid_since(ref self: ContractState) { + let tx_valid_since = self._next_nonce.read(); + self._tx_valid_since.write(tx_valid_since); + } + + fn _require_signer(self: @ContractState) { + let caller = get_caller_address(); + let is_signer = self._is_signer.read(caller); + assert(is_signer, 'invalid signer'); + } + + fn _require_tx_exists(self: @ContractState, nonce: u128) { + let next_nonce = self._next_nonce.read(); + assert(nonce < next_nonce, 'transaction does not exist'); + } + + fn _require_not_executed(self: @ContractState, nonce: u128) { + let transaction = self._transactions.read(nonce); + assert(!transaction.executed, 'transaction already executed'); + } + + fn _require_not_confirmed(self: @ContractState, nonce: u128) { + let caller = get_caller_address(); + let is_confirmed = self._is_confirmed.read((nonce, caller)); + assert(!is_confirmed, 'transaction already confirmed'); + } + + fn _require_confirmed(self: @ContractState, nonce: u128) { + let caller = get_caller_address(); + let is_confirmed = self._is_confirmed.read((nonce, caller)); + assert(is_confirmed, 'transaction not confirmed'); + } + + fn _require_unique_signers(self: @ContractState, signers: @Array) { + assert_unique_values(signers); + } + + fn _require_tx_valid(self: @ContractState, nonce: u128) { + let tx_valid_since = self._tx_valid_since.read(); + assert(tx_valid_since <= nonce, 'transaction invalid'); + } + + fn _require_multisig(self: @ContractState) { + let caller = get_caller_address(); + let contract = get_contract_address(); + assert(caller == contract, 'only multisig allowed'); + } + + fn _require_valid_threshold(self: @ContractState, threshold: usize, signers_len: usize) { + if threshold == 0_usize { + if signers_len == 0_usize { + return (); + } + } + + assert(threshold >= 1_usize, 'invalid threshold, too small'); + assert(threshold <= signers_len, 'invalid threshold, too large'); + } + } +} diff --git a/contracts/src/ocr2.cairo b/contracts/src/ocr2.cairo new file mode 100644 index 000000000..09a69eff0 --- /dev/null +++ b/contracts/src/ocr2.cairo @@ -0,0 +1,4 @@ +mod aggregator; +mod aggregator_proxy; +mod mocks; + diff --git a/contracts/src/ocr2/aggregator.cairo b/contracts/src/ocr2/aggregator.cairo new file mode 100644 index 000000000..d494c81e8 --- /dev/null +++ b/contracts/src/ocr2/aggregator.cairo @@ -0,0 +1,1252 @@ +use starknet::ContractAddress; + +#[derive(Copy, Drop, Serde, PartialEq, starknet::Store)] +struct Round { + // used as u128 internally, but necessary for phase-prefixed round ids as returned by proxy + round_id: felt252, + answer: u128, + block_num: u64, + started_at: u64, + updated_at: u64, +} + +#[derive(Copy, Drop, Serde, starknet::Store)] +struct Transmission { + answer: u128, + block_num: u64, + observation_timestamp: u64, + transmission_timestamp: u64, +} + +// TODO: reintroduce custom storage to save on space +// impl TransmissionStorageAccess of StorageAccess { +// fn read(address_domain: u32, base: StorageBaseAddress) -> SyscallResult:: { +// let block_num_and_answer = storage_read_syscall( +// address_domain, storage_address_from_base_and_offset(base, 0_u8) +// )?; +// let (block_num, answer) = split_felt(block_num_and_answer); +// let timestamps = storage_read_syscall( +// address_domain, storage_address_from_base_and_offset(base, 1_u8) +// )?; +// let (observation_timestamp, transmission_timestamp) = split_felt(timestamps); + +// Result::Ok( +// Transmission { +// answer, +// block_num: block_num.try_into().unwrap(), +// observation_timestamp: observation_timestamp.try_into().unwrap(), +// transmission_timestamp: transmission_timestamp.try_into().unwrap(), +// } +// ) +// } +// +// fn write( +// address_domain: u32, base: StorageBaseAddress, value: Transmission +// ) -> SyscallResult::<()> { +// let block_num_and_answer = value.block_num.into() * SHIFT_128 + value.answer.into(); +// let timestamps = value.observation_timestamp.into() * SHIFT_128 +// + value.transmission_timestamp.into(); +// storage_write_syscall( +// address_domain, +// storage_address_from_base_and_offset(base, 0_u8), +// block_num_and_answer +// )?; +// storage_write_syscall( +// address_domain, storage_address_from_base_and_offset(base, 1_u8), timestamps +// ) +// } +// } + +#[starknet::interface] +trait IAggregator { + fn latest_round_data(self: @TContractState) -> Round; + fn round_data(self: @TContractState, round_id: u128) -> Round; + fn description(self: @TContractState) -> felt252; + fn decimals(self: @TContractState) -> u8; + fn latest_answer(self: @TContractState) -> u128; +} + +#[derive(Copy, Drop, Serde)] +struct OracleConfig { + signer: felt252, + transmitter: ContractAddress, +} + +impl OracleConfigLegacyHash of LegacyHash { + fn hash(mut state: felt252, value: OracleConfig) -> felt252 { + state = LegacyHash::hash(state, value.signer); + state = LegacyHash::hash(state, value.transmitter); + state + } +} + +#[starknet::interface] +trait Configuration { + fn set_config( + ref self: TContractState, + oracles: Array, + f: u8, + onchain_config: Array, + offchain_config_version: u64, + offchain_config: Array, + ) -> felt252; // digest + fn latest_config_details(self: @TContractState) -> (u64, u64, felt252); + fn transmitters(self: @TContractState) -> Array; +} + +use Aggregator::{BillingConfig, BillingConfigSerde}; + +#[starknet::interface] +trait Billing { + fn set_billing_access_controller(ref self: TContractState, access_controller: ContractAddress); + fn set_billing(ref self: TContractState, config: Aggregator::BillingConfig); + fn billing(self: @TContractState) -> Aggregator::BillingConfig; + // + fn withdraw_payment(ref self: TContractState, transmitter: ContractAddress); + fn owed_payment(self: @TContractState, transmitter: ContractAddress) -> u128; + fn withdraw_funds(ref self: TContractState, recipient: ContractAddress, amount: u256); + fn link_available_for_payment( + self: @TContractState + ) -> (bool, u128); // (is negative, absolute difference) + fn set_link_token( + ref self: TContractState, link_token: ContractAddress, recipient: ContractAddress + ); +} + +#[derive(Copy, Drop, Serde)] +struct PayeeConfig { + transmitter: ContractAddress, + payee: ContractAddress, +} + +#[starknet::interface] +trait PayeeManagement { + fn set_payees(ref self: TContractState, payees: Array); + fn transfer_payeeship( + ref self: TContractState, transmitter: ContractAddress, proposed: ContractAddress + ); + fn accept_payeeship(ref self: TContractState, transmitter: ContractAddress); +} + +use array::ArrayTrait; +use array::SpanTrait; +use option::OptionTrait; +use hash::LegacyHash; + +fn hash_span, impl TCopy: Copy>( + state: felt252, mut value: Span +) -> felt252 { + let item = value.pop_front(); + match item { + Option::Some(x) => { + let s = LegacyHash::hash(state, *x); + hash_span(s, value) + }, + Option::None(_) => state, + } +} + +// TODO: consider switching to lookups +fn pow(n: u128, m: u128) -> u128 { + if m == 0_u128 { + return 1_u128; + } + let half = pow(n, m / 2_u128); + let total = half * half; + // TODO: check if (& 1) is cheaper + if (m % 2_u128) == 1_u128 { + total * n + } else { + total + } +} + +// TODO: wrap hash_span +impl SpanLegacyHash, impl TCopy: Copy> of LegacyHash> { + fn hash(state: felt252, mut value: Span) -> felt252 { + hash_span(state, value) + } +} + +#[starknet::contract] +mod Aggregator { + use super::Round; + use super::{Transmission}; + use super::SpanLegacyHash; + use super::pow; + + use array::ArrayTrait; + use array::SpanTrait; + use box::BoxTrait; + use hash::LegacyHash; + use integer::U128IntoFelt252; + use integer::u128s_from_felt252; + use integer::U128sFromFelt252Result; + use zeroable::Zeroable; + use traits::Into; + use traits::TryInto; + use option::OptionTrait; + + use starknet::ContractAddress; + use starknet::get_caller_address; + use starknet::contract_address_const; + use starknet::StorageBaseAddress; + use starknet::SyscallResult; + use starknet::storage_read_syscall; + use starknet::storage_write_syscall; + use starknet::storage_address_from_base_and_offset; + use starknet::class_hash::ClassHash; + + use openzeppelin::access::ownable::OwnableComponent; + use openzeppelin::token::erc20::interface::{IERC20, IERC20Dispatcher, IERC20DispatcherTrait}; + + use chainlink::utils::split_felt; + use chainlink::libraries::access_control::{AccessControlComponent, IAccessController}; + use chainlink::libraries::access_control::AccessControlComponent::InternalTrait as AccessControlInternalTrait; + use chainlink::libraries::upgradeable::{Upgradeable, IUpgradeable}; + + use chainlink::libraries::access_control::{ + IAccessControllerDispatcher, IAccessControllerDispatcherTrait + }; + use chainlink::libraries::type_and_version::ITypeAndVersion; + + component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent); + + #[abi(embed_v0)] + impl OwnableImpl = OwnableComponent::OwnableTwoStepImpl; + impl OwnableInternalImpl = OwnableComponent::InternalImpl; + + #[abi(embed_v0)] + impl AccessControlImpl = + AccessControlComponent::AccessControlImpl; + impl AccessControlInternalImpl = AccessControlComponent::InternalImpl; + + const GIGA: u128 = 1000000000_u128; + + const MAX_ORACLES: u32 = 31_u32; + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + OwnableEvent: OwnableComponent::Event, + #[flat] + AccessControlEvent: AccessControlComponent::Event, + NewTransmission: NewTransmission, + ConfigSet: ConfigSet, + LinkTokenSet: LinkTokenSet, + BillingAccessControllerSet: BillingAccessControllerSet, + BillingSet: BillingSet, + OraclePaid: OraclePaid, + PayeeshipTransferRequested: PayeeshipTransferRequested, + PayeeshipTransferred: PayeeshipTransferred, + } + + #[derive(Drop, starknet::Event)] + struct NewTransmission { + #[key] + round_id: u128, + answer: u128, + #[key] + transmitter: ContractAddress, + observation_timestamp: u64, + observers: felt252, + observations: Array, + juels_per_fee_coin: u128, + gas_price: u128, + config_digest: felt252, + epoch_and_round: u64, + reimbursement: u128 + } + + #[derive(Copy, Drop, Serde, starknet::Store)] + struct Oracle { + index: usize, + // entire supply of LINK always fits into u96, so u128 is safe to use + payment_juels: u128, + } + + // TODO: reintroduce custom storage to save on space + // impl OracleStorageAccess of StorageAccess { + // fn read(address_domain: u32, base: StorageBaseAddress) -> SyscallResult:: { + // let value = storage_read_syscall( + // address_domain, storage_address_from_base_and_offset(base, 0_u8) + // )?; + // let (index, payment_juels) = split_felt(value); + // Result::Ok(Oracle { index: index.try_into().unwrap(), payment_juels, }) + // } + // + // fn write( + // address_domain: u32, base: StorageBaseAddress, value: Oracle + // ) -> SyscallResult::<()> { + // let value = value.index.into() * SHIFT_128 + value.payment_juels.into(); + // storage_write_syscall( + // address_domain, storage_address_from_base_and_offset(base, 0_u8), value + // ) + // } + // } + + #[storage] + struct Storage { + #[substorage(v0)] + ownable: OwnableComponent::Storage, + #[substorage(v0)] + access_control: AccessControlComponent::Storage, + /// Maximum number of faulty oracles + _f: u8, + _latest_epoch_and_round: u64, // (u32, u32) + _latest_aggregator_round_id: u128, + _min_answer: u128, + _max_answer: u128, + _decimals: u8, + _description: felt252, + _latest_config_block_number: u64, + _config_count: u64, + _latest_config_digest: felt252, + // _oracles: Array, // NOTE: array can't be used in storage + _oracles_len: usize, + _transmitters: LegacyMap, // + _signers: LegacyMap, // + _signers_list: LegacyMap, + _transmitters_list: LegacyMap, + _reward_from_aggregator_round_id: LegacyMap, // + _transmissions: LegacyMap, + // link token + _link_token: ContractAddress, + // billing + _billing_access_controller: ContractAddress, + _billing: BillingConfig, + // payee management + _payees: LegacyMap, // + _proposed_payees: LegacyMap< + ContractAddress, ContractAddress + > // + } + + #[generate_trait] + impl AccessHelperImpl of AccessHelperTrait { + fn _require_read_access(self: @ContractState) { + let caller = starknet::info::get_caller_address(); + self.access_control.check_read_access(caller); + } + } + + #[abi(embed_v0)] + impl TypeAndVersionImpl of ITypeAndVersion { + fn type_and_version(self: @ContractState) -> felt252 { + 'ocr2/aggregator.cairo 1.0.0' + } + } + + #[abi(embed_v0)] + impl AggregatorImpl of super::IAggregator { + fn latest_round_data(self: @ContractState) -> Round { + self._require_read_access(); + let latest_round_id = self._latest_aggregator_round_id.read(); + let transmission = self._transmissions.read(latest_round_id); + Round { + round_id: latest_round_id.into(), + answer: transmission.answer, + block_num: transmission.block_num, + started_at: transmission.observation_timestamp, + updated_at: transmission.transmission_timestamp, + } + } + + fn round_data(self: @ContractState, round_id: u128) -> Round { + self._require_read_access(); + let transmission = self._transmissions.read(round_id); + Round { + round_id: round_id.into(), + answer: transmission.answer, + block_num: transmission.block_num, + started_at: transmission.observation_timestamp, + updated_at: transmission.transmission_timestamp, + } + } + + fn description(self: @ContractState) -> felt252 { + self._require_read_access(); + self._description.read() + } + + fn decimals(self: @ContractState) -> u8 { + self._require_read_access(); + self._decimals.read() + } + + fn latest_answer(self: @ContractState) -> u128 { + self._require_read_access(); + let latest_round_id = self._latest_aggregator_round_id.read(); + let transmission = self._transmissions.read(latest_round_id); + transmission.answer + } + } + + // --- + + #[constructor] + fn constructor( + ref self: ContractState, + owner: ContractAddress, + link: ContractAddress, + min_answer: u128, + max_answer: u128, + billing_access_controller: ContractAddress, + decimals: u8, + description: felt252 + ) { + self.ownable.initializer(owner); + self.access_control.initializer(); + self._link_token.write(link); + self._billing_access_controller.write(billing_access_controller); + + assert(min_answer < max_answer, 'min >= max'); + self._min_answer.write(min_answer); + self._max_answer.write(max_answer); + + self._decimals.write(decimals); + self._description.write(description); + } + + // --- Upgradeable --- + + #[abi(embed_v0)] + impl UpgradeableImpl of IUpgradeable { + fn upgrade(ref self: ContractState, new_impl: ClassHash) { + self.ownable.assert_only_owner(); + Upgradeable::upgrade(new_impl) + } + } + + // --- Validation --- + + // NOTE: Currently unimplemented: + + // --- Configuration + + #[derive(Drop, starknet::Event)] + struct ConfigSet { + #[key] + previous_config_block_number: u64, + #[key] + latest_config_digest: felt252, + config_count: u64, + oracles: Array, + f: u8, + onchain_config: Array, + offchain_config_version: u64, + offchain_config: Array, + } + + use super::OracleConfig; + + const SHIFT_128: felt252 = 0x100000000000000000000000000000000; + // 4 * 2 ** (124 - 12) + const HALF_PREFIX: u128 = 0x40000000000000000000000000000_u128; + // 2 ** (124 - 12) - 1 + const HALF_DIGEST_MASK: u128 = 0xffffffffffffffffffffffffffff_u128; + + fn config_digest_from_data( + chain_id: felt252, + contract_address: ContractAddress, + config_count: u64, + oracles: @Array, + f: u8, + onchain_config: @Array, + offchain_config_version: u64, + offchain_config: @Array, + ) -> felt252 { + let mut state = 0; + state = LegacyHash::hash(state, chain_id); + state = LegacyHash::hash(state, contract_address); + state = LegacyHash::hash(state, config_count); + state = LegacyHash::hash(state, oracles.len()); + state = LegacyHash::hash(state, oracles.span()); // for oracle in oracles, hash each + state = LegacyHash::hash(state, f); + state = LegacyHash::hash(state, onchain_config.len()); + state = LegacyHash::hash(state, onchain_config.span()); + state = LegacyHash::hash(state, offchain_config_version); + state = LegacyHash::hash(state, offchain_config.len()); + state = LegacyHash::hash(state, offchain_config.span()); + let len: usize = 3 + + 1 + + (oracles.len() * 2) + + 1 + + 1 + + onchain_config.len() + + 1 + + 1 + + offchain_config.len(); + state = LegacyHash::hash(state, len); + + // since there's no bitwise ops on felt252, we split into two u128s and recombine. + // we only need to clamp and prefix the top bits. + let (top, bottom) = split_felt(state); + let masked_top = (top & HALF_DIGEST_MASK) | HALF_PREFIX; + let masked = (masked_top.into() * SHIFT_128) + bottom.into(); + + masked + } + + #[abi(embed_v0)] + impl ConfigurationImpl of super::Configuration { + fn set_config( + ref self: ContractState, + oracles: Array, + f: u8, + onchain_config: Array, + offchain_config_version: u64, + offchain_config: Array, + ) -> felt252 { // digest + self.ownable.assert_only_owner(); + assert(oracles.len() <= MAX_ORACLES, 'too many oracles'); + assert((3_u8 * f).into() < oracles.len(), 'faulty-oracle f too high'); + assert(f > 0_u8, 'f must be positive'); + + assert(onchain_config.len() == 0_u32, 'onchain_config must be empty'); + + let min_answer = self._min_answer.read(); + let max_answer = self._max_answer.read(); + + let mut computed_onchain_config = ArrayTrait::new(); + computed_onchain_config.append(1); // version + computed_onchain_config.append(min_answer.into()); + computed_onchain_config.append(max_answer.into()); + + self.pay_oracles(); + + // remove old signers & transmitters + self.remove_oracles(); + + let latest_round_id = self._latest_aggregator_round_id.read(); + + self.add_oracles(@oracles, latest_round_id); + + self._f.write(f); + let block_num = starknet::info::get_block_info().unbox().block_number; + let prev_block_num = self._latest_config_block_number.read(); + self._latest_config_block_number.write(block_num); + // update config count + let mut config_count = self._config_count.read(); + config_count += 1_u64; + self._config_count.write(config_count); + let contract_address = starknet::info::get_contract_address(); + let chain_id = starknet::info::get_tx_info().unbox().chain_id; + + let digest = config_digest_from_data( + chain_id, + contract_address, + config_count, + @oracles, + f, + @computed_onchain_config, + offchain_config_version, + @offchain_config, + ); + + self._latest_config_digest.write(digest); + + // reset epoch & round + self._latest_epoch_and_round.write(0_u64); + + self + .emit( + Event::ConfigSet( + ConfigSet { + previous_config_block_number: prev_block_num, + latest_config_digest: digest, + config_count: config_count, + oracles: oracles, + f: f, + onchain_config: computed_onchain_config, + offchain_config_version: offchain_config_version, + offchain_config: offchain_config + } + ) + ); + + digest + } + + fn latest_config_details(self: @ContractState) -> (u64, u64, felt252) { + let config_count = self._config_count.read(); + let block_number = self._latest_config_block_number.read(); + let config_digest = self._latest_config_digest.read(); + + (config_count, block_number, config_digest) + } + + fn transmitters(self: @ContractState) -> Array { + let mut index = 1; + let mut len = self._oracles_len.read(); + let mut result = ArrayTrait::new(); + while len > 0_usize { + let transmitter = self._transmitters_list.read(index); + result.append(transmitter); + len -= 1; + index += 1; + }; + return result; + } + } + + #[generate_trait] + impl ConfigurationHelperImpl of ConfigurationHelperTrait { + fn remove_oracles(ref self: ContractState) { + let mut index = self._oracles_len.read(); + while index > 0_usize { + let signer = self._signers_list.read(index); + self._signers.write(signer, 0_usize); + + let transmitter = self._transmitters_list.read(index); + self + ._transmitters + .write(transmitter, Oracle { index: 0_usize, payment_juels: 0_u128 }); + + index -= 1; + }; + self._oracles_len.write(0_usize); + } + + fn add_oracles( + ref self: ContractState, oracles: @Array, latest_round_id: u128 + ) { + let mut index = 0; + let mut span = oracles.span(); + while let Option::Some(oracle) = span + .pop_front() { + // NOTE: index should start with 1 here because storage is 0-initialized. + // That way signers(pkey) => 0 indicates "not present" + // This is why we increment first, before using the index + index += 1; + + // check for duplicates + let existing_signer = self._signers.read(*oracle.signer); + assert(existing_signer == 0_usize, 'repeated signer'); + + let existing_transmitter = self._transmitters.read(*oracle.transmitter); + assert(existing_transmitter.index == 0_usize, 'repeated transmitter'); + + self._signers.write(*oracle.signer, index); + self._signers_list.write(index, *oracle.signer); + + self + ._transmitters + .write(*oracle.transmitter, Oracle { index, payment_juels: 0_u128 }); + self._transmitters_list.write(index, *oracle.transmitter); + + self._reward_from_aggregator_round_id.write(index, latest_round_id); + }; + self._oracles_len.write(index); + } + } + + // --- Transmission --- + + #[derive(Copy, Drop, Serde)] + struct Signature { + r: felt252, + s: felt252, + public_key: felt252, + } + + #[derive(Copy, Drop, Serde)] + struct ReportContext { + config_digest: felt252, + epoch_and_round: u64, + extra_hash: felt252, + } + + #[abi(per_item)] + #[generate_trait] + impl TransmissionHelperImpl of TransmissionHelperTrait { + fn hash_report( + self: @ContractState, + report_context: @ReportContext, + observation_timestamp: u64, + observers: felt252, + observations: @Array, + juels_per_fee_coin: u128, + gas_price: u128 + ) -> felt252 { + let mut state = 0; + state = LegacyHash::hash(state, *report_context.config_digest); + state = LegacyHash::hash(state, *report_context.epoch_and_round); + state = LegacyHash::hash(state, *report_context.extra_hash); + state = LegacyHash::hash(state, observation_timestamp); + state = LegacyHash::hash(state, observers); + state = LegacyHash::hash(state, observations.len()); + state = LegacyHash::hash(state, observations.span()); + state = LegacyHash::hash(state, juels_per_fee_coin); + state = LegacyHash::hash(state, gas_price); + let len: usize = 5 + 1 + observations.len() + 2; + state = LegacyHash::hash(state, len); + state + } + + #[external(v0)] + fn latest_transmission_details(self: @ContractState) -> (felt252, u64, u128, u64) { + let config_digest = self._latest_config_digest.read(); + let latest_round_id = self._latest_aggregator_round_id.read(); + let epoch_and_round = self._latest_epoch_and_round.read(); + let transmission = self._transmissions.read(latest_round_id); + ( + config_digest, + epoch_and_round, + transmission.answer, + transmission.transmission_timestamp + ) + } + + #[external(v0)] + fn transmit( + ref self: ContractState, + report_context: ReportContext, + observation_timestamp: u64, + observers: felt252, + observations: Array, + juels_per_fee_coin: u128, + gas_price: u128, + mut signatures: Array, + ) { + let signatures_len = signatures.len(); + + let epoch_and_round = self._latest_epoch_and_round.read(); + assert(epoch_and_round < report_context.epoch_and_round, 'stale report'); + + // validate transmitter + let caller = starknet::info::get_caller_address(); + let mut oracle = self._transmitters.read(caller); + assert(oracle.index != 0_usize, 'unknown sender'); // 0 index = uninitialized + + // Validate config digest matches latest_config_digest + let config_digest = self._latest_config_digest.read(); + assert(report_context.config_digest == config_digest, 'config digest mismatch'); + + let f = self._f.read(); + assert(signatures_len == (f + 1_u8).into(), 'wrong number of signatures'); + + let msg = self + .hash_report( + @report_context, + observation_timestamp, + observers, + @observations, + juels_per_fee_coin, + gas_price + ); + + // Check all signatures are unique (we only saw each pubkey once) + // NOTE: This relies on protocol-level design constraints (MAX_ORACLES = 31, f = 10) which + // ensures we have enough bits to store a count for each oracle. Whenever the MAX_ORACLES + // is updated, the signed_count parameter should be reconsidered. + // + // Although 31 bits is enough, we use a u128 here for simplicity because BitAnd and BitOr + // operators are defined only for u128 and u256. + assert(MAX_ORACLES == 31_u32, ''); + self.verify_signatures(msg, ref signatures, 0_u128); + + // report(): + + let observations_len = observations.len(); + assert(observations_len <= MAX_ORACLES, ''); + assert(f.into() < observations_len, ''); + + self._latest_epoch_and_round.write(report_context.epoch_and_round); + + let median_idx = observations_len / 2_usize; + let median = *observations[median_idx]; + + // Validate median in min-max range + let min_answer = self._min_answer.read(); + let max_answer = self._max_answer.read(); + assert( + (min_answer <= median) & (median <= max_answer), 'median is out of min-max range' + ); + + let prev_round_id = self._latest_aggregator_round_id.read(); + let round_id = prev_round_id + 1_u128; + self._latest_aggregator_round_id.write(round_id); + + let block_info = starknet::info::get_block_info().unbox(); + + self + ._transmissions + .write( + round_id, + Transmission { + answer: median, + block_num: block_info.block_number, + observation_timestamp, + transmission_timestamp: block_info.block_timestamp, + } + ); + + // NOTE: Usually validating via validator would happen here, currently disabled + + let billing = self._billing.read(); + let reimbursement_juels = calculate_reimbursement( + juels_per_fee_coin, signatures_len, gas_price, billing + ); + + // end report() + + self + .emit( + Event::NewTransmission( + NewTransmission { + round_id: round_id, + answer: median, + transmitter: caller, + observation_timestamp: observation_timestamp, + observers: observers, + observations: observations, + juels_per_fee_coin: juels_per_fee_coin, + gas_price: gas_price, + config_digest: report_context.config_digest, + epoch_and_round: report_context.epoch_and_round, + reimbursement: reimbursement_juels, + } + ) + ); + + // pay transmitter + let payment = reimbursement_juels + (billing.transmission_payment_gjuels.into() * GIGA); + // TODO: check overflow + + oracle.payment_juels += payment; + self._transmitters.write(caller, oracle); + } + + fn verify_signatures( + self: @ContractState, + msg: felt252, + ref signatures: Array, + mut signed_count: u128 + ) { + let mut span = signatures.span(); + while let Option::Some(signature) = span + .pop_front() { + let index = self._signers.read(*signature.public_key); + assert(index != 0_usize, 'invalid signer'); // 0 index == uninitialized + + let indexed_bit = pow(2_u128, index.into() - 1_u128); + let prev_signed_count = signed_count; + signed_count = signed_count | indexed_bit; + assert(prev_signed_count != signed_count, 'duplicate signer'); + + let is_valid = ecdsa::check_ecdsa_signature( + msg, *signature.public_key, *signature.r, *signature.s + ); + + assert(is_valid, ''); + }; + } + } + + // --- Billing Config + + #[derive(Copy, Drop, Serde, starknet::Store)] + struct BillingConfig { + observation_payment_gjuels: u32, + transmission_payment_gjuels: u32, + gas_base: u32, + gas_per_signature: u32, + } + + // --- Billing Access Controller + + #[derive(Drop, starknet::Event)] + struct BillingAccessControllerSet { + #[key] + old_controller: ContractAddress, + #[key] + new_controller: ContractAddress, + } + + #[derive(Drop, starknet::Event)] + struct BillingSet { + config: BillingConfig + } + + #[derive(Drop, starknet::Event)] + struct OraclePaid { + #[key] + transmitter: ContractAddress, + payee: ContractAddress, + amount: u256, + link_token: ContractAddress, + } + + #[derive(Drop, starknet::Event)] + struct LinkTokenSet { + #[key] + old_link_token: ContractAddress, + #[key] + new_link_token: ContractAddress + } + + #[abi(embed_v0)] + impl BillingImpl of super::Billing { + fn set_link_token( + ref self: ContractState, link_token: ContractAddress, recipient: ContractAddress + ) { + self.ownable.assert_only_owner(); + + let old_token = self._link_token.read(); + + if link_token == old_token { + return (); + } + + let contract_address = starknet::info::get_contract_address(); + + // call balanceOf as a sanity check to confirm we're talking to a token + let token = IERC20Dispatcher { contract_address: link_token }; + token.balance_of(account: contract_address); + + self.pay_oracles(); + + // transfer remaining balance of old token to recipient + let old_token_dispatcher = IERC20Dispatcher { contract_address: old_token }; + let amount = old_token_dispatcher.balance_of(account: contract_address); + old_token_dispatcher.transfer(recipient, amount); + + self._link_token.write(link_token); + + self + .emit( + Event::LinkTokenSet( + LinkTokenSet { old_link_token: old_token, new_link_token: link_token } + ) + ); + } + + fn set_billing_access_controller( + ref self: ContractState, access_controller: ContractAddress + ) { + self.ownable.assert_only_owner(); + + let old_controller = self._billing_access_controller.read(); + if access_controller == old_controller { + return (); + } + + self._billing_access_controller.write(access_controller); + self + .emit( + Event::BillingAccessControllerSet( + BillingAccessControllerSet { + old_controller: old_controller, new_controller: access_controller + } + ) + ); + } + + fn set_billing(ref self: ContractState, config: BillingConfig) { + self.has_billing_access(); + + self.pay_oracles(); + + self._billing.write(config); + + self.emit(Event::BillingSet(BillingSet { config: config })); + } + + fn billing(self: @ContractState) -> BillingConfig { + self._billing.read() + } + + // Payments and Withdrawals + + fn withdraw_payment(ref self: ContractState, transmitter: ContractAddress) { + let caller = starknet::info::get_caller_address(); + let payee = self._payees.read(transmitter); + assert(caller == payee, 'only payee can withdraw'); + + let latest_round_id = self._latest_aggregator_round_id.read(); + let link_token = self._link_token.read(); + self.pay_oracle(transmitter, latest_round_id, link_token) + } + + fn owed_payment(self: @ContractState, transmitter: ContractAddress) -> u128 { + let oracle = self._transmitters.read(transmitter); + self._owed_payment(@oracle) + } + + fn withdraw_funds(ref self: ContractState, recipient: ContractAddress, amount: u256) { + self.has_billing_access(); + + let link_token = self._link_token.read(); + let contract_address = starknet::info::get_contract_address(); + + let due = self.total_link_due(); + // NOTE: equivalent to converting u128 to u256 + let due = u256 { high: 0_u128, low: due }; + + let token = IERC20Dispatcher { contract_address: link_token }; + let balance = token.balance_of(account: contract_address); + + assert(due <= balance, 'amount due exceeds balance'); + let available = balance - due; + + // Transfer as much as there is available + let amount = if available < amount { + available + } else { + amount + }; + token.transfer(recipient, amount); + } + + fn link_available_for_payment( + self: @ContractState + ) -> (bool, u128) { // (is negative, absolute difference) + let link_token = self._link_token.read(); + let contract_address = starknet::info::get_contract_address(); + + let token = IERC20Dispatcher { contract_address: link_token }; + let balance = token.balance_of(account: contract_address); + // entire link supply fits into u96 so this should not fail + assert(balance.high == 0_u128, 'balance too high'); + let balance: u128 = balance.low; + + let due = self.total_link_due(); + if balance > due { + (false, balance - due) + } else { + (true, due - balance) + } + } + } + + #[generate_trait] + impl BillingHelperImpl of BillingHelperTrait { + fn has_billing_access(self: @ContractState) { + let caller = starknet::info::get_caller_address(); + let owner = self.ownable.owner(); + + // owner always has access + if caller == owner { + return (); + } + + let access_controller = self._billing_access_controller.read(); + let access_controller = IAccessControllerDispatcher { + contract_address: access_controller + }; + assert( + access_controller.has_access(caller, ArrayTrait::new()), + 'caller does not have access' + ); + } + + // --- Payments and Withdrawals + + fn _owed_payment(self: @ContractState, oracle: @Oracle) -> u128 { + if *oracle.index == 0_usize { + return 0_u128; + } + + let billing = self._billing.read(); + + let latest_round_id = self._latest_aggregator_round_id.read(); + let from_round_id = self._reward_from_aggregator_round_id.read(*oracle.index); + let rounds = latest_round_id - from_round_id; + + (rounds * billing.observation_payment_gjuels.into() * GIGA) + *oracle.payment_juels + } + + fn pay_oracle( + ref self: ContractState, + transmitter: ContractAddress, + latest_round_id: u128, + link_token: ContractAddress + ) { + let oracle = self._transmitters.read(transmitter); + if oracle.index == 0_usize { + return (); + } + + let amount = self._owed_payment(@oracle); + // if zero, fastpath return to avoid empty transfers + if amount == 0_u128 { + return (); + } + + let payee = self._payees.read(transmitter); + + // NOTE: equivalent to converting u128 to u256 + let amount = u256 { high: 0_u128, low: amount }; + + let token = IERC20Dispatcher { contract_address: link_token }; + token.transfer(recipient: payee, amount: amount); + + // Reset payment + self._reward_from_aggregator_round_id.write(oracle.index, latest_round_id); + self + ._transmitters + .write(transmitter, Oracle { index: oracle.index, payment_juels: 0_u128 }); + + self + .emit( + Event::OraclePaid( + OraclePaid { + transmitter: transmitter, + payee: payee, + amount: amount, + link_token: link_token + } + ) + ); + } + + fn pay_oracles(ref self: ContractState) { + let mut index = self._oracles_len.read(); + let latest_round_id = self._latest_aggregator_round_id.read(); + let link_token = self._link_token.read(); + while index > 0_usize { + let transmitter = self._transmitters_list.read(index); + self.pay_oracle(transmitter, latest_round_id, link_token); + index -= 1; + }; + } + + fn total_link_due(self: @ContractState) -> u128 { + let mut index = self._oracles_len.read(); + let latest_round_id = self._latest_aggregator_round_id.read(); + let mut total_rounds = 0; + let mut payments_juels = 0; + + loop { + if index == 0_usize { + break (); + } + let transmitter = self._transmitters_list.read(index); + let oracle = self._transmitters.read(transmitter); + assert(oracle.index != 0_usize, index.into()); // 0 == undefined + + let from_round_id = self._reward_from_aggregator_round_id.read(oracle.index); + let rounds = latest_round_id - from_round_id; + total_rounds += rounds; + payments_juels += oracle.payment_juels; + index -= 1; + }; + + let billing = self._billing.read(); + return (total_rounds * billing.observation_payment_gjuels.into() * GIGA) + + payments_juels; + } + } + + // --- Transmitter Payment + + const MARGIN: u128 = 115_u128; + + fn calculate_reimbursement( + juels_per_fee_coin: u128, signature_count: usize, gas_price: u128, config: BillingConfig + ) -> u128 { + // TODO: determine new values for these constants + // Based on estimateFee (f=1 14977, f=2 14989, f=3 15002 f=4 15014 f=5 15027, count = f+1) + // gas_base = 14951, gas_per_signature = 13 + let signature_count_u128: u128 = signature_count.into(); + let gas_base_u128: u128 = config.gas_base.into(); + let gas_per_signature_u128: u128 = config.gas_per_signature.into(); + + let exact_gas = gas_base_u128 + (signature_count_u128 * gas_per_signature_u128); + let gas = exact_gas * MARGIN / 100_u128; // scale to 115% for some margin + let amount = gas * gas_price; + amount * juels_per_fee_coin + } + + // --- Payee Management + + use super::PayeeConfig; + + #[derive(Drop, starknet::Event)] + struct PayeeshipTransferRequested { + #[key] + transmitter: ContractAddress, + #[key] + current: ContractAddress, + #[key] + proposed: ContractAddress, + } + + #[derive(Drop, starknet::Event)] + struct PayeeshipTransferred { + #[key] + transmitter: ContractAddress, + #[key] + previous: ContractAddress, + #[key] + current: ContractAddress, + } + + #[abi(embed_v0)] + impl PayeeManagementImpl of super::PayeeManagement { + fn set_payees(ref self: ContractState, mut payees: Array) { + self.ownable.assert_only_owner(); + while let Option::Some(payee) = payees + .pop_front() { + let current_payee = self._payees.read(payee.transmitter); + let is_unset = current_payee.is_zero(); + let is_same = current_payee == payee.payee; + assert(is_unset | is_same, 'payee already set'); + + self._payees.write(payee.transmitter, payee.payee); + + self + .emit( + Event::PayeeshipTransferred( + PayeeshipTransferred { + transmitter: payee.transmitter, + previous: current_payee, + current: payee.payee + } + ) + ); + } + } + + fn transfer_payeeship( + ref self: ContractState, transmitter: ContractAddress, proposed: ContractAddress + ) { + assert(!proposed.is_zero(), 'cannot transfer to zero address'); + let caller = starknet::info::get_caller_address(); + let payee = self._payees.read(transmitter); + assert(caller == payee, 'only current payee can update'); + assert(caller != proposed, 'cannot transfer to self'); + + self._proposed_payees.write(transmitter, proposed); + self + .emit( + Event::PayeeshipTransferRequested( + PayeeshipTransferRequested { + transmitter: transmitter, current: payee, proposed: proposed + } + ) + ); + } + + fn accept_payeeship(ref self: ContractState, transmitter: ContractAddress) { + let proposed = self._proposed_payees.read(transmitter); + let caller = starknet::info::get_caller_address(); + assert(caller == proposed, 'only proposed payee can accept'); + let previous = self._payees.read(transmitter); + + self._payees.write(transmitter, proposed); + self._proposed_payees.write(transmitter, Zeroable::zero()); + self + .emit( + Event::PayeeshipTransferred( + PayeeshipTransferred { + transmitter: transmitter, previous: previous, current: caller + } + ) + ); + } + } +} diff --git a/contracts/src/ocr2/aggregator_proxy.cairo b/contracts/src/ocr2/aggregator_proxy.cairo new file mode 100644 index 000000000..9859c9ccd --- /dev/null +++ b/contracts/src/ocr2/aggregator_proxy.cairo @@ -0,0 +1,262 @@ +use chainlink::ocr2::aggregator::Round; +use chainlink::ocr2::aggregator::{IAggregator, IAggregatorDispatcher, IAggregatorDispatcherTrait}; +use starknet::ContractAddress; + +// TODO: use a generic param for the round_id? +#[starknet::interface] +trait IAggregatorProxy { + fn latest_round_data(self: @TContractState) -> Round; + fn round_data(self: @TContractState, round_id: felt252) -> Round; + fn description(self: @TContractState) -> felt252; + fn decimals(self: @TContractState) -> u8; + fn latest_answer(self: @TContractState) -> u128; +} + +#[starknet::interface] +trait IAggregatorProxyInternal { + fn propose_aggregator(ref self: TContractState, address: ContractAddress); + fn confirm_aggregator(ref self: TContractState, address: ContractAddress); + fn proposed_latest_round_data(self: @TContractState) -> Round; + fn proposed_round_data(self: @TContractState, round_id: felt252) -> Round; + fn aggregator(self: @TContractState) -> ContractAddress; + fn phase_id(self: @TContractState) -> u128; +} + +#[starknet::contract] +mod AggregatorProxy { + use super::IAggregatorProxy; + use super::IAggregatorDispatcher; + use super::IAggregatorDispatcherTrait; + + use integer::u128s_from_felt252; + use option::OptionTrait; + use traits::Into; + use traits::TryInto; + use zeroable::Zeroable; + + use starknet::ContractAddress; + use starknet::ContractAddressIntoFelt252; + use starknet::Felt252TryIntoContractAddress; + use integer::Felt252TryIntoU128; + use starknet::StorageBaseAddress; + use starknet::SyscallResult; + use integer::U128IntoFelt252; + use integer::U128sFromFelt252Result; + use starknet::storage_read_syscall; + use starknet::storage_write_syscall; + use starknet::storage_address_from_base_and_offset; + use starknet::class_hash::ClassHash; + + use openzeppelin::access::ownable::OwnableComponent; + + use chainlink::ocr2::aggregator::IAggregator; + use chainlink::ocr2::aggregator::Round; + use chainlink::libraries::access_control::{AccessControlComponent, IAccessController}; + use chainlink::libraries::access_control::AccessControlComponent::InternalTrait as AccessControlInternalTrait; + use chainlink::utils::split_felt; + use chainlink::libraries::type_and_version::{ + ITypeAndVersion, ITypeAndVersionDispatcher, ITypeAndVersionDispatcherTrait + }; + use chainlink::libraries::upgradeable::{Upgradeable, IUpgradeable}; + + const SHIFT: felt252 = 0x100000000000000000000000000000000; + const MAX_ID: felt252 = 0xffffffffffffffffffffffffffffffff; + + #[derive(Copy, Drop, Serde, starknet::Store)] + struct Phase { + id: u128, + aggregator: ContractAddress + } + + component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent); + + #[abi(embed_v0)] + impl OwnableImpl = OwnableComponent::OwnableTwoStepImpl; + impl OwnableInternalImpl = OwnableComponent::InternalImpl; + + #[abi(embed_v0)] + impl AccessControlImpl = + AccessControlComponent::AccessControlImpl; + impl AccessControlInternalImpl = AccessControlComponent::InternalImpl; + + #[storage] + struct Storage { + #[substorage(v0)] + ownable: OwnableComponent::Storage, + #[substorage(v0)] + access_control: AccessControlComponent::Storage, + _current_phase: Phase, + _proposed_aggregator: ContractAddress, + _phases: LegacyMap + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + OwnableEvent: OwnableComponent::Event, + #[flat] + AccessControlEvent: AccessControlComponent::Event, + } + + // TODO: refactor these events + #[event] + fn AggregatorProposed(current: ContractAddress, proposed: ContractAddress) {} + + #[event] + fn AggregatorConfirmed(previous: ContractAddress, latest: ContractAddress) {} + + #[abi(embed_v0)] + impl AggregatorProxyImpl of IAggregatorProxy { + fn latest_round_data(self: @ContractState) -> Round { + self._require_read_access(); + let phase = self._current_phase.read(); + let aggregator = IAggregatorDispatcher { contract_address: phase.aggregator }; + let round = aggregator.latest_round_data(); + + Round { + round_id: (phase.id.into() * SHIFT) + round.round_id, + answer: round.answer, + block_num: round.block_num, + started_at: round.started_at, + updated_at: round.updated_at, + } + } + fn round_data(self: @ContractState, round_id: felt252) -> Round { + self._require_read_access(); + let (phase_id, round_id) = split_felt(round_id); + let address = self._phases.read(phase_id); + assert(!address.is_zero(), 'aggregator address is 0'); + + let aggregator = IAggregatorDispatcher { contract_address: address }; + let round = aggregator.round_data(round_id); + + Round { + round_id: (phase_id.into() * SHIFT) + round.round_id, + answer: round.answer, + block_num: round.block_num, + started_at: round.started_at, + updated_at: round.updated_at, + } + } + fn description(self: @ContractState) -> felt252 { + self._require_read_access(); + let phase = self._current_phase.read(); + let aggregator = IAggregatorDispatcher { contract_address: phase.aggregator }; + aggregator.description() + } + + fn decimals(self: @ContractState) -> u8 { + self._require_read_access(); + let phase = self._current_phase.read(); + let aggregator = IAggregatorDispatcher { contract_address: phase.aggregator }; + aggregator.decimals() + } + + fn latest_answer(self: @ContractState) -> u128 { + self._require_read_access(); + let phase = self._current_phase.read(); + let aggregator = IAggregatorDispatcher { contract_address: phase.aggregator }; + aggregator.latest_answer() + } + } + + #[abi(embed_v0)] + impl TypeAndVersion of ITypeAndVersion { + fn type_and_version(self: @ContractState) -> felt252 { + let phase = self._current_phase.read(); + let aggregator = ITypeAndVersionDispatcher { contract_address: phase.aggregator }; + aggregator.type_and_version() + } + } + + #[constructor] + fn constructor(ref self: ContractState, owner: ContractAddress, address: ContractAddress) { + self.ownable.initializer(owner); + self.access_control.initializer(); + self._set_aggregator(address); + } + + // -- Upgradeable -- + + #[abi(embed_v0)] + impl UpgradeableImpl of IUpgradeable { + fn upgrade(ref self: ContractState, new_impl: ClassHash) { + self.ownable.assert_only_owner(); + Upgradeable::upgrade(new_impl) + } + } + + // + + #[abi(embed_v0)] + impl AggregatorProxyInternal of super::IAggregatorProxyInternal { + fn propose_aggregator(ref self: ContractState, address: ContractAddress) { + self.ownable.assert_only_owner(); + assert(!address.is_zero(), 'proposed address is 0'); + self._proposed_aggregator.write(address); + + let phase = self._current_phase.read(); + AggregatorProposed(phase.aggregator, address); + } + + fn confirm_aggregator(ref self: ContractState, address: ContractAddress) { + self.ownable.assert_only_owner(); + assert(!address.is_zero(), 'confirm address is 0'); + let phase = self._current_phase.read(); + let previous = phase.aggregator; + + let proposed_aggregator = self._proposed_aggregator.read(); + assert(address == proposed_aggregator, 'does not match proposed address'); + self._proposed_aggregator.write(starknet::contract_address_const::<0>()); + self._set_aggregator(proposed_aggregator); + + AggregatorConfirmed(previous, address); + } + + fn proposed_latest_round_data(self: @ContractState) -> Round { + self._require_read_access(); + let address = self._proposed_aggregator.read(); + let aggregator = IAggregatorDispatcher { contract_address: address }; + aggregator.latest_round_data() + } + + fn proposed_round_data(self: @ContractState, round_id: felt252) -> Round { + self._require_read_access(); + let address = self._proposed_aggregator.read(); + let round_id128: u128 = round_id.try_into().unwrap(); + let aggregator = IAggregatorDispatcher { contract_address: address }; + aggregator.round_data(round_id128) + } + + fn aggregator(self: @ContractState) -> ContractAddress { + self._require_read_access(); + let phase = self._current_phase.read(); + phase.aggregator + } + + fn phase_id(self: @ContractState) -> u128 { + self._require_read_access(); + let phase = self._current_phase.read(); + phase.id + } + } + + /// Internals + + #[generate_trait] + impl StorageImpl of StorageTrait { + fn _set_aggregator(ref self: ContractState, address: ContractAddress) { + let phase = self._current_phase.read(); + let new_phase_id = phase.id + 1_u128; + self._current_phase.write(Phase { id: new_phase_id, aggregator: address }); + self._phases.write(new_phase_id, address); + } + + fn _require_read_access(self: @ContractState) { + let caller = starknet::info::get_caller_address(); + self.access_control.check_read_access(caller); + } + } +} diff --git a/contracts/src/ocr2/mocks.cairo b/contracts/src/ocr2/mocks.cairo new file mode 100644 index 000000000..16f9b3343 --- /dev/null +++ b/contracts/src/ocr2/mocks.cairo @@ -0,0 +1 @@ +mod mock_aggregator; diff --git a/contracts/src/ocr2/mocks/mock_aggregator.cairo b/contracts/src/ocr2/mocks/mock_aggregator.cairo new file mode 100644 index 000000000..eceb7d3c8 --- /dev/null +++ b/contracts/src/ocr2/mocks/mock_aggregator.cairo @@ -0,0 +1,127 @@ +#[starknet::interface] +trait IMockAggregator { + fn set_latest_round_data( + ref self: TContractState, + answer: u128, + block_num: u64, + observation_timestamp: u64, + transmission_timestamp: u64 + ); +} + +#[starknet::contract] +mod MockAggregator { + use array::ArrayTrait; + use starknet::contract_address_const; + use traits::Into; + + use chainlink::ocr2::aggregator::IAggregator; + use chainlink::ocr2::aggregator::Aggregator::{Transmission, NewTransmission}; + use chainlink::ocr2::aggregator::Round; + use chainlink::libraries::type_and_version::ITypeAndVersion; + + #[event] + use chainlink::ocr2::aggregator::Aggregator::Event; + + #[storage] + struct Storage { + _transmissions: LegacyMap, + _latest_aggregator_round_id: u128, + _decimals: u8 + } + + #[constructor] + fn constructor(ref self: ContractState, decimals: u8) { + self._decimals.write(decimals); + } + + #[abi(embed_v0)] + impl MockImpl of super::IMockAggregator { + fn set_latest_round_data( + ref self: ContractState, + answer: u128, + block_num: u64, + observation_timestamp: u64, + transmission_timestamp: u64 + ) { + let new_round_id = self._latest_aggregator_round_id.read() + 1_u128; + self + ._transmissions + .write( + new_round_id, + Transmission { + answer: answer, + block_num: block_num, + observation_timestamp: observation_timestamp, + transmission_timestamp: transmission_timestamp + } + ); + + let mut observations = ArrayTrait::new(); + observations.append(2_u128); + observations.append(3_u128); + + self._latest_aggregator_round_id.write(new_round_id); + + self + .emit( + Event::NewTransmission( + NewTransmission { + round_id: new_round_id, + answer: answer, + transmitter: contract_address_const::<42>(), + observation_timestamp: observation_timestamp, + observers: 3, + observations: observations, + juels_per_fee_coin: 18_u128, + gas_price: 1_u128, + config_digest: 777, + epoch_and_round: 20_u64, + reimbursement: 100_u128 + } + ) + ); + } + } + + #[abi(embed_v0)] + impl TypeAndVersionImpl of ITypeAndVersion { + fn type_and_version(self: @ContractState) -> felt252 { + 'mock_aggregator.cairo 1.0.0' + } + } + + #[abi(embed_v0)] + impl Aggregator of IAggregator { + fn round_data(self: @ContractState, round_id: u128) -> Round { + panic_with_felt252('unimplemented') + } + + fn latest_round_data(self: @ContractState) -> Round { + let latest_round_id = self._latest_aggregator_round_id.read(); + let transmission = self._transmissions.read(latest_round_id); + + Round { + round_id: latest_round_id.into(), + answer: transmission.answer, + block_num: transmission.block_num, + started_at: transmission.observation_timestamp, + updated_at: transmission.transmission_timestamp + } + } + + fn decimals(self: @ContractState) -> u8 { + self._decimals.read() + } + + fn description(self: @ContractState) -> felt252 { + 'mock' + } + + fn latest_answer(self: @ContractState) -> u128 { + let latest_round_id = self._latest_aggregator_round_id.read(); + let transmission = self._transmissions.read(latest_round_id); + transmission.answer + } + } +} diff --git a/contracts/src/tests.cairo b/contracts/src/tests.cairo new file mode 100644 index 000000000..4d8104499 --- /dev/null +++ b/contracts/src/tests.cairo @@ -0,0 +1,12 @@ +// Cairo files in folders can only be imported from a file of the same name as the folder + +mod test_aggregator; +mod test_aggregator_proxy; +mod test_multisig; +mod test_ownable; +mod test_erc677; +mod test_link_token; +mod test_upgradeable; +mod test_access_controller; +mod test_mock_aggregator; +mod test_sequencer_uptime_feed; diff --git a/contracts/src/tests/test_access_controller.cairo b/contracts/src/tests/test_access_controller.cairo new file mode 100644 index 000000000..17d570978 --- /dev/null +++ b/contracts/src/tests/test_access_controller.cairo @@ -0,0 +1,85 @@ +use starknet::ContractAddress; +use starknet::testing::set_caller_address; +use starknet::testing::set_contract_address; +use starknet::contract_address_const; +use starknet::class_hash::class_hash_const; +use starknet::class_hash::Felt252TryIntoClassHash; +use starknet::syscalls::deploy_syscall; + +use array::ArrayTrait; +use traits::Into; +use traits::TryInto; +use option::OptionTrait; +use core::result::ResultTrait; + +use chainlink::access_control::access_controller::AccessController; +use chainlink::access_control::access_controller::AccessController::UpgradeableImpl; + +use chainlink::libraries::access_control::{ + IAccessController, IAccessControllerDispatcher, IAccessControllerDispatcherTrait +}; + +fn STATE() -> AccessController::ContractState { + AccessController::contract_state_for_testing() +} + +fn setup() -> ContractAddress { + let account: ContractAddress = contract_address_const::<777>(); + set_caller_address(account); + account +} + +#[test] +#[should_panic(expected: ('Caller is not the owner',))] +fn test_upgrade_not_owner() { + let _ = setup(); + let mut state = STATE(); + + UpgradeableImpl::upgrade(ref state, class_hash_const::<2>()); +} + +#[test] +fn test_access_control() { + let owner = setup(); + // Deploy access controller + let calldata = array![owner.into(), // owner + ]; + let (accessControllerAddr, _) = deploy_syscall( + AccessController::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + + should_implement_access_control(accessControllerAddr, owner); +} + +// +// Tests for contracts that inherit AccessControl. +// Write functions are assumed to be protected by Ownable::only_owner, +// but this test does not check for that. +// + +fn should_implement_access_control(contract_addr: ContractAddress, owner: ContractAddress) { + let contract = IAccessControllerDispatcher { contract_address: contract_addr }; + let acc2: ContractAddress = contract_address_const::<2222987765>(); + + set_contract_address(owner); // required to call contract as owner + + // access check is enabled by default + assert(!contract.has_access(acc2, array![]), 'should not have access'); + + // disable access check + contract.disable_access_check(); + assert(contract.has_access(acc2, array![]), 'should have access'); + + // enable access check + contract.enable_access_check(); + assert(!contract.has_access(acc2, array![]), 'should not have access'); + + // add_access for acc2 + contract.add_access(acc2); + assert(contract.has_access(acc2, array![]), 'should have access'); + + // remove_access for acc2 + contract.remove_access(acc2); + assert(!contract.has_access(acc2, array![]), 'should not have access'); +} diff --git a/contracts/src/tests/test_aggregator.cairo b/contracts/src/tests/test_aggregator.cairo new file mode 100644 index 000000000..e2c3d81c3 --- /dev/null +++ b/contracts/src/tests/test_aggregator.cairo @@ -0,0 +1,427 @@ +use starknet::testing::set_caller_address; +use starknet::testing::set_contract_address; +use starknet::ContractAddress; +use starknet::contract_address_const; +use starknet::class_hash::class_hash_const; +use starknet::class_hash::Felt252TryIntoClassHash; +use starknet::syscalls::deploy_syscall; + +use array::ArrayTrait; +use clone::Clone; +use traits::Into; +use traits::TryInto; +use option::OptionTrait; +use core::result::ResultTrait; + +use chainlink::ocr2::aggregator::pow; +use chainlink::ocr2::aggregator::Aggregator; +use chainlink::ocr2::aggregator::Aggregator::{ + AggregatorImpl, BillingImpl, PayeeManagementImpl, UpgradeableImpl +}; +use chainlink::ocr2::aggregator::Aggregator::BillingConfig; +use chainlink::ocr2::aggregator::Aggregator::PayeeConfig; +use chainlink::access_control::access_controller::AccessController; +use chainlink::token::link_token::LinkToken; +use chainlink::tests::test_ownable::should_implement_ownable; +use chainlink::tests::test_access_controller::should_implement_access_control; + +#[test] +fn test_pow_2_0() { + assert(pow(2, 0) == 0x1, 'expected 0x1'); + assert(pow(2, 1) == 0x2, 'expected 0x2'); + assert(pow(2, 2) == 0x4, 'expected 0x4'); + assert(pow(2, 3) == 0x8, 'expected 0x8'); + assert(pow(2, 4) == 0x10, 'expected 0x10'); + assert(pow(2, 5) == 0x20, 'expected 0x20'); + assert(pow(2, 6) == 0x40, 'expected 0x40'); + assert(pow(2, 7) == 0x80, 'expected 0x80'); + assert(pow(2, 8) == 0x100, 'expected 0x100'); + assert(pow(2, 9) == 0x200, 'expected 0x200'); + assert(pow(2, 10) == 0x400, 'expected 0x400'); + assert(pow(2, 11) == 0x800, 'expected 0x800'); + assert(pow(2, 12) == 0x1000, 'expected 0x1000'); + assert(pow(2, 13) == 0x2000, 'expected 0x2000'); + assert(pow(2, 14) == 0x4000, 'expected 0x4000'); + assert(pow(2, 15) == 0x8000, 'expected 0x8000'); + assert(pow(2, 16) == 0x10000, 'expected 0x10000'); + assert(pow(2, 17) == 0x20000, 'expected 0x20000'); + assert(pow(2, 18) == 0x40000, 'expected 0x40000'); + assert(pow(2, 19) == 0x80000, 'expected 0x80000'); + assert(pow(2, 20) == 0x100000, 'expected 0x100000'); + assert(pow(2, 21) == 0x200000, 'expected 0x200000'); + assert(pow(2, 22) == 0x400000, 'expected 0x400000'); + assert(pow(2, 23) == 0x800000, 'expected 0x800000'); + assert(pow(2, 24) == 0x1000000, 'expected 0x1000000'); + assert(pow(2, 25) == 0x2000000, 'expected 0x2000000'); + assert(pow(2, 26) == 0x4000000, 'expected 0x4000000'); + assert(pow(2, 27) == 0x8000000, 'expected 0x8000000'); + assert(pow(2, 28) == 0x10000000, 'expected 0x10000000'); + assert(pow(2, 29) == 0x20000000, 'expected 0x20000000'); + assert(pow(2, 30) == 0x40000000, 'expected 0x40000000'); + assert(pow(2, 31) == 0x80000000, 'expected 0x80000000'); +} + +use chainlink::libraries::access_control::{ + IAccessController, IAccessControllerDispatcher, IAccessControllerDispatcherTrait +}; + +#[starknet::interface] +trait ILinkToken {} + +fn STATE() -> Aggregator::ContractState { + Aggregator::contract_state_for_testing() +} + +fn setup() -> ( + ContractAddress, ContractAddress, IAccessControllerDispatcher, ILinkTokenDispatcher +) { + let acc1: ContractAddress = contract_address_const::<777>(); + let acc2: ContractAddress = contract_address_const::<888>(); + // set acc1 as default caller + set_caller_address(acc1); + + // deploy billing access controller + let calldata = array![acc1.into(), // owner = acc1; + ]; + let (billingAccessControllerAddr, _) = deploy_syscall( + AccessController::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + let billingAccessController = IAccessControllerDispatcher { + contract_address: billingAccessControllerAddr + }; + + // deploy link token contract + let calldata = array![acc1.into(), // minter = acc1; + acc1.into(), // owner = acc1; + ]; + let (linkTokenAddr, _) = deploy_syscall( + LinkToken::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + let linkToken = ILinkTokenDispatcher { contract_address: linkTokenAddr }; + + // return accounts, billing access controller, link token + (acc1, acc2, billingAccessController, linkToken) +} + +#[test] +fn test_ownable() { + let (account, _, _, _) = setup(); + // Deploy aggregator + let calldata = array![ + account.into(), // owner + contract_address_const::<777>().into(), // link token + 0, // min_answer + 100, // max_answer + contract_address_const::<999>().into(), // billing access controller + 8, // decimals + 123, // description + ]; + let (aggregatorAddr, _) = deploy_syscall( + Aggregator::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + + should_implement_ownable(aggregatorAddr, account); +} + +#[test] +fn test_access_control() { + let (account, _, _, _) = setup(); + // Deploy aggregator + let mut calldata = array![ + account.into(), // owner + contract_address_const::<777>().into(), // link token + 0, // min_answer + 100, // max_answer + contract_address_const::<999>().into(), // billing access controller + 8, // decimals + 123, // description + ]; + let (aggregatorAddr, _) = deploy_syscall( + Aggregator::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + + should_implement_access_control(aggregatorAddr, account); +} + + +#[test] +#[should_panic(expected: ('Caller is not the owner',))] +fn test_upgrade_non_owner() { + let _ = setup(); + let mut state = STATE(); + + UpgradeableImpl::upgrade(ref state, class_hash_const::<123>()); +} + +// --- Billing tests --- + +#[test] +#[should_panic(expected: ('Caller is not the owner',))] +fn test_set_billing_access_controller_not_owner() { + let (owner, acc2, billingAccessController, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, owner, contract_address_const::<777>(), 0, 100, acc2, 8, 123 + ); + + // set billing access controller should revert if caller is not owner + set_caller_address(acc2); + BillingImpl::set_billing_access_controller(ref state, billingAccessController.contract_address); +} + +#[test] +#[should_panic(expected: ('caller does not have access',))] +fn test_set_billing_config_no_access() { + let (owner, acc2, billingAccessController, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, + owner, + contract_address_const::<777>(), + 0, + 100, + billingAccessController.contract_address, + 8, + 123 + ); + + // set billing config as acc2 with no access + let config = BillingConfig { + observation_payment_gjuels: 1, + transmission_payment_gjuels: 5, + gas_base: 1, + gas_per_signature: 1, + }; + set_caller_address(acc2); + BillingImpl::set_billing(ref state, config); +} + +#[test] +fn test_set_billing_config_as_owner() { + let (owner, _, billingAccessController, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, + owner, + contract_address_const::<777>(), + 0, + 100, + billingAccessController.contract_address, + 8, + 123 + ); + + // set billing config as owner + let config = BillingConfig { + observation_payment_gjuels: 1, + transmission_payment_gjuels: 5, + gas_base: 1, + gas_per_signature: 1, + }; + BillingImpl::set_billing(ref state, config); + + // check billing config + let billing = BillingImpl::billing(@state); + assert(billing.observation_payment_gjuels == 1, 'should be 1'); + assert(billing.transmission_payment_gjuels == 5, 'should be 5'); + assert(billing.gas_base == 1, 'should be 1'); + assert(billing.gas_per_signature == 1, 'should be 1'); +} + +#[test] +fn test_set_billing_config_as_acc_with_access() { + let (owner, acc2, billingAccessController, _) = setup(); + let mut state = STATE(); + // grant acc2 access on access controller + set_contract_address(owner); + billingAccessController.add_access(acc2); + + Aggregator::constructor( + ref state, + owner, + contract_address_const::<777>(), + 0, + 100, + billingAccessController.contract_address, + 8, + 123 + ); + + // set billing config as acc2 with access + let config = BillingConfig { + observation_payment_gjuels: 1, + transmission_payment_gjuels: 5, + gas_base: 1, + gas_per_signature: 1, + }; + set_caller_address(acc2); + BillingImpl::set_billing(ref state, config); + + // check billing config + let billing = BillingImpl::billing(@state); + assert(billing.observation_payment_gjuels == 1, 'should be 1'); + assert(billing.transmission_payment_gjuels == 5, 'should be 5'); + assert(billing.gas_base == 1, 'should be 1'); + assert(billing.gas_per_signature == 1, 'should be 1'); +} + +// --- Payee Management Tests --- + +#[test] +#[should_panic(expected: ('Caller is not the owner',))] +fn test_set_payees_caller_not_owner() { + let (owner, acc2, _, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, owner, contract_address_const::<777>(), 0, 100, acc2, 8, 123 + ); + + let payees = array![PayeeConfig { transmitter: acc2, payee: acc2, },]; + + // set payee should revert if caller is not owner + set_caller_address(acc2); + PayeeManagementImpl::set_payees(ref state, payees); +} + +#[test] +fn test_set_single_payee() { + let (owner, acc2, _, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, owner, contract_address_const::<777>(), 0, 100, acc2, 8, 123 + ); + + let payees = array![PayeeConfig { transmitter: acc2, payee: acc2, },]; + + set_caller_address(owner); + PayeeManagementImpl::set_payees(ref state, payees); +} + +#[test] +fn test_set_multiple_payees() { + let (owner, acc2, _, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, owner, contract_address_const::<777>(), 0, 100, acc2, 8, 123 + ); + + let payees = array![ + PayeeConfig { transmitter: acc2, payee: acc2, }, + PayeeConfig { transmitter: owner, payee: owner, }, + ]; + + set_caller_address(owner); + PayeeManagementImpl::set_payees(ref state, payees); +} + +#[test] +#[should_panic(expected: ('only current payee can update',))] +fn test_transfer_payeeship_caller_not_payee() { + let (owner, acc2, _, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, owner, contract_address_const::<777>(), 0, 100, acc2, 8, 123 + ); + + let transmitter = contract_address_const::<123>(); + let payees = array![PayeeConfig { transmitter: transmitter, payee: acc2, },]; + + set_caller_address(owner); + PayeeManagementImpl::set_payees(ref state, payees); + PayeeManagementImpl::transfer_payeeship(ref state, transmitter, owner); +} + +#[test] +#[should_panic(expected: ('cannot transfer to self',))] +fn test_transfer_payeeship_to_self() { + let (owner, acc2, _, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, owner, contract_address_const::<777>(), 0, 100, acc2, 8, 123 + ); + + let transmitter = contract_address_const::<123>(); + let payees = array![PayeeConfig { transmitter: transmitter, payee: acc2, },]; + + set_caller_address(owner); + PayeeManagementImpl::set_payees(ref state, payees); + set_caller_address(acc2); + PayeeManagementImpl::transfer_payeeship(ref state, transmitter, acc2); +} + +#[test] +#[should_panic(expected: ('only proposed payee can accept',))] +fn test_accept_payeeship_caller_not_proposed_payee() { + let (owner, acc2, _, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, owner, contract_address_const::<777>(), 0, 100, acc2, 8, 123 + ); + + let transmitter = contract_address_const::<123>(); + let payees = array![PayeeConfig { transmitter: transmitter, payee: acc2, },]; + + set_caller_address(owner); + PayeeManagementImpl::set_payees(ref state, payees); + set_caller_address(acc2); + PayeeManagementImpl::transfer_payeeship(ref state, transmitter, owner); + PayeeManagementImpl::accept_payeeship(ref state, transmitter); +} + +#[test] +fn test_transfer_and_accept_payeeship() { + let (owner, acc2, _, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, owner, contract_address_const::<777>(), 0, 100, acc2, 8, 123 + ); + + let transmitter = contract_address_const::<123>(); + let payees = array![PayeeConfig { transmitter: transmitter, payee: acc2, },]; + + set_caller_address(owner); + PayeeManagementImpl::set_payees(ref state, payees); + set_caller_address(acc2); + PayeeManagementImpl::transfer_payeeship(ref state, transmitter, owner); + set_caller_address(owner); + PayeeManagementImpl::accept_payeeship(ref state, transmitter); +} +// --- Payments and Withdrawals Tests --- +// +// NOTE: this test suite largely incomplete as we cannot generate or mock +// off-chain signatures in cairo-test, and thus cannot generate aggregator rounds. +// We could explore testing against a mock aggregator contract with the signature +// verification logic removed in the future. + +#[test] +fn test_owed_payment_no_rounds() { + let (owner, acc2, _, _) = setup(); + let mut state = STATE(); + Aggregator::constructor( + ref state, owner, contract_address_const::<777>(), 0, 100, acc2, 8, 123 + ); + + let transmitter = contract_address_const::<123>(); + let mut payees = array![PayeeConfig { transmitter: transmitter, payee: acc2, },]; + + set_caller_address(owner); + PayeeManagementImpl::set_payees(ref state, payees); + + let owed = BillingImpl::owed_payment(@state, transmitter); + assert(owed == 0, 'owed payment should be 0'); +} + +#[test] +fn test_link_available_for_payment_no_rounds_or_funds() { + let (owner, acc2, _, linkToken) = setup(); + let mut state = STATE(); + Aggregator::constructor(ref state, owner, linkToken.contract_address, 0, 100, acc2, 8, 123); + + let (is_negative, diff) = BillingImpl::link_available_for_payment(@state); + assert(is_negative == true, 'is_negative should be true'); + assert(diff == 0, 'absolute_diff should be 0'); +} diff --git a/contracts/src/tests/test_aggregator_proxy.cairo b/contracts/src/tests/test_aggregator_proxy.cairo new file mode 100644 index 000000000..ef33d0f66 --- /dev/null +++ b/contracts/src/tests/test_aggregator_proxy.cairo @@ -0,0 +1,216 @@ +use starknet::contract_address_const; +use starknet::ContractAddress; +use starknet::testing::set_caller_address; +use starknet::syscalls::deploy_syscall; +use starknet::class_hash::Felt252TryIntoClassHash; +use starknet::class_hash::class_hash_const; + +use array::ArrayTrait; +use traits::Into; +use traits::TryInto; +use option::OptionTrait; +use core::result::ResultTrait; + +use chainlink::ocr2::mocks::mock_aggregator::{ + MockAggregator, IMockAggregator, IMockAggregatorDispatcher, IMockAggregatorDispatcherTrait +}; +use chainlink::ocr2::aggregator_proxy::AggregatorProxy; +use chainlink::ocr2::aggregator_proxy::AggregatorProxy::{ + AggregatorProxyImpl, AggregatorProxyInternal, UpgradeableImpl +}; +use chainlink::libraries::access_control::AccessControlComponent::AccessControlImpl; +use chainlink::ocr2::aggregator::Round; +use chainlink::utils::split_felt; +use chainlink::tests::test_ownable::should_implement_ownable; +use chainlink::tests::test_access_controller::should_implement_access_control; + +fn STATE() -> AggregatorProxy::ContractState { + AggregatorProxy::contract_state_for_testing() +} + +fn setup() -> ( + ContractAddress, + ContractAddress, + IMockAggregatorDispatcher, + ContractAddress, + IMockAggregatorDispatcher +) { + // Set account as default caller + let account: ContractAddress = contract_address_const::<1>(); + set_caller_address(account); + + // Deploy mock aggregator 1 + let mut calldata = ArrayTrait::new(); + calldata.append(8); // decimals = 8 + let (mockAggregatorAddr1, _) = deploy_syscall( + MockAggregator::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + let mockAggregator1 = IMockAggregatorDispatcher { contract_address: mockAggregatorAddr1 }; + + // Deploy mock aggregator 2 + // note: deployment address is deterministic based on deploy_syscall parameters + // so we need to change the decimals parameter to avoid an address conflict with mock aggregator 1 + let mut calldata2 = ArrayTrait::new(); + calldata2.append(10); // decimals = 10 + let (mockAggregatorAddr2, _) = deploy_syscall( + MockAggregator::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata2.span(), false + ) + .unwrap(); + let mockAggregator2 = IMockAggregatorDispatcher { contract_address: mockAggregatorAddr2 }; + + // Return account, mock aggregator address and mock aggregator contract + (account, mockAggregatorAddr1, mockAggregator1, mockAggregatorAddr2, mockAggregator2) +} + +#[test] +fn test_ownable() { + let (account, mockAggregatorAddr, _, _, _) = setup(); + // Deploy aggregator proxy + let calldata = array![account.into(), // owner = account + mockAggregatorAddr.into(),]; + let (aggregatorProxyAddr, _) = deploy_syscall( + AggregatorProxy::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + + should_implement_ownable(aggregatorProxyAddr, account); +} + +#[test] +fn test_access_control() { + let (account, mockAggregatorAddr, _, _, _) = setup(); + // Deploy aggregator proxy + let calldata = array![account.into(), // owner = account + mockAggregatorAddr.into(),]; + let (aggregatorProxyAddr, _) = deploy_syscall( + AggregatorProxy::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + + should_implement_access_control(aggregatorProxyAddr, account); +} + +#[test] +#[should_panic(expected: ('Caller is not the owner',))] +fn test_upgrade_non_owner() { + let (_, _, _, _, _) = setup(); + let mut state = STATE(); + UpgradeableImpl::upgrade(ref state, class_hash_const::<123>()); +} + +fn test_query_latest_round_data() { + let (owner, mockAggregatorAddr, mockAggregator, _, _) = setup(); + let mut state = STATE(); + // init aggregator proxy with mock aggregator + AggregatorProxy::constructor(ref state, owner, mockAggregatorAddr); + state.add_access(owner); + // insert round into mock aggregator + mockAggregator.set_latest_round_data(10, 1, 9, 8); + // query latest round + let round = AggregatorProxyImpl::latest_round_data(@state); + let (phase_id, round_id) = split_felt(round.round_id); + assert(phase_id == 1, 'phase_id should be 1'); + assert(round_id == 1, 'round_id should be 1'); + assert(round.answer == 10, 'answer should be 10'); + assert(round.block_num == 1, 'block_num should be 1'); + assert(round.started_at == 9, 'started_at should be 9'); + assert(round.updated_at == 8, 'updated_at should be 8'); + + // latest_answer matches up with latest_round_data + let latest_answer = AggregatorProxyImpl::latest_answer(@state); + assert(latest_answer == 10, '(latest) answer should be 10'); +} + +#[test] +#[should_panic(expected: ('user does not have read access',))] +fn test_query_latest_round_data_without_access() { + let (owner, mockAggregatorAddr, mockAggregator, _, _) = setup(); + let mut state = STATE(); + // init aggregator proxy with mock aggregator + AggregatorProxy::constructor(ref state, owner, mockAggregatorAddr); + state.add_access(owner); + // insert round into mock aggregator + mockAggregator.set_latest_round_data(10, 1, 9, 8); + // set caller to non-owner address with no read access + set_caller_address(contract_address_const::<2>()); + // query latest round + AggregatorProxyImpl::latest_round_data(@state); +} + +#[test] +#[should_panic(expected: ('user does not have read access',))] +fn test_query_latest_answer_without_access() { + let (owner, mockAggregatorAddr, mockAggregator, _, _) = setup(); + let mut state = STATE(); + // init aggregator proxy with mock aggregator + AggregatorProxy::constructor(ref state, owner, mockAggregatorAddr); + state.add_access(owner); + // insert round into mock aggregator + mockAggregator.set_latest_round_data(10, 1, 9, 8); + // set caller to non-owner address with no read access + set_caller_address(contract_address_const::<2>()); + // query latest round + AggregatorProxyImpl::latest_answer(@state); +} + +#[test] +fn test_propose_new_aggregator() { + let (owner, mockAggregatorAddr1, mockAggregator1, mockAggregatorAddr2, mockAggregator2) = + setup(); + let mut state = STATE(); + // init aggregator proxy with mock aggregator 1 + AggregatorProxy::constructor(ref state, owner, mockAggregatorAddr1); + state.add_access(owner); + // insert rounds into mock aggregators + mockAggregator1.set_latest_round_data(10, 1, 9, 8); + mockAggregator2.set_latest_round_data(12, 2, 10, 11); + + // propose new mock aggregator to AggregatorProxy + AggregatorProxyInternal::propose_aggregator(ref state, mockAggregatorAddr2); + + // latest_round_data should return old aggregator round data + let round = AggregatorProxyImpl::latest_round_data(@state); + assert(round.answer == 10, 'answer should be 10'); + + // mockAggregator2.set_latest_round_data(12, 2, 10, 11); + + // proposed_round_data should return new aggregator round data + let proposed_round = AggregatorProxyInternal::proposed_latest_round_data(@state); + assert(proposed_round.answer == 12, 'answer should be 12'); + + // aggregator should still be set to the old aggregator + let aggregator = AggregatorProxyInternal::aggregator(@state); + assert(aggregator == mockAggregatorAddr1, 'aggregator should be old addr'); +} + +#[test] +fn test_confirm_new_aggregator() { + let (owner, mockAggregatorAddr1, mockAggregator1, mockAggregatorAddr2, mockAggregator2) = + setup(); + let mut state = STATE(); + // init aggregator proxy with mock aggregator 1 + AggregatorProxy::constructor(ref state, owner, mockAggregatorAddr1); + state.add_access(owner); + // insert rounds into mock aggregators + mockAggregator1.set_latest_round_data(10, 1, 9, 8); + mockAggregator2.set_latest_round_data(12, 2, 10, 11); + + // propose new mock aggregator to AggregatorProxy + AggregatorProxyInternal::propose_aggregator(ref state, mockAggregatorAddr2); + + // confirm new mock aggregator + AggregatorProxyInternal::confirm_aggregator(ref state, mockAggregatorAddr2); + + // aggregator should be set to the new aggregator + let aggregator = AggregatorProxyInternal::aggregator(@state); + assert(aggregator == mockAggregatorAddr2, 'aggregator should be new addr'); + + // phase ID should be 2 + let phase_id = AggregatorProxyInternal::phase_id(@state); + assert(phase_id == 2, 'phase_id should be 2'); + + // latest_round_data should return new aggregator round data + let round = AggregatorProxyImpl::latest_round_data(@state); + assert(round.answer == 12, 'answer should be 12'); +} diff --git a/contracts/src/tests/test_erc677.cairo b/contracts/src/tests/test_erc677.cairo new file mode 100644 index 000000000..99b9c8fbf --- /dev/null +++ b/contracts/src/tests/test_erc677.cairo @@ -0,0 +1,112 @@ +use starknet::ContractAddress; +use starknet::contract_address_const; +use starknet::testing::set_caller_address; +use starknet::syscalls::deploy_syscall; +use starknet::class_hash::Felt252TryIntoClassHash; + +use array::ArrayTrait; +use traits::Into; +use traits::TryInto; +use zeroable::Zeroable; +use option::OptionTrait; +use core::result::ResultTrait; + +use chainlink::token::mock::valid_erc667_receiver::ValidReceiver; +use chainlink::token::mock::invalid_erc667_receiver::InvalidReceiver; +use chainlink::libraries::token::erc677::ERC677Component; +use chainlink::libraries::token::erc677::ERC677Component::ERC677Impl; + +#[starknet::interface] +trait MockInvalidReceiver { + fn set_supports(ref self: TContractState, value: bool); +} + +use chainlink::token::mock::valid_erc667_receiver::{ + MockValidReceiver, MockValidReceiverDispatcher, MockValidReceiverDispatcherTrait +}; + +// Ignored tests are dependent on upgrading our version of cairo to include this PR https://github.com/starkware-libs/cairo/pull/2912/files + +fn setup() -> ContractAddress { + let account: ContractAddress = contract_address_const::<1>(); + // Set account as default caller + set_caller_address(account); + account +} + +fn setup_valid_receiver() -> (ContractAddress, MockValidReceiverDispatcher) { + let calldata = ArrayTrait::new(); + let (address, _) = deploy_syscall( + ValidReceiver::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + let contract = MockValidReceiverDispatcher { contract_address: address }; + (address, contract) +} + + +fn setup_invalid_receiver() -> (ContractAddress, MockInvalidReceiverDispatcher) { + let calldata = ArrayTrait::new(); + let (address, _) = deploy_syscall( + InvalidReceiver::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + let contract = MockInvalidReceiverDispatcher { contract_address: address }; + (address, contract) +} + +type ComponentState = + ERC677Component::ComponentState; + +fn transfer_and_call(receiver: ContractAddress) { + let data = ArrayTrait::::new(); + // have to send 0 because ERC20 is not initialized with starting supply when using this library by itself + let mut state: ComponentState = ERC677Component::component_state_for_testing(); + state.transfer_and_call(receiver, u256 { high: 0, low: 0 }, data); +} + +#[test] +#[should_panic(expected: ('ERC20: transfer to 0',))] +fn test_to_zero_address() { + setup(); + transfer_and_call(Zeroable::zero()); +} + +#[test] +fn test_valid_transfer_and_call() { + let sender = setup(); + let (receiver_address, receiver) = setup_valid_receiver(); + + transfer_and_call(receiver_address); + + assert(receiver.verify() == sender, 'on_token_transfer called'); +} + +#[test] +#[should_panic(expected: ('ENTRYPOINT_NOT_FOUND',))] +fn test_invalid_receiver_supports_interface_true() { + setup(); + let (receiver_address, receiver) = setup_invalid_receiver(); + + receiver.set_supports(true); + + transfer_and_call(receiver_address); +} + +#[test] +fn test_invalid_receiver_supports_interface_false() { + setup(); + let (receiver_address, _) = setup_invalid_receiver(); + + transfer_and_call(receiver_address); +} + + +#[test] +#[should_panic(expected: ('CONTRACT_NOT_DEPLOYED',))] +fn test_nonexistent_receiver() { + setup(); + + transfer_and_call(contract_address_const::<777>()); +} + diff --git a/contracts/src/tests/test_link_token.cairo b/contracts/src/tests/test_link_token.cairo new file mode 100644 index 000000000..0c0fde3ed --- /dev/null +++ b/contracts/src/tests/test_link_token.cairo @@ -0,0 +1,150 @@ +use starknet::ContractAddress; +use starknet::testing::set_caller_address; +use starknet::contract_address_const; +use starknet::class_hash::class_hash_const; +use starknet::class_hash::Felt252TryIntoClassHash; +use starknet::syscalls::deploy_syscall; + +use array::ArrayTrait; +use traits::Into; +use traits::TryInto; +use zeroable::Zeroable; +use option::OptionTrait; +use core::result::ResultTrait; + +use chainlink::token::link_token::LinkToken; +use chainlink::token::link_token::LinkToken::{MintableToken, UpgradeableImpl}; +use openzeppelin::token::erc20::ERC20Component::{ERC20Impl, ERC20MetadataImpl}; +use chainlink::tests::test_ownable::should_implement_ownable; + +// only tests link token specific functionality +// erc20 and erc677 functionality is already tested elsewhere + +fn STATE() -> LinkToken::ContractState { + LinkToken::contract_state_for_testing() +} + +fn setup() -> ContractAddress { + let account: ContractAddress = contract_address_const::<1>(); + // Set account as default caller + set_caller_address(account); + account +} + +#[test] +fn test_ownable() { + let account = setup(); + // Deploy LINK token + let mut calldata = ArrayTrait::new(); + calldata.append(class_hash_const::<123>().into()); // minter + calldata.append(account.into()); // owner + let (linkAddr, _) = deploy_syscall( + LinkToken::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + + should_implement_ownable(linkAddr, account); +} + +#[test] +#[should_panic(expected: ('minter is 0',))] +fn test_constructor_zero_address() { + let sender = setup(); + let mut state = STATE(); + + LinkToken::constructor(ref state, Zeroable::zero(), sender); +} + +#[test] +fn test_constructor() { + let sender = setup(); + let mut state = STATE(); + LinkToken::constructor(ref state, sender, sender); + + assert(LinkToken::minter(@state) == sender, 'minter valid'); + assert(state.erc20.name() == "ChainLink Token", 'name valid'); + assert(state.erc20.symbol() == "LINK", 'symbol valid'); +} + +#[test] +fn test_permissioned_mint_from_minter() { + let sender = setup(); + let mut state = STATE(); + LinkToken::constructor(ref state, sender, sender); + let to = contract_address_const::<908>(); + + let zero: felt252 = 0; + assert(ERC20Impl::balance_of(@state, sender) == zero.into(), 'zero balance'); + assert(ERC20Impl::balance_of(@state, to) == zero.into(), 'zero balance'); + + let amount: felt252 = 3000; + MintableToken::permissioned_mint(ref state, to, amount.into()); + + assert(ERC20Impl::balance_of(@state, sender) == zero.into(), 'zero balance'); + assert(ERC20Impl::balance_of(@state, to) == amount.into(), 'expect balance'); +} + +#[test] +#[should_panic(expected: ('only minter',))] +fn test_permissioned_mint_from_nonminter() { + let sender = setup(); + let mut state = STATE(); + let minter = contract_address_const::<111>(); + LinkToken::constructor(ref state, minter, sender); + let to = contract_address_const::<908>(); + + let amount: felt252 = 3000; + MintableToken::permissioned_mint(ref state, to, amount.into()); +} + +#[test] +#[should_panic(expected: ('u256_sub Overflow',))] +fn test_permissioned_burn_from_minter() { + let zero = 0; + let sender = setup(); + let mut state = STATE(); + LinkToken::constructor(ref state, sender, sender); + let to = contract_address_const::<908>(); + + let amount: felt252 = 3000; + MintableToken::permissioned_mint(ref state, to, amount.into()); + assert(ERC20Impl::balance_of(@state, to) == amount.into(), 'expect balance'); + + // burn some + let burn_amount: felt252 = 2000; + let remaining_amount: felt252 = amount - burn_amount; + MintableToken::permissioned_burn(ref state, to, burn_amount.into()); + assert(ERC20Impl::balance_of(@state, to) == remaining_amount.into(), 'remaining balance'); + + // burn remaining + MintableToken::permissioned_burn(ref state, to, remaining_amount.into()); + assert(ERC20Impl::balance_of(@state, to) == zero.into(), 'no balance'); + + // burn too much + MintableToken::permissioned_burn(ref state, to, amount.into()); +} + + +#[test] +#[should_panic(expected: ('only minter',))] +fn test_permissioned_burn_from_nonminter() { + let sender = setup(); + let mut state = STATE(); + let minter = contract_address_const::<111>(); + LinkToken::constructor(ref state, minter, sender); + let to = contract_address_const::<908>(); + + let amount: felt252 = 3000; + MintableToken::permissioned_burn(ref state, to, amount.into()); +} + +#[test] +#[should_panic(expected: ('Caller is not the owner',))] +fn test_upgrade_non_owner() { + let sender = setup(); + let mut state = STATE(); + LinkToken::constructor(ref state, sender, contract_address_const::<111>()); + + UpgradeableImpl::upgrade(ref state, class_hash_const::<123>()); +} + diff --git a/contracts/src/tests/test_mock_aggregator.cairo b/contracts/src/tests/test_mock_aggregator.cairo new file mode 100644 index 000000000..e95b7b87e --- /dev/null +++ b/contracts/src/tests/test_mock_aggregator.cairo @@ -0,0 +1,65 @@ +use starknet::ContractAddress; +use starknet::testing::set_caller_address; +use chainlink::ocr2::mocks::mock_aggregator::MockAggregator; +use starknet::contract_address_const; +use chainlink::ocr2::aggregator::Round; + +fn STATE() -> MockAggregator::ContractState { + MockAggregator::contract_state_for_testing() +} + +fn setup() -> ContractAddress { + let account: ContractAddress = contract_address_const::<777>(); + // Set account as default caller + set_caller_address(account); + account +} + +#[test] +fn test_deploy() { + setup(); + + let mut state = STATE(); + + MockAggregator::constructor(ref state, 18_u8); + + assert(MockAggregator::Aggregator::decimals(@state) == 18_u8, 'decimals'); + + let latest_round = MockAggregator::Aggregator::latest_round_data(@state); + + let _ = Round { + round_id: 0, answer: 0_u128, block_num: 0_u64, started_at: 0_u64, updated_at: 0_u64 + }; + + assert( + latest_round == Round { + round_id: 0, answer: 0_u128, block_num: 0_u64, started_at: 0_u64, updated_at: 0_u64 + }, + 'rounds' + ); +} + +#[test] +fn test_set_latest_round() { + setup(); + + let mut state = STATE(); + + MockAggregator::constructor(ref state, 18_u8); + + MockAggregator::MockImpl::set_latest_round_data(ref state, 777_u128, 777_u64, 777_u64, 777_u64); + + let expected_round = Round { + round_id: 1, answer: 777_u128, block_num: 777_u64, started_at: 777_u64, updated_at: 777_u64 + }; + + assert( + MockAggregator::Aggregator::latest_round_data(@state) == expected_round, 'round not equal' + ); + + assert( + MockAggregator::Aggregator::latest_answer(@state) == expected_round.answer, + 'latest answer not equal' + ); +} + diff --git a/contracts/src/tests/test_multisig.cairo b/contracts/src/tests/test_multisig.cairo new file mode 100644 index 000000000..becfe4d7d --- /dev/null +++ b/contracts/src/tests/test_multisig.cairo @@ -0,0 +1,691 @@ +use chainlink::multisig::IMultisigDispatcherTrait; +use core::traits::Into; +use starknet::class_hash_const; +use starknet::contract_address_const; +use starknet::syscalls::deploy_syscall; +use starknet::testing::set_caller_address; +use starknet::testing::set_contract_address; +use starknet::Felt252TryIntoClassHash; + +use array::ArrayTrait; +use option::OptionTrait; +use result::ResultTrait; +use traits::TryInto; + +use chainlink::multisig::assert_unique_values; +use chainlink::multisig::Multisig; +use chainlink::multisig::Multisig::{MultisigImpl, UpgradeableImpl}; +use chainlink::multisig::{IMultisigDispatcher}; + +#[starknet::contract] +mod MultisigTest { + use array::ArrayTrait; + + #[storage] + struct Storage {} + + #[abi(per_item)] + #[generate_trait] + impl HelperImpl of HelperTrait { + #[external(v0)] + fn increment(ref self: ContractState, val1: felt252, val2: felt252) -> Array { + array![val1 + 1, val2 + 1] + } + } +} + + +fn STATE() -> Multisig::ContractState { + Multisig::contract_state_for_testing() +} + +fn sample_calldata() -> Array:: { + array![1, 2, 32] +} + +#[test] +fn test_assert_unique_values_empty() { + let a = ArrayTrait::::new(); + assert_unique_values(@a); +} + +#[test] +fn test_assert_unique_values_no_duplicates() { + let a = array![1, 2, 3]; + assert_unique_values(@a); +} + +#[test] +#[should_panic] +fn test_assert_unique_values_with_duplicate() { + let a = array![1, 2, 3, 3]; + assert_unique_values(@a); +} + +#[test] +fn test_is_signer_true() { + let mut state = STATE(); + let signer = contract_address_const::<1>(); + let mut signers = ArrayTrait::new(); + signers.append(signer); + Multisig::constructor(ref state, :signers, threshold: 1); + assert(MultisigImpl::is_signer(@state, signer), 'should be signer'); +} + +#[test] +fn test_is_signer_false() { + let mut state = STATE(); + let not_signer = contract_address_const::<2>(); + let mut signers = ArrayTrait::new(); + signers.append(contract_address_const::<1>()); + Multisig::constructor(ref state, :signers, threshold: 1); + assert(!MultisigImpl::is_signer(@state, not_signer), 'should be signer'); +} + +#[test] +fn test_signer_len() { + let mut state = STATE(); + let mut signers = ArrayTrait::new(); + signers.append(contract_address_const::<1>()); + signers.append(contract_address_const::<2>()); + Multisig::constructor(ref state, :signers, threshold: 1); + assert(MultisigImpl::get_signers_len(@state) == 2, 'should equal 2 signers'); +} + +#[test] +fn test_get_signers() { + let mut state = STATE(); + let signer1 = contract_address_const::<1>(); + let signer2 = contract_address_const::<2>(); + let signers = array![signer1, signer2]; + + Multisig::constructor(ref state, :signers, threshold: 1); + let returned_signers = MultisigImpl::get_signers(@state); + assert(returned_signers.len() == 2, 'should match signers length'); + assert(*returned_signers.at(0) == signer1, 'should match signer 1'); + assert(*returned_signers.at(1) == signer2, 'should match signer 2'); +} + +#[test] +fn test_get_threshold() { + let mut state = STATE(); + let mut signers = ArrayTrait::new(); + signers.append(contract_address_const::<1>()); + signers.append(contract_address_const::<2>()); + Multisig::constructor(ref state, :signers, threshold: 1); + assert(MultisigImpl::get_threshold(@state) == 1, 'should equal threshold of 1'); +} + +#[test] +fn test_submit_transaction() { + let mut state = STATE(); + let signer = contract_address_const::<1>(); + let signers = array![signer]; + Multisig::constructor(ref state, :signers, threshold: 1); + + set_caller_address(signer); + let to = contract_address_const::<42>(); + let function_selector = 10; + MultisigImpl::submit_transaction( + ref state, :to, :function_selector, calldata: sample_calldata() + ); + + let (transaction, _) = MultisigImpl::get_transaction(@state, 0); + assert(transaction.to == to, 'should match target address'); + assert(transaction.function_selector == function_selector, 'should match function selector'); + assert(transaction.calldata_len == sample_calldata().len(), 'should match calldata length'); + assert(!transaction.executed, 'should not be executed'); + assert(transaction.confirmations == 0, 'should not have confirmations'); +// TODO: compare calldata when loops are supported +} + +#[test] +#[should_panic] +fn test_submit_transaction_not_signer() { + let mut state = STATE(); + let signer = contract_address_const::<1>(); + let signers = array![signer]; + Multisig::constructor(ref state, :signers, threshold: 1); + + set_caller_address(contract_address_const::<3>()); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); +} + +#[test] +fn test_confirm_transaction() { + let mut state = STATE(); + let signer1 = contract_address_const::<1>(); + let signer2 = contract_address_const::<2>(); + let signers = array![signer1, signer2]; + Multisig::constructor(ref state, :signers, threshold: 2); + + set_caller_address(signer1); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + + assert(MultisigImpl::is_confirmed(@state, nonce: 0, signer: signer1), 'should be confirmed'); + assert( + !MultisigImpl::is_confirmed(@state, nonce: 0, signer: signer2), 'should not be confirmed' + ); + let (transaction, _) = MultisigImpl::get_transaction(@state, 0); + assert(transaction.confirmations == 1, 'should have confirmation'); +} + +#[test] +#[should_panic] +fn test_confirm_transaction_not_signer() { + let mut state = STATE(); + let signer = contract_address_const::<1>(); + let not_signer = contract_address_const::<2>(); + let signers = array![signer]; + Multisig::constructor(ref state, :signers, threshold: 1); + set_caller_address(signer); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); + + set_caller_address(not_signer); + MultisigImpl::confirm_transaction(ref state, nonce: 0); +} + +#[test] +fn test_revoke_confirmation() { + let mut state = STATE(); + let signer1 = contract_address_const::<1>(); + let signer2 = contract_address_const::<2>(); + let signers = array![signer1, signer2]; + Multisig::constructor(ref state, :signers, threshold: 2); + set_caller_address(signer1); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + + MultisigImpl::revoke_confirmation(ref state, nonce: 0); + + assert( + !MultisigImpl::is_confirmed(@state, nonce: 0, signer: signer1), 'should not be confirmed' + ); + assert( + !MultisigImpl::is_confirmed(@state, nonce: 0, signer: signer2), 'should not be confirmed' + ); + let (transaction, _) = MultisigImpl::get_transaction(@state, 0); + assert(transaction.confirmations == 0, 'should not have confirmation'); +} + +#[test] +#[should_panic] +fn test_revoke_confirmation_not_signer() { + let mut state = STATE(); + let signer = contract_address_const::<1>(); + let not_signer = contract_address_const::<2>(); + let mut signers = array![signer]; + Multisig::constructor(ref state, :signers, threshold: 2); + set_caller_address(signer); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + + set_caller_address(not_signer); + MultisigImpl::revoke_confirmation(ref state, nonce: 0); +} + +#[test] +#[should_panic] +fn test_execute_confirmation_below_threshold() { + let mut state = STATE(); + let signer1 = contract_address_const::<1>(); + let signer2 = contract_address_const::<2>(); + let signers = array![signer1, signer2]; + Multisig::constructor(ref state, :signers, threshold: 2); + set_caller_address(signer1); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + MultisigImpl::execute_transaction(ref state, nonce: 0); +} + +#[test] +#[should_panic(expected: ('only multisig allowed',))] +fn test_upgrade_not_multisig() { + let mut state = STATE(); + let account = contract_address_const::<777>(); + set_caller_address(account); + + UpgradeableImpl::upgrade(ref state, class_hash_const::<1>()) +} + +#[test] +fn test_execute() { + let mut state = STATE(); + let signer1 = contract_address_const::<1>(); + let signer2 = contract_address_const::<2>(); + let signers = array![signer1, signer2]; + Multisig::constructor(ref state, :signers, threshold: 2); + let (test_address, _) = deploy_syscall( + MultisigTest::TEST_CLASS_HASH.try_into().unwrap(), 0, ArrayTrait::new().span(), false + ) + .unwrap(); + set_caller_address(signer1); + let increment_calldata = array![42, 100]; + MultisigImpl::submit_transaction( + ref state, + to: test_address, + // increment() + function_selector: 0x7a44dde9fea32737a5cf3f9683b3235138654aa2d189f6fe44af37a61dc60d, + calldata: increment_calldata, + ); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + set_caller_address(signer2); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + + let response = MultisigImpl::execute_transaction(ref state, nonce: 0); + assert(response.len() == 3, 'expected response length 3'); + assert(*response.at(0) == 2, 'expected array length 2'); + assert(*response.at(1) == 43, 'expected array value 43'); + assert(*response.at(2) == 101, 'expected array value 101'); +} + +#[test] +#[should_panic(expected: ('invalid signer',))] +fn test_execute_not_signer() { + let mut state = STATE(); + let signer1 = contract_address_const::<1>(); + let signer2 = contract_address_const::<2>(); + let signers = array![signer1, signer2]; + Multisig::constructor(ref state, :signers, threshold: 2); + set_caller_address(signer1); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + set_caller_address(signer2); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + + set_caller_address(contract_address_const::<3>()); + MultisigImpl::execute_transaction(ref state, nonce: 0); +} + +#[test] +#[should_panic(expected: ('transaction invalid',))] +fn test_execute_after_set_signers() { + let mut state = STATE(); + let contract_address = contract_address_const::<100>(); + set_contract_address(contract_address); + let signer1 = contract_address_const::<1>(); + let signer2 = contract_address_const::<2>(); + let signer3 = contract_address_const::<3>(); + let signers = array![signer1, signer2]; + Multisig::constructor(ref state, :signers, threshold: 2); + set_caller_address(signer1); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + set_caller_address(signer2); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + set_caller_address(contract_address); + let new_signers = array![signer2, signer3]; + MultisigImpl::set_signers(ref state, new_signers); + + set_caller_address(signer2); + MultisigImpl::execute_transaction(ref state, nonce: 0); +} + +#[test] +#[should_panic(expected: ('transaction invalid',))] +fn test_execute_after_set_signers_and_threshold() { + let mut state = STATE(); + let contract_address = contract_address_const::<100>(); + set_contract_address(contract_address); + let signer1 = contract_address_const::<1>(); + let signer2 = contract_address_const::<2>(); + let signer3 = contract_address_const::<3>(); + let signers = array![signer1, signer2]; + Multisig::constructor(ref state, :signers, threshold: 2); + set_caller_address(signer1); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + set_caller_address(signer2); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + set_caller_address(contract_address); + let new_signers = array![signer2, signer3]; + MultisigImpl::set_signers_and_threshold(ref state, new_signers, 1); + + set_caller_address(signer2); + MultisigImpl::execute_transaction(ref state, nonce: 0); +} + +#[test] +#[should_panic(expected: ('transaction invalid',))] +fn test_execute_after_set_threshold() { + let mut state = STATE(); + let contract_address = contract_address_const::<100>(); + set_contract_address(contract_address); + let signer1 = contract_address_const::<1>(); + let signer2 = contract_address_const::<2>(); + let signers = array![signer1, signer2]; + Multisig::constructor(ref state, :signers, threshold: 2); + set_caller_address(signer1); + MultisigImpl::submit_transaction( + ref state, + to: contract_address_const::<42>(), + function_selector: 10, + calldata: sample_calldata(), + ); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + set_caller_address(signer2); + MultisigImpl::confirm_transaction(ref state, nonce: 0); + set_caller_address(contract_address); + MultisigImpl::set_threshold(ref state, 1); + + set_caller_address(signer1); + MultisigImpl::execute_transaction(ref state, nonce: 0); +} + +// test set_threshold (non-recursive) +#[test] +fn test_set_threshold() { + let s1 = contract_address_const::<1>(); + let s2 = contract_address_const::<2>(); + let s3 = contract_address_const::<3>(); + let signers = array![s1, s2, s3]; + let init_threshold: usize = 3; + let new_threshold: usize = 2; + + let mut deploy_calldata = ArrayTrait::new(); + Serde::serialize(@signers, ref deploy_calldata); + Serde::serialize(@init_threshold, ref deploy_calldata); + let (multisig_address, _) = deploy_syscall( + Multisig::TEST_CLASS_HASH.try_into().unwrap(), 0, deploy_calldata.span(), false + ) + .unwrap(); + + let multisig = IMultisigDispatcher { contract_address: multisig_address }; + assert(multisig.get_threshold() == init_threshold, 'invalid init threshold'); + set_contract_address(multisig_address); + multisig.set_threshold(new_threshold); + assert(multisig.get_threshold() == new_threshold, 'threshold was not updated'); +} + +// test set_threshold with recursive call +#[test] +fn test_recursive_set_threshold() { + // Defines helper variables + let s1 = contract_address_const::<1>(); + let s2 = contract_address_const::<2>(); + let signers = array![s1, s2]; + let init_threshold: usize = 2; + let new_threshold: usize = 1; + + // Deploys the contract + let mut deploy_calldata = ArrayTrait::new(); + Serde::serialize(@signers, ref deploy_calldata); + Serde::serialize(@init_threshold, ref deploy_calldata); + let (multisig_address, _) = deploy_syscall( + Multisig::TEST_CLASS_HASH.try_into().unwrap(), 0, deploy_calldata.span(), false + ) + .unwrap(); + + // Gets a dispatcher (so we can call methods on the deployed contract) + let multisig = IMultisigDispatcher { contract_address: multisig_address }; + + // Checks that the threshold was correctly initialized on deployment + assert(multisig.get_threshold() == init_threshold, 'invalid init threshold'); + // Recursive call occurs here - this code proposes a transaction to the + // multisig contract that calls the set_threshold function on the multisig + // contract. + let mut set_threshold_calldata = ArrayTrait::new(); + Serde::serialize(@new_threshold, ref set_threshold_calldata); + set_contract_address(s1); + multisig + .submit_transaction(multisig_address, selector!("set_threshold"), set_threshold_calldata); + // Signer 1 confirms the transaction + set_contract_address(s1); + multisig.confirm_transaction(0); + + // Signer 2 confirms the transaction + set_contract_address(s2); + multisig.confirm_transaction(0); + + // Once we have enough confirmations, we execute the transaction + set_contract_address(s1); + multisig.execute_transaction(0); + + // Now we check that the threshold was actually updated + assert(multisig.get_threshold() == new_threshold, 'threshold was not updated'); +} + +// test set_signers (non-recursive) +#[test] +fn test_set_signers() { + let s1 = contract_address_const::<1>(); + let s2 = contract_address_const::<2>(); + let init_signers = array![s1, s2]; + let new_signers = array![s1]; + let threshold: usize = 2; + + let mut deploy_calldata = ArrayTrait::new(); + Serde::serialize(@init_signers, ref deploy_calldata); + Serde::serialize(@threshold, ref deploy_calldata); + let (multisig_address, _) = deploy_syscall( + Multisig::TEST_CLASS_HASH.try_into().unwrap(), 0, deploy_calldata.span(), false + ) + .unwrap(); + + let multisig = IMultisigDispatcher { contract_address: multisig_address }; + + let returned_signers = multisig.get_signers(); + assert(returned_signers.len() == 2, 'should match signers length'); + assert(*returned_signers.at(0) == s1, 'should match signer 1'); + assert(*returned_signers.at(1) == s2, 'should match signer 2'); + assert(multisig.get_threshold() == 2, 'wrong init threshold'); + + set_contract_address(multisig_address); + multisig.set_signers(new_signers); + + let updated_signers = multisig.get_signers(); + assert(updated_signers.len() == 1, 'should match signers length'); + assert(*updated_signers.at(0) == s1, 'should match signer 1'); + assert(multisig.get_threshold() == 1, 'threshold not updated'); +} + +// test set_signers with recursive call +#[test] +fn test_recursive_set_signers() { + // Defines helper variables + let s1 = contract_address_const::<1>(); + let s2 = contract_address_const::<2>(); + let init_signers = array![s1, s2]; + let new_signers = array![s1]; + let init_threshold: usize = 2; + + // Deploys the contract + let mut deploy_calldata = ArrayTrait::new(); + Serde::serialize(@init_signers, ref deploy_calldata); + Serde::serialize(@init_threshold, ref deploy_calldata); + let (multisig_address, _) = deploy_syscall( + Multisig::TEST_CLASS_HASH.try_into().unwrap(), 0, deploy_calldata.span(), false + ) + .unwrap(); + + // Gets a dispatcher (so we can call methods on the deployed contract) + let multisig = IMultisigDispatcher { contract_address: multisig_address }; + + // Checks that the signers were correctly initialized on deployment + let returned_signers = multisig.get_signers(); + assert(returned_signers.len() == 2, 'should match signers length'); + assert(*returned_signers.at(0) == s1, 'should match signer 1'); + assert(*returned_signers.at(1) == s2, 'should match signer 2'); + assert(multisig.get_threshold() == 2, 'wrong init threshold'); + + // Recursive call occurs here - this code proposes a transaction to the + // multisig contract that calls the set_signers function on the multisig + // contract. + let mut set_signers_calldata = ArrayTrait::new(); + Serde::serialize(@new_signers, ref set_signers_calldata); + set_contract_address(s1); + multisig.submit_transaction(multisig_address, selector!("set_signers"), set_signers_calldata); + + // Signer 1 confirms the transaction + set_contract_address(s1); + multisig.confirm_transaction(0); + + // Signer 2 confirms the transaction + set_contract_address(s2); + multisig.confirm_transaction(0); + + // Once we have enough confirmations, we execute the transaction + set_contract_address(s1); + multisig.execute_transaction(0); + + // Now we check that the signers were actually updated + let updated_signers = multisig.get_signers(); + assert(updated_signers.len() == 1, 'should match signers length'); + assert(*updated_signers.at(0) == s1, 'should match signer 1'); + assert(multisig.get_threshold() == 1, 'wrong threshold'); +} + +// test set_signers_and_threshold (non-recursive) +#[test] +fn test_set_signers_and_threshold() { + let s1 = contract_address_const::<1>(); + let s2 = contract_address_const::<2>(); + let s3 = contract_address_const::<3>(); + let init_signers = array![s1, s2, s3]; + let new_signers = array![s1, s2]; + let init_threshold: usize = 3; + let new_threshold: usize = 1; + + let mut deploy_calldata = ArrayTrait::new(); + Serde::serialize(@init_signers, ref deploy_calldata); + Serde::serialize(@init_threshold, ref deploy_calldata); + let (multisig_address, _) = deploy_syscall( + Multisig::TEST_CLASS_HASH.try_into().unwrap(), 0, deploy_calldata.span(), false + ) + .unwrap(); + + let multisig = IMultisigDispatcher { contract_address: multisig_address }; + + let returned_signers = multisig.get_signers(); + assert(returned_signers.len() == 3, 'should match signers length'); + assert(*returned_signers.at(0) == s1, 'should match signer 1'); + assert(*returned_signers.at(1) == s2, 'should match signer 2'); + assert(*returned_signers.at(2) == s3, 'should match signer 3'); + assert(multisig.get_threshold() == init_threshold, 'wrong init threshold'); + + set_contract_address(multisig_address); + multisig.set_signers_and_threshold(new_signers, new_threshold); + + let updated_signers = multisig.get_signers(); + assert(updated_signers.len() == 2, 'should match signers length'); + assert(*updated_signers.at(0) == s1, 'should match signer 1'); + assert(*updated_signers.at(1) == s2, 'should match signer 2'); + assert(multisig.get_threshold() == new_threshold, 'threshold not updated'); +} + +// test set_signers_and_threshold with recursive call +#[test] +fn test_recursive_set_signers_and_threshold() { + // Defines helper variables + let s1 = contract_address_const::<1>(); + let s2 = contract_address_const::<2>(); + let s3 = contract_address_const::<3>(); + let init_signers = array![s1, s2, s3]; + let new_signers = array![s1, s2]; + let init_threshold: usize = 3; + let new_threshold: usize = 1; + + // Deploys the contract + let mut deploy_calldata = ArrayTrait::new(); + Serde::serialize(@init_signers, ref deploy_calldata); + Serde::serialize(@init_threshold, ref deploy_calldata); + let (multisig_address, _) = deploy_syscall( + Multisig::TEST_CLASS_HASH.try_into().unwrap(), 0, deploy_calldata.span(), false + ) + .unwrap(); + + // Gets a dispatcher (so we can call methods on the deployed contract) + let multisig = IMultisigDispatcher { contract_address: multisig_address }; + + // Checks that the initial state is correct + let returned_signers = multisig.get_signers(); + assert(returned_signers.len() == 3, 'should match signers length'); + assert(*returned_signers.at(0) == s1, 'should match signer 1'); + assert(*returned_signers.at(1) == s2, 'should match signer 2'); + assert(*returned_signers.at(2) == s3, 'should match signer 3'); + assert(multisig.get_threshold() == 3, 'wrong init threshold'); + + // Recursive call occurs here - this code proposes a transaction to the + // multisig contract that calls the set_signers_and_threshold function + // on the multisig contract. + let mut set_signers_and_threshold_calldata = ArrayTrait::new(); + Serde::serialize(@new_signers, ref set_signers_and_threshold_calldata); + Serde::serialize(@new_threshold, ref set_signers_and_threshold_calldata); + set_contract_address(s1); + multisig + .submit_transaction( + multisig_address, + selector!("set_signers_and_threshold"), + set_signers_and_threshold_calldata + ); + + // Signer 1 confirms the transaction + set_contract_address(s1); + multisig.confirm_transaction(0); + + // Signer 2 confirms the transaction + set_contract_address(s2); + multisig.confirm_transaction(0); + + // Signer 3 confirms the transaction + set_contract_address(s3); + multisig.confirm_transaction(0); + + // Once we have enough confirmations, we execute the transaction + set_contract_address(s1); + multisig.execute_transaction(0); + + // Now we check that the signers were actually updated + let updated_signers = multisig.get_signers(); + assert(updated_signers.len() == 2, 'should match signers length'); + assert(*updated_signers.at(0) == s1, 'should match signer 1'); + assert(*updated_signers.at(1) == s2, 'should match signer 2'); + assert(multisig.get_threshold() == 1, 'wrong threshold'); +} + diff --git a/contracts/src/tests/test_ownable.cairo b/contracts/src/tests/test_ownable.cairo new file mode 100644 index 000000000..40e86c1c5 --- /dev/null +++ b/contracts/src/tests/test_ownable.cairo @@ -0,0 +1,38 @@ +use starknet::contract_address_const; +use starknet::ContractAddress; +use starknet::testing::set_caller_address; +use starknet::testing::set_contract_address; +use zeroable::Zeroable; + +use openzeppelin::access::ownable::interface::{ + IOwnableTwoStep, IOwnableTwoStepDispatcher, IOwnableTwoStepDispatcherTrait +}; + +// +// General ownable contract tests +// + +fn should_implement_ownable(contract_addr: ContractAddress, owner: ContractAddress) { + let contract = IOwnableTwoStepDispatcher { contract_address: contract_addr }; + let acc2: ContractAddress = contract_address_const::<2222>(); + + // check owner is set correctly + assert(owner == contract.owner(), 'owner does not match'); + + // transfer ownership - check owner unchanged and proposed owner set correctly + set_contract_address(owner); // required to call contract as owner + contract.transfer_ownership(acc2); + assert(owner == contract.owner(), 'owner should remain unchanged'); + assert(acc2 == contract.pending_owner(), 'acc2 should be proposed owner'); + + // accept ownership - check owner changed and proposed owner set to zero + set_contract_address(acc2); // required to call function as acc2 + contract.accept_ownership(); + assert(contract.owner() == acc2, 'failed to change ownership'); + assert(contract.pending_owner().is_zero(), 'proposed owner should be zero'); + + // renounce ownership + contract.renounce_ownership(); + assert(contract.owner().is_zero(), 'owner not 0 after renounce'); +} + diff --git a/contracts/src/tests/test_sequencer_uptime_feed.cairo b/contracts/src/tests/test_sequencer_uptime_feed.cairo new file mode 100644 index 000000000..51dabbd25 --- /dev/null +++ b/contracts/src/tests/test_sequencer_uptime_feed.cairo @@ -0,0 +1,129 @@ +use starknet::ContractAddress; +use starknet::EthAddress; +use starknet::contract_address_const; +use starknet::class_hash::class_hash_const; +use starknet::class_hash::Felt252TryIntoClassHash; +use starknet::syscalls::deploy_syscall; +use starknet::testing::set_caller_address; +use starknet::testing::set_contract_address; + +use array::ArrayTrait; +use traits::Into; +use traits::TryInto; +use option::OptionTrait; +use core::result::ResultTrait; + +use chainlink::emergency::sequencer_uptime_feed::SequencerUptimeFeed; +use chainlink::libraries::access_control::{ + IAccessController, IAccessControllerDispatcher, IAccessControllerDispatcherTrait +}; +use chainlink::ocr2::aggregator_proxy::{ + IAggregatorProxy, IAggregatorProxyDispatcher, IAggregatorProxyDispatcherTrait +}; +use chainlink::ocr2::aggregator_proxy::AggregatorProxy; +use chainlink::ocr2::aggregator_proxy::AggregatorProxy::AggregatorProxyImpl; +use chainlink::tests::test_ownable::should_implement_ownable; +use chainlink::tests::test_access_controller::should_implement_access_control; + +use chainlink::emergency::sequencer_uptime_feed::{ + ISequencerUptimeFeed, ISequencerUptimeFeedDispatcher, ISequencerUptimeFeedDispatcherTrait +}; + +fn PROXY() -> AggregatorProxy::ContractState { + AggregatorProxy::contract_state_for_testing() +} + +fn STATE() -> SequencerUptimeFeed::ContractState { + SequencerUptimeFeed::contract_state_for_testing() +} + +fn setup() -> (ContractAddress, ContractAddress, ISequencerUptimeFeedDispatcher) { + let account: ContractAddress = contract_address_const::<777>(); + set_caller_address(account); + + // Deploy seqeuencer uptime feed + let calldata = array![0, // initial status + account.into() // owner + ]; + let (sequencerFeedAddr, _) = deploy_syscall( + SequencerUptimeFeed::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + let sequencerUptimeFeed = ISequencerUptimeFeedDispatcher { + contract_address: sequencerFeedAddr + }; + + (account, sequencerFeedAddr, sequencerUptimeFeed) +} + +#[test] +fn test_ownable() { + let (account, sequencerFeedAddr, _) = setup(); + should_implement_ownable(sequencerFeedAddr, account); +} + +#[test] +fn test_access_control() { + let (account, sequencerFeedAddr, _) = setup(); + should_implement_access_control(sequencerFeedAddr, account); +} + +#[test] +#[should_panic()] +fn test_set_l1_sender_not_owner() { + let (_, _, sequencerUptimeFeed) = setup(); + sequencerUptimeFeed.set_l1_sender(EthAddress { address: 789 }); +} + +#[test] +fn test_set_l1_sender() { + let (owner, _, sequencerUptimeFeed) = setup(); + set_contract_address(owner); + sequencerUptimeFeed.set_l1_sender(EthAddress { address: 789 }); + assert(sequencerUptimeFeed.l1_sender().address == 789, 'l1_sender should be set to 789'); +} + +#[test] +#[should_panic(expected: ('user does not have read access',))] +fn test_latest_round_data_no_access() { + let (owner, sequencerFeedAddr, _) = setup(); + let mut proxy = PROXY(); + AggregatorProxy::constructor(ref proxy, owner, sequencerFeedAddr); + AggregatorProxyImpl::latest_round_data(@proxy); +} + +#[test] +#[should_panic(expected: ('user does not have read access',))] +fn test_latest_answer_no_access() { + let (owner, sequencerFeedAddr, _) = setup(); + let mut proxy = PROXY(); + AggregatorProxy::constructor(ref proxy, owner, sequencerFeedAddr); + AggregatorProxyImpl::latest_answer(@proxy); +} + +#[test] +fn test_aggregator_proxy_response() { + let (owner, sequencerFeedAddr, _) = setup(); + + set_contract_address(owner); + let contract = IAccessControllerDispatcher { contract_address: sequencerFeedAddr }; + contract.add_access(owner); + + let proxy = IAggregatorProxyDispatcher { contract_address: sequencerFeedAddr }; + + // latest round data + let latest_round_data = proxy.latest_round_data(); + assert(latest_round_data.answer == 0, 'latest_round_data should be 0'); + + // latest answer + let latest_answer = proxy.latest_answer(); + assert(latest_answer == 0, 'latest_answer should be 0'); + + // description + let description = proxy.description(); + assert(description == 'L2 Sequencer Uptime Status Feed', 'description does not match'); + + // decimals + let decimals = proxy.decimals(); + assert(decimals == 0, 'decimals should be 0'); +} diff --git a/contracts/src/tests/test_upgradeable.cairo b/contracts/src/tests/test_upgradeable.cairo new file mode 100644 index 000000000..4d4213573 --- /dev/null +++ b/contracts/src/tests/test_upgradeable.cairo @@ -0,0 +1,51 @@ +use traits::Into; + +use starknet::testing::set_caller_address; +use starknet::ContractAddress; +use starknet::contract_address_const; +use starknet::class_hash::class_hash_const; +use starknet::syscalls::deploy_syscall; + +use chainlink::libraries::upgradeable::Upgradeable; +use chainlink::libraries::mocks::mock_upgradeable::{ + MockUpgradeable, IMockUpgradeableDispatcher, IMockUpgradeableDispatcherTrait, + IMockUpgradeableDispatcherImpl +}; +use chainlink::libraries::mocks::mock_non_upgradeable::{ + MockNonUpgradeable, IMockNonUpgradeableDispatcher, IMockNonUpgradeableDispatcherTrait, + IMockNonUpgradeableDispatcherImpl +}; + +fn setup() -> ContractAddress { + let account: ContractAddress = contract_address_const::<777>(); + set_caller_address(account); + account +} + +#[test] +fn test_upgrade_and_call() { + let _ = setup(); + + let calldata = array![]; + let (contractAddr, _) = deploy_syscall( + MockUpgradeable::TEST_CLASS_HASH.try_into().unwrap(), 0, calldata.span(), false + ) + .unwrap(); + let mockUpgradeable = IMockUpgradeableDispatcher { contract_address: contractAddr }; + assert(mockUpgradeable.foo() == true, 'should call foo'); + + mockUpgradeable.upgrade(MockNonUpgradeable::TEST_CLASS_HASH.try_into().unwrap()); + + // now, contract should be different + let mockNonUpgradeable = IMockNonUpgradeableDispatcher { contract_address: contractAddr }; + assert(mockNonUpgradeable.bar() == true, 'should call bar'); +} + + +#[test] +#[should_panic(expected: ('Class hash cannot be zero',))] +fn test_upgrade_zero_hash() { + let _ = setup(); + + Upgradeable::upgrade(class_hash_const::<0>()); +} diff --git a/contracts/src/token.cairo b/contracts/src/token.cairo new file mode 100644 index 000000000..1c56c11b7 --- /dev/null +++ b/contracts/src/token.cairo @@ -0,0 +1,2 @@ +mod link_token; +mod mock; diff --git a/contracts/src/token/link_token.cairo b/contracts/src/token/link_token.cairo new file mode 100644 index 000000000..24bdb2271 --- /dev/null +++ b/contracts/src/token/link_token.cairo @@ -0,0 +1,131 @@ +use starknet::ContractAddress; + +// https://github.com/starknet-io/starkgate-contracts/blob/v2.0/src/cairo/mintable_token_interface.cairo +#[starknet::interface] +trait IMintableToken { + fn permissioned_mint(ref self: TContractState, account: ContractAddress, amount: u256); + fn permissioned_burn(ref self: TContractState, account: ContractAddress, amount: u256); +} + +#[starknet::contract] +mod LinkToken { + use starknet::ContractAddress; + use starknet::class_hash::ClassHash; + + use zeroable::Zeroable; + + use openzeppelin::token::erc20::ERC20Component; + use openzeppelin::access::ownable::OwnableComponent; + + use super::IMintableToken; + use openzeppelin::token::erc20::interface::{IERC20, IERC20Dispatcher, IERC20DispatcherTrait}; + use chainlink::libraries::token::erc677::ERC677Component; + use chainlink::libraries::type_and_version::ITypeAndVersion; + use chainlink::libraries::upgradeable::{Upgradeable, IUpgradeable}; + + component!(path: OwnableComponent, storage: ownable, event: OwnableEvent); + component!(path: ERC20Component, storage: erc20, event: ERC20Event); + component!(path: ERC677Component, storage: erc677, event: ERC677Event); + + #[abi(embed_v0)] + impl OwnableImpl = OwnableComponent::OwnableTwoStepImpl; + impl InternalImpl = OwnableComponent::InternalImpl; + + #[abi(embed_v0)] + impl ERC20Impl = ERC20Component::ERC20Impl; + #[abi(embed_v0)] + impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl; + impl ERC20InternalImpl = ERC20Component::InternalImpl; + + #[abi(embed_v0)] + impl ERC677Impl = ERC677Component::ERC677Impl; + + #[storage] + struct Storage { + #[substorage(v0)] + ownable: OwnableComponent::Storage, + _minter: ContractAddress, + #[substorage(v0)] + erc20: ERC20Component::Storage, + #[substorage(v0)] + erc677: ERC677Component::Storage + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + #[flat] + OwnableEvent: OwnableComponent::Event, + #[flat] + ERC20Event: ERC20Component::Event, + #[flat] + ERC677Event: ERC677Component::Event + } + + // + // IMintableToken (StarkGate) + // + #[abi(embed_v0)] + impl MintableToken of IMintableToken { + fn permissioned_mint(ref self: ContractState, account: ContractAddress, amount: u256) { + only_minter(@self); + self.erc20._mint(account, amount); + } + + fn permissioned_burn(ref self: ContractState, account: ContractAddress, amount: u256) { + only_minter(@self); + self.erc20._burn(account, amount); + } + } + + + #[constructor] + fn constructor(ref self: ContractState, minter: ContractAddress, owner: ContractAddress) { + let name = "ChainLink Token"; + let symbol = "LINK"; + self.erc20.initializer(name, symbol); + assert(!minter.is_zero(), 'minter is 0'); + self._minter.write(minter); + self.ownable.initializer(owner); + } + + // TODO #[view] + fn minter(self: @ContractState) -> ContractAddress { + self._minter.read() + } + + #[abi(embed_v0)] + impl TypeAndVersionImpl of ITypeAndVersion { + fn type_and_version(self: @ContractState) -> felt252 { + 'LinkToken 1.0.0' + } + } + + #[abi(embed_v0)] + impl UpgradeableImpl of IUpgradeable { + fn upgrade(ref self: ContractState, new_impl: ClassHash) { + self.ownable.assert_only_owner(); + Upgradeable::upgrade(new_impl) + } + } + + // fn increase_allowance(ref self: ContractState, spender: ContractAddress, added_value: u256) -> bool { + // let mut state = ERC20::unsafe_new_contract_state(); + // ERC20::ERC20Impl::increase_allowance(ref state, spender, added_value) + // } + + // fn decrease_allowance(ref self: ContractState, spender: ContractAddress, subtracted_value: u256) -> bool { + // let mut state = ERC20::unsafe_new_contract_state(); + // ERC20::ERC20Impl::decrease_allowance(ref state, spender, subtracted_value) + // } + + // + // Internal + // + + fn only_minter(self: @ContractState) { + let caller = starknet::get_caller_address(); + let minter = self._minter.read(); + assert(caller == minter, 'only minter'); + } +} diff --git a/contracts/src/token/mock.cairo b/contracts/src/token/mock.cairo new file mode 100644 index 000000000..dd1f80450 --- /dev/null +++ b/contracts/src/token/mock.cairo @@ -0,0 +1,2 @@ +mod valid_erc667_receiver; +mod invalid_erc667_receiver; diff --git a/contracts/src/token/mock/invalid_erc667_receiver.cairo b/contracts/src/token/mock/invalid_erc667_receiver.cairo new file mode 100644 index 000000000..9332dc66f --- /dev/null +++ b/contracts/src/token/mock/invalid_erc667_receiver.cairo @@ -0,0 +1,25 @@ +#[starknet::contract] +mod InvalidReceiver { + #[storage] + struct Storage { + _supports: bool + } + + #[constructor] + fn constructor(ref self: ContractState) {} + + #[abi(per_item)] + #[generate_trait] + impl HelperImpl of HelperTrait { + // toggle whether or not receiver says it supports the interface id + #[external(v0)] + fn set_supports(ref self: ContractState, support: bool) { + self._supports.write(support); + } + + #[external(v0)] + fn supports_interface(self: @ContractState, interface_id: u32) -> bool { + self._supports.read() + } + } +} diff --git a/contracts/src/token/mock/valid_erc667_receiver.cairo b/contracts/src/token/mock/valid_erc667_receiver.cairo new file mode 100644 index 000000000..cd08f7da6 --- /dev/null +++ b/contracts/src/token/mock/valid_erc667_receiver.cairo @@ -0,0 +1,41 @@ +use starknet::ContractAddress; +#[starknet::interface] +trait MockValidReceiver { + fn verify(self: @TContractState) -> ContractAddress; +} + +#[starknet::contract] +mod ValidReceiver { + use starknet::ContractAddress; + use array::ArrayTrait; + use chainlink::libraries::token::erc677::IERC677Receiver; + + #[storage] + struct Storage { + _sender: ContractAddress, + } + + #[constructor] + fn constructor(ref self: ContractState) {} + + + #[abi(embed_v0)] + impl ERC677Receiver of IERC677Receiver { + fn on_token_transfer( + ref self: ContractState, sender: ContractAddress, value: u256, data: Array + ) { + self._sender.write(sender); + } + + fn supports_interface(ref self: ContractState, interface_id: u32) -> bool { + true + } + } + + #[abi(embed_v0)] + impl ValidReceiver of super::MockValidReceiver { + fn verify(self: @ContractState) -> ContractAddress { + self._sender.read() + } + } +} diff --git a/contracts/src/utils.cairo b/contracts/src/utils.cairo new file mode 100644 index 000000000..13db189c9 --- /dev/null +++ b/contracts/src/utils.cairo @@ -0,0 +1,10 @@ +use integer::U128IntoFelt252; +use integer::u128s_from_felt252; +use integer::U128sFromFelt252Result; +fn split_felt(felt: felt252) -> (u128, u128) { + match u128s_from_felt252(felt) { + U128sFromFelt252Result::Narrow(low) => (0_u128, low), + U128sFromFelt252Result::Wide((high, low)) => (high, low), + } +} + diff --git a/contracts/test/account.ts b/contracts/test/account.ts new file mode 100644 index 000000000..c5b240ed7 --- /dev/null +++ b/contracts/test/account.ts @@ -0,0 +1,100 @@ +import { Account, RpcProvider, ec, uint256, constants } from 'starknet' + +export const ERC20_ADDRESS = '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7' + +export const DEVNET_URL = 'http://127.0.0.1:5050' +const DEVNET_NAME = 'devnet' +// This function loads options from the environment. +// It returns options for Devnet as default when nothing is configured in the environment. +export const makeFunderOptsFromEnv = () => { + const network = process.env.NETWORK || DEVNET_NAME + const gateway = process.env.NODE_URL || DEVNET_URL + const accountAddr = process.env.ACCOUNT?.toLowerCase() + const keyPair = ec.starkCurve.utils.randomPrivateKey() + + return { network, gateway, accountAddr, keyPair } +} + +interface FundAccounts { + account: string + amount: number +} + +interface FunderOptions { + network?: string + gateway?: string + accountAddr?: string + keyPair: Uint8Array +} + +// Define the Strategy to use depending on the network. +export class Funder { + private opts: FunderOptions + private strategy: IFundingStrategy + + constructor(opts: FunderOptions) { + this.opts = opts + if (this.opts.network === DEVNET_NAME) { + this.strategy = new DevnetFundingStrategy() + return + } + this.strategy = new AllowanceFundingStrategy() + } + + // This function adds some funds to pre-deployed account that we are using in our test. + public async fund(accounts: FundAccounts[]) { + await this.strategy.fund(accounts, this.opts) + } +} + +interface IFundingStrategy { + fund(accounts: FundAccounts[], opts: FunderOptions): Promise +} + +// Fund the Account on Devnet +class DevnetFundingStrategy implements IFundingStrategy { + public async fund(accounts: FundAccounts[], opts: FunderOptions) { + accounts.forEach(async (account) => { + const body = { + address: account.account, + amount: account.amount, + lite: true, + } + await fetch(`${opts.gateway}/mint`, { + method: 'post', + body: JSON.stringify(body), + headers: { 'Content-Type': 'application/json' }, + }) + }) + } +} + +// Fund the Account on Testnet +class AllowanceFundingStrategy implements IFundingStrategy { + public async fund(accounts: FundAccounts[], opts: Required) { + const provider = new RpcProvider({ + nodeUrl: constants.NetworkName.SN_SEPOLIA, + }) + + const operator = new Account(provider, opts.accountAddr, opts.keyPair) + + for (const account of accounts) { + const data = [ + account.account, + uint256.bnToUint256(account.amount).low.toString(), + uint256.bnToUint256(account.amount).high.toString(), + ] + const nonce = await operator.getNonce() + const hash = await operator.execute( + { + contractAddress: ERC20_ADDRESS, + entrypoint: 'transfer', + calldata: data, + }, + undefined, + { nonce }, + ) + await provider.waitForTransaction(hash.transaction_hash) + } + } +} diff --git a/contracts/test/constants.ts b/contracts/test/constants.ts new file mode 100644 index 000000000..e7ff055c2 --- /dev/null +++ b/contracts/test/constants.ts @@ -0,0 +1,5 @@ +/** 15 min */ +export const TIMEOUT = 900_000 + +export const STARKNET_DEVNET_URL = 'http://127.0.0.1:5050' +export const ETH_DEVNET_URL = 'http://127.0.0.1:8545' diff --git a/contracts/test/emergency/StarknetValidator.test.ts b/contracts/test/emergency/StarknetValidator.test.ts new file mode 100644 index 000000000..0c824d875 --- /dev/null +++ b/contracts/test/emergency/StarknetValidator.test.ts @@ -0,0 +1,728 @@ +import { abi as starknetMessagingAbi } from '../../artifacts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/IStarknetMessaging.sol/IStarknetMessaging.json' +import { abi as accessControllerAbi } from '../../artifacts/@chainlink/contracts/src/v0.8/interfaces/AccessControllerInterface.sol/AccessControllerInterface.json' +import { abi as aggregatorAbi } from '../../artifacts/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol/AggregatorV3Interface.json' +import { fetchStarknetAccount, getStarknetContractArtifacts, waitForTransactions } from '../utils' +import { Contract as StarknetContract, RpcProvider, CallData, Account, hash } from 'starknet' +import { deployMockContract, MockContract } from '@ethereum-waffle/mock-contract' +import { BigNumber, Contract as EthersContract, ContractFactory } from 'ethers' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import * as l1l2messaging from '../l1-l2-messaging' +import { STARKNET_DEVNET_URL } from '../constants' +import * as account from '../account' +import { ethers } from 'hardhat' +import { expect } from 'chai' + +describe('StarknetValidator', () => { + const provider = new RpcProvider({ nodeUrl: STARKNET_DEVNET_URL }) + const opts = account.makeFunderOptsFromEnv() + const funder = new account.Funder(opts) + + let defaultAccount: Account + let deployer: SignerWithAddress + let eoaValidator: SignerWithAddress + let alice: SignerWithAddress + + let starknetValidatorFactory: ContractFactory + let starknetValidator: EthersContract + let mockStarknetMessagingFactory: ContractFactory + let mockStarknetMessaging: EthersContract + let mockGasPriceFeed: MockContract + let mockAccessController: MockContract + let mockAggregator: MockContract + + let l2Contract: StarknetContract + + before(async () => { + // Setup L2 account + defaultAccount = await fetchStarknetAccount() + await funder.fund([{ account: defaultAccount.address, amount: 1e21 }]) + + // Deploy L2 feed contract + const ddL2Contract = await defaultAccount.declareAndDeploy({ + ...getStarknetContractArtifacts('SequencerUptimeFeed'), + constructorCalldata: CallData.compile({ + initial_status: 0, + owner_address: defaultAccount.address, + }), + }) + + // Creates a starknet contract instance for the l2 feed + const { abi: l2FeedAbi } = await provider.getClassByHash(ddL2Contract.declare.class_hash) + l2Contract = new StarknetContract(l2FeedAbi, ddL2Contract.deploy.address, provider) + + // Fetch predefined L1 EOA accounts + const accounts = await ethers.getSigners() + deployer = accounts[0] + eoaValidator = accounts[1] + alice = accounts[2] + + // Deploy the mock feed + mockGasPriceFeed = await deployMockContract(deployer, aggregatorAbi) + await mockGasPriceFeed.mock.latestRoundData.returns( + '73786976294838220258' /** roundId */, + '96800000000' /** answer */, + '163826896' /** startedAt */, + '1638268960' /** updatedAt */, + '73786976294838220258' /** answeredInRound */, + ) + + // Deploy the mock access controller + mockAccessController = await deployMockContract(deployer, accessControllerAbi) + + // Deploy the mock aggregator + mockAggregator = await deployMockContract(deployer, aggregatorAbi) + await mockAggregator.mock.latestRoundData.returns( + '73786976294838220258' /** roundId */, + 1 /** answer */, + '163826896' /** startedAt */, + '1638268960' /** updatedAt */, + '73786976294838220258' /** answeredInRound */, + ) + }) + + beforeEach(async () => { + // Deploy the MockStarknetMessaging contract used to simulate L1 - L2 comms + mockStarknetMessagingFactory = await ethers.getContractFactory( + 'MockStarknetMessaging', + deployer, + ) + const messageCancellationDelay = 5 * 60 // seconds + mockStarknetMessaging = await mockStarknetMessagingFactory.deploy(messageCancellationDelay) + await mockStarknetMessaging.deployed() + + // Deploy the L1 StarknetValidator + starknetValidatorFactory = await ethers.getContractFactory('StarknetValidator', deployer) + starknetValidator = await starknetValidatorFactory.deploy( + mockStarknetMessaging.address, + mockAccessController.address, + mockGasPriceFeed.address, + mockAggregator.address, + l2Contract.address, + 0, + 0, + ) + + // Point the L2 feed contract to receive from the L1 StarknetValidator contract + await defaultAccount.execute( + l2Contract.populate('set_l1_sender', { + address: starknetValidator.address, + }), + ) + }) + + describe('#constructor', () => { + it('reverts when the StarknetMessaging address is zero', async () => { + await expect( + starknetValidatorFactory.deploy( + ethers.constants.AddressZero, + mockAccessController.address, + mockGasPriceFeed.address, + mockAggregator.address, + l2Contract.address, + 0, + 0, + ), + ).to.be.revertedWithCustomError(starknetValidator, 'InvalidStarknetMessagingAddress') + }) + + it('reverts when the L2 feed is zero', async () => { + await expect( + starknetValidatorFactory.deploy( + mockStarknetMessaging.address, + mockAccessController.address, + mockGasPriceFeed.address, + mockAggregator.address, + 0, + 0, + 0, + ), + ).to.be.revertedWithCustomError(starknetValidator, 'InvalidL2FeedAddress') + }) + + it('reverts when the Aggregator address is zero', async () => { + await expect( + starknetValidatorFactory.deploy( + mockStarknetMessaging.address, + mockAccessController.address, + mockGasPriceFeed.address, + ethers.constants.AddressZero, + l2Contract.address, + 0, + 0, + ), + ).to.be.revertedWithCustomError(starknetValidator, 'InvalidSourceAggregatorAddress') + }) + + it('reverts when the Access Controller address is zero', async () => { + await expect( + starknetValidatorFactory.deploy( + mockStarknetMessaging.address, + ethers.constants.AddressZero, + mockGasPriceFeed.address, + mockAggregator.address, + l2Contract.address, + 0, + 0, + ), + ).to.be.revertedWithCustomError(starknetValidator, 'InvalidAccessControllerAddress') + }) + + it('reverts when the L1 Gas Price feed address is zero', async () => { + await expect( + starknetValidatorFactory.deploy( + mockStarknetMessaging.address, + mockAccessController.address, + ethers.constants.AddressZero, + mockAggregator.address, + l2Contract.address, + 0, + 0, + ), + ).to.be.revertedWithCustomError(starknetValidator, 'InvalidGasPriceL1FeedAddress') + }) + + it('is initialized with the correct gas config', async () => { + const gasConfig = await starknetValidator.getGasConfig() + expect(gasConfig.gasEstimate).to.equal(0) // Initialized with 0 in before function + expect(gasConfig.gasPriceL1Feed).to.hexEqual(mockGasPriceFeed.address) + expect(gasConfig.gasAdjustment).to.equal(0) + }) + + it('is initialized with the correct access controller address', async () => { + const acAddr = await starknetValidator.getConfigAC() + expect(acAddr).to.hexEqual(mockAccessController.address) + }) + + it('is initialized with the correct source aggregator address', async () => { + const aggregatorAddr = await starknetValidator.getSourceAggregator() + expect(aggregatorAddr).to.hexEqual(mockAggregator.address) + }) + + it('should get the selector from the name successfully', async () => { + const actual = hash.getSelectorFromName('update_status') + const expected = 1585322027166395525705364165097050997465692350398750944680096081848180365267n + expect(BigInt(actual)).to.equal(expected) + + const computedActual = await starknetValidator.SELECTOR_STARK_UPDATE_STATUS() + expect(computedActual).to.equal(expected) + }) + }) + + describe('#retry', () => { + describe('when called by account with no access', () => { + it('reverts', async () => { + await expect(starknetValidator.connect(alice).retry()).to.be.revertedWith('No access') + }) + }) + + describe('when called by account with access', () => { + it('transaction succeeds', async () => { + const waffleMockStarknetMessaging = await deployMockContract(deployer, starknetMessagingAbi) + await waffleMockStarknetMessaging.mock.sendMessageToL2.returns( + ethers.utils.formatBytes32String('0'), + 0, + ) + await mockAggregator.mock.latestRoundData.returns( + '0' /** roundId */, + 1 /** answer */, + '0' /** startedAt */, + '0' /** updatedAt */, + '0' /** answeredInRound */, + ) + await mockGasPriceFeed.mock.latestRoundData.returns( + '0' /** roundId */, + 1 /** answer */, + '0' /** startedAt */, + '0' /** updatedAt */, + '0' /** answeredInRound */, + ) + + const starknetValidator = await starknetValidatorFactory.deploy( + waffleMockStarknetMessaging.address, + mockAccessController.address, + mockGasPriceFeed.address, + mockAggregator.address, + l2Contract.address, + 0, + 0, + ) + + await starknetValidator.addAccess(deployer.address) + + await starknetValidator.retry() + }) + }) + }) + + describe('#setConfigAC', () => { + describe('when called by non owner', () => { + it('reverts', async () => { + const newACAddr = '0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4' + await expect(starknetValidator.connect(alice).setConfigAC(newACAddr)).to.be.revertedWith( + 'Only callable by owner', + ) + }) + }) + + describe('when called by owner', () => { + it('emits an event', async () => { + const newACAddr = '0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4' + await expect(starknetValidator.setConfigAC(newACAddr)) + .to.emit(starknetValidator, 'ConfigACSet') + .withArgs(mockAccessController.address, newACAddr) + }) + + it('sets the access controller address', async () => { + const newACAddr = '0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4' + await starknetValidator.connect(deployer).setConfigAC(newACAddr) + expect(await starknetValidator.getConfigAC()).to.equal(newACAddr) + }) + + it('no-op if new address equals previous address', async () => { + const tx = await starknetValidator.setConfigAC(mockAccessController.address) + const receipt = await tx.wait() + expect(receipt.events).is.empty + expect(await starknetValidator.getConfigAC()).to.equal(mockAccessController.address) + }) + + it('reverts if address is zero', async () => { + await expect( + starknetValidator.connect(deployer).setConfigAC(ethers.constants.AddressZero), + ).to.be.revertedWithCustomError(starknetValidator, 'InvalidAccessControllerAddress') + }) + }) + }) + + describe('#setSourceAggregator', () => { + describe('when called by non owner', () => { + it('reverts', async () => { + await expect( + starknetValidator.connect(alice).setSourceAggregator(ethers.constants.AddressZero), + ).to.be.revertedWith('Only callable by owner') + }) + }) + + describe('when source address is the zero address', () => { + it('reverts', async () => { + await expect( + starknetValidator.connect(deployer).setSourceAggregator(ethers.constants.AddressZero), + ).to.be.revertedWithCustomError(starknetValidator, 'InvalidSourceAggregatorAddress') + }) + }) + + describe('when called by owner', () => { + it('emits an event', async () => { + const newSourceAddr = '0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4' + await expect(starknetValidator.setSourceAggregator(newSourceAddr)) + .to.emit(starknetValidator, 'SourceAggregatorSet') + .withArgs(mockAggregator.address, newSourceAddr) + }) + + it('sets the source aggregator address', async () => { + expect(await starknetValidator.getSourceAggregator()).to.hexEqual(mockAggregator.address) + }) + + it('does nothing if new address equal to previous', async () => { + const tx = await starknetValidator + .connect(deployer) + .setSourceAggregator(mockAggregator.address) + const receipt = await tx.wait() + expect(receipt.events).to.be.empty + + expect(await starknetValidator.getSourceAggregator()).to.hexEqual(mockAggregator.address) + }) + }) + }) + + describe('#setGasConfig', () => { + describe('when called by non owner without access', () => { + beforeEach(async () => { + await mockAccessController.mock.hasAccess.returns(false) + }) + + it('reverts', async () => { + await expect( + starknetValidator.connect(alice).setGasConfig(0, mockGasPriceFeed.address, 0), + ).to.be.revertedWithCustomError(starknetValidator, 'AccessForbidden') + }) + }) + + describe('when called by owner', () => { + it('correctly sets the gas config', async () => { + const newGasEstimate = 25000 + const newFeedAddr = '0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4' + // gasAdjustment of 110 equates to 1.1x + const newGasAdjustment = 110 + await starknetValidator + .connect(deployer) + .setGasConfig(newGasEstimate, newFeedAddr, newGasAdjustment) + const gasConfig = await starknetValidator.getGasConfig() + expect(gasConfig.gasEstimate).to.equal(newGasEstimate) + expect(gasConfig.gasPriceL1Feed).to.hexEqual(newFeedAddr) + expect(gasConfig.gasAdjustment).to.equal(newGasAdjustment) + }) + + it('emits an event', async () => { + const newGasEstimate = 25000 + const newFeedAddr = '0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4' + const newGasAdjustment = 110 + await expect( + starknetValidator + .connect(deployer) + .setGasConfig(newGasEstimate, newFeedAddr, newGasAdjustment), + ) + .to.emit(starknetValidator, 'GasConfigSet') + .withArgs(newGasEstimate, newFeedAddr, newGasAdjustment) + }) + + describe('when l1 gas price feed address is the zero address', () => { + it('reverts', async () => { + await expect( + starknetValidator + .connect(deployer) + .setGasConfig(25000, ethers.constants.AddressZero, 0), + ).to.be.revertedWithCustomError(starknetValidator, 'InvalidGasPriceL1FeedAddress') + }) + }) + }) + + describe('when called by an address with access', () => { + beforeEach(async () => { + await mockAccessController.mock.hasAccess.returns(true) + }) + + it('correctly sets the gas config', async () => { + const newGasEstimate = 25000 + const newFeedAddr = '0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4' + const newGasAdjustment = 110 + await starknetValidator + .connect(eoaValidator) + .setGasConfig(newGasEstimate, newFeedAddr, newGasAdjustment) + const gasConfig = await starknetValidator.getGasConfig() + expect(gasConfig.gasEstimate).to.equal(newGasEstimate) + expect(gasConfig.gasPriceL1Feed).to.hexEqual(newFeedAddr) + expect(gasConfig.gasAdjustment).to.equal(newGasAdjustment) + }) + + it('emits an event', async () => { + const newGasEstimate = 25000 + const newFeedAddr = '0xc662c410C0ECf747543f5bA90660f6ABeBD9C8c4' + const newGasAdjustment = 110 + await expect( + starknetValidator + .connect(eoaValidator) + .setGasConfig(newGasEstimate, newFeedAddr, newGasAdjustment), + ) + .to.emit(starknetValidator, 'GasConfigSet') + .withArgs(newGasEstimate, newFeedAddr, newGasAdjustment) + }) + + describe('when l1 gas price feed address is the zero address', () => { + it('reverts', async () => { + await expect( + starknetValidator + .connect(eoaValidator) + .setGasConfig(25000, ethers.constants.AddressZero, 0), + ).to.be.revertedWithCustomError(starknetValidator, 'InvalidGasPriceL1FeedAddress') + }) + }) + }) + }) + + describe('#approximateGasPrice', () => { + it('calculates gas price with scalar coefficient', async () => { + await mockGasPriceFeed.mock.latestRoundData.returns( + '0' /** roundId */, + 96800000000 /** answer */, + '0' /** startedAt */, + '0' /** updatedAt */, + '0' /** answeredInRound */, + ) + // 96800000000 is the mocked value from gas feed + const expectedGasPrice = BigNumber.from(96800000000).mul(110).div(100) + + await starknetValidator.connect(deployer).setGasConfig(0, mockGasPriceFeed.address, 110) + + const gasPrice = await starknetValidator.connect(deployer).approximateGasPrice() + + expect(gasPrice).to.equal(expectedGasPrice) + }) + }) + + describe('#validate', () => { + beforeEach(async () => { + await expect( + deployer.sendTransaction({ to: starknetValidator.address, value: 100n }), + ).to.changeEtherBalance(starknetValidator, 100n) + }) + + it('reverts if `StarknetValidator.validate` called by account with no access', async () => { + const c = starknetValidator.connect(eoaValidator) + await expect(c.validate(0, 0, 1, 1)).to.be.revertedWith('No access') + }) + + it('should not revert if `sequencer_uptime_feed.latest_round_data` called by an Account with no explicit access (Accounts are allowed read access)', async () => { + const result = await l2Contract.latest_round_data() + expect(result['answer']).to.equal('0') + }) + + it('should deploy the messaging contract', async () => { + const { messaging_contract_address } = await l1l2messaging.loadL1MessagingContract({ + address: mockStarknetMessaging.address, + }) + expect(messaging_contract_address).not.to.be.undefined + }) + + it('should load the already deployed contract if the address is provided', async () => { + const { messaging_contract_address } = await l1l2messaging.loadL1MessagingContract({ + address: mockStarknetMessaging.address, + }) + expect(mockStarknetMessaging.address).to.hexEqual(messaging_contract_address) + }) + + it('should send a message to the L2 contract', async () => { + // Load the mock messaging contract + await l1l2messaging.loadL1MessagingContract({ address: mockStarknetMessaging.address }) + + // Return gas price of 1 + await mockGasPriceFeed.mock.latestRoundData.returns( + '0' /** roundId */, + 1 /** answer */, + '0' /** startedAt */, + '0' /** updatedAt */, + '0' /** answeredInRound */, + ) + + // Simulate L1 transmit + validate + const newGasEstimate = 1 + const receipts = await waitForTransactions([ + // Add access + () => starknetValidator.addAccess(eoaValidator.address), + + // By default the gas config is 0, we need to change it or we will submit a 0 fee + () => + starknetValidator + .connect(deployer) + .setGasConfig(newGasEstimate, mockGasPriceFeed.address, 100), + + // gasPrice (1) * newGasEstimate (1) + () => starknetValidator.connect(eoaValidator).validate(0, 0, 1, 1), + ]) + + // Simulate the L1 - L2 comms + const resp = await l1l2messaging.flush() + const msgFromL1 = resp.messages_to_l2 + expect(msgFromL1).to.have.a.lengthOf(1) + expect(resp.messages_to_l1).to.be.empty + + expect(msgFromL1.at(0)?.l1_contract_address).to.hexEqual(starknetValidator.address) + expect(msgFromL1.at(0)?.l2_contract_address).to.hexEqual(l2Contract.address) + + // Assert L2 effects + const result = await l2Contract.latest_round_data() + + // Logging (to help debug potential flaky test) + console.log( + JSON.stringify( + { + latestRoundData: result, + flushResponse: resp, + txReceipts: receipts, + }, + (_, value) => (typeof value === 'bigint' ? value.toString() : value), + 2, + ), + ) + + expect(result['answer']).to.equal('1') + }) + + it('should always send a **boolean** message to L2 contract', async () => { + // Load the mock messaging contract + await l1l2messaging.loadL1MessagingContract({ address: mockStarknetMessaging.address }) + + // Return gas price of 1 + await mockGasPriceFeed.mock.latestRoundData.returns( + '0' /** roundId */, + 1 /** answer */, + '0' /** startedAt */, + '0' /** updatedAt */, + '0' /** answeredInRound */, + ) + + // Simulate L1 transmit + validate + const newGasEstimate = 1 + const receipts = await waitForTransactions([ + // Add access + () => starknetValidator.connect(deployer).addAccess(eoaValidator.address), + + // By default the gas config is 0, we need to change it or we will submit a 0 fee + () => + starknetValidator + .connect(deployer) + .setGasConfig(newGasEstimate, mockGasPriceFeed.address, 100), + + // Incorrect value + () => starknetValidator.connect(eoaValidator).validate(0, 0, 1, 127), + ]) + + // Simulate the L1 - L2 comms + const resp = await l1l2messaging.flush() + const msgFromL1 = resp.messages_to_l2 + expect(msgFromL1).to.have.a.lengthOf(1) + expect(resp.messages_to_l1).to.be.empty + + expect(msgFromL1[0].l1_contract_address).to.hexEqual(starknetValidator.address) + expect(msgFromL1[0].l2_contract_address).to.hexEqual(l2Contract.address) + + // Assert L2 effects + const result = await l2Contract.latest_round_data() + + // Logging (to help debug potential flaky test) + console.log( + JSON.stringify( + { + latestRoundData: result, + flushResponse: resp, + txReceipts: receipts, + }, + (_, value) => (typeof value === 'bigint' ? value.toString() : value), + 2, + ), + ) + + expect(result['answer']).to.equal('0') // status unchanged - incorrect value treated as false + }) + + it('should send multiple messages', async () => { + // Load the mock messaging contract + await l1l2messaging.loadL1MessagingContract({ address: mockStarknetMessaging.address }) + + // Return gas price of 1 + await mockGasPriceFeed.mock.latestRoundData.returns( + '0' /** roundId */, + 1 /** answer */, + '0' /** startedAt */, + '0' /** updatedAt */, + '0' /** answeredInRound */, + ) + + // Simulate L1 transmit + validate + const messages = new Array() + const newGasEstimate = 1 + const receipts = await waitForTransactions( + [ + // Add access + () => starknetValidator.connect(deployer).addAccess(eoaValidator.address), + + // By default the gas config is 0, we need to change it or we will submit a 0 fee + () => + starknetValidator + .connect(deployer) + .setGasConfig(newGasEstimate, mockGasPriceFeed.address, 100), + + // Validate + () => starknetValidator.connect(eoaValidator).validate(0, 0, 1, 1), + () => starknetValidator.connect(eoaValidator).validate(0, 0, 1, 1), + () => starknetValidator.connect(eoaValidator).validate(0, 0, 1, 127), // incorrect value + () => starknetValidator.connect(eoaValidator).validate(0, 0, 1, 0), // final status + ], + async () => { + // Simulate the L1 - L2 comms + const resp = await l1l2messaging.flush() + if (resp.messages_to_l2.length !== 0) { + expect(resp.messages_to_l1).to.be.empty + + const msgFromL1 = resp.messages_to_l2 + expect(msgFromL1).to.have.a.lengthOf(1) + expect(msgFromL1[0].l1_contract_address).to.hexEqual(starknetValidator.address) + expect(msgFromL1[0].l2_contract_address).to.hexEqual(l2Contract.address) + + messages.push(resp) + } + }, + ) + + // Makes sure the correct number of messages were transmitted + expect(messages.length).to.eq(4) + + // Assert L2 effects + const result = await l2Contract.latest_round_data() + + // Logging (to help debug potential flaky test) + console.log( + JSON.stringify( + { + latestRoundData: result, + flushResponse: messages, + txReceipts: receipts, + }, + (_, value) => (typeof value === 'bigint' ? value.toString() : value), + 2, + ), + ) + + expect(result['answer']).to.equal('0') // final status 0 + }) + }) + + describe('#withdrawFunds', () => { + beforeEach(async () => { + await expect(() => + deployer.sendTransaction({ to: starknetValidator.address, value: 10 }), + ).to.changeEtherBalance(starknetValidator, 10n) + }) + + describe('when called by non owner', () => { + it('reverts', async () => { + await expect(starknetValidator.connect(alice).withdrawFunds()).to.be.revertedWith( + 'Only callable by owner', + ) + }) + }) + + describe('when called by owner', () => { + it('emits an event', async () => { + await expect(starknetValidator.connect(deployer).withdrawFunds()) + .to.emit(starknetValidator, 'FundsWithdrawn') + .withArgs(deployer.address, 10) + }) + + it('withdraws all funds to deployer', async () => { + await starknetValidator.connect(deployer).withdrawFunds() + const balance = await ethers.provider.getBalance(starknetValidator.address) + expect(balance).to.equal(0n) + }) + }) + }) + + describe('#withdrawFundsTo', () => { + beforeEach(async () => { + await expect(() => + deployer.sendTransaction({ to: starknetValidator.address, value: 10 }), + ).to.changeEtherBalance(starknetValidator, 10) + }) + + describe('when called by non owner', () => { + it('reverts', async () => { + await expect( + starknetValidator.connect(alice).withdrawFundsTo(alice.address), + ).to.be.revertedWith('Only callable by owner') + }) + }) + + describe('when called by owner', () => { + it('emits an event', async () => { + await expect(starknetValidator.connect(deployer).withdrawFundsTo(eoaValidator.address)) + .to.emit(starknetValidator, 'FundsWithdrawn') + .withArgs(eoaValidator.address, 10) + }) + + it('withdraws all funds to deployer', async () => { + await starknetValidator.connect(deployer).withdrawFunds() + const balance = await ethers.provider.getBalance(starknetValidator.address) + expect(balance).to.equal(0n) + }) + }) + }) +}) diff --git a/contracts/test/l1-l2-messaging.ts b/contracts/test/l1-l2-messaging.ts new file mode 100644 index 000000000..b27b58520 --- /dev/null +++ b/contracts/test/l1-l2-messaging.ts @@ -0,0 +1,103 @@ +import { ETH_DEVNET_URL, STARKNET_DEVNET_URL } from './constants' + +// +// Docs: https://github.com/0xSpaceShard/starknet-devnet-rs/blob/main/contracts/l1-l2-messaging/README.md#ethereum-setup +// + +/* + * https://github.com/0xSpaceShard/starknet-devnet-rs/blob/7e5ff351198f799816c1857c1048bf8ee7f89428/crates/starknet-devnet-server/src/api/http/models.rs#L23 + */ +export type PostmanLoadL1MessagingContract = Readonly<{ + networkUrl?: string + address?: string +}> + +/* + * https://github.com/0xSpaceShard/starknet-devnet-rs/blob/7e5ff351198f799816c1857c1048bf8ee7f89428/crates/starknet-devnet-server/src/api/http/models.rs#L132 + */ +export type MessagingLoadAddress = Readonly<{ + messaging_contract_address: string +}> + +/* + * https://github.com/0xSpaceShard/starknet-devnet-rs/blob/7e5ff351198f799816c1857c1048bf8ee7f89428/crates/starknet-devnet-server/src/api/http/endpoints/postman.rs#L12 + */ +export const loadL1MessagingContract = async ( + params?: PostmanLoadL1MessagingContract, +): Promise => { + const res = await fetch(`${STARKNET_DEVNET_URL}/postman/load_l1_messaging_contract`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + network_url: params?.networkUrl ?? ETH_DEVNET_URL, + address: params?.address, + }), + }) + + const result = await res.json() + if (result.error != null) { + throw new Error(result.error) + } + return result +} + +/* + * https://github.com/0xSpaceShard/starknet-devnet-rs/blob/7e5ff351198f799816c1857c1048bf8ee7f89428/crates/starknet-devnet-server/src/api/http/models.rs#L127 + */ +export type FlushParameters = Readonly<{ + dryRun?: boolean +}> + +/* + * https://github.com/0xSpaceShard/starknet-devnet-rs/blob/7e5ff351198f799816c1857c1048bf8ee7f89428/crates/starknet-devnet-types/src/rpc/messaging.rs#L52 + */ +export type MessageToL1 = Readonly<{ + from_address: string + to_address: string + payload: string[] +}> + +/* + * https://github.com/0xSpaceShard/starknet-devnet-rs/blob/7e5ff351198f799816c1857c1048bf8ee7f89428/crates/starknet-devnet-types/src/rpc/messaging.rs#L14 + */ +export type MessageToL2 = Readonly<{ + l2_contract_address: string + entry_point_selector: string + l1_contract_address: string + payload: string + paid_fee_on_l1: string + nonce: string +}> + +/* + * https://github.com/0xSpaceShard/starknet-devnet-rs/blob/7e5ff351198f799816c1857c1048bf8ee7f89428/crates/starknet-devnet-server/src/api/http/models.rs#L120 + */ +export type FlushedMessages = Readonly<{ + messages_to_l1: MessageToL1[] + messages_to_l2: MessageToL2[] + generated_l2_transactions: string[] + l1_provider: string +}> + +/* + * https://github.com/0xSpaceShard/starknet-devnet-rs/blob/7e5ff351198f799816c1857c1048bf8ee7f89428/crates/starknet-devnet-server/src/api/http/endpoints/postman.rs#L26 + */ +export const flush = async (params?: FlushParameters): Promise => { + const res = await fetch(`${STARKNET_DEVNET_URL}/postman/flush`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + dry_run: params?.dryRun ?? false, + }), + }) + + const result = await res.json() + if (result.error != null) { + throw new Error(result.error) + } + return result +} diff --git a/contracts/test/ocr2/aggregator.test.ts b/contracts/test/ocr2/aggregator.test.ts new file mode 100644 index 000000000..a41508b52 --- /dev/null +++ b/contracts/test/ocr2/aggregator.test.ts @@ -0,0 +1,440 @@ +import { fetchStarknetAccount, getStarknetContractArtifacts } from '../utils' +import { bytesToFelts } from '@chainlink/starknet-gauntlet' +import { STARKNET_DEVNET_URL, TIMEOUT } from '../constants' +import * as account from '../account' +import { assert, expect } from 'chai' +import { + BigNumberish, + ParsedStruct, + LibraryError, + RpcProvider, + Contract, + CallData, + Account, + Uint256, + cairo, + hash, + num, + ec, +} from 'starknet' + +type Oracle = Readonly<{ + // hex string + signer: string + transmitter: Account +}> + +// Observers - max 31 oracles or 31 bytes +const OBSERVERS_MAX = 31 +const OBSERVERS_HEX = '0x00010203000000000000000000000000000000000000000000000000000000' +const UINT128_MAX = BigInt(2) ** BigInt(128) - BigInt(1) + +describe('Aggregator', function () { + this.timeout(TIMEOUT) + const provider = new RpcProvider({ nodeUrl: STARKNET_DEVNET_URL }) + const opts = account.makeFunderOptsFromEnv() + const funder = new account.Funder(opts) + + let aggregator: Contract + let token: Contract + let owner: Account + + const maxAnswer = 1000000000 + const minAnswer = 2 + const f = 1 + const n = 3 * f + 1 + const oracles: Oracle[] = [] + let config_digest: string + + before(async () => { + // Sets up the owner account + owner = await fetchStarknetAccount() + await funder.fund([{ account: owner.address, amount: 1e21 }]) + console.log('Owner account has been funded') + + // Declares and deploys the LINK token contract + const ddToken = await owner.declareAndDeploy({ + ...getStarknetContractArtifacts('LinkToken'), + constructorCalldata: CallData.compile({ + minter: owner.address, + owner: owner.address, + }), + }) + console.log(`Successfully deployed LinkToken: ${ddToken.deploy.address}`) + + // Creates a starknet contract instance for token + const { abi: tokenAbi } = await provider.getClassByHash(ddToken.declare.class_hash) + token = new Contract(tokenAbi, ddToken.deploy.address, provider) + + // Funds the owner account with some LINK + await owner.execute( + token.populate('permissioned_mint', { + account: owner.address, + amount: cairo.uint256(100_000_000_000n), + }), + ) + console.log('Successfully funded owner account with LINK') + + // Performs the following in parallel: + // Deploys the aggregator contract + // Populates the oracles array with devnet accounts + const [ddAggregator] = await Promise.all([ + // Declares and deploys the aggregator + owner.declareAndDeploy({ + ...getStarknetContractArtifacts('Aggregator'), + constructorCalldata: CallData.compile({ + owner: owner.address, + link: token.address, + min_answer: minAnswer, // TODO: toFelt() to correctly wrap negative ints + max_answer: maxAnswer, // TODO: toFelt() to correctly wrap negative ints + billing_access_controller: 0, // TODO: billing AC + decimals: 8, + description: 0, + }), + }), + + // Populates the oracles array with devnet accounts + ...Array.from({ length: n }).map(async (_, i) => { + // account index 0 is taken by the owner account, so we need to offset by 1 + const transmitter = await fetchStarknetAccount({ accountIndex: i + 1 }) + await funder.fund([{ account: transmitter.address, amount: 1e21 }]) + oracles.push({ + signer: '0x' + Buffer.from(ec.starkCurve.utils.randomPrivateKey()).toString('hex'), + transmitter, + // payee + }) + }), + ]) + console.log(`Successfully deployed Aggregator: ${ddAggregator.deploy.address}`) + + // Creates a starknet contract instance for aggregator + const { abi: aggregatorAbi } = await provider.getClassByHash(ddAggregator.declare.class_hash) + aggregator = new Contract(aggregatorAbi, ddAggregator.deploy.address, provider) + + // Defines the offchain config + const onchain_config = new Array() + const offchain_config = new Uint8Array([1]) + const offchain_config_encoded = bytesToFelts(offchain_config) + const offchain_config_version = 2 + const config = { + oracles: oracles.map((oracle) => { + return { + signer: ec.starkCurve.getStarkKey(oracle.signer), + transmitter: oracle.transmitter.address, + } + }), + f, + onchain_config, + offchain_config_version, + offchain_config: offchain_config_encoded, + } + console.log('Encoded offchain_config: %O', offchain_config_encoded) + + // Sets the billing config + await owner.execute( + aggregator.populate('set_billing', { + config: { + observation_payment_gjuels: 1, + transmission_payment_gjuels: 1, + gas_base: 1, + gas_per_signature: 1, + }, + }), + ) + + // Sets the OCR config + await owner.execute(aggregator.populate('set_config', config)) + console.log('Config: %O', config) + + // Gets the config details as bigints: + // + // result["0"] = config_count + // result["1"] = block_number + // result["2"] = config_digest + // + const result = await aggregator.latest_config_details() + const blockNumber = Number(result['1']) // we receive a bigint, but getBlock() assumes bigint = block hash, number = block number + const configDigest = result['2'] + console.log(`Config digest: ${configDigest.toString(16)}`) + console.log(`Block number: ${blockNumber.toString(16)}`) + config_digest = configDigest + + // Immitate the fetch done by relay to confirm latest_config_details_works + const block = await provider.getBlock(blockNumber) + const txHash = block.transactions.at(0) + if (txHash == null) { + assert.fail('unexpectedly found no transacitons') + } + + // Gets the transaction receipt + const receipt = await provider.waitForTransaction(txHash) + + // Checks that the receipt has events to decode + const events = receipt.events + const event = events.at(0) + if (event == null) { + assert.fail('unexpectedly received no events') + } else { + console.log("Log raw 'ConfigSet' event: %O", event) + } + + // Decodes the events + const decodedEvents = aggregator.parseEvents(receipt) + const decodedEvent = decodedEvents.at(0) + if (decodedEvent == null) { + assert.fail('unexpectedly received no decoded events') + } else { + console.log("Log decoded 'ConfigSet' event: %O", decodedEvent) + } + + // Double checks that the ConfigSet event exists in the decoded event payload + assert.isTrue(Object.prototype.hasOwnProperty.call(decodedEvent, 'ConfigSet')) + }) + + describe('OCR aggregator behavior', function () { + const transmit = async (epochAndRound: number, answer: num.BigNumberish) => { + // Defines helper variables + const observations = new Array() + const observersBuf = Buffer.alloc(31) + const observationTimestamp = 1 + const juelsPerFeeCoin = 1 + const extraHash = 1 + const gasPrice = 1 + + // Updates the observer state + for (let i = 0; i < oracles.length; i++) { + observersBuf[i] = i + observations.push(answer) + } + + // Converts observersBuf to a single value that will be decoded by toBN + const observers = `0x${observersBuf.toString('hex')}` + assert.equal(observers, OBSERVERS_HEX) + + // Defines report data + const reportData = [ + // report_context + config_digest, + epochAndRound, + extraHash, + // raw_report + observationTimestamp, + observers, + observations.length, + ...observations, + juelsPerFeeCoin, + gasPrice, + ] + + // Hashes the report data + const reportDigest = hash.computeHashOnElements(reportData) + console.log('Report data: %O', reportData) + console.log(`Report digest: ${reportDigest}`) + + // Generates report signatures + console.log('Report signatures - START') + const signatures = [] + for (const { signer } of oracles.slice(0, f + 1)) { + const signature = ec.starkCurve.sign(reportDigest, signer) + const { r, s } = signature + const starkKey = ec.starkCurve.getStarkKey(signer) + const pubKey = '0x' + Buffer.from(ec.starkCurve.getPublicKey(signer)).toString('hex') + signatures.push({ r, s, public_key: starkKey }) + console.log({ + starkKey, + pubKey, + privKey: signer, + r, + s, + }) + } + console.log('Report signatures - END\n') + + // Gets the first transmitter + const transmitter = oracles.at(0)?.transmitter + if (transmitter == null) { + assert.fail('no oracles exist') + } + + // Executes the transmit function on the aggregator contract + return await transmitter.execute( + aggregator.populate('transmit', { + report_context: { + config_digest, + epoch_and_round: epochAndRound, + extra_hash: extraHash, + }, + observation_timestamp: observationTimestamp, + observers, + observations, + juels_per_fee_coin: juelsPerFeeCoin, + gas_price: gasPrice, + signatures, + }), + ) + } + + it("should emit 'NewTransmission' event on transmit", async () => { + // Calls the transmit function + const { transaction_hash } = await transmit(1, 99) + const receipt = await provider.getTransactionReceipt(transaction_hash) + + // Double checks that some events were emitted + assert.isNotEmpty(receipt.events) + console.log("Log raw 'NewTransmission' event: %O", receipt.events[0]) + + // Decodes the events + const decodedEvents = aggregator.parseEvents(receipt) + const decodedEvent = decodedEvents.at(0) + if (decodedEvent == null) { + assert.fail('unexpectedly received no decoded events') + } else { + console.log("Log decoded 'NewTransmission' event: %O", decodedEvent) + } + + // Validates the decoded event + const e = decodedEvent['NewTransmission'] + assert.isTrue(Object.prototype.hasOwnProperty.call(decodedEvent, 'NewTransmission')) + assert.equal(e.round_id, 1n) + assert.equal(e.observation_timestamp, 1n) + assert.equal(e.epoch_and_round, 1n) + // assert.equal(e.data.reimbursement, 0n) + + // NOTICE: Leading zeros are trimmed for an encoded felt (number). + // To decode, the raw felt needs to be start padded up to max felt size (252 bits or < 32 bytes). + const hexPadStart = ( + data: BigNumberish | Uint256 | ParsedStruct | BigNumberish[], + len: number, + ) => { + return `0x${data.toString(16).padStart(len, '0')}` + } + + // Validates the transmitter + const transmitterAddr = oracles[0].transmitter.address + const len = 32 * 2 // 32 bytes (hex) + expect(hexPadStart(e.transmitter, len)).to.hexEqual(transmitterAddr) + + // Validates the observers and observations + const lenObservers = OBSERVERS_MAX * 2 // 31 bytes (hex) + assert.equal(hexPadStart(e.observers, lenObservers), OBSERVERS_HEX) + if (Array.isArray(e.observations)) { + assert.equal(e.observations.length, 4) + } else { + assert.fail( + `property 'observations' on NewTransmission event is not an array: ${JSON.stringify( + e, + null, + 2, + )}`, + ) + } + + // Validates the config digest + assert.equal(hexPadStart(e.config_digest, len), config_digest) + }) + + it('should transmit correctly', async () => { + await transmit(2, 99) + + // Gets the latest round details as a map from string to bigint: + // + // result["round_id"] = 2n + // result["answer"] = 99n + // result["block_num"] = 8n + // result["started_at"] = 1n + // result["updated_at"] = 1710802726n + // + const round = await aggregator.latest_round_data() + assert.equal(round['round_id'], 2n) + assert.equal(round['answer'], 99n) + + // await transmit(3, -10) // TODO: toFelt() to correctly wrap negative ints + // ;({ round } = await aggregator.call('latest_round_data')) + // assert.equal(round.round_id, 3) + // assert.equal(round.answer, -10) + + try { + await transmit(4, 1) + expect.fail() + } catch (err) { + // Round should be unchanged + const newRound = await aggregator.latest_round_data() + assert.deepEqual(round, newRound) + } + }) + + it('should transmit with max u128 value correctly', async () => { + try { + await transmit(4, UINT128_MAX) + assert.fail('expected an error') + } catch (err) { + if (err instanceof LibraryError) { + expect(err.message).to.contain('median is out of min-max range') + } else { + assert.fail('expected a starknet LibraryError') + } + } + }) + + it('payments and withdrawals', async () => { + // set up payees + await owner.execute( + aggregator.populate('set_payees', { + payees: oracles.map((oracle) => ({ + transmitter: oracle.transmitter.address, + payee: oracle.transmitter.address, // reusing transmitter acocunts as payees for simplicity + })), + }), + ) + + // Several rounds happened so we are owed payment + // + // The aggregator.owed_payment call returns a bigint + // + const payee = oracles[0].transmitter + const owed1 = await aggregator.owed_payment(payee.address) + assert.ok(owed1 > 0n) + + const availableToValue = ([is_negative, abs_difference]: [boolean, bigint]): bigint => { + return is_negative ? -abs_difference : abs_difference + } + + // no funds on contract, so no LINK available for payment + // + // The aggregator.link_available_for_payment call returns a map: + // + // result['0'] = is negative (e.g. true) + // result['1'] = absolute difference (e.g. 10000000006n) + // + let result = await aggregator.link_available_for_payment() + assert.ok(availableToValue([result['0'], result['1']]) < 0) // should be negative: we owe payments + + // deposit LINK to contract + await owner.execute( + token.populate('transfer', { + recipient: aggregator.address, + amount: cairo.uint256(100_000_000_000n), + }), + ) + + // we have enough funds available now + result = await aggregator.link_available_for_payment() + assert.ok(availableToValue([result['0'], result['1']]) > 0) + + // attempt to withdraw the payment + await payee.execute( + aggregator.populate('withdraw_payment', { + transmitter: payee.address, + }), + ) + + // balance as transferred to payee + const balance = await token.balance_of(payee.address) + assert.ok(owed1 === balance) + + // owed payment is now zero + const owed2 = await aggregator.owed_payment(payee.address) + assert.ok(owed2 === 0n) + }) + }) +}) diff --git a/contracts/test/setup.ts b/contracts/test/setup.ts new file mode 100644 index 000000000..0ca69128c --- /dev/null +++ b/contracts/test/setup.ts @@ -0,0 +1,94 @@ +import * as path from 'node:path' +import * as fs from 'node:fs' + +function findCommonPrefix(path1: string, path2: string): string { + const segments1 = path1.split(path.sep) + const segments2 = path2.split(path.sep) + + const minLength = Math.min(segments1.length, segments2.length) + const commonSegments = [] + + for (let i = 0; i < minLength; i++) { + if (segments1[i] === segments2[i]) { + commonSegments.push(segments1[i]) + } else { + break + } + } + + return commonSegments.join(path.sep) +} + +function toCamelCase(str: string): string { + return str + .replace(/_([a-z])/g, (_, letter) => letter.toUpperCase()) + .replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()) + .replace(/(^| )([a-z])/g, (_, __, letter) => letter.toUpperCase()) + .replace(/ /g, '') +} + +function findCairoFiles(dir: string): string[] { + const entries = fs.readdirSync(dir, { withFileTypes: true }) + const filePaths = entries.flatMap((entry) => { + const entryPath = path.join(dir, entry.name) + if (entry.isDirectory()) { + return findCairoFiles(entryPath) + } else if (entry.isFile() && entry.name.toLowerCase().endsWith('.cairo')) { + return [entryPath] + } else { + return [] + } + }) + return filePaths +} + +export function prepareHardhatArtifacts() { + const hre = require('hardhat') + + const src = hre.config.paths.starknetSources + const target = hre.config.paths.starknetArtifacts + if (!src || !target) { + throw new Error('Missing starknet path config') + } + + const root = findCommonPrefix(src, target) + + console.log('Cleaning and regenerating hardhat file structure..') + const generatedPath = path.join(target, src.slice(root.length)) + if (fs.existsSync(generatedPath)) { + fs.rmSync(generatedPath, { recursive: true }) + } + + const cairoFiles = findCairoFiles(src) + for (const cairoFile of cairoFiles) { + const relativePath = cairoFile + const filename = path.basename(relativePath, '.cairo') + + const camelCaseFilename = toCamelCase(filename) + + const sierraFile = `${target}/chainlink_${camelCaseFilename}.sierra.json` + const casmFile = `${target}/chainlink_${camelCaseFilename}.casm.json` + + if (!fs.existsSync(sierraFile) || !fs.existsSync(casmFile)) { + continue + } + + const subdir = path.dirname(relativePath).slice(root.length) + // Create the corresponding directory + const targetSubdir = path.join(target, subdir, `${filename}.cairo`) + fs.mkdirSync(targetSubdir, { recursive: true }) + + // Copy the sierra and casm files. We need to copy instead of symlink + // because hardhat-starknet-plugin does fs.lstatSync to check if the file + // exists. + fs.copyFileSync(sierraFile, `${targetSubdir}/${filename}.json`) + fs.copyFileSync(casmFile, `${targetSubdir}/${filename}.casm`) + + // Parse and save the ABI JSON + const sierraContent = JSON.parse(fs.readFileSync(sierraFile, 'utf8')) + fs.writeFileSync( + `${targetSubdir}/${filename}_abi.json`, + JSON.stringify(sierraContent.abi, null, 2), + ) + } +} diff --git a/contracts/test/utils.ts b/contracts/test/utils.ts new file mode 100644 index 000000000..9f0cdce40 --- /dev/null +++ b/contracts/test/utils.ts @@ -0,0 +1,78 @@ +import { STARKNET_DEVNET_URL } from './constants' +import { execSync } from 'node:child_process' +import { Account } from 'starknet' +import * as path from 'node:path' +import { ethers } from 'hardhat' +import { json } from 'starknet' +import * as fs from 'node:fs' + +export type FetchStarknetAccountParams = Readonly<{ + accountIndex?: number +}> + +export const fetchStarknetAccount = async (params?: FetchStarknetAccountParams) => { + const response = await fetch(`${STARKNET_DEVNET_URL}/predeployed_accounts`) + const accounts = await response.json() + const accIndex = params?.accountIndex ?? 0 + + const account = accounts.at(accIndex) + if (account == null) { + throw new Error(`no account available at index ${accIndex}`) + } + + return new Account( + { + nodeUrl: STARKNET_DEVNET_URL, + }, + account.address, + account.private_key, + ) +} + +export const getStarknetContractArtifacts = (name: string) => { + const rootDir = getRootDir() + return { + contract: getStarknetContractArtifactPath(rootDir, name, false), + casm: getStarknetContractArtifactPath(rootDir, name, true), + } +} + +export const waitForTransaction = async ( + tx: () => ReturnType, +) => { + const result = await tx() + return await result.wait() +} + +export const waitForTransactions = async ( + txs: (() => ReturnType)[], + cb?: () => void | Promise, +) => { + const results = new Array>>() + for (const tx of txs) { + results.push(await waitForTransaction(tx)) + cb != null && (await cb()) + } + return results +} + +const getRootDir = () => { + const result = execSync('git rev-parse --show-toplevel').toString() + return result.replace(/\n/g, '') +} + +const getStarknetContractArtifactPath = (rootDir: string, name: string, casm: boolean) => { + return json.parse( + fs + .readFileSync( + path.join( + rootDir, + 'contracts', + 'target', + 'release', + `chainlink_${name}.${casm ? 'compiled_' : ''}contract_class.json`, + ), + ) + .toString('ascii'), + ) +} diff --git a/contracts/tests/conftest.py b/contracts/tests/conftest.py deleted file mode 100644 index 866e91bb3..000000000 --- a/contracts/tests/conftest.py +++ /dev/null @@ -1,6 +0,0 @@ -import pytest -import asyncio - -@pytest.fixture(scope='module') -def event_loop(): - return asyncio.new_event_loop() \ No newline at end of file diff --git a/contracts/tests/test_contract.py b/contracts/tests/test_contract.py deleted file mode 100644 index 492d0a93c..000000000 --- a/contracts/tests/test_contract.py +++ /dev/null @@ -1,301 +0,0 @@ -"""aggregator.cairo test file.""" -import os - -import asyncio -import pytest -import pytest_asyncio -from starkware.starknet.testing.starknet import Starknet -from starkware.crypto.signature.signature import ( - pedersen_hash, private_to_stark_key, sign) -from starkware.cairo.common.hash_state import compute_hash_on_elements -from starkware.starknet.utils.api_utils import cast_to_felts - -from utils import ( - Signer, to_uint, add_uint, sub_uint, str_to_felt, MAX_UINT256, ZERO_ADDRESS, INVALID_UINT256, - get_contract_def, contract_path, cached_contract, assert_revert, assert_event_emitted, uint -) - -signer = Signer(999654321123456789) - -oracles = [ - { 'signer': Signer(123456789987654321), 'transmitter': Signer(987654321123456789) }, - { 'signer': Signer(123456789987654322), 'transmitter': Signer(987654321123456788) }, - { 'signer': Signer(123456789987654323), 'transmitter': Signer(987654321123456787) }, - { 'signer': Signer(123456789987654324), 'transmitter': Signer(987654321123456786) }, -] - - -@pytest.fixture(scope='module') -def contract_defs(): - aggregator_def = get_contract_def('aggregator.cairo') - account_def = get_contract_def('account.cairo') - erc20_def = get_contract_def('token.cairo') - return aggregator_def, account_def, erc20_def - -@pytest_asyncio.fixture(scope='module') -async def token_factory(contract_defs): - _aggregator_def, account_def, erc20_def = contract_defs - - # Create a new Starknet class that simulates the StarkNet system. - starknet = await Starknet.empty() - - owner = await starknet.deploy( - contract_def=account_def, - constructor_calldata=[signer.public_key] - ) - - token = await starknet.deploy( - contract_def=erc20_def, - constructor_calldata=[ - str_to_felt("LINK Token"), - str_to_felt("LINK"), - 18, - *uint(1000), - owner.contract_address, - owner.contract_address - ] - ) - return starknet, token, owner - -# @pytest.mark.asyncio -# async def test_ownership(token_factory): -# """Test constructor method.""" -# starknet, token, owner = token_factory - -# # Deploy the contract. -# contract = await starknet.deploy( -# source=contract_path("aggregator.cairo"), -# constructor_calldata=[ -# owner.contract_address, -# token.contract_address, -# 0, -# 1000000000, -# 0, # TODO: billing AC -# 8, # decimals -# str_to_felt("ETH/BTC") -# ] -# ) - -# # # Invoke increase_balance() twice. -# # await contract.increase_balance(amount=10).invoke() -# # await contract.increase_balance(amount=20).invoke() - -# # Check the result of owner(). -# execution_info = await contract.owner().call() -# assert execution_info.result == (owner.contract_address,) - -# TODO: module scope won't work, need to wrap with a state copy -@pytest_asyncio.fixture(scope='module') -async def setup(token_factory, contract_defs): - starknet, token, owner = token_factory - aggregator_def, account_def, _erc20_def = contract_defs - - # Deploy the contract. - min_answer = -10 - max_answer = 1000000000 - - contract = await starknet.deploy( - contract_def=aggregator_def, - constructor_calldata=cast_to_felts([ - owner.contract_address, - token.contract_address, - *cast_to_felts(values=[ - min_answer, - max_answer - ]), - 0, # TODO: billing AC - 8, # decimals - str_to_felt("ETH/BTC") - ]) - ) - - # Deploy an account for each oracle - accounts = await asyncio.gather(*[ - starknet.deploy( - contract_def=account_def, - constructor_calldata=[oracle['transmitter'].public_key] - ) for oracle in oracles - ]) - for i in range(len(accounts)): - oracles[i]['account'] = accounts[i] - - # Call set_config - - f = 1 - # onchain_config = [] - onchain_config = 1 - offchain_config_version = 2 - offchain_config = [1] - - # TODO: need to call via owner - execution_info = await contract.set_config( - oracles=[( - oracle['signer'].public_key, - oracle['account'].contract_address - ) for oracle in oracles], - # TODO: dict was supposed to be ok but it asks for a tuple - # oracles=[{ - # 'signer': oracle['signer'].public_key, - # 'transmitter': oracle['transmitter'].public_key - # } for oracle in oracles], - f=f, - onchain_config=onchain_config, - offchain_config_version=2, - offchain_config=offchain_config - ).invoke() - - digest = execution_info.result.digest - - return { - "starknet": starknet, - "token": token, - "owner": owner, - "contract": contract, - "f": f, - "digest": digest, - "oracles": oracles - } - -@pytest.fixture -def aggregator_factory(contract_defs, setup): - aggregator_def, account_def, erc20_def = contract_defs - env = setup - _state = env["starknet"].state.copy() - token = cached_contract(_state, erc20_def, env["token"]) - owner = cached_contract(_state, account_def, env["owner"]) - contract = cached_contract(_state, aggregator_def, env["contract"]) - - # TODO: need to replace all oracles with cache too? - - return { - "token": token, - "owner": owner, - "contract": contract, - "f": env["f"], - "digest": env["digest"], - "oracles": env["oracles"] - } - - -@pytest.mark.asyncio -async def test_transmit(aggregator_factory): - """Test transmit method.""" - env = aggregator_factory - print(f"digest = {env['digest']}") - - oracle = env["oracles"][0] - - n = env["f"] + 1 - - def transmit( - epoch_and_round, # TODO: split into two values - answer - ): - # TODO: - observation_timestamp = 1 - extra_hash = 1 - juels_per_fee_coin = 1 - report_context = [env["digest"], epoch_and_round, extra_hash] - # int.from_bytes(report_context, "big"), - - l = len(env["oracles"]) - observers = bytes([i for i in range(l)]) - observations = [answer for _ in range(l)] - - - raw_report = [ - observation_timestamp, - int.from_bytes(observers, "big"), - len(observations), - *cast_to_felts(observations), # convert negative numbers to valid felts - juels_per_fee_coin, - ] - - msg = compute_hash_on_elements([ - *report_context, - *raw_report - ]) - - signatures = [] - - # TODO: test with duplicate signers - # for o in oracles[:n]: - # oracle = oracles[0] - - for oracle in env["oracles"][:n]: - # Sign with a single oracle - sig_r, sig_s = sign(msg_hash=msg, priv_key=oracle['signer'].private_key) - - signature = [ - sig_r, # r - sig_s, # s - oracle['signer'].public_key # public_key - ] - signatures.extend(signature) - - calldata = [ - *report_context, - *raw_report, - n, # len signatures - *signatures - ] - - print(calldata) - - return oracle['transmitter'].send_transaction( - oracle['account'], - env["contract"].contract_address, - 'transmit', - calldata - ) - - await transmit(epoch_and_round=1, answer=99) - # TODO: test latest_round_data, round_data - await transmit(epoch_and_round=2, answer=-1) - -@pytest.mark.asyncio -async def test_payees(aggregator_factory): - """Test payee related functionality.""" - env = aggregator_factory - - payees = [] - - for oracle in env["oracles"]: - payees.extend([ - oracle['transmitter'].public_key, - oracle['transmitter'].public_key # reusing transmitter accounts as payees for simplicity - ]) - - calldata = [ - len(env["oracles"]), - *payees - ] - - # should succeed because all payees are zero - execution_info = await signer.send_transaction( - env['owner'], - env["contract"].contract_address, - 'set_payees', - calldata - ) - - # should succeed because all payees equal current payees - execution_info = await signer.send_transaction( - env['owner'], - env["contract"].contract_address, - 'set_payees', - calldata - ) - - # can't transfer to self - assert_revert(signer.send_transaction( - env['owner'], - env["contract"].contract_address, - 'transfer_payeeship', - [transmitter, proposed] - )) - # only payee can transfer - # successful transfer - # only proposed payee can accept - # successful accept - diff --git a/contracts/tests/utils.py b/contracts/tests/utils.py deleted file mode 100644 index 836aa4146..000000000 --- a/contracts/tests/utils.py +++ /dev/null @@ -1,213 +0,0 @@ -"""Utilities for testing Cairo contracts.""" - -from pathlib import Path -import math -from starkware.cairo.common.hash_state import compute_hash_on_elements -from starkware.crypto.signature.signature import private_to_stark_key, sign -from starkware.starknet.public.abi import get_selector_from_name -from starkware.starknet.compiler.compile import compile_starknet_files -from starkware.starkware_utils.error_handling import StarkException -from starkware.starknet.testing.starknet import StarknetContract -from starkware.starknet.business_logic.execution.objects import Event - -MAX_UINT256 = (2**128 - 1, 2**128 - 1) -INVALID_UINT256 = (MAX_UINT256[0] + 1, MAX_UINT256[1]) -ZERO_ADDRESS = 0 -TRUE = 1 -FALSE = 0 - -TRANSACTION_VERSION = 0 - - -_root = Path(__file__).parent.parent - - -def contract_path(name): - if name.startswith("tests/"): - return str(_root / name) - else: - return str(_root / "contracts" / name) - - -def str_to_felt(text): - b_text = bytes(text, "ascii") - return int.from_bytes(b_text, "big") - - -def felt_to_str(felt): - b_felt = felt.to_bytes(31, "big") - return b_felt.decode() - - -def assert_event_emitted(tx_exec_info, from_address, name, data): - assert Event( - from_address=from_address, - keys=[get_selector_from_name(name)], - data=data, - ) in tx_exec_info.raw_events - - -def uint(a): - return(a, 0) - - -def to_uint(a): - """Takes in value, returns uint256-ish tuple.""" - return (a & ((1 << 128) - 1), a >> 128) - - -def from_uint(uint): - """Takes in uint256-ish tuple, returns value.""" - return uint[0] + (uint[1] << 128) - - -def add_uint(a, b): - """Returns the sum of two uint256-ish tuples.""" - a = from_uint(a) - b = from_uint(b) - c = a + b - return to_uint(c) - - -def sub_uint(a, b): - """Returns the difference of two uint256-ish tuples.""" - a = from_uint(a) - b = from_uint(b) - c = a - b - return to_uint(c) - - -def mul_uint(a, b): - """Returns the product of two uint256-ish tuples.""" - a = from_uint(a) - b = from_uint(b) - c = a * b - return to_uint(c) - - -def div_rem_uint(a, b): - """Returns the quotient and remainder of two uint256-ish tuples.""" - a = from_uint(a) - b = from_uint(b) - c = math.trunc(a / b) - m = a % b - return (to_uint(c), to_uint(m)) - - -async def assert_revert(fun, reverted_with=None): - try: - await fun - assert False - except StarkException as err: - _, error = err.args - if reverted_with is not None: - assert reverted_with in error['message'] - - -def assert_event_emitted(tx_exec_info, from_address, name, data): - assert Event( - from_address=from_address, - keys=[get_selector_from_name(name)], - data=data, - ) in tx_exec_info.raw_events - - -def get_contract_def(path): - """Returns the contract definition from the contract path""" - path = contract_path(path) - contract_def = compile_starknet_files( - files=[path], - debug_info=True - ) - return contract_def - - -def cached_contract(state, definition, deployed): - """Returns the cached contract""" - contract = StarknetContract( - state=state, - abi=definition.abi, - contract_address=deployed.contract_address, - deploy_execution_info=deployed.deploy_execution_info - ) - return contract - - -class Signer(): - """ - Utility for sending signed transactions to an Account on Starknet. - - Parameters - ---------- - - private_key : int - - Examples - --------- - Constructing a Signer object - - >>> signer = Signer(1234) - - Sending a transaction - - >>> await signer.send_transaction(account, - account.contract_address, - 'set_public_key', - [other.public_key] - ) - - """ - - def __init__(self, private_key): - self.private_key = private_key - self.public_key = private_to_stark_key(private_key) - - def sign(self, message_hash): - return sign(msg_hash=message_hash, priv_key=self.private_key) - - async def send_transaction(self, account, to, selector_name, calldata, nonce=None, max_fee=0): - return await self.send_transactions(account, [(to, selector_name, calldata)], nonce, max_fee) - - async def send_transactions(self, account, calls, nonce=None, max_fee=0): - if nonce is None: - execution_info = await account.get_nonce().call() - nonce, = execution_info.result - - calls_with_selector = [ - (call[0], get_selector_from_name(call[1]), call[2]) for call in calls] - (call_array, calldata) = from_call_to_call_array(calls) - - message_hash = hash_multicall( - account.contract_address, calls_with_selector, nonce, max_fee) - sig_r, sig_s = self.sign(message_hash) - - return await account.__execute__(call_array, calldata, nonce).invoke(signature=[sig_r, sig_s]) - - -def from_call_to_call_array(calls): - call_array = [] - calldata = [] - for i, call in enumerate(calls): - assert len(call) == 3, "Invalid call parameters" - entry = (call[0], get_selector_from_name( - call[1]), len(calldata), len(call[2])) - call_array.append(entry) - calldata.extend(call[2]) - return (call_array, calldata) - - -def hash_multicall(sender, calls, nonce, max_fee): - hash_array = [] - for call in calls: - call_elements = [call[0], call[1], compute_hash_on_elements(call[2])] - hash_array.append(compute_hash_on_elements(call_elements)) - - message = [ - str_to_felt('StarkNet Transaction'), - sender, - compute_hash_on_elements(hash_array), - nonce, - max_fee, - TRANSACTION_VERSION - ] - return compute_hash_on_elements(message) diff --git a/contracts/tsconfig.json b/contracts/tsconfig.json new file mode 100644 index 000000000..13fad6402 --- /dev/null +++ b/contracts/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "outDir": "dist", + "resolveJsonModule": true + }, + "include": [ + "./scripts", + "./test", + "./typechain-types" + ], + "files": [ + "./hardhat.config.ts" + ] +} diff --git a/contracts/vendor/starkware-libs/README.md b/contracts/vendor/starkware-libs/README.md new file mode 100644 index 000000000..a3cf938b6 --- /dev/null +++ b/contracts/vendor/starkware-libs/README.md @@ -0,0 +1,4 @@ +# starkware-libs vendor contracts + +- `starkware-libs/starkgate-contracts` - fork of the original repo at [c08863a](https://github.com/starkware-libs/starkgate-contracts/commit/c08863a1f08226c09f1d0748124192e848d73db9) includes only `std_contracts/ERC20/permitted.cairo` +- `starkware-libs/cairo-lang` fork of the original repo at [v0.11.0.2](https://github.com/starkware-libs/cairo-lang/tree/v0.11.0.2/src/starkware/starknet) which loosens the `pragma` declaration for a few interfaces to support v0.8 (includes only the files we use) \ No newline at end of file diff --git a/contracts/vendor/starkware-libs/cairo-lang/src/starkware/solidity/libraries/NamedStorage.sol b/contracts/vendor/starkware-libs/cairo-lang/src/starkware/solidity/libraries/NamedStorage.sol new file mode 100644 index 000000000..5f20ba86a --- /dev/null +++ b/contracts/vendor/starkware-libs/cairo-lang/src/starkware/solidity/libraries/NamedStorage.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: Apache-2.0. +pragma solidity ^0.8.0; + +/* + Library to provide basic storage, in storage location out of the low linear address space. + + New types of storage variables should be added here upon need. +*/ +library NamedStorage { + function bytes32ToUint256Mapping(string memory tag_) + internal + pure + returns (mapping(bytes32 => uint256) storage randomVariable) + { + bytes32 location = keccak256(abi.encodePacked(tag_)); + assembly { + randomVariable.slot := location + } + } + + function bytes32ToAddressMapping(string memory tag_) + internal + pure + returns (mapping(bytes32 => address) storage randomVariable) + { + bytes32 location = keccak256(abi.encodePacked(tag_)); + assembly { + randomVariable.slot := location + } + } + + function uintToAddressMapping(string memory tag_) + internal + pure + returns (mapping(uint256 => address) storage randomVariable) + { + bytes32 location = keccak256(abi.encodePacked(tag_)); + assembly { + randomVariable.slot := location + } + } + + function addressToBoolMapping(string memory tag_) + internal + pure + returns (mapping(address => bool) storage randomVariable) + { + bytes32 location = keccak256(abi.encodePacked(tag_)); + assembly { + randomVariable.slot := location + } + } + + function getUintValue(string memory tag_) internal view returns (uint256 retVal) { + bytes32 slot = keccak256(abi.encodePacked(tag_)); + assembly { + retVal := sload(slot) + } + } + + function setUintValue(string memory tag_, uint256 value) internal { + bytes32 slot = keccak256(abi.encodePacked(tag_)); + assembly { + sstore(slot, value) + } + } + + function setUintValueOnce(string memory tag_, uint256 value) internal { + require(getUintValue(tag_) == 0, "ALREADY_SET"); + setUintValue(tag_, value); + } + + function getAddressValue(string memory tag_) internal view returns (address retVal) { + bytes32 slot = keccak256(abi.encodePacked(tag_)); + assembly { + retVal := sload(slot) + } + } + + function setAddressValue(string memory tag_, address value) internal { + bytes32 slot = keccak256(abi.encodePacked(tag_)); + assembly { + sstore(slot, value) + } + } + + function setAddressValueOnce(string memory tag_, address value) internal { + require(getAddressValue(tag_) == address(0x0), "ALREADY_SET"); + setAddressValue(tag_, value); + } + + function getBoolValue(string memory tag_) internal view returns (bool retVal) { + bytes32 slot = keccak256(abi.encodePacked(tag_)); + assembly { + retVal := sload(slot) + } + } + + function setBoolValue(string memory tag_, bool value) internal { + bytes32 slot = keccak256(abi.encodePacked(tag_)); + assembly { + sstore(slot, value) + } + } +} diff --git a/contracts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/IStarknetMessaging.sol b/contracts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/IStarknetMessaging.sol new file mode 100644 index 000000000..7ce51dad3 --- /dev/null +++ b/contracts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/IStarknetMessaging.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: Apache-2.0. +pragma solidity ^0.8.0; + +import "./IStarknetMessagingEvents.sol"; + +interface IStarknetMessaging is IStarknetMessagingEvents { + /** + Returns the max fee (in Wei) that StarkNet will accept per single message. + */ + function getMaxL1MsgFee() external pure returns (uint256); + + /** + Sends a message to an L2 contract. + This function is payable, the payed amount is the message fee. + + Returns the hash of the message and the nonce of the message. + */ + function sendMessageToL2( + uint256 toAddress, + uint256 selector, + uint256[] calldata payload + ) external payable returns (bytes32, uint256); + + /** + Consumes a message that was sent from an L2 contract. + + Returns the hash of the message. + */ + function consumeMessageFromL2(uint256 fromAddress, uint256[] calldata payload) + external + returns (bytes32); + + /** + Starts the cancellation of an L1 to L2 message. + A message can be canceled messageCancellationDelay() seconds after this function is called. + + Note: This function may only be called for a message that is currently pending and the caller + must be the sender of the that message. + */ + function startL1ToL2MessageCancellation( + uint256 toAddress, + uint256 selector, + uint256[] calldata payload, + uint256 nonce + ) external returns (bytes32); + + /** + Cancels an L1 to L2 message, this function should be called at least + messageCancellationDelay() seconds after the call to startL1ToL2MessageCancellation(). + A message may only be cancelled by its sender. + If the message is missing, the call will revert. + + Note that the message fee is not refunded. + */ + function cancelL1ToL2Message( + uint256 toAddress, + uint256 selector, + uint256[] calldata payload, + uint256 nonce + ) external returns (bytes32); +} diff --git a/contracts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/IStarknetMessagingEvents.sol b/contracts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/IStarknetMessagingEvents.sol new file mode 100644 index 000000000..2f52bfe77 --- /dev/null +++ b/contracts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/IStarknetMessagingEvents.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: Apache-2.0. +pragma solidity ^0.8.0; + +interface IStarknetMessagingEvents { + // This event needs to be compatible with the one defined in Output.sol. + event LogMessageToL1(uint256 indexed fromAddress, address indexed toAddress, uint256[] payload); + + // An event that is raised when a message is sent from L1 to L2. + event LogMessageToL2( + address indexed fromAddress, + uint256 indexed toAddress, + uint256 indexed selector, + uint256[] payload, + uint256 nonce, + uint256 fee + ); + + // An event that is raised when a message from L2 to L1 is consumed. + event ConsumedMessageToL1( + uint256 indexed fromAddress, + address indexed toAddress, + uint256[] payload + ); + + // An event that is raised when a message from L1 to L2 is consumed. + event ConsumedMessageToL2( + address indexed fromAddress, + uint256 indexed toAddress, + uint256 indexed selector, + uint256[] payload, + uint256 nonce + ); + + // An event that is raised when a message from L1 to L2 Cancellation is started. + event MessageToL2CancellationStarted( + address indexed fromAddress, + uint256 indexed toAddress, + uint256 indexed selector, + uint256[] payload, + uint256 nonce + ); + + // An event that is raised when a message from L1 to L2 is canceled. + event MessageToL2Canceled( + address indexed fromAddress, + uint256 indexed toAddress, + uint256 indexed selector, + uint256[] payload, + uint256 nonce + ); +} diff --git a/contracts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/StarknetMessaging.sol b/contracts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/StarknetMessaging.sol new file mode 100644 index 000000000..04e9a6518 --- /dev/null +++ b/contracts/vendor/starkware-libs/cairo-lang/src/starkware/starknet/solidity/StarknetMessaging.sol @@ -0,0 +1,185 @@ +// SPDX-License-Identifier: Apache-2.0. +pragma solidity ^0.8.0; + +import "./IStarknetMessaging.sol"; +import "../../solidity/libraries/NamedStorage.sol"; + +/** + Implements sending messages to L2 by adding them to a pipe and consuming messages from L2 by + removing them from a different pipe. A deriving contract can handle the former pipe and add items + to the latter pipe while interacting with L2. +*/ +contract StarknetMessaging is IStarknetMessaging { + /* + Random slot storage elements and accessors. + */ + string constant L1L2_MESSAGE_MAP_TAG = "STARKNET_1.0_MSGING_L1TOL2_MAPPPING_V2"; + string constant L2L1_MESSAGE_MAP_TAG = "STARKNET_1.0_MSGING_L2TOL1_MAPPPING"; + + string constant L1L2_MESSAGE_NONCE_TAG = "STARKNET_1.0_MSGING_L1TOL2_NONCE"; + + string constant L1L2_MESSAGE_CANCELLATION_MAP_TAG = ( + "STARKNET_1.0_MSGING_L1TOL2_CANCELLATION_MAPPPING" + ); + + string constant L1L2_MESSAGE_CANCELLATION_DELAY_TAG = ( + "STARKNET_1.0_MSGING_L1TOL2_CANCELLATION_DELAY" + ); + + uint256 constant MAX_L1_MSG_FEE = 1 ether; + + function getMaxL1MsgFee() public pure override returns (uint256) { + return MAX_L1_MSG_FEE; + } + + /** + Returns the msg_fee + 1 for the message with the given 'msgHash', + or 0 if no message with such a hash is pending. + */ + function l1ToL2Messages(bytes32 msgHash) external view returns (uint256) { + return l1ToL2Messages()[msgHash]; + } + + function l2ToL1Messages(bytes32 msgHash) external view returns (uint256) { + return l2ToL1Messages()[msgHash]; + } + + function l1ToL2Messages() internal pure returns (mapping(bytes32 => uint256) storage) { + return NamedStorage.bytes32ToUint256Mapping(L1L2_MESSAGE_MAP_TAG); + } + + function l2ToL1Messages() internal pure returns (mapping(bytes32 => uint256) storage) { + return NamedStorage.bytes32ToUint256Mapping(L2L1_MESSAGE_MAP_TAG); + } + + function l1ToL2MessageNonce() public view returns (uint256) { + return NamedStorage.getUintValue(L1L2_MESSAGE_NONCE_TAG); + } + + function messageCancellationDelay() public view returns (uint256) { + return NamedStorage.getUintValue(L1L2_MESSAGE_CANCELLATION_DELAY_TAG); + } + + function messageCancellationDelay(uint256 delayInSeconds) internal { + NamedStorage.setUintValue(L1L2_MESSAGE_CANCELLATION_DELAY_TAG, delayInSeconds); + } + + /** + Returns the timestamp at the time cancelL1ToL2Message was called with a message + matching 'msgHash'. + + The function returns 0 if cancelL1ToL2Message was never called. + */ + function l1ToL2MessageCancellations(bytes32 msgHash) external view returns (uint256) { + return l1ToL2MessageCancellations()[msgHash]; + } + + function l1ToL2MessageCancellations() + internal + pure + returns (mapping(bytes32 => uint256) storage) + { + return NamedStorage.bytes32ToUint256Mapping(L1L2_MESSAGE_CANCELLATION_MAP_TAG); + } + + /** + Returns the hash of an L1 -> L2 message from msg.sender. + */ + function getL1ToL2MsgHash( + uint256 toAddress, + uint256 selector, + uint256[] calldata payload, + uint256 nonce + ) internal view returns (bytes32) { + return + keccak256( + abi.encodePacked( + uint256(uint160(msg.sender)), + toAddress, + nonce, + selector, + payload.length, + payload + ) + ); + } + + /** + Sends a message to an L2 contract. + */ + function sendMessageToL2( + uint256 toAddress, + uint256 selector, + uint256[] calldata payload + ) external payable override returns (bytes32, uint256) { + require(msg.value > 0, "L1_MSG_FEE_MUST_BE_GREATER_THAN_0"); + require(msg.value <= getMaxL1MsgFee(), "MAX_L1_MSG_FEE_EXCEEDED"); + uint256 nonce = l1ToL2MessageNonce(); + NamedStorage.setUintValue(L1L2_MESSAGE_NONCE_TAG, nonce + 1); + emit LogMessageToL2(msg.sender, toAddress, selector, payload, nonce, msg.value); + bytes32 msgHash = getL1ToL2MsgHash(toAddress, selector, payload, nonce); + // Note that the inclusion of the unique nonce in the message hash implies that + // l1ToL2Messages()[msgHash] was not accessed before. + l1ToL2Messages()[msgHash] = msg.value + 1; + return (msgHash, nonce); + } + + /** + Consumes a message that was sent from an L2 contract. + + Returns the hash of the message. + */ + function consumeMessageFromL2(uint256 fromAddress, uint256[] calldata payload) + external + override + returns (bytes32) + { + bytes32 msgHash = keccak256( + abi.encodePacked(fromAddress, uint256(uint160(msg.sender)), payload.length, payload) + ); + + require(l2ToL1Messages()[msgHash] > 0, "INVALID_MESSAGE_TO_CONSUME"); + emit ConsumedMessageToL1(fromAddress, msg.sender, payload); + l2ToL1Messages()[msgHash] -= 1; + return msgHash; + } + + function startL1ToL2MessageCancellation( + uint256 toAddress, + uint256 selector, + uint256[] calldata payload, + uint256 nonce + ) external override returns (bytes32) { + emit MessageToL2CancellationStarted(msg.sender, toAddress, selector, payload, nonce); + bytes32 msgHash = getL1ToL2MsgHash(toAddress, selector, payload, nonce); + uint256 msgFeePlusOne = l1ToL2Messages()[msgHash]; + require(msgFeePlusOne > 0, "NO_MESSAGE_TO_CANCEL"); + l1ToL2MessageCancellations()[msgHash] = block.timestamp; + return msgHash; + } + + function cancelL1ToL2Message( + uint256 toAddress, + uint256 selector, + uint256[] calldata payload, + uint256 nonce + ) external override returns (bytes32) { + emit MessageToL2Canceled(msg.sender, toAddress, selector, payload, nonce); + // Note that the message hash depends on msg.sender, which prevents one contract from + // cancelling another contract's message. + // Trying to do so will result in NO_MESSAGE_TO_CANCEL. + bytes32 msgHash = getL1ToL2MsgHash(toAddress, selector, payload, nonce); + uint256 msgFeePlusOne = l1ToL2Messages()[msgHash]; + require(msgFeePlusOne != 0, "NO_MESSAGE_TO_CANCEL"); + + uint256 requestTime = l1ToL2MessageCancellations()[msgHash]; + require(requestTime != 0, "MESSAGE_CANCELLATION_NOT_REQUESTED"); + + uint256 cancelAllowedTime = requestTime + messageCancellationDelay(); + require(cancelAllowedTime >= requestTime, "CANCEL_ALLOWED_TIME_OVERFLOW"); + require(block.timestamp >= cancelAllowedTime, "MESSAGE_CANCELLATION_NOT_ALLOWED_YET"); + + l1ToL2Messages()[msgHash] = 0; + return (msgHash); + } +} diff --git a/contracts/vendor/starkware-libs/starkgate-contracts/src/starkware/starknet/std_contracts/ERC20/permitted.cairo b/contracts/vendor/starkware-libs/starkgate-contracts/src/starkware/starknet/std_contracts/ERC20/permitted.cairo new file mode 100644 index 000000000..2d1c0baf1 --- /dev/null +++ b/contracts/vendor/starkware-libs/starkgate-contracts/src/starkware/starknet/std_contracts/ERC20/permitted.cairo @@ -0,0 +1,39 @@ +%lang starknet + +from starkware.cairo.common.cairo_builtins import HashBuiltin +from starkware.cairo.common.math import assert_not_zero +from starkware.starknet.common.syscalls import get_caller_address + +@storage_var +func permitted_minter() -> (res: felt) { +} + +// Constructor. + +func permitted_initializer{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( + minter_address: felt +) { + assert_not_zero(minter_address); + permitted_minter.write(minter_address); + return (); +} + +// Getters. + +@view +func permittedMinter{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> ( + minter: felt +) { + let (minter) = permitted_minter.read(); + return (minter,); +} + +// Internals. + +func permitted_minter_only{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() { + let (caller_address) = get_caller_address(); + let (permitted_address) = permittedMinter(); + assert_not_zero(permitted_address); + assert caller_address = permitted_address; + return (); +} diff --git a/contracts/yarn.lock b/contracts/yarn.lock new file mode 100644 index 000000000..f5c0f320a --- /dev/null +++ b/contracts/yarn.lock @@ -0,0 +1,3700 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.2.tgz#63d1e26d0b7a7a3684fce920de6ebabec1e5b674" + integrity sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw== + dependencies: + "@ethereumjs/common" "^2.6.3" + "@ethereumjs/tx" "^3.5.1" + ethereumjs-util "^7.1.4" + merkle-patricia-tree "^4.2.4" + +"@ethereumjs/block@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" + integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== + dependencies: + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" + ethereumjs-util "^7.1.5" + merkle-patricia-tree "^4.2.4" + +"@ethereumjs/blockchain@^5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.2.tgz#1848abd9dc1ee56acf8cec4c84304d7f4667d027" + integrity sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig== + dependencies: + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/common" "^2.6.3" + "@ethereumjs/ethash" "^1.1.0" + debug "^4.3.3" + ethereumjs-util "^7.1.4" + level-mem "^5.0.1" + lru-cache "^5.1.1" + semaphore-async-await "^1.5.1" + +"@ethereumjs/blockchain@^5.5.3": + version "5.5.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" + integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== + dependencies: + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/common" "^2.6.4" + "@ethereumjs/ethash" "^1.1.0" + debug "^4.3.3" + ethereumjs-util "^7.1.5" + level-mem "^5.0.1" + lru-cache "^5.1.1" + semaphore-async-await "^1.5.1" + +"@ethereumjs/common@^2.6.3", "@ethereumjs/common@^2.6.4": + version "2.6.4" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.4.tgz#1b3cdd3aa4ee3b0ca366756fc35e4a03022a01cc" + integrity sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.4" + +"@ethereumjs/common@^2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" + +"@ethereumjs/ethash@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" + integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== + dependencies: + "@ethereumjs/block" "^3.5.0" + "@types/levelup" "^4.3.0" + buffer-xor "^2.0.1" + ethereumjs-util "^7.1.1" + miller-rabin "^4.0.0" + +"@ethereumjs/tx@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" + integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== + dependencies: + "@ethereumjs/common" "^2.6.3" + ethereumjs-util "^7.1.4" + +"@ethereumjs/tx@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== + dependencies: + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" + +"@ethereumjs/vm@^5.9.0": + version "5.9.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.3.tgz#6d69202e4c132a4a1e1628ac246e92062e230823" + integrity sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg== + dependencies: + "@ethereumjs/block" "^3.6.3" + "@ethereumjs/blockchain" "^5.5.3" + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" + async-eventemitter "^0.2.4" + core-js-pure "^3.0.1" + debug "^4.3.3" + ethereumjs-util "^7.1.5" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + merkle-patricia-tree "^4.2.4" + rustbn.js "~0.2.0" + +"@ethersproject/abi@5.6.3", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.3": + version "5.6.3" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.3.tgz#2d643544abadf6e6b63150508af43475985c23db" + integrity sha512-CxKTdoZY4zDJLWXG6HzNH6znWK0M79WzzxHegDoecE3+K32pzfHOzuXg2/oGSTecZynFgpkjYXNPOqXVJlqClw== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/abi@^5.1.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.2.tgz#f2956f2ac724cd720e581759d9e3840cd9744818" + integrity sha512-40Ixjhy+YzFtnvzIqFU13FW9hd1gMoLa3cJfSDnfnL4o8EnEG1qLiV8sNJo3sHYi9UYMfFeRuZ7kv5+vhzU7gQ== + dependencies: + "@ethersproject/address" "^5.6.0" + "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.0" + +"@ethersproject/abstract-provider@5.6.1", "@ethersproject/abstract-provider@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" + integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.3" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" + +"@ethersproject/abstract-signer@5.6.2", "@ethersproject/abstract-signer@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" + integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/address@5.6.1", "@ethersproject/address@^5.6.0", "@ethersproject/address@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" + integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + +"@ethersproject/base64@5.6.1", "@ethersproject/base64@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" + integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + +"@ethersproject/basex@5.6.1", "@ethersproject/basex@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305" + integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/bignumber@5.6.2", "@ethersproject/bignumber@^5.6.0", "@ethersproject/bignumber@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" + integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.6.0", "@ethersproject/bytes@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" + integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/constants@5.6.1", "@ethersproject/constants@^5.6.0", "@ethersproject/constants@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" + integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + +"@ethersproject/contracts@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc" + integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g== + dependencies: + "@ethersproject/abi" "^5.6.3" + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.2" + +"@ethersproject/hash@5.6.1", "@ethersproject/hash@^5.6.0", "@ethersproject/hash@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" + integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/hdnode@5.6.2", "@ethersproject/hdnode@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2" + integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.1" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/wordlists" "^5.6.1" + +"@ethersproject/json-wallets@5.6.1", "@ethersproject/json-wallets@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91" + integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hdnode" "^5.6.2" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.1" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.6.1", "@ethersproject/keccak256@^5.6.0", "@ethersproject/keccak256@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" + integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" + integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== + +"@ethersproject/networks@5.6.3", "@ethersproject/networks@^5.6.3": + version "5.6.3" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.3.tgz#3ee3ab08f315b433b50c99702eb32e0cf31f899f" + integrity sha512-QZxRH7cA5Ut9TbXwZFiCyuPchdWi87ZtVNHWZd0R6YFgYtes2jQ3+bsslJ0WdyDe0i6QumqtoYqvY3rrQFRZOQ== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/pbkdf2@5.6.1", "@ethersproject/pbkdf2@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz#f462fe320b22c0d6b1d72a9920a3963b09eb82d1" + integrity sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/sha2" "^5.6.1" + +"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" + integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/providers@5.6.8": + version "5.6.8" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d" + integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/base64" "^5.6.1" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.3" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.6.1", "@ethersproject/random@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255" + integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/rlp@5.6.1", "@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" + integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/sha2@5.6.1", "@ethersproject/sha2@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.1.tgz#211f14d3f5da5301c8972a8827770b6fd3e51656" + integrity sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.6.2", "@ethersproject/signing-key@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" + integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.1.tgz#5845e71182c66d32e6ec5eefd041fca091a473e2" + integrity sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/strings@5.6.1", "@ethersproject/strings@^5.6.0", "@ethersproject/strings@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" + integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/transactions@5.6.2", "@ethersproject/transactions@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" + integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + +"@ethersproject/units@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.1.tgz#ecc590d16d37c8f9ef4e89e2005bda7ddc6a4e6f" + integrity sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/wallet@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c" + integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/hdnode" "^5.6.2" + "@ethersproject/json-wallets" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/wordlists" "^5.6.1" + +"@ethersproject/web@5.6.1", "@ethersproject/web@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" + integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== + dependencies: + "@ethersproject/base64" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/wordlists@5.6.1", "@ethersproject/wordlists@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1" + integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@joriksch/oz-cairo@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@joriksch/oz-cairo/-/oz-cairo-1.0.1.tgz#660d7fc9ccfb78d4a77354ff8a43150cc6a14899" + integrity sha512-UhDE9gCiUKtz2ryrr9a8hA24ivFdBy5cdlI4BcmRmhpRChCdfaPjI6w2xdiDwxCh/ZhC/Ij9EnG1CMLqOd5g0w== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@ledgerhq/cryptoassets@^6.28.2": + version "6.28.2" + resolved "https://registry.yarnpkg.com/@ledgerhq/cryptoassets/-/cryptoassets-6.28.2.tgz#fabc77c46830348d121452976cdcc19908e0acb2" + integrity sha512-i+33VVNE+54HrC0mHly6JXWO6Th+/7n7vNpxjhUQq+1IL3K/ex1HUCwB61O/siDInjq7OZ1Roq9CEx7tAsED2Q== + dependencies: + invariant "2" + +"@ledgerhq/devices@^6.27.1": + version "6.27.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-6.27.1.tgz#3b13ab1d1ba8201e9e74a08f390560483978c962" + integrity sha512-jX++oy89jtv7Dp2X6gwt3MMkoajel80JFWcdc0HCouwDsV1mVJ3SQdwl/bQU0zd8HI6KebvUP95QTwbQLLK/RQ== + dependencies: + "@ledgerhq/errors" "^6.10.0" + "@ledgerhq/logs" "^6.10.0" + rxjs "6" + semver "^7.3.5" + +"@ledgerhq/errors@^6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.10.0.tgz#dda9127b65f653fbb2f74a55e8f0e550d69de6e4" + integrity sha512-fQFnl2VIXh9Yd41lGjReCeK+Q2hwxQJvLZfqHnKqWapTz68NHOv5QcI0OHuZVNEbv0xhgdLhi5b65kgYeQSUVg== + +"@ledgerhq/hw-app-eth@^6.26.0": + version "6.28.2" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-eth/-/hw-app-eth-6.28.2.tgz#06fd19b9277442f4eb58ed76f4bc8299acd15a81" + integrity sha512-/pGJW5QKsci5mkjcUeP8RvDw4sV9gldp7RWKTKlkldqeRh2kV75bAdStL2p99fGdDfGkfYotpTfm3oOXQpOwiQ== + dependencies: + "@ethersproject/abi" "^5.5.0" + "@ethersproject/rlp" "^5.5.0" + "@ledgerhq/cryptoassets" "^6.28.2" + "@ledgerhq/errors" "^6.10.0" + "@ledgerhq/hw-transport" "^6.27.1" + "@ledgerhq/logs" "^6.10.0" + axios "^0.26.1" + bignumber.js "^9.0.2" + +"@ledgerhq/hw-transport-webhid@^6.24.1": + version "6.27.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webhid/-/hw-transport-webhid-6.27.1.tgz#8fd1710d23b6bd7cbe2382dd02054dfabe788447" + integrity sha512-u74rBYlibpbyGblSn74fRs2pMM19gEAkYhfVibq0RE1GNFjxDMFC1n7Sb+93Jqmz8flyfB4UFJsxs8/l1tm2Kw== + dependencies: + "@ledgerhq/devices" "^6.27.1" + "@ledgerhq/errors" "^6.10.0" + "@ledgerhq/hw-transport" "^6.27.1" + "@ledgerhq/logs" "^6.10.0" + +"@ledgerhq/hw-transport@^6.24.1", "@ledgerhq/hw-transport@^6.27.1": + version "6.27.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.27.1.tgz#88072278f69c279cb6569352acd4ae2fec33ace3" + integrity sha512-hnE4/Fq1YzQI4PA1W0H8tCkI99R3UWDb3pJeZd6/Xs4Qw/q1uiQO+vNLC6KIPPhK0IajUfuI/P2jk0qWcMsuAQ== + dependencies: + "@ledgerhq/devices" "^6.27.1" + "@ledgerhq/errors" "^6.10.0" + events "^3.3.0" + +"@ledgerhq/logs@^6.10.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.10.0.tgz#c012c1ecc1a0e53d50e6af381618dca5268461c1" + integrity sha512-lLseUPEhSFUXYTKj6q7s2O3s2vW2ebgA11vMAlKodXGf5AFw4zUoEbTz9CoFOC9jS6xY4Qr8BmRnxP/odT4Uuw== + +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@noble/hashes@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.1.tgz#c056d9b7166c1e7387a7453c2aff199bf7d88e5f" + integrity sha512-Lkp9+NijmV7eSVZqiUvt3UCuuHeJpUVmRrvh430gyJjJiuJMqkeHf6/A9lQ/smmbWV/0spDeJscscPzyB4waZg== + +"@noble/hashes@^0.5.7": + version "0.5.9" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-0.5.9.tgz#9f3051a4cc6f7c168022b3b7fbbe9fe2a35cccf0" + integrity sha512-7lN1Qh6d8DUGmfN36XRsbN/WcGIPNtTGhkw26vWId/DlCIGsYJJootTtPGghTLcn/AaXPx2Q0b3cacrwXa7OVw== + +"@noble/hashes@~1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + +"@noble/secp256k1@1.6.0", "@noble/secp256k1@~1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.0.tgz#602afbbfcfb7e169210469b697365ef740d7e930" + integrity sha512-DWSsg8zMHOYMYBqIQi96BQuthZrp98LCeMNcUOaffCIVYQ5yxDbNikLF+H7jEnmNNmXbtVic46iCuVWzar+MgA== + +"@noble/secp256k1@^1.4.0": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" + integrity sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ== + +"@nomiclabs/hardhat-docker@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-docker/-/hardhat-docker-2.0.2.tgz#ae964be17951275a55859ff7358e9e7c77448846" + integrity sha512-XgGEpRT3wlA1VslyB57zyAHV+oll8KnV1TjwnxxC1tpAL04/lbdwpdO5KxInVN8irMSepqFpsiSkqlcnvbE7Ng== + dependencies: + dockerode "^2.5.8" + fs-extra "^7.0.1" + node-fetch "^2.6.0" + +"@nomiclabs/hardhat-ethers@^2.0.5": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.6.tgz#1c695263d5b46a375dcda48c248c4fba9dfe2fc2" + integrity sha512-q2Cjp20IB48rEn2NPjR1qxsIQBvFVYW9rFRCFq+bC4RUrn1Ljz3g4wM8uSlgIBZYBi2JMXxmOzFqHraczxq4Ng== + +"@scure/base@~1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" + integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== + dependencies: + "@noble/hashes" "~1.1.1" + "@noble/secp256k1" "~1.6.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" + integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== + dependencies: + "@noble/hashes" "~1.1.1" + "@scure/base" "~1.1.0" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@shardlabs/starknet-hardhat-plugin@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@shardlabs/starknet-hardhat-plugin/-/starknet-hardhat-plugin-0.6.0.tgz#94fd4ba5f7e788474ad55a5b21b7acc23b104ed6" + integrity sha512-rqKZqfE9uOLTMxQ44pZLVs3eAm1ylxjQGVZuHvTR292N8KwHl7IaSd2k9yORaUobFdpHxt5LQoxFPlO8+pjCoQ== + dependencies: + "@nomiclabs/hardhat-docker" "^2.0.2" + axios "^0.24.0" + exit-hook "2.2.1" + form-data "^4.0.0" + glob "^7.2.0" + is-wsl "^2.2.0" + starknet "^3.15.0" + +"@solidity-parser/parser@^0.14.2": + version "0.14.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.2.tgz#2d8f2bddb217621df882ceeae7d7b42ae8664db3" + integrity sha512-10cr0s+MtRtqjEw0WFJrm2rwULN30xx7btd/v9cmqME2617/2M5MbHDkFIGIGTa7lwNw4bN9mVGfhlLzrYw8pA== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@toruslabs/starkware-crypto@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@toruslabs/starkware-crypto/-/starkware-crypto-1.1.0.tgz#754da7f0d6529de619ded73bd7636372d3da4b5d" + integrity sha512-IWqri38bd6kIlj7GDhxLby2Sw9LKJ+ShbfbKUPl0CAuv2QLOjGFFL17o9m7s2CUIZ9IMmz1a+yDT9uEfQvNRKg== + dependencies: + assert "^2.0.0" + bip39 "^3.0.4" + bn.js "^5.2.0" + elliptic "~6.5.4" + enc-utils "^3.0.0" + ethereumjs-wallet "^1.0.2" + hash.js "^1.1.7" + +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + +"@types/abstract-leveldown@*": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" + integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== + +"@types/bn.js@*", "@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/chai@^4.2.22": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" + integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== + +"@types/elliptic@^6.4.14": + version "6.4.14" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.14.tgz#7bbaad60567a588c1f08b10893453e6b9b4de48e" + integrity sha512-z4OBcDAU0GVwDTuwJzQCiL6188QvZMkvoERgcVjq0/mPM8jCfdwZ3x5zQEVoL9WCAru3aG5wl3Z5Ww5wBWn7ZQ== + dependencies: + "@types/bn.js" "*" + +"@types/level-errors@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" + integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== + +"@types/levelup@^4.3.0": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" + integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== + dependencies: + "@types/abstract-leveldown" "*" + "@types/level-errors" "*" + "@types/node" "*" + +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/mocha@^9.0.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== + +"@types/node@*": + version "17.0.34" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.34.tgz#3b0b6a50ff797280b8d000c6281d229f9c538cef" + integrity sha512-XImEz7XwTvDBtzlTnm8YvMqGW/ErMWBsKZ+hMTvnDIjGCKxwK5Xpc+c/oQjOauwq8M4OS11hEkpjX8rrI/eEgA== + +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + +"@types/node@^16.11.10": + version "16.11.38" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.38.tgz#be0edd097b23eace6c471c525a74b3f98803017f" + integrity sha512-hjO/0K140An3GWDw2HJfq7gko3wWeznbjXgg+rzPdVzhe198hp4x2i1dgveAOEiFKd8sOilAxzoSJiVv5P/CUg== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +JSONStream@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" + integrity sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abstract-leveldown@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +abstract-leveldown@~6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +aes-js@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +assert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +async-eventemitter@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async@^2.4.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.23.0.tgz#b0fa5d0948a8d1d75e3d5635238b6c4625b05149" + integrity sha512-NmvAE4i0YAv5cKq8zlDoPd1VLKAqX5oLuZKs8xkJa4qi6RGn0uhCYFjWtHHC9EM/MwOwYWOs53W+V0aqEXq1sg== + dependencies: + follow-redirects "^1.14.4" + +axios@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + +axios@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== + dependencies: + follow-redirects "^1.14.8" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +bignumber.js@^9.0.0, bignumber.js@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" + integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bip39@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + +bl@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" + integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bluebird@^3.5.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer-xor@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" + integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== + dependencies: + safe-buffer "^5.1.1" + +buffer@^5.5.0, buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cairo-ls@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/cairo-ls/-/cairo-ls-0.0.4.tgz#42c4eae4c1eac65eed32fe66896fcc44531ddffc" + integrity sha512-n/dWpvbt0g2ioQZJAneCgFe0kxMo6LncSF/GwdjffbjRJC/gCCGrYNPoa3OgKCoLwGBny+DwXiJhJY5UPV5pdw== + dependencies: + file-uri-to-path "^2.0.0" + glob "^7.2.0" + index-of-regex "^1.0.0" + request-promise "4.2.5" + vscode-languageserver "^6.1.1" + vscode-languageserver-textdocument "^1.0.1" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chai@^4.3.4: + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + +chokidar@3.5.3, chokidar@^3.4.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.0.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +core-js-pure@^3.0.1: + version "3.22.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.5.tgz#bdee0ed2f9b78f2862cda4338a07b13a49b6c9a9" + integrity sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deferred-leveldown@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== + dependencies: + abstract-leveldown "~6.2.1" + inherits "^2.0.3" + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +docker-modem@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-1.0.9.tgz#a1f13e50e6afb6cf3431b2d5e7aac589db6aaba8" + integrity sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw== + dependencies: + JSONStream "1.3.2" + debug "^3.2.6" + readable-stream "~1.0.26-4" + split-ca "^1.0.0" + +dockerode@^2.5.8: + version "2.5.8" + resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-2.5.8.tgz#1b661e36e1e4f860e25f56e0deabe9f87f1d0acc" + integrity sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw== + dependencies: + concat-stream "~1.6.2" + docker-modem "^1.0.8" + tar-fs "~1.16.3" + +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4, elliptic@~6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enc-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/enc-utils/-/enc-utils-3.0.0.tgz#65935d2d6a867fa0ae995f05f3a2f055ce764dcf" + integrity sha512-e57t/Z2HzWOLwOp7DZcV0VMEY8t7ptWwsxyp6kM2b2zrk6JqIpXxzkruHAMiBsy5wg9jp/183GdiRXCvBtzsYg== + dependencies: + is-typedarray "1.0.0" + typedarray-to-buffer "3.1.5" + +encoding-down@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== + dependencies: + abstract-leveldown "^6.2.1" + inherits "^2.0.3" + level-codec "^9.0.0" + level-errors "^2.0.0" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.0: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +errno@~0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^0.2.0: + version "0.2.5" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.2.5.tgz#dfa636f0fa1978d962a13362d0850befb9ab8e7e" + integrity sha512-aWvqiegXgSTwbuDE1DDnM7taLteLcHVHh5nMZnnD2dwlvH6w5bOxcdXW20oS+1aLDorDlrK1c82stB8jsLDN5Q== + dependencies: + "@noble/hashes" "^0.5.7" + "@noble/secp256k1" "^1.4.0" + micro-base "^0.10.1" + +ethereum-cryptography@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.0.tgz#7048d184ff365a5255ced5cc9eb7682a273c4db7" + integrity sha512-wyNVTBR4wIR2yoXdMv4Qt44mTVBpPgSW/DQCTmNO6nQluwpyrAIvmL4mxPbziFuc6VWJQa3rwUxn0nUFU03nyQ== + dependencies: + "@noble/hashes" "1.1.1" + "@noble/secp256k1" "1.6.0" + "@scure/bip32" "1.1.0" + "@scure/bip39" "1.1.0" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" + integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethereumjs-wallet@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz#2c000504b4c71e8f3782dabe1113d192522e99b6" + integrity sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA== + dependencies: + aes-js "^3.1.2" + bs58check "^2.1.2" + ethereum-cryptography "^0.1.3" + ethereumjs-util "^7.1.2" + randombytes "^2.1.0" + scrypt-js "^3.0.1" + utf8 "^3.0.0" + uuid "^8.3.2" + +ethers@^5.4.6: + version "5.6.8" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.8.tgz#d36b816b4896341a80a8bbd2a44e8cb6e9b98dd4" + integrity sha512-YxIGaltAOdvBFPZwIkyHnXbW40f1r8mHUgapW6dxkO+6t7H6wY8POUn0Kbxrd/N7I4hHxyi7YCddMAH/wmho2w== + dependencies: + "@ethersproject/abi" "5.6.3" + "@ethersproject/abstract-provider" "5.6.1" + "@ethersproject/abstract-signer" "5.6.2" + "@ethersproject/address" "5.6.1" + "@ethersproject/base64" "5.6.1" + "@ethersproject/basex" "5.6.1" + "@ethersproject/bignumber" "5.6.2" + "@ethersproject/bytes" "5.6.1" + "@ethersproject/constants" "5.6.1" + "@ethersproject/contracts" "5.6.2" + "@ethersproject/hash" "5.6.1" + "@ethersproject/hdnode" "5.6.2" + "@ethersproject/json-wallets" "5.6.1" + "@ethersproject/keccak256" "5.6.1" + "@ethersproject/logger" "5.6.0" + "@ethersproject/networks" "5.6.3" + "@ethersproject/pbkdf2" "5.6.1" + "@ethersproject/properties" "5.6.0" + "@ethersproject/providers" "5.6.8" + "@ethersproject/random" "5.6.1" + "@ethersproject/rlp" "5.6.1" + "@ethersproject/sha2" "5.6.1" + "@ethersproject/signing-key" "5.6.2" + "@ethersproject/solidity" "5.6.1" + "@ethersproject/strings" "5.6.1" + "@ethersproject/transactions" "5.6.2" + "@ethersproject/units" "5.6.1" + "@ethersproject/wallet" "5.6.2" + "@ethersproject/web" "5.6.1" + "@ethersproject/wordlists" "5.6.1" + +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exit-hook@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" + integrity sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw== + +fetch-intercept@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/fetch-intercept/-/fetch-intercept-2.4.0.tgz#be8b0f17abaadeea6de52ecdb6e9ed081f03480a" + integrity sha512-BPZ2LM9Dh1ua2ovQf03N6rhWg1qxdVD5qK/G4llvcemt6M+jjxCuIDxJ+6IiG+uz//3UQmgfKEv0gOGvYIxZ7g== + +file-uri-to-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" + integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.12.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + +follow-redirects@^1.14.4, follow-redirects@^1.14.8: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +hardhat@^2.9.9: + version "2.10.0" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.10.0.tgz#23a640293d52ce79388660b2872624b2c6f94e5d" + integrity sha512-9VUorKvWNyW96qFXkwkpDUSeWND3gOZpm0oJ8l63JQJvWhxyxTJ92BcOrNylOKy9hzNNGdMfM2QWNP80fGOjpA== + dependencies: + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/blockchain" "^5.5.2" + "@ethereumjs/common" "^2.6.4" + "@ethereumjs/tx" "^3.5.1" + "@ethereumjs/vm" "^5.9.0" + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@sentry/node" "^5.18.1" + "@solidity-parser/parser" "^0.14.2" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + abort-controller "^3.0.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + ethereumjs-util "^7.1.4" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + lodash "^4.17.11" + merkle-patricia-tree "^4.2.4" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + qs "^6.7.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + slash "^3.0.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + "true-case-path" "^2.2.1" + tsort "0.0.1" + undici "^5.4.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immediate@~3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= + +immutable@^4.0.0-rc.12: + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +index-of-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/index-of-regex/-/index-of-regex-1.0.0.tgz#3a7637b4e27665f6673a4751a20b01477ffbd3ec" + integrity sha1-OnY3tOJ2ZfZnOkdRogsBR3/70+w= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +invariant@2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= + +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + +is-typedarray@1.0.0, is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +keccak@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +level-codec@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" + integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== + dependencies: + buffer "^5.6.0" + +level-concat-iterator@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== + +level-errors@^2.0.0, level-errors@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" + integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.0" + xtend "^4.0.2" + +level-mem@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== + dependencies: + level-packager "^5.0.3" + memdown "^5.0.0" + +level-packager@^5.0.3: + version "5.1.1" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== + dependencies: + encoding-down "^6.3.0" + levelup "^4.3.2" + +level-supports@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + dependencies: + xtend "^4.0.2" + +level-ws@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== + dependencies: + inherits "^2.0.3" + readable-stream "^3.1.0" + xtend "^4.0.1" + +levelup@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== + dependencies: + deferred-leveldown "~5.3.0" + level-errors "~2.0.0" + level-iterator-stream "~4.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loupe@^2.3.1: + version "2.3.4" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + dependencies: + get-func-name "^2.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= + +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memdown@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== + dependencies: + abstract-leveldown "~6.2.1" + functional-red-black-tree "~1.0.1" + immediate "~3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.2.0" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +merkle-patricia-tree@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" + integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== + dependencies: + "@types/levelup" "^4.3.0" + ethereumjs-util "^7.1.4" + level-mem "^5.0.1" + level-ws "^2.0.0" + readable-stream "^3.6.0" + semaphore-async-await "^1.5.1" + +micro-base@^0.10.1: + version "0.10.2" + resolved "https://registry.yarnpkg.com/micro-base/-/micro-base-0.10.2.tgz#f6f9f0bd949ce511883e5a99f9147d80ddc32f5a" + integrity sha512-lqqJrT7lfJtDmmiQ4zRLZuIJBk96t0RAc5pCrrWpL9zDeH5i/SUL85mku9HqzTI/OCZ8EQ3aicbMW+eK5Nyu5w== + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" + integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@2.6.7, node-fetch@^2.6.0: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +pako@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" + integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.17, pbkdf2@^3.0.9: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@^6.7.0: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +randombytes@^2.0.1, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~1.0.26-4: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise@4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.5.tgz#186222c59ae512f3497dfe4d75a9c8461bd0053c" + integrity sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg== + dependencies: + bluebird "^3.5.0" + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +rimraf@^2.2.8: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +rxjs@6: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semaphore-async-await@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= + +semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +source-map-support@^0.5.13: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split-ca@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" + integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY= + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +starknet@3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/starknet/-/starknet-3.9.0.tgz#ee7a3d99effef0998b365d95dd85f9b01cdb463c" + integrity sha512-/sn3WHFX7f+A3vVf3I+Kamg2KIW6494vpCcZWA09IQ5RZXrozjaBtYWT41SoKKWZ3b0Xg8WF//SOkRVCTZOZkQ== + dependencies: + "@ledgerhq/hw-app-eth" "^6.26.0" + "@ledgerhq/hw-transport" "^6.24.1" + "@ledgerhq/hw-transport-webhid" "^6.24.1" + axios "^0.23.0" + bn.js "^5.2.0" + elliptic "^6.5.4" + ethereum-cryptography "^0.2.0" + hash.js "^1.1.7" + json-bigint "^1.0.0" + minimalistic-assert "^1.0.1" + pako "^2.0.4" + superstruct "^0.15.3" + url-join "^4.0.1" + +starknet@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/starknet/-/starknet-3.15.0.tgz#3f9ab20c6d6a094b33272f971f01fc5fa9b92c2a" + integrity sha512-+wqAHky7ffTpyJGGSLkzVt8c2FrMyu/8R1cAB3n++VyuBuTTS9+qD8SLXhXWJiBxCzlznP8KkdWQC9N0SCTokw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + bn.js "^5.2.1" + cross-fetch "^3.1.5" + elliptic "^6.5.4" + ethereum-cryptography "^1.0.3" + fetch-intercept "^2.4.0" + hash.js "^1.1.7" + json-bigint "^1.0.0" + minimalistic-assert "^1.0.1" + pako "^2.0.4" + url-join "^4.0.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= + dependencies: + is-hex-prefixed "1.0.0" + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^0.15.3: + version "0.15.4" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.4.tgz#e3381dd84ca07e704e19f69eda74eee1a5efb1f9" + integrity sha512-eOoMeSbP9ZJChNOm/9RYjE+F36rYR966AAqeG3xhQB02j2sfAUXDp4EQ/7bAOqnlJnuFDB8yvOu50SocvKpUEw== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +tar-fs@~1.16.3: + version "1.16.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" + integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-stream@^1.1.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^2.3.3: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +"true-case-path@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" + integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== + +ts-node@^10.4.0: + version "10.8.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.0.tgz#3ceb5ac3e67ae8025c1950626aafbdecb55d82ce" + integrity sha512-/fNd5Qh+zTt8Vt1KbYZjRHCE9sI5i7nqfD/dzBBRDeVXZXS6kToW6R7tTU6Nd4XavFs0mAVCg29Q//ML7WsZYA== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^1.9.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typedarray-to-buffer@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^4.5.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.2.tgz#1f9aa2ceb9af87cca227813b4310fff0b51593c4" + integrity sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici@^5.4.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.6.0.tgz#3fd695d4454970bae3d151326ee4ab645b8d1962" + integrity sha512-mc+8SY1fXubTrdx4CXDkeFFGV8lI3Tq4I/70U1V8Z6g4iscGII0uLO7CPnDt56bXEbvaKwo2T2+VrteWbZiXiQ== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +url-join@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + +utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@^0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +vscode-jsonrpc@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.1.tgz#f30b0625ebafa0fb3bc53e934ca47b706445e57e" + integrity sha512-N/WKvghIajmEvXpatSzvTvOIz61ZSmOSa4BRA4pTLi+1+jozquQKP/MkaylP9iB68k73Oua1feLQvH3xQuigiQ== + +vscode-languageserver-protocol@^3.15.3: + version "3.17.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.1.tgz#e801762c304f740208b6c804a0cf21f2c87509ed" + integrity sha512-BNlAYgQoYwlSgDLJhSG+DeA8G1JyECqRzM2YO6tMmMji3Ad9Mw6AW7vnZMti90qlAKb0LqAlJfSVGEdqMMNzKg== + dependencies: + vscode-jsonrpc "8.0.1" + vscode-languageserver-types "3.17.1" + +vscode-languageserver-textdocument@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157" + integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ== + +vscode-languageserver-types@3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.1.tgz#c2d87fa7784f8cac389deb3ff1e2d9a7bef07e16" + integrity sha512-K3HqVRPElLZVVPtMeKlsyL9aK0GxGQpvtAUTfX4k7+iJ4mc1M+JM+zQwkgGy2LzY0f0IAafe8MKqIkJrxfGGjQ== + +vscode-languageserver@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz#d76afc68172c27d4327ee74332b468fbc740d762" + integrity sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ== + dependencies: + vscode-languageserver-protocol "^3.15.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@^7.4.6: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..a56da31f5 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,16 @@ +# Chainlink Starknet Documentation + +This repository is a monorepo of the various components required for Chainlink on Starknet. + +- [Contracts](../contracts) + +- [Gauntlet & TS toolchain](../packages-ts) + +- [Ops](../ops) +- [Integration Tests](../integration-tests) +- [Demos & Examples](../examples) + +Additional documentation can be found in this directory. + +- [Getting Started](./getting-started.md) +- [L2 Emergency Protocol](./emergency-protocol/) diff --git a/docs/artifacts.md b/docs/artifacts.md new file mode 100644 index 000000000..216a336a4 --- /dev/null +++ b/docs/artifacts.md @@ -0,0 +1,19 @@ +# Artifacts + +## A Note on Starknet Artifacts + +In `starknet.js` v6.7.0, it is necessary to supply both the sierra and sierra casm compilation outputs to a declare transaction as shown [here](https://www.starknetjs.com/docs/next/guides/create_contract#declare-for-a-new-class). + +The [`declare`](https://github.com/starknet-io/starknet.js/blob/a85d48ee73acb1365da6bef3f9d3a65153f9a422/src/account/default.ts#L393) method uses the [`artifact` field to compute the `class_hash`](https://github.com/starknet-io/starknet.js/blob/a85d48ee73acb1365da6bef3f9d3a65153f9a422/src/utils/contract.ts#L38), and the [`casm` field to compute the `compiled_class_hash`](https://github.com/starknet-io/starknet.js/blob/a85d48ee73acb1365da6bef3f9d3a65153f9a422/src/utils/contract.ts#L30). + +For V2 and V3 declare transactions, both the `class_hash` and `compiled_class_hash` are required to construct the tx hash: + +- [V3 declare transaction docs](https://docs.starknet.io/documentation/architecture_and_concepts/Network_Architecture/transactions/#v3_hash_calculation_2) +- [V2 declare transaction docs](https://docs.starknet.io/documentation/architecture_and_concepts/Network_Architecture/transactions/#v2_deprecated_hash_calculation) + - Side note: even though V2 is deprecated, I'm still including it bc [`starknet.js` defaults to transaction version 2 for backwards compatibility in v6.7.0](https://github.com/starknet-io/starknet.js/blob/a85d48ee73acb1365da6bef3f9d3a65153f9a422/src/account/default.ts#L75) + +If you attempt to pass only the casm artifact alone or the sierra artifact alone, this causes an error like the one below: + +```sh +"Extract compiledClassHash failed, provide (CairoAssembly).casm file or compiledClassHash" +``` diff --git a/docs/assets/godepgraph_starknet_relayer.png b/docs/assets/godepgraph_starknet_relayer.png new file mode 100644 index 000000000..9d60c82a7 Binary files /dev/null and b/docs/assets/godepgraph_starknet_relayer.png differ diff --git a/docs/emergency-protocol/README.md b/docs/emergency-protocol/README.md new file mode 100644 index 000000000..21272c81e --- /dev/null +++ b/docs/emergency-protocol/README.md @@ -0,0 +1,161 @@ +# L2 Emergency Protocol - Starknet + +## Overview + +Today Chainlink price feeds are used by many DeFi protocols to secure billions of dollars. Whilst feeds report fresh prices the majority of the time, L2 feeds will report stale price data whenever the L2 chain stops producing new blocks. This can happen whenever the L2 Sequencer fails to process any new transactions. Whenever this happens, an arbitrage opportunity is created for malicious actors to take advantage of the price difference between the price inside and outside the L2 chain. + +The Starknet Emergency Protocol provides a way for Chainlink price feed consumers to guard against the scenario described above. The protocol tracks the last known health of the Sequencer and reports its health on chain along with the timestamp of when it either comes back online or goes offline. This allows consuming contracts to implement a grace period in their contracts to revert transactions whenever the Sequencer is down. + +For more background information check the [official docs.](https://docs.chain.link/docs/l2-sequencer-flag/) + +**WARNING:** The current implementation of the protocol supports health status detection for Starknet **centralized** Sequencer architecture. As Starknet plans to decentralize the Sequencer in the future, this protocol will either need to be redesigned and reevaluated. The reason for this is that the current protocol relies on polling the `pending` block from the Sequencer to determine if new transactions are being added. A decentralized Starknet sequencer will no longer allow this hence breaking the protocol. [The documentation](https://docs.starknet.io/documentation/develop/Blocks/transaction-life-cycle/#the_pending_block) states: + +> Today, Starknet supports querying the new block before its construction is complete. This feature improves the responsiveness of the system prior to the decentralization phase, but will probably become obsolete once the system is decentralized, as full nodes will only propagate finalized blocks through the network. + +For more information on how the pending block is used, take a look at the [Layer2 Sequencer Health External Adapter](#layer2-sequencer-health-external-adapter) section. + +## Architecture + +The diagram above illustrates the general path of how the Sequencer’s status is relayed from L1 to L2. + +[![](https://mermaid.ink/img/pako:eNqNk99PwjAQx_-VprxCwo8YtSQmOtgTCQaiL46H2l1HQ9fOrosSwv9u59aBzBH3svXu8737Xi87YKZjwARzqT_ZlhqLFqtIIfcwSfN8Bhy5sFBSqB3iQkrSm0wmQRhOUSfGtNSG9DjnLSi31OwU2LrU03B0G46nXdCVQkyrvEjB1IXC-9Hd8GbaBbULLYMVIeTkeTB4QI9JYiCh1qFnqYpf155cxtsrJWv4KEAxMGfxWuAzP6W9_CWzIoUQIK6ovHhPDM22aDFumCoT1N7d2xrKysZ-nAr47fjZ6K992_bfvdscqEtDXoWWnAclfDFWl24xQnO7BQNFWmWu3aqz90qliP85QcNexzqtQdIEAy8PdJppBcq-NaFN9_pPtI9sWpv3m2ttzDXHfeyOKRWx--cOZTjC7rZSiDBxn7GrE-FIHR1XZG5UmMfCzYuJNQX0MS2sXu8V8-eKmQnqBkwx4VTmcPwGV_dK6g)](https://mermaid.live/edit#pako:eNqNk99PwjAQx_-VprxCwo8YtSQmOtgTCQaiL46H2l1HQ9fOrosSwv9u59aBzBH3svXu8737Xi87YKZjwARzqT_ZlhqLFqtIIfcwSfN8Bhy5sFBSqB3iQkrSm0wmQRhOUSfGtNSG9DjnLSi31OwU2LrU03B0G46nXdCVQkyrvEjB1IXC-9Hd8GbaBbULLYMVIeTkeTB4QI9JYiCh1qFnqYpf155cxtsrJWv4KEAxMGfxWuAzP6W9_CWzIoUQIK6ovHhPDM22aDFumCoT1N7d2xrKysZ-nAr47fjZ6K992_bfvdscqEtDXoWWnAclfDFWl24xQnO7BQNFWmWu3aqz90qliP85QcNexzqtQdIEAy8PdJppBcq-NaFN9_pPtI9sWpv3m2ttzDXHfeyOKRWx--cOZTjC7rZSiDBxn7GrE-FIHR1XZG5UmMfCzYuJNQX0MS2sXu8V8-eKmQnqBkwx4VTmcPwGV_dK6g) + +### Contracts + +- L1 Ethereum (Solditiy): + - [StarknetValidator.sol](https://github.com/smartcontractkit/chainlink-starknet/blob/develop/contracts/solidity/emergency/StarknetValidator.sol) +- L2 Starknet (Cairo): + - [SequencerUptimeFeed.cairo](https://github.com/smartcontractkit/chainlink-starknet/blob/develop/contracts/src/chainlink/cairo/emergency/SequencerUptimeFeed/sequencer_uptime_feed.cairo) + +**L1** + +1. The EA is run by a network of Node operators to post the latest sequencer status to the `Aggregator` contract and relayed to the `ValidatorProxy` contract. The `Aggregator` contract then calls the `validate` function in the `ValidatorProxy` contract, which proxies the call to the `StarknetValidator` contract. +2. The `StarknetValidator` then calls the `sendMessageToL2` function on the `Starknet` contract. This message will contain instructions to call the `updateStatus(bool status, uint64 timestamp)` function in the `StarknetSequencerUptimeFeed` contract deployed on L2 +3. The core `Starknet` contract then emits a new `LogMessageToL2` event to to signal that a new message needs to be sent from L1 to L2. + +```javascript +event LogMessageToL2( + address indexed fromAddress, + uint256 indexed toAddress, + uint256 indexed selector, + uint256[] payload, + uint256 nonce +); +``` + +4. The `Sequencer` will then pickup the `LogMessageToL2` event emitted above and forward the message to the target contract on L2. + +**L2** + +1. The Sequencer posts the message to the `starknet_sequencer_uptime_feed` contract and calls the `update_status` function to update the Sequencer status. +2. Consumers can then read from the `aggregator_proxy` contract, which fetches the latest round data from the `starknet_sequencer_uptime_feed` contract. + +## Sequencer Downtime + +### L1 → L2 Transactions + +In the event that the Sequencer is down, messages will not be transmitted from L1 to L2 and **no L2 transactions are executed**. Instead messages will be enqueued in the Sequencer and only processed in the order they arrived later once the Sequencer comes back up. This means that as long as the message from the `StarknetValidator` on L1 is already enqueued in the Starknet Sequencer, the flag on the `starknet_sequencer_uptime_feed` on L2 will be guaranteed to be flipped prior to any subsequent transactions. This happens as the transaction flipping the flag on the uptime feed will get executed before transactions that were enqueued after it. This is further explained in the diagrams below. + +**During Sequencer downtime** + +- New `LogMessageToL2` events emitted are not picked up whilst the Sequencer is down. +- When the Sequencer is down, all L2 transactions sent from L1 are stuck in the pending queue, which lives in Starknet’s centralized Sequencer. +- **Tx1** contains Chainlink’s transaction to set the status of the Sequencer as being down on L2. +- **Tx2** is a transaction made by a consumer that is dependent on + +[![](https://mermaid.ink/img/pako:eNo1jrEOwjAMRH8l8twFxsywMQBlzOImbhPRJMWNBajqvxNU1dO709PJC9jsCDT0Y35bj1zU5W6SqjdLNzBOXrX0EkqWWF0puZAGdRMS2qzH57DDcYPqQAOROGJwdXn51waKp0gGdEWH_DRg0lo9mRwWOrtQMoMuLNQASsntN9k9b84pYP0ngu5xnGn9ATwDPgo)](https://mermaid.live/edit#pako:eNo1jrEOwjAMRH8l8twFxsywMQBlzOImbhPRJMWNBajqvxNU1dO709PJC9jsCDT0Y35bj1zU5W6SqjdLNzBOXrX0EkqWWF0puZAGdRMS2qzH57DDcYPqQAOROGJwdXn51waKp0gGdEWH_DRg0lo9mRwWOrtQMoMuLNQASsntN9k9b84pYP0ngu5xnGn9ATwDPgo) + +**After Sequencer comes back online** + +- `LogMessageToL2` events are picked up and added to the pending queue. +- Transactions in the pending queue are processed chronologically so **Tx1** is processed before **Tx2.** +- As **Tx1** happens before **Tx2, Tx2** will read the status of the Sequencer as being down + +### Bridge Fees + +As of writing, on version v0.11.0, Starknet has begun charging mandatory fees to send messages from L1 to L2. These fees are used to pay for the transaction +on L2. As the Emergency Protocol needs to send messages cross chain, +the protocol needs a way to estimate gas fees. Currently, the `StarkwareValidator` contract on L1 does the following to estimate the amount of required +gas. + +1. Estimate gas fees by running the command below. The command is from Starkware's standard CLI (using version 0.11.0.x) + +``` +starknet estimate_message_fee \ + --feeder_gateway_url=https://alpha4.starknet.io/feeder_gateway/ + --from_address ${L1_SENDER_ADDR} \ + --address ${UPTIME_FEED_ADDR} \ + --function update_status \ + --inputs ${STATUS} ${TIMESTAMP} +``` + +Make sure that the `L1_SENDER_ADDR` is equal to the l1 sender storage variable on the uptime feed, or else the gateway will respond with a revert instead of the values. If you don't set the l1 sender storage variable, it'll be 0 by default (as in the example below) + +Example Query and response: + +``` +starknet estimate_message_fee \ + --feeder_gateway_url=https://alpha4.starknet.io/feeder_gateway/ \ + --from_address 0x0 \ + --address=0x06f4279f832de1afd94ab79aa1766628d2c1e70bc7f74bfba3335db8e728a7e6 \ + --function update_status \ + --inputs 0x1 123123 + +The estimated fee is: 3739595758116898 WEI (0.003740 ETH). +Gas usage: 17266 +Gas price: 216587267353 WEI +``` + +In order to reliably ensure that cross chain messages are sent with sufficient gas, the estimate is multiplied by a buffer. At the time of writing (Starknet v.0.11.0), Starkware has told us that L2 gas prices are equal to L1 gas prices and are denominated in Ethereum Wei, so we use L1 gas price feed to get the gas price: + +1. Read the current L1 gas price from Chainlink's L1 gas price feed +2. Multiply gas price by a buffer +3. Multiply product of above by the number of gas units + +```solidity +gasFee = buffer * l1GasPrice * numGasUnits +``` + +The gas units that it costs is also derived from the starknet estimate_message_fee command (as shown above). + +As of the time of writing (Starknet v. 0.11.0), we recommend a gasAdjustment of 130 (or 1.3x buffer) and a gas units to be 17300. + +### Layer2 Sequencer Health External Adapter + +[Code](https://github.com/smartcontractkit/external-adapters-js/tree/develop/packages/sources/layer2-sequencer-health) + +The emergency protocol requires an off chain component to tracks the health of the centralized Starkware sequencer. Today, this is made up by a DON (Decentralized Oracle Network) that triggers using OCR (Offchain Reporting). A new OCR round is initiated every 30s whereby each node in the DON checks the health of the Sequencer using the Layer2 Sequencer Health External Adapter. If the nodes in the DON determine that the Sequencer’s health has changed, they elect a new leader to write the updated result onto chain as shown in the diagram above. + +**How the External Adapter Works** + +Checking the Starkware Sequencer’s health is currently a two step process + +1. Call the Sequencer directly to fetch the pending block’s details. + 1. Verify that a new block has been produced within 2 minutes by checking the pending block’s `parentHash` + 2. If the pending block’s `parentHash` has not changed, then check the length of the `transactions` field to see if it has increased since the last round +2. Send an empty transaction to a dummy contract at address `0x00000000000000000000000000000000000000000000000000000000000001` + + The EA sends the empty transaction using the StarknetJS library. This transaction tries to call the dummy contract’s `initialize` function with a `maxFee` of 0 + + ```javascript + const DUMMY_ADDRESS = '0x00000000000000000000000000000000000000000000000000000000000001' + const DEFAULT_PRIVATE_KEY = '0x0000000000000000000000000000000000000000000000000000000000000001' + const starkKeyPair = ec.genKeyPair(DEFAULT_PRIVATE_KEY) + const starkKeyPub = ec.getStarkKey(starkKeyPair) + const provider = config.starkwareConfig.provider + const account = new Account(provider, DUMMY_ADDRESS, starkKeyPair) + + account.execute( + { + contractAddress: DUMMY_ADDRESS, + entrypoint: 'initialize', + calldata: [starkKeyPub, '0'], + }, + undefined, + { maxFee: '0' }, + ) + ``` + +3. As the above transaction is expected to fail, the EA will consider the Sequencer as healthy if it receives any of the expected error statuses + 1. `StarknetErrorCode.UNINITIALIZED_CONTRACT` if the dummy contract has not been initialized + 2. `StarknetErrorCode.OUT_OF_RANGE_FEE` if the dummy contract has been initialized by accident. As Starknet is a permissionless network, we cannot guarantee that a user deploys and initializes a contract at the dummy address. As a result, the EA will set the `maxFee` to 0 so that the transaction will fail with the `StarknetErrorCode.OUT_OF_RANGE_FEE` status code. diff --git a/docs/gauntlet/README.md b/docs/gauntlet/README.md index 2c0e03871..dc05f6e2d 100644 --- a/docs/gauntlet/README.md +++ b/docs/gauntlet/README.md @@ -4,10 +4,12 @@ - [Local Install](./getting_started.md#setup) - [Binary](./getting_started.md#binary) - [Basic Setup](./getting_started.md#basic-setup) - - [CLI](../../packages-ts/gauntlet-starknet-cli/README.md) - - [Example Contract](../../packages-ts/gauntlet-starknet-example/README.md) - - [OZ Contracts](../../packages-ts/gauntlet-starknet-oz/README.md) - - [Starkgate Contracts](../../packages-ts/gauntlet-starknet-starkgate/README.md) - - [Argent Contracts](../../packages-ts/gauntlet-starknet-argent/README.md) - - [OCR2 Contracts](../../packages-ts/gauntlet-starknet-ocr2/README.md) + - [CLI](../../packages-ts/starknet-gauntlet-cli/README.md) + - [Example Contract](../../packages-ts/starknet-gauntlet-example/README.md) + - [OZ Contracts](../../packages-ts/starknet-gauntlet-oz/README.md) + - [Starkgate Contracts](../../packages-ts/starknet-gauntlet-token/README.md) + - [Emergency Protocol Contracts](../../packages-ts/starknet-gauntlet-emergency-protocol/README.md) + - [Argent Contracts](../../packages-ts/starknet-gauntlet-argent/README.md) + - [OCR2 Contracts](../../packages-ts/starknet-gauntlet-ocr2/README.md) + - [Multisig Contracts](../../packages-ts/starknet-gauntlet-multisig/README.md) - Contribute diff --git a/docs/gauntlet/getting_started.md b/docs/gauntlet/getting_started.md index 455ce0ee3..64b785d99 100644 --- a/docs/gauntlet/getting_started.md +++ b/docs/gauntlet/getting_started.md @@ -68,6 +68,6 @@ ACCOUNT=0x... PRIVATE_KEY=0x... ``` -In order to get this configuration, go to [how to setup an account](../../packages-ts/gauntlet-starknet-account/README.md#setup-an-account) +In order to get this configuration, go to [how to setup an account](../../packages-ts/starknet-gauntlet-account/README.md#setup-an-account) If you are interacting with a local network and do not want to use any wallet, execute every command with the flag `--noWallet` diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 000000000..a0a943b45 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,30 @@ +# Getting Started + +## Local setup + +```bash +make install +``` + +## Go Modules Dependency + +```mermaid +flowchart LR + subgraph ops + test-helpers + k8s + end + + subgraph relayer + contract-bindings + end + + subgraph integration-tests + smoke + soak + end + + contract-bindings --> integration-tests + test-helpers --> relayer + k8s --> integration-tests +``` diff --git a/docs/integration-tests/README.md b/docs/integration-tests/README.md index 7c845f5e2..779379121 100644 --- a/docs/integration-tests/README.md +++ b/docs/integration-tests/README.md @@ -1,3 +1,249 @@ ## Integration tests -See examples [here](testing.md) +### Run tests + +### Prerequisites + +1. `yarn install` +2. `yarn build` + +#### Smoke + +`cd integration-tests/smoke/ && go test --timeout=2h -v` (from core of repo) + +#### Soak + +Soak tests will run a modified version of the smoke test via a remote runner for the set period. The difference is that +there is no panic when an +error appears, but instead log it. + +##### Run + +`make test-integration-soak` + +##### Env vars + +`TTL=72h` - duration of soak + +`NODE_COUNT` - number of OCR nodes + +`CHAINLINK_IMAGE` - Chainlink docker image repo + +`CHAINLINK_VERSION` - Chainlink docker image version + +`L2_RPC_URL` - This will override the L2 url, used for testnet (optional) + +`PRIVATE_KEY` - Private key for Testnet (optional) + +`ACCOUNT` - Account address on Testnet (optional) + +### Structure + +[Commons](../../integration-tests/common/common.go) - Common Chainlink methods to generate chains, nodes, key bundles + +[Test Commons](../../integration-tests/common/test_common.go) - Test methods to deploy env, configure clients, fetch +client details + +[Starknet Commons](../../ops/devnet/devnet.go) - Methods related to starknet and L2 actions such as minting, L1<>L2 sync + +[Gauntlet wrapper](../../relayer/pkg/starknet/gauntlet_starknet.go) - Wrapper for Starknet gauntlet + +[OCRv2 tests](../../integration-tests/smoke/ocr2_test.go) - Example smoke test to set up environment, configure it and +run the smoke test + +### Writing tests + +See smoke examples [here](../../integration-tests/smoke/ocr2_test.go) + +See soak examples [here](../../integration-tests/soak/tests/ocr_test.go) +and [here](../../integration-tests/soak/soak_runner_test.go) + +1. Instantiate Gauntlet +2. Deploy Cluster +3. Set Gauntlet network +4. Deploy accounts on L2 for the nodes +5. Fund the accounts +6. Deploy L2 LINK token via Gauntlet +7. Deploy L2 Access controller contract via Gauntlet +8. Deploy L2 OCR2 contract via Gauntlet +9. Set OCR2 billing via Gauntlet +10. Set OCR2 config details via Gauntlet +11. Set up boostrap and oracle nodes + +### Metrics and logs (K8) + +1. Navigate to Grafana +2. Search for `chainlink-testing-insights` dashboard +3. Select the starknet namespace + +Here you will find pod logs for all the chainlink nodes as well as Devnet / Geth + +# Testing wiki + +## Testnet + +- Chain name - `Starknet` +- Chain ID - `SN_SEPOLIA` + - Testnet 1 - `[https://alpha4.starknet.io](https://alpha4.starknet.io)` + - Testnet 2 - [`https://alpha4-2.starknet.io`](https://alpha4-2.starknet.io/) + +## Mainnet + +- Chain name - `Starknet` +- Chain ID - `SN_MAIN` + - `[https://alpha-mainnet.starknet.io](https://alpha-mainnet.starknet.io)` + +# Node config + +```bash +[[Starknet]] +Enabled = true +ChainID = '' +[[Starknet.Nodes]] +Name = 'primary' +URL = '' + +[OCR2] +Enabled = true + +[P2P] +[P2P.V2] +Enabled = true +DeltaDial = '5s' +DeltaReconcile = '5s' +ListenAddresses = ['0.0.0.0:6690'] +``` + +# Gauntlet steps + +## Environment file + +```bash +NODE_URL= +ACCOUNT= +PRIVATE_KEY= +CHAINLINK_ENV_USER=John; +CHAINLINK_IMAGE={AWS_OIDC}.dkr.ecr.{AWS_REGION}.amazonaws.com/chainlink; +CHAINLINK_VERSION=develop; +INTERNAL_DOCKER_REPO={AWS_OIDC}.dkr.ecr.{AWS_REGION}.amazonaws.com; # required for mock adapter +L2_RPC_URL=https://alpha4.starknet.io; # testnet only +NODE_COUNT=5; +TEST_DURATION=70h; # for soak +TEST_USE_ENV_VAR_CONFIG=true; # for soak +TTL=72h # for soak +``` + +1. Deploy link + +```bash +yarn gauntlet token:deploy --link +``` + +2. Deploy access controller + +```bash +yarn gauntlet access_controller:deploy +``` + +3. Deploy OCR2 + +```bash +yarn gauntlet ocr2:deploy --minSubmissionValue= --maxSubmissionValue= --decimals= --name= --link= +``` + +4. Deploy proxy + +```bash +yarn gauntlet proxy:deploy +``` + +5. Add access to proxy + +```bash +yarn gauntlet ocr2:add_access --address= +``` + +6. Mint LINK + +```bash +yarn gauntlet token:mint --recipient --amount= +``` + +7. Set billing + +```bash +yarn gauntlet ocr2:set_billing --observationPaymentGjuels= --transmissionPaymentGjuels= +``` + +8. Set config + + 1. Example config testnet + + ```bash + { + "f": 1, + "signers": [ + "ocr2on_starknet_0371028377bfd793b7e2965757e348309e7242802d20253da6ab81c8eb4b4051", + "ocr2on_starknet_073cadfc4474e8c6c79f66fa609da1dbcd5be4299ff9b1f71646206d1faca1fc", + "ocr2on_starknet_0386d1a9d93792c426739f73afa1d0b19782fbf30ae27ce33c9fbd4da659cd80", + "ocr2on_starknet_005360052758819ba2af790469a28353b7ff6f8b84176064ab572f6cc20e5fb4" + ], + "transmitters": [ + "0x0...", + "0x0...", + "0x0...", + "0x0..." + ], + "onchainConfig": "", + "offchainConfig": { + "deltaProgressNanoseconds": 8000000000, + "deltaResendNanoseconds": 30000000000, + "deltaRoundNanoseconds": 3000000000, + "deltaGraceNanoseconds": 1000000000, + "deltaStageNanoseconds": 20000000000, + "rMax": 5, + "s": [ + 1, + 1, + 1, + 1 + ], + "offchainPublicKeys": [ + "ocr2off_starknet_0...", + "ocr2off_starknet_0...", + "ocr2off_starknet_0...", + "ocr2off_starknet_0..." + ], + "peerIds": [ + "12D3..", + "12D3..", + "12D3..", + "12D3.." + ], + "reportingPluginConfig": { + "alphaReportInfinite": false, + "alphaReportPpb": 0, + "alphaAcceptInfinite": false, + "alphaAcceptPpb": 0, + "deltaCNanoseconds": 1000000000 + }, + "maxDurationQueryNanoseconds": 2000000000, + "maxDurationObservationNanoseconds": 1000000000, + "maxDurationReportNanoseconds": 2000000000, + "maxDurationShouldAcceptFinalizedReportNanoseconds": 2000000000, + "maxDurationShouldTransmitAcceptedReportNanoseconds": 2000000000, + "configPublicKeys": [ + "ocr2cfg_starknet_...", + "ocr2cfg_starknet_...", + "ocr2cfg_starknet_...", + "ocr2cfg_starknet_..." + ] + }, + "offchainConfigVersion": 2, + "secret": "some secret you want" + } + ``` + +```bash +yarn gauntlet ocr2:set_config --input= +``` diff --git a/docs/integration-tests/on-demand-soak.md b/docs/integration-tests/on-demand-soak.md new file mode 100644 index 000000000..1c91d30e3 --- /dev/null +++ b/docs/integration-tests/on-demand-soak.md @@ -0,0 +1,22 @@ +## On demand soak test + + +Soak tests can be triggered in GHA remotely with custom duration on devnet / testnet + +1. Navigate to Actions +2. Select Integration Tests - Soak +3. Click run workflow +4. Enter RPC url (Optional this is for testing on testnet) +5. Specify node count (default is 4+1) +6. Specify TTL of the namespace (This is when to destroy the env) +7. Specify duration of the soak (Should be lower than TTL) +8. Enter private key L2 (Optional, only for testnet) +9. Enter account address L2 (Optional, only for testnet) + + +## Monitoring +Tests will print out a namespace in the "TestOCRSoak" phase in the Run tests step (e.g chainlink-ocr-starknet-472d5) + +1. Enter the namespace in grafana chainlink testing insights dashboard and the logs will be visible + +The remote runner contains the test run and outputs. \ No newline at end of file diff --git a/docs/integration-tests/testing.md b/docs/integration-tests/testing.md index e5b0628a6..5b8dc7e04 100644 --- a/docs/integration-tests/testing.md +++ b/docs/integration-tests/testing.md @@ -1,54 +1,5 @@ ## Integration tests usage -Setup k8s context, if you don't have k8s, spin up a local cluster using [this](../kubernetes.md) guide +The testing suite uses `chainlink-env` as the base for programmatic control of kubernetes clusters. -### Run tests using ephemeral envs - -``` -make e2e_test -``` - -### Run tests on a standalone local env - -1. Spin up an env, for example, see yaml file for more options with a stark-devnet/pathfinder real node - -``` -envcli new -p ops/chainlink-starknet.yaml -``` - -2. Check created file in a previous command output, example `Environment setup and written to file environmentFile=chainlink-stark-k42hp.yaml` -3. Run the tests - -``` -ENVIRONMENT_FILE="$(pwd)/chainlink-stark-k42hp.yaml" KEEP_ENVIRONMENTS="Always" make e2e_test -``` - -4. Check the env file or connect command logs for a forwarded `local_ports` and try it in the browser -5. Destroy the env - -``` -envcli rm -e chainlink-stark-b7mt9.yaml -``` - -### Interact with an env using other scripts - -1. Spin up an env, for example, see yaml file for more options with a stark-devnet/pathfinder real node - -``` -envcli new -p ops/chainlink-starknet.yaml -``` - -2. Check created file in a previous command output, example `Environment setup and written to file environmentFile=chainlink-stark-mx7rg.yaml` -3. Connect to your env - -``` -envcli connect -e ${your_env_file_yaml} -``` - -4. Check the env file or connect command logs for a forwarded `local_ports` and try it in the browser -5. Interact using other scripts -6. Destroy the env - -``` -envcli rm -e chainlink-stark-b7mt9.yaml -``` +[Repo + Docs](https://github.com/smartcontractkit/chainlink-env) diff --git a/examples/contracts/aggregator_consumer/.gitignore b/examples/contracts/aggregator_consumer/.gitignore new file mode 100644 index 000000000..73aa31e60 --- /dev/null +++ b/examples/contracts/aggregator_consumer/.gitignore @@ -0,0 +1,2 @@ +target +.snfoundry_cache/ diff --git a/examples/contracts/aggregator_consumer/Makefile b/examples/contracts/aggregator_consumer/Makefile new file mode 100644 index 000000000..01dbccf2a --- /dev/null +++ b/examples/contracts/aggregator_consumer/Makefile @@ -0,0 +1,72 @@ +# The starknet-devnet-rs container version - this version +# supports rpc v0.7 which is needed for snfoundry v0.20.1 +CONTAINER_VERSION="7743a089a33beb75d7012e4aa24745bee8ae0d71" + +export TESTNET_ACCOUNTS_FILE=~/.starknet_accounts/starknet_open_zeppelin_accounts.json +export TESTNET_ACCOUNT_NAME=testnet-account + +export DEVNET_ACCOUNTS_FILE=$(shell pwd)/accounts.json +export DEVNET_ACCOUNT_NAME=devnet-account + +# General Commands + +test: + @snforge test + +devnet: + @printf "\nStarting a local starknet devnet docker container:\n\n" \ + && CONTAINER_VERSION="$(CONTAINER_VERSION)" bash ../../../ops/scripts/devnet-hardhat.sh + +# Account Management Commands + +create-account: + @printf "\nCreating starknet account details for testnet...\n\n" \ + && sncast --profile testnet account create --name "$(TESTNET_ACCOUNT_NAME)" \ + && printf "\nYour accounts:\n\n" \ + && cat $(TESTNET_ACCOUNTS_FILE) \ + && printf "\n\nYou can fund your account here: https://sepolia.starkgate.starknet.io\n" + +add-account: + @printf "\nImporting a prefunded account from starknet devnet container...\n\n" \ + && sncast --profile devnet account add \ + --name "$(DEVNET_ACCOUNT_NAME)" \ + --address "0x4b3f4ba8c00a02b66142a4b1dd41a4dfab4f92650922a3280977b0f03c75ee1" \ + --private-key "0x57b2f8431c772e647712ae93cc616638" \ + && printf "\nYour accounts:\n\n" \ + && cat $(DEVNET_ACCOUNTS_FILE) \ + +deploy-account: + @sncast --profile testnet account deploy --name "$(TESTNET_ACCOUNT_NAME)" --max-fee 0x5af3107a3fff + +# MockAggregator Commands + +ma-deploy: + @cd ./scripts && sncast --profile "$(NETWORK)" script run deploy_mock_aggregator --no-state-file + +ma-set-latest-round: + @cd ./scripts && sncast --profile "$(NETWORK)" script run set_latest_round --no-state-file + +# Aggregator Commands + +agg-read-latest-round: + @cd ./scripts && sncast --profile "$(NETWORK)" script run read_latest_round --no-state-file + +agg-read-decimals: + @cd ./scripts && sncast --profile "$(NETWORK)" script run read_decimals --no-state-file + +# AggregatorConsumer commands + +ac-deploy: + @cd ./scripts && sncast --profile "$(NETWORK)" script run deploy_aggregator_consumer --no-state-file + +ac-read-answer: + @cd ./scripts && sncast --profile "$(NETWORK)" script run read_answer --no-state-file + +ac-set-answer: + @cd ./scripts && sncast --profile "$(NETWORK)" script run set_answer --no-state-file + +# Helpers + +devnet-deploy: + @make ma-deploy NETWORK=devnet && make ac-deploy NETWORK=devnet + diff --git a/examples/contracts/aggregator_consumer/README.md b/examples/contracts/aggregator_consumer/README.md new file mode 100644 index 000000000..cffdf0d1b --- /dev/null +++ b/examples/contracts/aggregator_consumer/README.md @@ -0,0 +1,238 @@ +# Examples + +## Overview + +In this directory you'll find three top-level folders: + +- `src/`: contains sample cairo contracts that demonstrate how one can integrate with Chainlink's core starknet contracts. +- `tests/`: contains cairo tests for the example contracts in `src/`. They showcase some simple usage patterns for the contracts. +- `scripts/`: contains cairo scripts that allow you to interact with the example contracts over testnet or a local starknet devnet container. + +## Prerequisites + +To get started, ensure that you have the following tools installed on your machine: + +- [starknet-foundry (v0.21.0)](https://github.com/foundry-rs/starknet-foundry/releases/tag/v0.21.0) +- [scarb (v2.6.4)](https://github.com/software-mansion/scarb/releases/tag/v2.6.4) + +## Tests + +To run all test cases in the `tests/` directory, you can use the following command: + +```sh +make test +``` + +## Scripts + +### Setup + +#### Using a Local Starknet Docker Devnet + +If you would like to run the scripts against a local starknet devnet container: + +- First, execute the following command to run a [starknet-devnet-rs](https://github.com/0xSpaceShard/starknet-devnet-rs) container: + + ```sh + make devnet + ``` + + If this command is re-run, it will fully stop the container and recreate it. This can be useful in case you'd like to restart from a completely clean state and re-run the deploy scripts. + +- The starknet devnet container comes with a set of prefunded accounts. In order to run the scripts, we'll need to add one of these accounts to a local `accounts.json` file. This can be done using the following command: + + ```sh + make add-account + ``` + +At this point you should be ready to start executing scripts! Feel free to move onto the next section. + +#### Using Testnet + +If you would like to run the scripts against testnet: + +- First, let's generate our account details. We can do this by running the following command: + + ```sh + make create-account + ``` + + Once the account has been created, its info should be stored in an accounts file on your local machine (usually at `~/.starknet_accounts/starknet_open_zeppelin_accounts.json`). + +- Next, you'll need to fund the account with some tokens. This can be achieved by sending tokens from another starknet account or by bridging them with [StarkGate](https://sepolia.starkgate.starknet.io). + +- After you fund the account, you can deploy it to testnet using the following command: + + ```sh + make deploy-account + ``` + +At this point you should be ready to start executing scripts! Feel free to move onto the next section. + +### Running Scripts + +There are several different ways to use the scripts in this repo. We'll cover a few different options below. + +#### Reading Data from an Aggregator + +##### Devnet + +First, let's deploy a mock aggregator contract to our container: + +```sh +make ma-deploy NETWORK=devnet +``` + +Under the hood this command will run a declare transaction followed by a deploy transaction for the MockAggregator contract. This command should output something similar to: + +```text +Declaring and deploying MockAggregator +Declaring contract... +Transaction hash = 0x568d29d07128cba750845b57a4bb77a31f628b6f4288861d8b31d12e71e4c3b +Class hash = 301563338814178704943249302673347019225052832575378055777678731916437560881 +Deploying contract... +Transaction hash = 0xfbc49eb82894a704ce536ab904cdee0fd021b0fba335900f8b9b12cfcd005f +MockAggregator deployed at address: 1566652744716179301065270359129119857774335542042051464747302084192731701184 + +command: script run +status: success +``` + +Once the MockAggregator is deployed, you can read the latest round data using the following command: + +```sh +make agg-read-latest-round NETWORK=devnet +``` + +This should return an output like: + +```text +Result::Ok(CallResult { data: [0, 0, 0, 0, 0] }) +command: script run +status: success +``` + +In this case, there isn't any round data yet since we haven't added any mock data. To set the latest round data, you can run the following command: + +```sh +make ma-set-latest-round NETWORK=devnet +``` + +This should result in an output like: + +```text +Transaction hash = 0x5b57df1db0898caefd01f7d7ff9a300814ef8869a6c475f135d8b5d56e0e3a8 +Result::Ok(InvokeResult { transaction_hash: 2582232800348643522264958893576302212545891688073192089151947336582678242216 }) +command: script run +status: success +``` + +Under the hood, this script sends a transaction to the network which calls `set_latest_round_data` on the `MockAggregator`. The data sent to the function is hardcoded in the script and can be modified in any way you like. Now when we read the latest round data: + +```sh +make agg-read-latest-round NETWORK=devnet +``` + +We should see something like: + +```text +Result::Ok(CallResult { data: [1, 1, 12345, 100000, 200000] }) +command: script run +status: success +``` + +This array of values represents the following: + +```text +[ 1, 1, 12345, 100000, 200000 ] +[roundId, answer, block_num, observation_timestamp, transmittion_timestamp] +``` + +##### Testnet + +The steps and commands used for devnet can also be applied to testnet! However, there are a few noticeable differences: + +- You do not need to deploy a mock aggregator. If you already have the address of a pre-deployed aggregator, you can use it in the `read_latest_round.cairo` script! + +- For all the commands, make sure you use `NETWORK=testnet`. + +#### Deploying an Aggregator Consumer Contract + +##### Devnet + +First, let's restart our devnet container to ensure we're starting from a clean slate: + +```sh +make devnet +``` + +Once the container is restarted, let's deploy the MockAggregator contract and the AggregatorConsumer contract to it: + +```sh +make devnet-deploy +``` + +The AggregatorConsumer is a simple contract that can be used to store the latest answer of an Aggregator contract. It takes the address of an aggregator contract as input (in this case it is the MockAggregator), and it comes with the following methods: + +- `set_answer`: this function sets the answer to a new value. +- `read_answer`: this function reads the answer from storage. The answer is initially set to 0 on deployment. +- `read_ocr_address`: this function returns the address of the aggregator contract. + +At this point, the AggregatorConsumer's answer has not been set, so calling `read_answer` on the AggregatorConsumer contract will return 0. You can run the following commands to verify this: + +Command: + +```sh +make ac-read-answer NETWORK=devnet +``` + +Output: + + +```text +Result::Ok(CallResult { data: [0] }) +command: script run +status: success +``` + +To change this, let's use the set the MockAggregator's latest round data to some dummy values: + +```sh +make ma-set-latest-round NETWORK=devnet +``` + +Now let's query the latest round data from the MockAggregator and store the latest round answer in the AggregatorConsumer: + +```sh +make ac-set-answer NETWORK=devnet +``` + +Now, reading the AggregatorConsumer's answer returns a non-zero value: + +Command: + +```sh +make ac-read-answer NETWORK=devnet +``` + +Output: + +```text +Result::Ok(CallResult { data: [1] }) +command: script run +status: success +``` + +##### Testnet + +The steps and commands used for devnet can also be applied to testnet! However, there are a few noticeable differences: + +- You do not need to use the `make devnet` command or the `make devnet-deploy` command. For contract deployment, you'll most likely want to use the address of a pre-deployed aggregator instead of the MockAggregator. If this is the case, you won't have control over the latest round data, so you can ignore the commands that interact with the MockAggregator (i.e. `make ma-set-latest-round`). For deployment, you can perform the following: + 1. note the address of the Aggregator contract you'd like to use + 1. input the address in the `deploy_aggregator_consumer.cairo` script + 1. run `make ac-deploy NETWORK=testnet` + +- For all the commands, make sure you use `NETWORK=testnet`. + +- The AggregatorConsumer scripts (e.g. `read_answer.cairo` and `set_answer.cairo`) contain the hardcoded address of the AggregatorConsumer for devnet. If you'd like to use these scripts on testnet, the hardcoded AggregatorConsumer address in these scripts will need to be swapped with the address that you receive from `make ac-deploy`. Keep in mind that the address that is printed from `make ac-deploy` may not be hex encoded - if this is the case you'll need to convert it to hex before adding it to the script. + diff --git a/examples/contracts/aggregator_consumer/Scarb.lock b/examples/contracts/aggregator_consumer/Scarb.lock new file mode 100644 index 000000000..586d04a23 --- /dev/null +++ b/examples/contracts/aggregator_consumer/Scarb.lock @@ -0,0 +1,27 @@ +# Code generated by scarb DO NOT EDIT. +version = 1 + +[[package]] +name = "aggregator_consumer" +version = "0.1.0" +dependencies = [ + "chainlink", + "snforge_std", +] + +[[package]] +name = "chainlink" +version = "0.1.0" +dependencies = [ + "openzeppelin", +] + +[[package]] +name = "openzeppelin" +version = "0.10.0" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.10.0#d77082732daab2690ba50742ea41080eb23299d3" + +[[package]] +name = "snforge_std" +version = "0.21.0" +source = "git+https://github.com/foundry-rs/starknet-foundry.git?tag=v0.21.0#2996b8c1dd66b2715fc67e69578089f278a46790" diff --git a/examples/contracts/aggregator_consumer/Scarb.toml b/examples/contracts/aggregator_consumer/Scarb.toml new file mode 100644 index 000000000..e7868b138 --- /dev/null +++ b/examples/contracts/aggregator_consumer/Scarb.toml @@ -0,0 +1,25 @@ +# This project was generated using snforge init +# +# https://foundry-rs.github.io/starknet-foundry/appendix/snforge/init.html +# + +[package] +name = "aggregator_consumer" +version = "0.1.0" +cairo-version = "2.6.3" + +# See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html + +[dependencies] +snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.21.0" } +chainlink = { path = "../../../contracts" } +starknet = ">=2.6.3" + +[lib] + +[[target.starknet-contract]] +casm = true +build-external-contracts = [ + "chainlink::emergency::sequencer_uptime_feed::SequencerUptimeFeed", + "chainlink::ocr2::mocks::mock_aggregator::MockAggregator", +] diff --git a/examples/contracts/aggregator_consumer/scripts/Scarb.lock b/examples/contracts/aggregator_consumer/scripts/Scarb.lock new file mode 100644 index 000000000..efc15f9c8 --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/Scarb.lock @@ -0,0 +1,41 @@ +# Code generated by scarb DO NOT EDIT. +version = 1 + +[[package]] +name = "aggregator_consumer" +version = "0.1.0" +dependencies = [ + "chainlink", + "snforge_std", +] + +[[package]] +name = "chainlink" +version = "0.1.0" +dependencies = [ + "openzeppelin", +] + +[[package]] +name = "openzeppelin" +version = "0.10.0" +source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.10.0#d77082732daab2690ba50742ea41080eb23299d3" + +[[package]] +name = "sncast_std" +version = "0.21.0" +source = "git+https://github.com/foundry-rs/starknet-foundry.git?tag=v0.21.0#2996b8c1dd66b2715fc67e69578089f278a46790" + +[[package]] +name = "snforge_std" +version = "0.21.0" +source = "git+https://github.com/foundry-rs/starknet-foundry.git?tag=v0.21.0#2996b8c1dd66b2715fc67e69578089f278a46790" + +[[package]] +name = "src" +version = "0.1.0" +dependencies = [ + "aggregator_consumer", + "chainlink", + "sncast_std", +] diff --git a/examples/contracts/aggregator_consumer/scripts/Scarb.toml b/examples/contracts/aggregator_consumer/scripts/Scarb.toml new file mode 100644 index 000000000..bf06f1d83 --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/Scarb.toml @@ -0,0 +1,24 @@ +[package] +name = "src" +version = "0.1.0" +cairo-version = "2.6.3" + +# See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html + +[dependencies] +sncast_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.21.0" } +chainlink = { path = "../../../../contracts" } +aggregator_consumer = { path = "../" } +starknet = ">=2.6.3" + +[lib] +casm = true + +[[target.starknet-contract]] +casm = true +build-external-contracts = [ + "chainlink::emergency::sequencer_uptime_feed::SequencerUptimeFeed", + "chainlink::ocr2::mocks::mock_aggregator::MockAggregator", + "aggregator_consumer::ocr2::consumer::AggregatorConsumer" +] + diff --git a/examples/contracts/aggregator_consumer/scripts/src/aggregator.cairo b/examples/contracts/aggregator_consumer/scripts/src/aggregator.cairo new file mode 100644 index 000000000..affdffa8b --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/aggregator.cairo @@ -0,0 +1,2 @@ +mod read_latest_round; +mod read_decimals; diff --git a/examples/contracts/aggregator_consumer/scripts/src/aggregator/read_decimals.cairo b/examples/contracts/aggregator_consumer/scripts/src/aggregator/read_decimals.cairo new file mode 100644 index 000000000..01067fd78 --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/aggregator/read_decimals.cairo @@ -0,0 +1,20 @@ +use sncast_std::{call, CallResult}; + +use starknet::ContractAddress; + +fn main() { + // If you are using testnet, this address may need to be changed + // If you are using the local starknet-devnet-rs container, this can be left alone + let aggregator_address = 0x3c6f82da5dbfa89ec9dbe414f33d23d1720d15568e4a880afcc9b0c3d98d127 + .try_into() + .unwrap(); + + let result = call(aggregator_address, selector!("decimals"), array![]); + if result.is_err() { + println!("{:?}", result.unwrap_err()); + panic_with_felt252('call failed'); + } else { + println!("{:?}", result); + } +} + diff --git a/examples/contracts/aggregator_consumer/scripts/src/aggregator/read_latest_round.cairo b/examples/contracts/aggregator_consumer/scripts/src/aggregator/read_latest_round.cairo new file mode 100644 index 000000000..4a7c5c1b4 --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/aggregator/read_latest_round.cairo @@ -0,0 +1,20 @@ +use sncast_std::{call, CallResult}; + +use starknet::ContractAddress; + +fn main() { + // If you are using testnet, this address may need to be changed + // If you are using the local starknet-devnet-rs container, this can be left alone + let aggregator_address = 0x3c6f82da5dbfa89ec9dbe414f33d23d1720d15568e4a880afcc9b0c3d98d127 + .try_into() + .unwrap(); + + let result = call(aggregator_address, selector!("latest_round_data"), array![]); + if result.is_err() { + println!("{:?}", result.unwrap_err()); + panic_with_felt252('call failed'); + } else { + println!("{:?}", result); + } +} + diff --git a/examples/contracts/aggregator_consumer/scripts/src/consumer.cairo b/examples/contracts/aggregator_consumer/scripts/src/consumer.cairo new file mode 100644 index 000000000..a7a56e7ce --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/consumer.cairo @@ -0,0 +1,3 @@ +mod deploy_aggregator_consumer; +mod read_answer; +mod set_answer; diff --git a/examples/contracts/aggregator_consumer/scripts/src/consumer/deploy_aggregator_consumer.cairo b/examples/contracts/aggregator_consumer/scripts/src/consumer/deploy_aggregator_consumer.cairo new file mode 100644 index 000000000..4d55a13db --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/consumer/deploy_aggregator_consumer.cairo @@ -0,0 +1,57 @@ +use sncast_std::{ + declare, deploy, DeclareResult, DeployResult, get_nonce, DisplayContractAddress, + DisplayClassHash +}; + +use starknet::{ContractAddress, ClassHash}; + +fn declare_and_deploy( + contract_name: ByteArray, constructor_calldata: Array +) -> DeployResult { + let mut class_hash: ClassHash = + 0x6d1dd0e5fa4e0284dcf341997f1d781bc2fb7d76ada684da7a2a33c38031df5 + .try_into() + .unwrap(); + + println!("Declaring contract..."); + let declare_result = declare(contract_name, Option::None, Option::None); + if declare_result.is_err() { + println!("{:?}", declare_result.unwrap_err()); + } else { + class_hash = declare_result.unwrap().class_hash; + } + println!("Class hash = {:?}", class_hash); + + println!("Deploying contract..."); + let nonce = get_nonce('latest'); + let salt = get_nonce('pending'); + let deploy_result = deploy( + class_hash, + constructor_calldata, + Option::Some(salt), + true, + Option::None, + Option::Some(nonce) + ); + if deploy_result.is_err() { + println!("{:?}", deploy_result.unwrap_err()); + panic_with_felt252('deploy failed'); + } + + return deploy_result.unwrap(); +} + +fn main() { + // Point this to the address of the aggregator contract you'd like to use + let aggregator_address: ContractAddress = + 0x3c6f82da5dbfa89ec9dbe414f33d23d1720d15568e4a880afcc9b0c3d98d127 + .try_into() + .unwrap(); + + println!("\nDeclaring and deploying AggregatorConsumer"); + let mut calldata = ArrayTrait::new(); + calldata.append(aggregator_address.into()); + let consumer = declare_and_deploy("AggregatorConsumer", calldata); + println!("AggregatorConsumer deployed at address: {}\n", consumer.contract_address); +} + diff --git a/examples/contracts/aggregator_consumer/scripts/src/consumer/read_answer.cairo b/examples/contracts/aggregator_consumer/scripts/src/consumer/read_answer.cairo new file mode 100644 index 000000000..743431665 --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/consumer/read_answer.cairo @@ -0,0 +1,20 @@ +use sncast_std::{call, CallResult}; + +use starknet::ContractAddress; + +fn main() { + // If you are using testnet, this address may need to be changed + // If you are using the local starknet-devnet-rs container, this can be left alone + let consumer_address = 0x56e078ee90929f13f2ca83545c71b98136c99b22822ada66ad2aff9595439fc + .try_into() + .unwrap(); + + let result = call(consumer_address, selector!("read_answer"), array![]); + if result.is_err() { + println!("{:?}", result.unwrap_err()); + panic_with_felt252('call failed'); + } else { + println!("{:?}", result); + } +} + diff --git a/examples/contracts/aggregator_consumer/scripts/src/consumer/set_answer.cairo b/examples/contracts/aggregator_consumer/scripts/src/consumer/set_answer.cairo new file mode 100644 index 000000000..d53d266a7 --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/consumer/set_answer.cairo @@ -0,0 +1,53 @@ +use sncast_std::{invoke, InvokeResult, call, CallResult, get_nonce}; + +use starknet::ContractAddress; + +fn main() { + // If you are using testnet, this address may need to be changed + // If you are using the local starknet-devnet-rs container, this can be left alone + let consumer_address = 0x56e078ee90929f13f2ca83545c71b98136c99b22822ada66ad2aff9595439fc + .try_into() + .unwrap(); + + // Reads the aggregator address from the AggregatorConsumer + let read_ocr_address = call(consumer_address, selector!("read_ocr_address"), array![]); + if read_ocr_address.is_err() { + println!("{:?}", read_ocr_address.unwrap_err()); + panic_with_felt252('call failed'); + } else { + println!("{:?}", read_ocr_address); + } + + // Queries the aggregator for the latest round data + let mut read_ocr_address_data = read_ocr_address.unwrap().data.span(); + let aggregator_address = Serde::< + starknet::ContractAddress + >::deserialize(ref read_ocr_address_data) + .unwrap(); + let latest_round = call(aggregator_address, selector!("latest_round_data"), array![]); + if latest_round.is_err() { + println!("{:?}", latest_round.unwrap_err()); + panic_with_felt252('call failed'); + } else { + println!("{:?}", latest_round); + } + + // Uses the latest round data to set a new answer on the AggregatorConsumer + let mut latest_round_data = latest_round.unwrap().data.span(); + let round = Serde::::deserialize(ref latest_round_data) + .unwrap(); + let result = invoke( + consumer_address, + selector!("set_answer"), + array![round.answer.into()], + Option::None, + Option::Some(get_nonce('pending')) + ); + if result.is_err() { + println!("{:?}", result.unwrap_err()); + panic_with_felt252('invoke failed'); + } else { + println!("{:?}", result); + } +} + diff --git a/examples/contracts/aggregator_consumer/scripts/src/example.cairo b/examples/contracts/aggregator_consumer/scripts/src/example.cairo new file mode 100644 index 000000000..3d64bded3 --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/example.cairo @@ -0,0 +1,15 @@ +use sncast_std::{call, CallResult}; + +fn main() { + let address = 0x775ee7f2f0b3e15953f4688f7a2ce5a0d1e7c8e18e5f929d461c037f14b690e + .try_into() + .unwrap(); + let result = call(address, selector!("description"), array![]); + if result.is_err() { + println!("{:?}", result.unwrap_err()); + panic_with_felt252('call failed'); + } else { + println!("{:?}", result); + } +} + diff --git a/examples/contracts/aggregator_consumer/scripts/src/lib.cairo b/examples/contracts/aggregator_consumer/scripts/src/lib.cairo new file mode 100644 index 000000000..f4dee19ba --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/lib.cairo @@ -0,0 +1,4 @@ +mod mock_aggregator; +mod aggregator; +mod consumer; +mod example; diff --git a/examples/contracts/aggregator_consumer/scripts/src/mock_aggregator.cairo b/examples/contracts/aggregator_consumer/scripts/src/mock_aggregator.cairo new file mode 100644 index 000000000..e403e772f --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/mock_aggregator.cairo @@ -0,0 +1,2 @@ +mod deploy_mock_aggregator; +mod set_latest_round; diff --git a/examples/contracts/aggregator_consumer/scripts/src/mock_aggregator/deploy_mock_aggregator.cairo b/examples/contracts/aggregator_consumer/scripts/src/mock_aggregator/deploy_mock_aggregator.cairo new file mode 100644 index 000000000..e3ab4e9a6 --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/mock_aggregator/deploy_mock_aggregator.cairo @@ -0,0 +1,52 @@ +use sncast_std::{ + declare, deploy, DeclareResult, DeployResult, get_nonce, DisplayContractAddress, + DisplayClassHash +}; + +use starknet::{ContractAddress, ClassHash}; + +fn declare_and_deploy( + contract_name: ByteArray, constructor_calldata: Array +) -> DeployResult { + let mut class_hash: ClassHash = + 0x728d8a221e2204c88df0642b7c6dcee60f7c3d3b3d5c190cac1ceba5baf15e8 + .try_into() + .unwrap(); + + println!("Declaring contract..."); + let declare_result = declare(contract_name, Option::None, Option::None); + if declare_result.is_err() { + println!("{:?}", declare_result.unwrap_err()); + } else { + class_hash = declare_result.unwrap().class_hash; + } + println!("Class hash = {:?}", class_hash); + + println!("Deploying contract..."); + let nonce = get_nonce('latest'); + let salt = get_nonce('pending'); + let deploy_result = deploy( + class_hash, + constructor_calldata, + Option::Some(salt), + true, + Option::None, + Option::Some(nonce) + ); + if deploy_result.is_err() { + println!("{:?}", deploy_result.unwrap_err()); + panic_with_felt252('deploy failed'); + } + + return deploy_result.unwrap(); +} + +fn main() { + let decimals = 16; + println!("\nDeclaring and deploying MockAggregator"); + let mut calldata = ArrayTrait::new(); + calldata.append(decimals.into()); + let mock_aggregator = declare_and_deploy("MockAggregator", calldata); + println!("MockAggregator deployed at address: {}\n", mock_aggregator.contract_address); +} + diff --git a/examples/contracts/aggregator_consumer/scripts/src/mock_aggregator/set_latest_round.cairo b/examples/contracts/aggregator_consumer/scripts/src/mock_aggregator/set_latest_round.cairo new file mode 100644 index 000000000..d5a2a0150 --- /dev/null +++ b/examples/contracts/aggregator_consumer/scripts/src/mock_aggregator/set_latest_round.cairo @@ -0,0 +1,33 @@ +use sncast_std::{invoke, InvokeResult, get_nonce}; + +use starknet::ContractAddress; + +fn main() { + // If you are using testnet, this address may need to be changed + // If you are using the local starknet-devnet-rs container, this can be left alone + let mock_aggregator_address = 0x3c6f82da5dbfa89ec9dbe414f33d23d1720d15568e4a880afcc9b0c3d98d127 + .try_into() + .unwrap(); + + // Feel free to modify these + let answer = 1; + let block_num = 12345; + let observation_timestamp = 1711716556; + let transmission_timestamp = 1711716514; + + let result = invoke( + mock_aggregator_address, + selector!("set_latest_round_data"), + array![answer, block_num, observation_timestamp, transmission_timestamp], + Option::None, + Option::Some(get_nonce('pending')) + ); + + if result.is_err() { + println!("{:?}", result.unwrap_err()); + panic_with_felt252('invoke failed'); + } else { + println!("{:?}", result); + } +} + diff --git a/examples/contracts/aggregator_consumer/snfoundry.toml b/examples/contracts/aggregator_consumer/snfoundry.toml new file mode 100644 index 000000000..e9a340351 --- /dev/null +++ b/examples/contracts/aggregator_consumer/snfoundry.toml @@ -0,0 +1,16 @@ +# A full list of RPC endpoints can be found here: +# +# https://blastapi.io/public-api/starknet +# +[sncast.devnet] +url = "http://127.0.0.1:5050/rpc" +accounts-file = "$DEVNET_ACCOUNTS_FILE" +account = "$DEVNET_ACCOUNT_NAME" +hex-format = true + +[sncast.testnet] +url = "https://starknet-sepolia.public.blastapi.io/rpc/v0_7" +accounts-file = "$TESTNET_ACCOUNTS_FILE" +account = "$TESTNET_ACCOUNT_NAME" +hex-format = true + diff --git a/examples/contracts/aggregator_consumer/src/lib.cairo b/examples/contracts/aggregator_consumer/src/lib.cairo new file mode 100644 index 000000000..ea174388f --- /dev/null +++ b/examples/contracts/aggregator_consumer/src/lib.cairo @@ -0,0 +1,2 @@ +pub mod ocr2; + diff --git a/examples/contracts/aggregator_consumer/src/ocr2.cairo b/examples/contracts/aggregator_consumer/src/ocr2.cairo new file mode 100644 index 000000000..8947aa72c --- /dev/null +++ b/examples/contracts/aggregator_consumer/src/ocr2.cairo @@ -0,0 +1,2 @@ +pub mod price_consumer; +pub mod consumer; diff --git a/examples/contracts/aggregator_consumer/src/ocr2/consumer.cairo b/examples/contracts/aggregator_consumer/src/ocr2/consumer.cairo new file mode 100644 index 000000000..6a8587bbb --- /dev/null +++ b/examples/contracts/aggregator_consumer/src/ocr2/consumer.cairo @@ -0,0 +1,52 @@ +#[starknet::interface] +pub trait IAggregatorConsumer { + fn read_latest_round(self: @TContractState) -> chainlink::ocr2::aggregator::Round; + fn read_ocr_address(self: @TContractState) -> starknet::ContractAddress; + fn read_answer(self: @TContractState) -> u128; + fn set_answer(ref self: TContractState, answer: u128); +} + +#[starknet::contract] +mod AggregatorConsumer { + use starknet::ContractAddress; + use traits::Into; + + use chainlink::ocr2::aggregator::Round; + + use chainlink::ocr2::aggregator_proxy::IAggregator; + use chainlink::ocr2::aggregator_proxy::IAggregatorDispatcher; + use chainlink::ocr2::aggregator_proxy::IAggregatorDispatcherTrait; + + #[storage] + struct Storage { + _ocr_address: ContractAddress, + _answer: u128, + } + + #[constructor] + fn constructor(ref self: ContractState, ocr_address: ContractAddress) { + self._ocr_address.write(ocr_address); + self._answer.write(0); + } + + #[abi(embed_v0)] + impl AggregatorConsumerImpl of super::IAggregatorConsumer { + fn read_latest_round(self: @ContractState) -> Round { + return IAggregatorDispatcher { contract_address: self._ocr_address.read() } + .latest_round_data(); + } + + + fn set_answer(ref self: ContractState, answer: u128) { + self._answer.write(answer); + } + + fn read_answer(self: @ContractState) -> u128 { + return self._answer.read(); + } + + fn read_ocr_address(self: @ContractState) -> ContractAddress { + return self._ocr_address.read(); + } + } +} diff --git a/examples/contracts/aggregator_consumer/src/ocr2/price_consumer.cairo b/examples/contracts/aggregator_consumer/src/ocr2/price_consumer.cairo new file mode 100644 index 000000000..9f2d2e381 --- /dev/null +++ b/examples/contracts/aggregator_consumer/src/ocr2/price_consumer.cairo @@ -0,0 +1,68 @@ +#[starknet::interface] +pub trait IAggregatorPriceConsumer { + fn get_latest_price(self: @TContractState) -> u128; +} + +#[starknet::contract] +mod AggregatorPriceConsumer { + use box::BoxTrait; + use starknet::ContractAddress; + use zeroable::Zeroable; + use traits::Into; + + use chainlink::ocr2::aggregator::Round; + use chainlink::ocr2::aggregator_proxy::IAggregator; + use chainlink::ocr2::aggregator_proxy::IAggregatorDispatcher; + use chainlink::ocr2::aggregator_proxy::IAggregatorDispatcherTrait; + + #[storage] + struct Storage { + _uptime_feed_address: ContractAddress, + _aggregator_address: ContractAddress, + } + + // Sequencer-aware aggregator consumer + // retrieves the latest price from the data feed only if + // the uptime feed is not stale (stale = older than 60 seconds) + #[constructor] + fn constructor( + ref self: ContractState, + uptime_feed_address: ContractAddress, + aggregator_address: ContractAddress + ) { + assert(!uptime_feed_address.is_zero(), 'uptime feed is 0'); + assert(!aggregator_address.is_zero(), 'aggregator is 0'); + self._uptime_feed_address.write(uptime_feed_address); + self._aggregator_address.write(aggregator_address); + } + + + #[abi(embed_v0)] + impl AggregatorPriceConsumerImpl of super::IAggregatorPriceConsumer { + fn get_latest_price(self: @ContractState) -> u128 { + assert_sequencer_healthy(self); + let round = IAggregatorDispatcher { contract_address: self._aggregator_address.read() } + .latest_round_data(); + round.answer + } + } + + fn assert_sequencer_healthy(self: @ContractState) { + let round = IAggregatorDispatcher { contract_address: self._uptime_feed_address.read() } + .latest_round_data(); + let timestamp = starknet::get_block_info().unbox().block_timestamp; + + // After 60 sec the report is considered stale + let report_stale = timestamp - round.updated_at > 60_u64; + + // 0 if the sequencer is up and 1 if it is down. No other options besides 1 and 0 + match round.answer.into() { + 0 => { assert(!report_stale, 'L2 seq up & report stale'); }, + _ => { + assert(!report_stale, 'L2 seq down & report stale'); + assert(false, 'L2 seq down & report ok'); + } + } + } +} + diff --git a/examples/contracts/aggregator_consumer/tests/test_consumer.cairo b/examples/contracts/aggregator_consumer/tests/test_consumer.cairo new file mode 100644 index 000000000..31d86386c --- /dev/null +++ b/examples/contracts/aggregator_consumer/tests/test_consumer.cairo @@ -0,0 +1,113 @@ +use snforge_std::{declare, ContractClassTrait}; + +use chainlink::ocr2::mocks::mock_aggregator::IMockAggregatorDispatcherTrait; +use chainlink::ocr2::mocks::mock_aggregator::IMockAggregatorDispatcher; +use chainlink::ocr2::aggregator_proxy::IAggregatorDispatcherTrait; +use chainlink::ocr2::aggregator_proxy::IAggregatorDispatcher; + +use aggregator_consumer::ocr2::consumer::IAggregatorConsumerDispatcherTrait; +use aggregator_consumer::ocr2::consumer::IAggregatorConsumerDispatcher; + +use starknet::ContractAddress; + +fn deploy_mock_aggregator(decimals: u8) -> ContractAddress { + let mut calldata = ArrayTrait::new(); + calldata.append(decimals.into()); + return declare("MockAggregator").deploy(@calldata).unwrap(); +} + +fn deploy_consumer(aggregator_address: ContractAddress) -> ContractAddress { + let mut calldata = ArrayTrait::new(); + calldata.append(aggregator_address.into()); + return declare("AggregatorConsumer").deploy(@calldata).unwrap(); +} + +#[test] +fn test_read_decimals() { + // Deploys the mock aggregator + let decimals = 16; + let mock_aggregator_address = deploy_mock_aggregator(decimals); + let aggregator_dispatcher = IAggregatorDispatcher { contract_address: mock_aggregator_address }; + + // Let's make sure the constructor arguments were passed in correctly + assert(decimals == aggregator_dispatcher.decimals(), 'Invalid decimals'); +} +#[test] +fn test_set_and_read_latest_round() { + // Deploys the mock aggregator + let mock_aggregator_address = deploy_mock_aggregator(16); + let mock_aggregator_dispatcher = IMockAggregatorDispatcher { + contract_address: mock_aggregator_address + }; + let aggregator_dispatcher = IAggregatorDispatcher { contract_address: mock_aggregator_address }; + + // No round data has been initialized, so reading the latest round should return no data + let empty_latest_round = aggregator_dispatcher.latest_round_data(); + assert(empty_latest_round.round_id == 0, 'round_id != 0'); + assert(empty_latest_round.answer == 0, 'answer != 0'); + assert(empty_latest_round.block_num == 0, 'block_num != 0'); + assert(empty_latest_round.started_at == 0, 'started_at != 0'); + assert(empty_latest_round.updated_at == 0, 'updated_at != 0'); + + // Now let's set the latest round data to some random values + let answer = 1; + let block_num = 12345; + let observation_timestamp = 100000; + let transmission_timestamp = 200000; + mock_aggregator_dispatcher + .set_latest_round_data(answer, block_num, observation_timestamp, transmission_timestamp); + + // The latest round should now have some data + let latest_round = aggregator_dispatcher.latest_round_data(); + assert(latest_round.round_id == 1, 'round_id != 1'); + assert(latest_round.answer == answer, 'bad answer'); + assert(latest_round.block_num == block_num, 'bad block_num'); + assert(latest_round.started_at == observation_timestamp, 'bad started_at'); + assert(latest_round.updated_at == transmission_timestamp, 'bad updated_at'); +} + +#[test] +fn test_set_and_read_answer() { + // Deploys the mock aggregator + let mock_aggregator_address = deploy_mock_aggregator(16); + let mock_aggregator_dispatcher = IMockAggregatorDispatcher { + contract_address: mock_aggregator_address + }; + + // Deploys the consumer + let consumer_address = deploy_consumer(mock_aggregator_address); + let consumer_dispatcher = IAggregatorConsumerDispatcher { contract_address: consumer_address }; + + // Let's make sure the AggregatorConsumer was initialized correctly + assert(consumer_dispatcher.read_ocr_address() == mock_aggregator_address, 'Invalid OCR address'); + assert(consumer_dispatcher.read_answer() == 0, 'Invalid initial answer'); + + // No round data has been initialized, so reading the latest round should return no data + let empty_latest_round = consumer_dispatcher.read_latest_round(); + assert(empty_latest_round.round_id == 0, 'round_id != 0'); + assert(empty_latest_round.answer == 0, 'answer != 0'); + assert(empty_latest_round.block_num == 0, 'block_num != 0'); + assert(empty_latest_round.started_at == 0, 'started_at != 0'); + assert(empty_latest_round.updated_at == 0, 'updated_at != 0'); + + // Now let's set the latest round data to some random values + let answer = 1; + let block_num = 12345; + let observation_timestamp = 100000; + let transmission_timestamp = 200000; + mock_aggregator_dispatcher + .set_latest_round_data(answer, block_num, observation_timestamp, transmission_timestamp); + + // The consumer should be able to query the aggregator for the new latest round data + let latest_round = consumer_dispatcher.read_latest_round(); + assert(latest_round.round_id == 1, 'round_id != 1'); + assert(latest_round.answer == answer, 'bad answer'); + assert(latest_round.block_num == block_num, 'bad block_num'); + assert(latest_round.started_at == observation_timestamp, 'bad started_at'); + assert(latest_round.updated_at == transmission_timestamp, 'bad updated_at'); + + // Now let's test that we can set the answer + consumer_dispatcher.set_answer(latest_round.answer); + assert(answer == consumer_dispatcher.read_answer(), 'Invalid answer'); +} + diff --git a/examples/contracts/aggregator_consumer/tests/test_price_consumer_with_sequencer.cairo b/examples/contracts/aggregator_consumer/tests/test_price_consumer_with_sequencer.cairo new file mode 100644 index 000000000..9582c8030 --- /dev/null +++ b/examples/contracts/aggregator_consumer/tests/test_price_consumer_with_sequencer.cairo @@ -0,0 +1,89 @@ +use snforge_std::{declare, ContractClassTrait, start_prank, stop_prank, CheatTarget}; + +use chainlink::emergency::sequencer_uptime_feed::ISequencerUptimeFeedDispatcherTrait; +use chainlink::emergency::sequencer_uptime_feed::ISequencerUptimeFeedDispatcher; +use chainlink::libraries::access_control::IAccessControllerDispatcherTrait; +use chainlink::libraries::access_control::IAccessControllerDispatcher; +use chainlink::ocr2::mocks::mock_aggregator::IMockAggregatorDispatcherTrait; +use chainlink::ocr2::mocks::mock_aggregator::IMockAggregatorDispatcher; + +use aggregator_consumer::ocr2::price_consumer::IAggregatorPriceConsumerDispatcherTrait; +use aggregator_consumer::ocr2::price_consumer::IAggregatorPriceConsumerDispatcher; + +use starknet::contract_address_const; +use starknet::get_caller_address; +use starknet::ContractAddress; + +fn deploy_mock_aggregator(decimals: u8) -> ContractAddress { + let mut calldata = ArrayTrait::new(); + calldata.append(decimals.into()); + return declare("MockAggregator").deploy(@calldata).unwrap(); +} + +fn deploy_uptime_feed(initial_status: u128, owner_address: ContractAddress) -> ContractAddress { + let mut calldata = ArrayTrait::new(); + calldata.append(initial_status.into()); + calldata.append(owner_address.into()); + return declare("SequencerUptimeFeed").deploy(@calldata).unwrap(); +} + +fn deploy_price_consumer( + uptime_feed_address: ContractAddress, aggregator_address: ContractAddress +) -> ContractAddress { + let mut calldata = ArrayTrait::new(); + calldata.append(uptime_feed_address.into()); + calldata.append(aggregator_address.into()); + return declare("AggregatorPriceConsumer").deploy(@calldata).unwrap(); +} + +#[test] +fn test_get_latest_price() { + // Defines helper variables + let owner = contract_address_const::<1>(); + let init_status = 0; + let decimals = 18; + + // Deploys contracts + let mock_aggregator_address = deploy_mock_aggregator(decimals); + let uptime_feed_address = deploy_uptime_feed(init_status, owner); + let price_consumer_address = deploy_price_consumer( + uptime_feed_address, mock_aggregator_address + ); + + // Adds the price consumer contract to the sequencer uptime feed access control list + // which allows the price consumer to call the get_latest_price function + start_prank(CheatTarget::All, owner); + IAccessControllerDispatcher { contract_address: uptime_feed_address } + .add_access(price_consumer_address); + + // The get_latest_price function returns the mock aggregator's latest round answer. At + // this point in the test, there is only one round that is initialized and that is the + // one that the sequencer uptime feed creates when it is deployed. In its constructor, + // a new round is initialized using its initial status as the round's answer, so the + // latest price should be the initial status that was passed into the sequencer uptime + // feed's constructor. + start_prank(CheatTarget::All, price_consumer_address); + let latest_price = IAggregatorPriceConsumerDispatcher { + contract_address: price_consumer_address + } + .get_latest_price(); + assert(latest_price == init_status, 'latest price is incorrect'); + + // Now let's update the round + stop_prank(CheatTarget::All); + let answer = 1; + let block_num = 12345; + let observation_timestamp = 100000; + let transmission_timestamp = 200000; + IMockAggregatorDispatcher { contract_address: mock_aggregator_address } + .set_latest_round_data(answer, block_num, observation_timestamp, transmission_timestamp); + + // This should now return the updated answer + start_prank(CheatTarget::All, price_consumer_address); + let updated_latest_price = IAggregatorPriceConsumerDispatcher { + contract_address: price_consumer_address + } + .get_latest_price(); + assert(updated_latest_price == answer, 'updated price is incorrect'); +} + diff --git a/examples/spec/ocr2-bootstrap.spec.toml b/examples/spec/ocr2-bootstrap.spec.toml new file mode 100644 index 000000000..b8a387593 --- /dev/null +++ b/examples/spec/ocr2-bootstrap.spec.toml @@ -0,0 +1,10 @@ +type = "bootstrap" +schemaVersion = 1 +relay = "starknet" +name = "" +contractID = "" +p2pPeerID = "" # optional, overrides P2P_PEER_ID + +[relayConfig] +chainID = "goerli-alpha-4" +nodeName = "goerli-alpha-4-node-1" # optional, defaults to random node with 'chainID' diff --git a/examples/spec/ocr2-oracle-simple.spec.toml b/examples/spec/ocr2-oracle-simple.spec.toml new file mode 100644 index 000000000..d95c553a6 --- /dev/null +++ b/examples/spec/ocr2-oracle-simple.spec.toml @@ -0,0 +1,45 @@ +type = "offchainreporting2" +pluginType = "median" +schemaVersion = 1 +relay = "starknet" +name = "" +contractID = "" +p2pBootstrapPeers = ["somep2pkey@localhost-tcp:port"] # optional, overrides P2PV2_BOOTSTRAPPERS +p2pPeerID = "" # optional, overrides P2P_PEER_ID +ocrKeyBundleID = "" # optional, overrides OCR2_KEY_BUNDLE_ID +transmitterID = "" +observationSource = """ + // data source 1 + ds1 [type="bridge" name="bridge-coingecko" requestData=<{"data": {"from":"LINK","to":"USD"}}>] + ds1_parse [type="jsonparse" path="result"] + ds1_multiply [type="multiply" times=100000000] + ds1 -> ds1_parse -> ds1_multiply +""" + +[pluginConfig] +juelsPerFeeCoinSource = """ + // Fetch the LINK price from a data source + // data source 1 + ds1_link [type="bridge" name="bridge-coingecko" requestData=<{"data": {"from":"LINK","to":"USD"}}>] + ds1_link_parse [type="jsonparse" path="result"] + ds1_link -> ds1_link_parse -> divide + + // Fetch the ETH price from a data source + // data source 1 + ds1_coin [type="bridge" name="bridge-coingecko" requestData=<{"data": {"from":"ETH","to":"USD"}}>] + ds1_coin_parse [type="jsonparse" path="result"] + ds1_coin -> ds1_coin_parse -> divide + + // ds1_link_parse (dollars/LINK) + // ds1_coin_parse (dollars/ETH) + // ds1_coin_parse / ds1_link_parse = LINK/ETH + divide [type="divide" input="$(ds1_coin_parse)" divisor="$(ds1_link_parse)" precision="18"] + scale [type="multiply" times=1000000000000000000] + + divide -> scale +""" + +[relayConfig] +chainID = "goerli-alpha-4" +accountAddress = "" +nodeName = "goerli-alpha-4-node-1" # optional, defaults to random node with 'chainID' diff --git a/examples/spec/ocr2-oracle.spec.toml b/examples/spec/ocr2-oracle.spec.toml new file mode 100644 index 000000000..4092ade16 --- /dev/null +++ b/examples/spec/ocr2-oracle.spec.toml @@ -0,0 +1,79 @@ +type = "offchainreporting2" +pluginType = "median" +schemaVersion = 1 +relay = "starknet" +name = "" +contractID = "" +p2pBootstrapPeers = ["somep2pkey@localhost-tcp:port"] # optional, overrides P2PV2_BOOTSTRAPPERS +p2pPeerID = "" # optional, overrides P2P_PEER_ID +ocrKeyBundleID = "" # optional, overrides OCR2_KEY_BUNDLE_ID +transmitterID = "" +observationSource = """ + // data source 1 + ds1 [type="bridge" name="bridge-tiingo" requestData=<{"data": {"from":"BTC","to":"USD"}}>] + ds1_parse [type="jsonparse" path="result"] + ds1_multiply [type="multiply" times=100000000] + ds1 -> ds1_parse -> ds1_multiply -> answer + // data source 2 + ds2 [type="bridge" name="bridge-nomics" requestData=<{"data": {"from":"BTC","to":"USD"}}>] + ds2_parse [type="jsonparse" path="result"] + ds2_multiply [type="multiply" times=100000000] + ds2 -> ds2_parse -> ds2_multiply -> answer + // data source 3 + ds3 [type="bridge" name="bridge-coinmarketcap" requestData=<{"data": {"from":"BTC","to":"USD"}}>] + ds3_parse [type="jsonparse" path="result"] + ds3_multiply [type="multiply" times=100000000] + ds3 -> ds3_parse -> ds3_multiply -> answer + answer [type="median" index=0] +""" + +[pluginConfig] +juelsPerFeeCoinSource = """ + // Fetch the LINK price from three data sources + // data source 1 + ds1_link [type="bridge" name="bridge-tiingo" requestData=<{"data": {"from":"LINK","to":"USD"}}>] + ds1_link_parse [type="jsonparse" path="result"] + ds1_link -> ds1_link_parse -> median_link + // data source 2 + ds2_link [type="bridge" name="bridge-nomics" requestData=<{"data": {"from":"LINK","to":"USD"}}>] + ds2_link_parse [type="jsonparse" path="result"] + ds2_link -> ds2_link_parse -> median_link + // data source 3 + ds3_link [type="bridge" name="bridge-coinmarketcap" requestData=<{"data": {"from":"LINK","to":"USD"}}>] + ds3_link_parse [type="jsonparse" path="result"] + ds3_link -> ds3_link_parse -> median_link + + // Fetch the ETH price from three data sources + // data source 1 + ds1_coin [type="bridge" name="bridge-tiingo" requestData=<{"data": {"from":"ETH","to":"USD"}}>] + ds1_coin_parse [type="jsonparse" path="result"] + ds1_coin -> ds1_coin_parse -> median_coin + // data source 2 + ds2_coin [type="bridge" name="bridge-nomics" requestData=<{"data": {"from":"ETH","to":"USD"}}>] + ds2_coin_parse [type="jsonparse" path="result"] + ds2_coin -> ds2_coin_parse -> median_coin + // data source 3 + ds3_coin [type="bridge" name="bridge-coinmarketcap" requestData=<{"data": {"from":"ETH","to":"USD"}}>] + ds3_coin_parse [type="jsonparse" path="result"] + ds3_coin -> ds3_coin_parse -> median_coin + + // Compute the medians from all data sources + median_link [type="median" values=<[ $(ds1_link_parse), $(ds2_link_parse), $(ds3_link_parse) ]> allowedFaults=2] + median_coin [type="median" values=<[ $(ds1_coin_parse), $(ds2_coin_parse), $(ds3_coin_parse) ]> allowedFaults=2] + + // Divide and scale appropriately + // median_link (dollars/LINK) + // median_coin (dollars/ETH) + // median_coin / median_link = LINK/ETH + divide [type="divide" input="$(median_coin)" divisor="$(median_link)" precision="18"] + scale [type="multiply" times=1000000000000000000] + + median_link -> divide + median_coin -> divide + divide -> scale +""" + +[relayConfig] +chainID = "goerli-alpha-4" +accountAddress = "" +nodeName = "goerli-alpha-4-node-1" # optional, defaults to random node with 'chainID' diff --git a/flake.lock b/flake.lock index 946070916..83b94c04f 100644 --- a/flake.lock +++ b/flake.lock @@ -1,12 +1,15 @@ { "nodes": { "flake-utils": { + "inputs": { + "systems": "systems" + }, "locked": { - "lastModified": 1649676176, - "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -17,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1650161686, - "narHash": "sha256-70ZWAlOQ9nAZ08OU6WY7n4Ij2kOO199dLfNlvO/+pf8=", + "lastModified": 1723991338, + "narHash": "sha256-Grh5PF0+gootJfOJFenTTxDTYPidA3V28dqJ/WV7iis=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1ffba9f2f683063c2b14c9f4d12c55ad5f4ed887", + "rev": "8a3354191c0d7144db9756a74755672387b702ba", "type": "github" }, "original": { @@ -31,10 +34,60 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1718428119, + "narHash": "sha256-WdWDpNaq6u1IPtxtYHHWpl5BmabtpmLnMAx0RdJ/vo8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e6cea36f83499eb4e9cd184c8a8e823296b50ad5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1724206841, + "narHash": "sha256-L8dKaX4T3k+TR2fEHCfGbH4UXdspovz/pj87iai9qmc=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "45e98fbd62c32e5927e952d2833fa1ba4fb35a61", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" } } }, diff --git a/flake.nix b/flake.nix index 50249d7d5..e9f27e564 100644 --- a/flake.nix +++ b/flake.nix @@ -1,16 +1,46 @@ { - description = "StarkNet integration"; + description = "Starknet integration"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; + rust-overlay.url = "github:oxalica/rust-overlay"; }; - outputs = inputs@{ self, nixpkgs, flake-utils, ... }: - flake-utils.lib.eachDefaultSystem (system: + outputs = inputs@{ self, nixpkgs, flake-utils, rust-overlay, ... }: + flake-utils.lib.eachDefaultSystem (system: let - pkgs = import nixpkgs { inherit system; overlays = [ ]; }; - in rec { - devShell = pkgs.callPackage ./shell.nix {}; + pkgs = import nixpkgs { inherit system; overlays = [ rust-overlay.overlays.default ]; }; + in + { + devShell = pkgs.callPackage ./shell.nix { + inherit pkgs; + scriptDir = toString ./.; # This converts the flake's root directory to a string + }; + + packages = { + starknet-devnet = pkgs.stdenv.mkDerivation rec { + name = "starknet-devnet"; + src = ./ops/scripts; + installPhase = '' + mkdir -p $out/bin + cp $src/devnet-hardhat.sh $out/bin/${name} + cp $src/devnet-hardhat-down.sh $out/bin/ + chmod +x $out/bin/${name} + ''; + }; + + starknet-devnet-down = pkgs.stdenv.mkDerivation rec { + name = "starknet-devnet-down"; + src = ./ops/scripts; + installPhase = '' + mkdir -p $out/bin + cp $src/devnet-hardhat-down.sh $out/bin/${name} + chmod +x $out/bin/${name} + ''; + }; + }; + + formatter = pkgs.nixpkgs-fmt; }); } diff --git a/go.mod b/go.mod deleted file mode 100644 index b9bdcbe90..000000000 --- a/go.mod +++ /dev/null @@ -1,164 +0,0 @@ -module github.com/smartcontractkit/chainlink-starknet - -go 1.18 - -require ( - github.com/smartcontractkit/chainlink-testing-framework v1.1.21 - github.com/smartcontractkit/helmenv v1.0.71 -) - -require ( - cloud.google.com/go v0.99.0 // indirect - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.20 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.15 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v0.4.1 // indirect - github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.1.1 // indirect - github.com/Masterminds/sprig/v3 v3.2.2 // indirect - github.com/Masterminds/squirrel v1.5.2 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/btcsuite/btcd v0.22.0-beta // indirect - github.com/cavaliercoder/grab v2.0.0+incompatible // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect - github.com/containerd/containerd v1.5.10 // indirect - github.com/cyphar/filepath-securejoin v0.2.3 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v20.10.11+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.12+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-metrics v0.0.1 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/ethereum/go-ethereum v1.10.16 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect - github.com/fatih/camelcase v1.0.0 // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/fvbommel/sortorder v1.0.1 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-errors/errors v1.4.1 // indirect - github.com/go-logr/logr v1.2.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.19.15 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.3.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/btree v1.0.1 // indirect - github.com/google/go-cmp v0.5.6 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect - github.com/gorilla/mux v1.8.0 // indirect - github.com/gosuri/uitable v0.0.4 // indirect - github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/huandu/xstrings v1.3.2 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/jmoiron/sqlx v1.3.5 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/kelseyhightower/envconfig v1.4.0 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect - github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/lib/pq v1.10.5 // indirect - github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/magiconair/properties v1.8.5 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/mitchellh/copystructure v1.2.0 // indirect - github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.4.3 // indirect - github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/locker v1.0.1 // indirect - github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect - github.com/morikuni/aec v1.0.0 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/pelletier/go-toml v1.9.4 // indirect - github.com/peterbourgon/diskv v2.0.1+incompatible // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.33.0 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rs/zerolog v1.26.1 // indirect - github.com/rubenv/sql-migrate v0.0.0-20211023115951-9f02b1e13857 // indirect - github.com/russross/blackfriday v1.6.0 // indirect - github.com/satori/go.uuid v1.2.0 // indirect - github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spf13/afero v1.6.0 // indirect - github.com/spf13/cast v1.4.1 // indirect - github.com/spf13/cobra v1.3.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.10.1 // indirect - github.com/stretchr/testify v1.7.1 // indirect - github.com/subosito/gotenv v1.2.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 - github.com/xlab/treeprint v1.1.0 // indirect - go.starlark.net v0.0.0-20211013185944-b0039bd2cfe3 // indirect - golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e // indirect - golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect - golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 // indirect - google.golang.org/grpc v1.43.0 // indirect - google.golang.org/protobuf v1.27.1 // indirect - gopkg.in/gorp.v1 v1.7.2 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.66.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - helm.sh/helm/v3 v3.8.1 // indirect - k8s.io/api v0.23.5 // indirect - k8s.io/apiextensions-apiserver v0.23.4 // indirect - k8s.io/apimachinery v0.23.5 // indirect - k8s.io/apiserver v0.23.4 // indirect - k8s.io/cli-runtime v0.23.5 // indirect - k8s.io/client-go v0.23.5 // indirect - k8s.io/component-base v0.23.5 // indirect - k8s.io/klog/v2 v2.30.0 // indirect - k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect - k8s.io/kubectl v0.23.5 // indirect - k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect - oras.land/oras-go v1.1.0 // indirect - sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect - sigs.k8s.io/kustomize/api v0.10.1 // indirect - sigs.k8s.io/kustomize/kyaml v0.13.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect -) diff --git a/go.sum b/go.sum deleted file mode 100644 index 66d260f09..000000000 --- a/go.sum +++ /dev/null @@ -1,2054 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -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.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go 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 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY= -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/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v56.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -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 h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -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 v0.11.20 h1:s8H1PbCZSqg/DH7JMlOz6YMig6htWLNPsjDdlLqCx3M= -github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -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.15 h1:X+p2GF0GWyOiSmqohIaEeuNFNDY4I4EOlVuUQvFdWMk= -github.com/Azure/go-autorest/autorest/adal v0.9.15/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -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 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -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/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= -github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= -github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= -github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= -github.com/Masterminds/squirrel v1.5.2 h1:UiOEi2ZX4RCSkpiNDQN5kro/XIBpSRk9iTqdIRPzUXE= -github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= -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 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -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.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim v0.9.1 h1:VfDCj+QnY19ktX5TsH22JHcjaZ05RWQiwDbOyEg5ziM= -github.com/Microsoft/hcsshim v0.9.1/go.mod h1:Y/0uV2jUab5kBI7SQgl62at0AVX7uaruzADAVmxm3eM= -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 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -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 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -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 h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -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/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -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-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -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-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/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -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/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= -github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= -github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/cavaliercoder/grab v2.0.0+incompatible h1:wZHbBQx56+Yxjx2TCGDcenhh3cJn7cCLMfkEPmySTSE= -github.com/cavaliercoder/grab v2.0.0+incompatible/go.mod h1:tTBkfNqSBfuMmMBFaO2phgyhdYhiZQ/+iXCZDzcDsMI= -github.com/cenkalti/backoff/v4 v4.1.1/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/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -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 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -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/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/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -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/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/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -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.2 h1:mZBclaSgNDfPWtfhj2xJY28LZ9nYIgzB0pwSURPl6JM= -github.com/containerd/cgroups v1.0.2/go.mod h1:qpbpJ1jmlqsR9f2IyaLPsdkCdnt0rbDVqIDlhuu5tRY= -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/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.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= -github.com/containerd/containerd v1.5.10 h1:3cQ2uRVCkJVcx5VombsE7105Gl9Wrl7ORAO3+4+ogf4= -github.com/containerd/containerd v1.5.10/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= -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/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-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/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/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -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/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-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/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.1/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 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -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/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/denisenkom/go-mssqldb v0.9.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-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684 h1:DBZ2sN7CK6dgvHVpQsQj4sRMCbWTmd17l+5SUCjnQSY= -github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684/go.mod h1:UfCu3YXJJCI+IdnqGgYP82dk2+Joxmv+mUTVBES6wac= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -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/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc= -github.com/docker/cli v20.10.11+incompatible/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.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.11+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U= -github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -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 h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= -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 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= -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/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= -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/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= -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/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= -github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= -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/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= -github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= -github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/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/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -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/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.4.1 h1:IvVlgbzSsaUNudsw5dcXSzF3EWyXTi5XrAdngnuhRyg= -github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -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-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -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-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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 v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -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/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -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.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= -github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= -github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM= -github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= -github.com/gobuffalo/packr/v2 v2.8.1 h1:tkQpju6i3EtMXJ9uoF5GT6kB+LMTimDWD8Xvbz6zDVA= -github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -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/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v3.3.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.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -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/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -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 h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -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.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-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= -github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= -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 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.9.0/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/flatbuffers v1.11.0/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 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -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.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -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-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/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -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.1.5/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 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -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.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -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.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/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= -github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/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/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1/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.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -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 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/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.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -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.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= -github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -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/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= -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.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/karrick/godirwalk v1.15.8 h1:7+rWAZPn9zuRxaIqqT8Ohs2Q2Ac0msBqwRdxNCr2VVs= -github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= -github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.4.0/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.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -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/kortschak/utter v1.0.1/go.mod h1:vSmSjbyrlKjjsL71193LmzBOKgwePk9DH6uFaWHIInc= -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 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -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/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/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -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/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ= -github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -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/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -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/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= -github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= -github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY= -github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= -github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= -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/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -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.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -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.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -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 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -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/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -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/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= -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 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -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 h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -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 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= -github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= -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/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= -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/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/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -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/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -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.7.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.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -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.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.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.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/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 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/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/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -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.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= -github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -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/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/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/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.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -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 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -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.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE= -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -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 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= -github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= -github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc/go.mod h1:HFLT6i9iR4QBOF5rdCyjddC9t59ArqWJV2xx+jwcCMo= -github.com/rubenv/sql-migrate v0.0.0-20211023115951-9f02b1e13857 h1:nI2V0EI64bEYpbyOmwYfk0DYu26j0k4LhC7YS4tKkhA= -github.com/rubenv/sql-migrate v0.0.0-20211023115951-9f02b1e13857/go.mod h1:HFLT6i9iR4QBOF5rdCyjddC9t59ArqWJV2xx+jwcCMo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -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/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/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.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 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartcontractkit/chainlink-testing-framework v1.1.21 h1:a1aBPGHzJn9X5qmGm+NsxfAgn9woYjC3UuinS5mIGNQ= -github.com/smartcontractkit/chainlink-testing-framework v1.1.21/go.mod h1:Squ1stWJdnlxS74X6ie2ucPGp0tjSwW1lxscUdoDTLI= -github.com/smartcontractkit/helmenv v1.0.71 h1:M94EYcDbyu9zBn2iiNJ3rKxpPqJHT4AjY3yQod08QcU= -github.com/smartcontractkit/helmenv v1.0.71/go.mod h1:VbfetB06uItvuxJKdZ6AftpbATYCnT40IaKRr75ebcs= -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/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 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -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 v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -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.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= -github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= -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/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.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -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/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 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -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 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/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/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -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-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -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/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/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/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/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -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/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 v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= -github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= -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 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= -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 h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= -github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= -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/api/v3 v3.5.1/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/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -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.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 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -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/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/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -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/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/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.starlark.net v0.0.0-20211013185944-b0039bd2cfe3 h1:oBcONsksxvpeodDrLjiMDaKHXKAVVfAydhe/792CE/o= -go.starlark.net v0.0.0-20211013185944-b0039bd2cfe3/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= -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.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.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= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -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= -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-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-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/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-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/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-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e h1:1SzTfNOXwIS2oWiMF+6qu0OUDKb0dauo6MoDUQyu+yU= -golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -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-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/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-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -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-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-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/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-20190923162816-aa69164e4478/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-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-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-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-20210220033124-5f55cee0dc0d/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-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d/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 h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/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 h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-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-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-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-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-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-20200107162124-548cf772de50/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-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/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-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-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-20210303074136-134d130e1a04/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-20210316164454-77fc1eacc6aa/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-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-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-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-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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-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-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/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 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -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-20201208040808-7e3f01d25324/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 h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/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/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-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-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-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-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-20200108203644-89082a384178/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-20200308013534-11ec41452d41/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-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -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= -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.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.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.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -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.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -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-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -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-20200108215221-bd8f9a0ef82f/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-20201102152239-715cce707fb0/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/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-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/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-20220107163113-42d7afdf6368 h1:Et6SkiuvnBn+SgrSYXs/BrUpGB4mbdwt4R3vaPIlicA= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -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 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -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 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -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= -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/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= -gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -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.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -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/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/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -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 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -helm.sh/helm/v3 v3.8.1 h1:J1EzhvtvKJRdx9skjUVe5xPN7KK2VA1mVxiQ9Ic5+oU= -helm.sh/helm/v3 v3.8.1/go.mod h1:Nm0Z2ciZFFvR9cRKpiRE2SMhJTgqY0b+ezT2cDcyqNw= -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= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -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.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI= -k8s.io/api v0.23.5 h1:zno3LUiMubxD/V1Zw3ijyKO3wxrhbUF1Ck+VjBvfaoA= -k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8= -k8s.io/apiextensions-apiserver v0.23.4 h1:AFDUEu/yEf0YnuZhqhIFhPLPhhcQQVuR1u3WCh0rveU= -k8s.io/apiextensions-apiserver v0.23.4/go.mod h1:TWYAKymJx7nLMxWCgWm2RYGXHrGlVZnxIlGnvtfYu+g= -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.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -k8s.io/apimachinery v0.23.5 h1:Va7dwhp8wgkUPWsEXk6XglXWU4IKYLKNlv8VkX7SDM0= -k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -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.23.4 h1:zNvQlG+C/ERjuUz4p7eY/0IWHaMixRSBoxgmyIdwo9Y= -k8s.io/apiserver v0.23.4/go.mod h1:A6l/ZcNtxGfPSqbFDoxxOjEjSKBaQmE+UTveOmMkpNc= -k8s.io/cli-runtime v0.23.4/go.mod h1:7KywUNTUibmHPqmpDFuRO1kc9RhsufHv2lkjCm2YZyM= -k8s.io/cli-runtime v0.23.5 h1:Z7XUpGoJZYZB2uNjQfJjMbyDKyVkoBGye62Ap0sWQHY= -k8s.io/cli-runtime v0.23.5/go.mod h1:oY6QDF2qo9xndSq32tqcmRp2UyXssdGrLfjAVymgbx4= -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.23.4/go.mod h1:PKnIL4pqLuvYUK1WU7RLTMYKPiIh7MYShLshtRY9cj0= -k8s.io/client-go v0.23.5 h1:zUXHmEuqx0RY4+CsnkOn5l0GU+skkRXKGJrhmE2SLd8= -k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.23.4/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= -k8s.io/code-generator v0.23.5/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= -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.23.4/go.mod h1:8o3Gg8i2vnUXGPOwciiYlkSaZT+p+7gA9Scoz8y4W4E= -k8s.io/component-base v0.23.5 h1:8qgP5R6jG1BBSXmRYW+dsmitIrpk8F/fPEvgDenMCCE= -k8s.io/component-base v0.23.5/go.mod h1:c5Nq44KZyt1aLl0IpHX82fhsn84Sb0jjzwjpcA42bY0= -k8s.io/component-helpers v0.23.4/go.mod h1:1Pl7L4zukZ054ElzRbvmZ1FJIU8roBXFOeRFu8zipa4= -k8s.io/component-helpers v0.23.5/go.mod h1:5riXJgjTIs+ZB8xnf5M2anZ8iQuq37a0B/0BgoPQuSM= -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/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/gengo v0.0.0-20210813121822-485abfe95c7c/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.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= -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-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kubectl v0.23.4/go.mod h1:Dgb0Rvx/8JKS/C2EuvsNiQc6RZnX0SbHJVG3XUzH6ok= -k8s.io/kubectl v0.23.5 h1:DmDULqCaF4qstj0Im143XmncvqWtJxHzK8IrW2BzlU0= -k8s.io/kubectl v0.23.5/go.mod h1:lLgw7cVY8xbd7o637vOXPca/w6HC205KsPCRDYRCxwE= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/metrics v0.23.4/go.mod h1:cl6sY9BdVT3DubbpqnkPIKi6mn/F2ltkU4yH1tEJ3Bo= -k8s.io/metrics v0.23.5/go.mod h1:WNAtV2a5BYbmDS8+7jSqYYV6E3efuGTpIwJ8PTD1wgs= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -oras.land/oras-go v1.1.0 h1:tfWM1RT7PzUwWphqHU6ptPU3ZhwVnSw/9nEGf519rYg= -oras.land/oras-go v1.1.0/go.mod h1:1A7vR/0KknT2UkJVWh+xMi95I/AhK8ZrxrnUSmXN0bQ= -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.27/go.mod h1:tq2nT0Kx7W+/f2JVE+zxYtUhdjuELJkVpNz+x/QN5R4= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= -sigs.k8s.io/kustomize/api v0.10.1 h1:KgU7hfYoscuqag84kxtzKdEC3mKMb99DPI3a0eaV1d0= -sigs.k8s.io/kustomize/api v0.10.1/go.mod h1:2FigT1QN6xKdcnGS2Ppp1uIWrtWN28Ms8A3OZUZhwr8= -sigs.k8s.io/kustomize/cmd/config v0.10.2/go.mod h1:K2aW7nXJ0AaT+VA/eO0/dzFLxmpFcTzudmAgDwPY1HQ= -sigs.k8s.io/kustomize/kustomize/v4 v4.4.1/go.mod h1:qOKJMMz2mBP+vcS7vK+mNz4HBLjaQSWRY22EF6Tb7Io= -sigs.k8s.io/kustomize/kyaml v0.13.0 h1:9c+ETyNfSrVhxvphs+K2dzT3dh5oVPPEqPOE/cUpScY= -sigs.k8s.io/kustomize/kyaml v0.13.0/go.mod h1:FTJxEZ86ScK184NpGSAQcfEqee0nul8oLCK30D47m4E= -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.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/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= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/packages-ts/gauntlet-starknet-ocr2/src/commands/accessController/deploy.ts b/integration-tests/.root_dir similarity index 100% rename from packages-ts/gauntlet-starknet-ocr2/src/commands/accessController/deploy.ts rename to integration-tests/.root_dir diff --git a/integration-tests/.sample.env b/integration-tests/.sample.env new file mode 100644 index 000000000..6e1d3b074 --- /dev/null +++ b/integration-tests/.sample.env @@ -0,0 +1,24 @@ + +# Starknet settings +export ACCOUNT= +export PRIVATE_KEY= +export NODE_COUNT=5 +export TTL=1h +export L2_RPC_URL= # https://alpha4.starknet.io + +# Test Settings +export KEEP_ENVIRONMENTS="Never" # Always | OnFail | Never +export CHAINLINK_IMAGE="public.ecr.aws/chainlink/chainlink" # Image repo to pull the Chainlink image from +export CHAINLINK_VERSION="1.13.0" # Version of the Chainlink image to pull +export CHAINLINK_ENV_USER="Satoshi-Nakamoto" # Name of the person running the tests (change to your own) +export TEST_LOG_LEVEL="info" # info | debug | trace + +# Soak/Chaos/Load Test Specific Settings +export ENV_JOB_IMAGE="image-location/chainlink-tests:test-tag" # Image repo to pull the remote-test-runner image from. Check the Integration Tests workflow. +export DETACH_RUNNER="true" # true 99% of the time, false if you are debugging soak test issues +export TEST_SUITE="soak" # soak | chaos | load + +# Slack Notification Settings +export SLACK_API_KEY="xoxb-example-key" # API key used to report soak test results to slack +export SLACK_CHANNEL="C000000000" # Channel ID for the slack bot to post test results +export SLACK_USER="U000000000" # User ID of the person running the soak tests to properly notify them \ No newline at end of file diff --git a/integration-tests/README.md b/integration-tests/README.md index ce4ff2ea3..6f71af0e6 100644 --- a/integration-tests/README.md +++ b/integration-tests/README.md @@ -1,7 +1,52 @@ -# Local k8s run +## Integration tests - HOWTO -See [there](../docs/integration-tests/README.md) +### Prerequisites +1. `cd contracts && scarb --profile release build` +2. `yarn install` +3. `yarn build` + +#### TOML preparation +The integration tests are using TOML as the configuration input. The logic and parsing is located under [Test config](./testconfig) + +By default, the tests will be running with the default config set in [default.toml](./testconfig/default.toml). This configuration is set to run on devnet with local docker. + +Fields in the default toml can be overriden by creating an `overrides.toml`file. Any values specified here take precedence and will be overwritten if they overlap with `default.toml`. + +##### Testnet runs +In order to run the tests on Testnet, additional variables need to be specified in the TOML, these would also be pointed out if `network = "testnet"` is set. The additional variables are: + +- `l2_rpc_url` - L2 RPC url +- `account` - Account address on L2 +- `private_key` - Private key for L2 account + +##### Running in k8s + +Set `inside_k8 = true` under `[Common]`. + +#### Run smoke tests + +`cd integration-tests && go test --timeout=2h -v -count=1 -json ./smoke` + + +### On demand soak test + +Navigate to the [workflow](https://github.com/smartcontractkit/chainlink-starknet/actions/workflows/integration-tests-soak.yml). The workflow takes in 3 parameters: + +- Base64 string of the .toml configuration +- Core image tag which defaults to develop +- Test runner tag, only tag needs to be supplied + +Create an `overrides.toml` file in `integration-tests/testconfig` and run `cat overrides.toml | base64`. `inside_k8` needs to be set to true in the .toml in order to run the tests in kubernetes. + +#### Local + +If you want to kick off the test from local: + +- `export TEST_SUITE: soak` +- `export DETACH_RUNNER: true` +- `export ENV_JOB_IMAGE: /chainlink-solana-tests:` +- Base64 the .toml config +- Run `export BASE64_CONFIG_OVERRIDE=""` +- `cd integration-tests/soak && go test -timeout 24h -count=1 -run TestOCRBasicSoak/embedded -test.timeout 30m;` -# Integration Tests -For more information, see the [Chainlink StarkNet Documentation | Integration Tests](../docs/integration-tests). diff --git a/integration-tests/common.go b/integration-tests/common.go deleted file mode 100644 index bb1787507..000000000 --- a/integration-tests/common.go +++ /dev/null @@ -1,263 +0,0 @@ -package integration_tests - -import ( - "context" - "math/big" - "net/url" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/go-resty/resty/v2" - "github.com/rs/zerolog/log" - "github.com/smartcontractkit/chainlink-testing-framework/blockchain" - "github.com/smartcontractkit/chainlink-testing-framework/config" - "github.com/smartcontractkit/helmenv/environment" -) - -// StarkNetNetworkConfig StarkNet network config -type StarkNetNetworkConfig struct { - ContractsDeployed bool `mapstructure:"contracts_deployed" yaml:"contracts_deployed"` - L1BridgeAddr string `mapstructure:"l1_bridge_addr" yaml:"l1_bridge_addr"` - Name string `mapstructure:"name" yaml:"name"` - ChainID int64 `mapstructure:"chain_id" yaml:"chain_id"` - URL string `mapstructure:"url" yaml:"url"` - URLs []string `mapstructure:"urls" yaml:"urls"` - Type string `mapstructure:"type" yaml:"type"` - PrivateKeys []string `mapstructure:"private_keys" yaml:"private_keys"` - ChainlinkTransactionLimit uint64 `mapstructure:"chainlink_transaction_limit" yaml:"chainlink_transaction_limit"` - Timeout time.Duration `mapstructure:"transaction_timeout" yaml:"transaction_timeout"` - MinimumConfirmations int `mapstructure:"minimum_confirmations" yaml:"minimum_confirmations"` - BlockGasLimit uint64 `mapstructure:"block_gas_limit" yaml:"block_gas_limit"` -} - -// GetStarkNetURLs gets remote L1 URL and a local L2 URL -func GetStarkNetURLs(e *environment.Environment) ([]*url.URL, error) { - var urls []*url.URL - l2URLs, err := e.Charts.Connections("starknet").LocalURLsByPort("http", environment.HTTP) - if err != nil { - return nil, err - } - urls = append(urls, l2URLs...) - l1URLs, err := e.Charts.Connections("geth").RemoteURLsByPort("http-rpc", environment.HTTP) - if err != nil { - return nil, err - } - urls = append(urls, l1URLs...) - return urls, nil -} - -func NewStarkNetClient(cfg *StarkNetNetworkConfig, urls []*url.URL) (*StarkNetClient, error) { - ctx, cancel := context.WithCancel(context.Background()) - c := &StarkNetClient{ - ctx: ctx, - cancel: cancel, - cfg: cfg, - urls: urls, - client: resty.New().SetBaseURL(urls[0].String()), - } - if err := c.init(); err != nil { - return nil, err - } - c.autoSyncL1() - return c, nil -} - -type StarkNetClient struct { - ctx context.Context - cancel context.CancelFunc - cfg *StarkNetNetworkConfig - urls []*url.URL - client *resty.Client -} - -func (s *StarkNetClient) autoSyncL1() { - t := time.NewTicker(2 * time.Second) - go func() { - for { - select { - case <-s.ctx.Done(): - log.Debug().Msg("Shutting down L1 sync") - return - case <-t.C: - log.Debug().Msg("Syncing L1") - _, err := s.client.R().Post("/postman/flush") - if err != nil { - log.Error().Err(err).Msg("failed to sync L1") - } - } - } - }() -} - -func (s *StarkNetClient) init() error { - resp, err := s.client.R().SetBody(map[string]interface{}{ - "networkUrl": s.urls[1].String(), - "address": s.cfg.L1BridgeAddr, - }).Post("/postman/load_l1_messaging_contract") - if err != nil { - return err - } - log.Warn().Interface("Response", resp.String()).Msg("Set up L1 messaging contract") - return nil -} - -func (s *StarkNetClient) Get() interface{} { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) GetNetworkName() string { - return "starknet-dev" -} - -func (s *StarkNetClient) GetNetworkType() string { - return "l2_starknet_dev" -} - -func (s *StarkNetClient) GetChainID() *big.Int { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) GetClients() []blockchain.EVMClient { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) GetDefaultWallet() *blockchain.EthereumWallet { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) GetWallets() []*blockchain.EthereumWallet { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) GetNetworkConfig() *config.ETHNetwork { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) SetID(id int) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) SetDefaultWallet(num int) error { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) SetWallets(wallets []*blockchain.EthereumWallet) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) LoadWallets(ns interface{}) error { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) SwitchNode(node int) error { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) HeaderHashByNumber(ctx context.Context, bn *big.Int) (string, error) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) HeaderTimestampByNumber(ctx context.Context, bn *big.Int) (uint64, error) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) LatestBlockNumber(ctx context.Context) (uint64, error) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) Fund(toAddress string, amount *big.Float) error { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) DeployContract(contractName string, deployer blockchain.ContractDeployer) (*common.Address, *types.Transaction, interface{}, error) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) TransactionOpts(from *blockchain.EthereumWallet) (*bind.TransactOpts, error) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) ProcessTransaction(tx *types.Transaction) error { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) IsTxConfirmed(txHash common.Hash) (bool, error) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) ParallelTransactions(enabled bool) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) Close() error { - s.cancel() - return nil -} - -func (s *StarkNetClient) EstimateCostForChainlinkOperations(amountOfOperations int) (*big.Float, error) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) EstimateTransactionGasCost() (*big.Int, error) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) GasStats() *blockchain.GasStats { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) AddHeaderEventSubscription(key string, subscriber blockchain.HeaderEventSubscription) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) DeleteHeaderEventSubscription(key string) { - //TODO implement me - panic("implement me") -} - -func (s *StarkNetClient) WaitForEvents() error { - //TODO implement me - panic("implement me") -} - -func GetStarkNetClient( - _ string, - networkConfig map[string]interface{}, - urls []*url.URL, -) (blockchain.EVMClient, error) { - networkSettings := &StarkNetNetworkConfig{} - err := blockchain.UnmarshalNetworkConfig(networkConfig, networkSettings) - if err != nil { - return nil, err - } - log.Info(). - Interface("URLs", networkSettings.URLs). - Msg("Connecting StarkNet client") - return NewStarkNetClient(networkSettings, urls) -} diff --git a/integration-tests/common/common.go b/integration-tests/common/common.go new file mode 100644 index 000000000..122eb7f32 --- /dev/null +++ b/integration-tests/common/common.go @@ -0,0 +1,314 @@ +package common + +import ( + "fmt" + "os" + "os/exec" + "strconv" + "strings" + "testing" + "time" + + "github.com/google/uuid" + "github.com/lib/pq" + "github.com/rs/zerolog/log" + "github.com/stretchr/testify/require" + "gopkg.in/guregu/null.v4" + + ctfconfig "github.com/smartcontractkit/chainlink-testing-framework/config" + "github.com/smartcontractkit/chainlink-testing-framework/k8s/environment" + "github.com/smartcontractkit/chainlink-testing-framework/k8s/pkg/helm/chainlink" + mock_adapter "github.com/smartcontractkit/chainlink-testing-framework/k8s/pkg/helm/mock-adapter" + "github.com/smartcontractkit/chainlink/integration-tests/client" + "github.com/smartcontractkit/chainlink/integration-tests/docker/test_env" + "github.com/smartcontractkit/chainlink/v2/core/services/job" + + chainconfig "github.com/smartcontractkit/chainlink-starknet/integration-tests/config" + "github.com/smartcontractkit/chainlink-starknet/integration-tests/testconfig" + "github.com/smartcontractkit/chainlink-starknet/ops/devnet" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +type Common struct { + ChainDetails *chainconfig.Config + TestEnvDetails *TestEnvDetails + Env *environment.Environment + RPCDetails *RPCDetails + ChainlinkConfig string + TestConfig *testconfig.TestConfig +} + +type TestEnvDetails struct { + TestDuration time.Duration + K8Config *environment.Config + NodeOpts []test_env.ClNodeOption +} + +type RPCDetails struct { + RPCL1Internal string + RPCL2Internal string + RPCL2InternalAPIKey string + RPCL1External string + RPCL2External string + MockServerURL string + MockServerEndpoint string + P2PPort string +} + +func New(testConfig *testconfig.TestConfig) *Common { + var c *Common + chainDetails := chainconfig.DevnetConfig() + + duration, err := time.ParseDuration(*testConfig.OCR2.TestDuration) + if err != nil { + panic("Invalid test duration") + } + + if *testConfig.Common.Network == "testnet" { + chainDetails = chainconfig.SepoliaConfig() + chainDetails.L2RPCInternal = *testConfig.Common.L2RPCUrl + if testConfig.Common.L2RPCApiKey == nil { + chainDetails.L2RPCInternalAPIKey = "" + } else { + chainDetails.L2RPCInternalAPIKey = *testConfig.Common.L2RPCApiKey + } + } else { + // set up mocked local feedernet server because starknet-devnet does not provide one + localDevnetFeederSrv := starknet.NewTestFeederServer() + chainDetails.FeederURL = localDevnetFeederSrv.URL + } + + c = &Common{ + TestConfig: testConfig, + ChainDetails: chainDetails, + TestEnvDetails: &TestEnvDetails{ + TestDuration: duration, + }, + RPCDetails: &RPCDetails{ + P2PPort: "6690", + RPCL2Internal: chainDetails.L2RPCInternal, + RPCL2InternalAPIKey: chainDetails.L2RPCInternalAPIKey, + }, + } + // provide getters for TestConfig (pointers to chain + rpc details) + c.TestConfig.GetChainID = func() string { return c.ChainDetails.ChainID } + c.TestConfig.GetFeederURL = func() string { return c.ChainDetails.FeederURL } + c.TestConfig.GetRPCL2Internal = func() string { return c.RPCDetails.RPCL2Internal } + c.TestConfig.GetRPCL2InternalAPIKey = func() string { return c.RPCDetails.RPCL2InternalAPIKey } + + return c +} + +func (c *Common) Default(t *testing.T, namespacePrefix string) (*Common, error) { + c.TestEnvDetails.K8Config = &environment.Config{ + NamespacePrefix: fmt.Sprintf("starknet-%s", namespacePrefix), + TTL: c.TestEnvDetails.TestDuration, + Test: t, + } + + if *c.TestConfig.Common.InsideK8s { + tomlString, err := c.TestConfig.GetNodeConfigTOML() + if err != nil { + return nil, err + } + var overrideFn = func(_ interface{}, target interface{}) { + ctfconfig.MustConfigOverrideChainlinkVersion(c.TestConfig.ChainlinkImage, target) + } + cd := chainlink.NewWithOverride(0, map[string]any{ + "toml": tomlString, + "replicas": *c.TestConfig.OCR2.NodeCount, + "chainlink": map[string]interface{}{ + "resources": map[string]interface{}{ + "requests": map[string]interface{}{ + "cpu": "2000m", + "memory": "4Gi", + }, + "limits": map[string]interface{}{ + "cpu": "2000m", + "memory": "4Gi", + }, + }, + }, + "db": map[string]any{ + "image": map[string]any{ + "version": *c.TestConfig.Common.PostgresVersion, + }, + "stateful": c.TestConfig.Common.Stateful, + }, + }, c.TestConfig.ChainlinkImage, overrideFn) + c.Env = environment.New(c.TestEnvDetails.K8Config). + AddHelm(devnet.New(nil)). + AddHelm(mock_adapter.New(nil)). + AddHelm(cd) + } + + return c, nil +} + +func (c *Common) SetLocalEnvironment(t *testing.T) { + // Run scripts to set up local test environment + log.Info().Msg("Starting starknet-devnet container...") + err := exec.Command("../../scripts/devnet.sh").Run() + require.NoError(t, err, "Could not start devnet container") + // TODO: add hardhat too + log.Info().Msg("Starting postgres container...") + err = exec.Command("../../scripts/postgres.sh").Run() + require.NoError(t, err, "Could not start postgres container") + log.Info().Msg("Starting mock adapter...") + err = exec.Command("../../scripts/mock-adapter.sh").Run() + require.NoError(t, err, "Could not start mock adapter") + log.Info().Msg("Starting core nodes...") + cmd := exec.Command("../../scripts/core.sh") + cmd.Env = append(os.Environ(), fmt.Sprintf("CL_CONFIG=%s", c.ChainlinkConfig)) + err = cmd.Run() + require.NoError(t, err, "Could not start core nodes") + log.Info().Msg("Set up local stack complete.") + + // Set ChainlinkNodeDetails + var nodeDetails []*environment.ChainlinkNodeDetail + var basePort = 50100 + for i := 0; i < *c.TestConfig.OCR2.NodeCount; i++ { + dbLocalIP := fmt.Sprintf("postgresql://postgres:postgres@chainlink.postgres:5432/starknet_test_%d?sslmode=disable", i+1) + nodeDetails = append(nodeDetails, &environment.ChainlinkNodeDetail{ + ChartName: "unused", + PodName: "unused", + LocalIP: "http://127.0.0.1:" + strconv.Itoa(basePort+i), + // InternalIP: "http://host.container.internal:" + strconv.Itoa(basePort+i), // TODO: chainlink.core.${i}:6688 + InternalIP: fmt.Sprintf("http://chainlink.core.%d:6688", i+1), // TODO: chainlink.core.1:6688 + DBLocalIP: dbLocalIP, + }) + } + c.Env.ChainlinkNodeDetails = nodeDetails +} + +func (c *Common) TearDownLocalEnvironment(t *testing.T) { + log.Info().Msg("Tearing down core nodes...") + err := exec.Command("../../scripts/core.down.sh").Run() + require.NoError(t, err, "Could not tear down core nodes") + log.Info().Msg("Tearing down mock adapter...") + err = exec.Command("../../scripts/mock-adapter.down.sh").Run() + require.NoError(t, err, "Could not tear down mock adapter") + log.Info().Msg("Tearing down postgres container...") + err = exec.Command("../../scripts/postgres.down.sh").Run() + require.NoError(t, err, "Could not tear down postgres container") + log.Info().Msg("Tearing down devnet container...") + err = exec.Command("../../scripts/devnet.down.sh").Run() + require.NoError(t, err, "Could not tear down devnet container") + log.Info().Msg("Tear down local stack complete.") +} + +func (c *Common) CreateNodeKeysBundle(nodes []*client.ChainlinkClient) ([]client.NodeKeysBundle, error) { + nkb := make([]client.NodeKeysBundle, 0) + for _, n := range nodes { + p2pkeys, err := n.MustReadP2PKeys() + if err != nil { + return nil, err + } + + peerID := p2pkeys.Data[0].Attributes.PeerID + txKey, _, err := n.CreateTxKey(c.ChainDetails.ChainName, c.ChainDetails.ChainID) + if err != nil { + return nil, err + } + ocrKey, _, err := n.CreateOCR2Key(c.ChainDetails.ChainName) + if err != nil { + return nil, err + } + + nkb = append(nkb, client.NodeKeysBundle{ + PeerID: peerID, + OCR2Key: *ocrKey, + TXKey: *txKey, + }) + } + return nkb, nil +} + +// CreateJobsForContract Creates and sets up the boostrap jobs as well as OCR jobs +func (c *Common) CreateJobsForContract(cc *ChainlinkClient, observationSource string, juelsPerFeeCoinSource string, ocrControllerAddress string, accountAddresses []string) error { + // Define node[0] as bootstrap node + cc.bootstrapPeers = []client.P2PData{ + { + InternalIP: cc.ChainlinkNodes[0].InternalIP(), + InternalPort: c.RPCDetails.P2PPort, + PeerID: cc.NKeys[0].PeerID, + }, + } + + // Defining relay config + bootstrapRelayConfig := job.JSONConfig{ + "nodeName": fmt.Sprintf("starknet-OCRv2-%s-%s", "node", uuid.New().String()), + "accountAddress": accountAddresses[0], + "chainID": c.ChainDetails.ChainID, + } + + oracleSpec := job.OCR2OracleSpec{ + ContractID: ocrControllerAddress, + Relay: c.ChainDetails.ChainName, + RelayConfig: bootstrapRelayConfig, + ContractConfigConfirmations: 1, // don't wait for confirmation on devnet + } + // Setting up bootstrap node + jobSpec := &client.OCR2TaskJobSpec{ + Name: fmt.Sprintf("starknet-OCRv2-%s-%s", "bootstrap", uuid.New().String()), + JobType: "bootstrap", + OCR2OracleSpec: oracleSpec, + } + _, _, err := cc.ChainlinkNodes[0].CreateJob(jobSpec) + if err != nil { + return err + } + + var p2pBootstrappers []string + + for i := range cc.bootstrapPeers { + p2pBootstrappers = append(p2pBootstrappers, cc.bootstrapPeers[i].P2PV2Bootstrapper()) + } + + sourceValueBridge := &client.BridgeTypeAttributes{ + Name: "mockserver-bridge", + URL: c.RPCDetails.MockServerEndpoint + "/" + strings.TrimPrefix(c.RPCDetails.MockServerURL, "/"), + } + + // Setting up job specs + for nIdx, n := range cc.ChainlinkNodes { + if nIdx == 0 { + continue + } + err := n.MustCreateBridge(sourceValueBridge) + if err != nil { + return err + } + relayConfig := job.JSONConfig{ + "nodeName": bootstrapRelayConfig["nodeName"], + "accountAddress": accountAddresses[nIdx], + "chainID": bootstrapRelayConfig["chainID"], + } + + oracleSpec = job.OCR2OracleSpec{ + ContractID: ocrControllerAddress, + Relay: c.ChainDetails.ChainName, + RelayConfig: relayConfig, + PluginType: "median", + OCRKeyBundleID: null.StringFrom(cc.NKeys[nIdx].OCR2Key.Data.ID), + TransmitterID: null.StringFrom(cc.NKeys[nIdx].TXKey.Data.ID), + P2PV2Bootstrappers: pq.StringArray{strings.Join(p2pBootstrappers, ",")}, + ContractConfigConfirmations: 1, // don't wait for confirmation on devnet + PluginConfig: job.JSONConfig{ + "juelsPerFeeCoinSource": juelsPerFeeCoinSource, + }, + } + + jobSpec = &client.OCR2TaskJobSpec{ + Name: fmt.Sprintf("starknet-OCRv2-%d-%s", nIdx, uuid.New().String()), + JobType: "offchainreporting2", + OCR2OracleSpec: oracleSpec, + ObservationSource: observationSource, + } + _, err = n.MustCreateJob(jobSpec) + if err != nil { + return err + } + } + return nil +} diff --git a/integration-tests/common/gauntlet_common.go b/integration-tests/common/gauntlet_common.go new file mode 100644 index 000000000..173b64dc5 --- /dev/null +++ b/integration-tests/common/gauntlet_common.go @@ -0,0 +1,147 @@ +package common + +import ( + "encoding/json" + "errors" + "fmt" + "os" + + "github.com/smartcontractkit/chainlink-starknet/integration-tests/utils" +) + +func (m *OCRv2TestState) fundNodes() ([]string, error) { + l := utils.GetTestLogger(m.TestConfig.T) + var nAccounts []string + for _, key := range m.GetNodeKeys() { + if key.TXKey.Data.Attributes.StarkKey == "" { + return nil, errors.New("stark key can't be empty") + } + nAccount, err := m.Clients.GauntletClient.DeployAccountContract(100, key.TXKey.Data.Attributes.StarkKey) + if err != nil { + return nil, err + } + nAccounts = append(nAccounts, nAccount) + } + + if *m.Common.TestConfig.Common.Network == "testnet" { + for _, key := range nAccounts { + // We are not deploying in parallel here due to testnet limitations (429 too many requests) + l.Debug().Msg(fmt.Sprintf("Funding node with address: %s", key)) + _, err := m.Clients.GauntletClient.TransferToken(m.Common.ChainDetails.StarkTokenAddress, key, "10000000000000000000") // Transferring 10 STRK to each node + if err != nil { + return nil, err + } + } + } else { + // The starknet provided mint method does not work so we send a req directly + for _, key := range nAccounts { + res, err := m.TestConfig.Resty.R().SetBody(map[string]any{ + "address": key, + "amount": 900000000000000000, + }).Post("/mint") + if err != nil { + return nil, err + } + l.Info().Msg(fmt.Sprintf("Funding account (WEI): %s", string(res.Body()))) + res, err = m.TestConfig.Resty.R().SetBody(map[string]any{ + "address": key, + "amount": 900000000000000000, + "unit": m.Common.ChainDetails.TokenName, + }).Post("/mint") + if err != nil { + return nil, err + } + l.Info().Msg(fmt.Sprintf("Funding account (FRI): %s", string(res.Body()))) + } + } + + return nAccounts, nil +} + +func (m *OCRv2TestState) deployLinkToken() error { + var err error + m.Contracts.LinkTokenAddr, err = m.Clients.GauntletClient.DeployLinkTokenContract() + if err != nil { + return err + } + err = os.Setenv("LINK", m.Contracts.LinkTokenAddr) + if err != nil { + return err + } + return nil +} + +func (m *OCRv2TestState) deployAccessController() error { + var err error + m.Contracts.AccessControllerAddr, err = m.Clients.GauntletClient.DeployAccessControllerContract() + if err != nil { + return err + } + err = os.Setenv("BILLING_ACCESS_CONTROLLER", m.Contracts.AccessControllerAddr) + if err != nil { + return err + } + return nil +} + +func (m *OCRv2TestState) setConfigDetails(ocrAddress string) error { + cfg, err := m.LoadOCR2Config() + if err != nil { + return err + } + var parsedConfig []byte + parsedConfig, err = json.Marshal(cfg) + if err != nil { + return err + } + _, err = m.Clients.GauntletClient.SetConfigDetails(string(parsedConfig), ocrAddress) + return err +} + +func (m *OCRv2TestState) DeployGauntlet(minSubmissionValue int64, maxSubmissionValue int64, decimals int, name string, observationPaymentGjuels int64, transmissionPaymentGjuels int64) error { + err := m.Clients.GauntletClient.InstallDependencies() + if err != nil { + return err + } + + m.Clients.ChainlinkClient.AccountAddresses, err = m.fundNodes() + if err != nil { + return err + } + + err = m.deployLinkToken() + if err != nil { + return err + } + + err = m.deployAccessController() + if err != nil { + return err + } + + m.Contracts.OCRAddr, err = m.Clients.GauntletClient.DeployOCR2ControllerContract(minSubmissionValue, maxSubmissionValue, decimals, name, m.Contracts.LinkTokenAddr) + if err != nil { + return err + } + + m.Contracts.ProxyAddr, err = m.Clients.GauntletClient.DeployOCR2ProxyContract(m.Contracts.OCRAddr) + if err != nil { + return err + } + _, err = m.Clients.GauntletClient.AddAccess(m.Contracts.OCRAddr, m.Contracts.ProxyAddr) + if err != nil { + return err + } + + _, err = m.Clients.GauntletClient.MintLinkToken(m.Contracts.LinkTokenAddr, m.Contracts.OCRAddr, "100000000000000000000") + if err != nil { + return err + } + _, err = m.Clients.GauntletClient.SetOCRBilling(observationPaymentGjuels, transmissionPaymentGjuels, m.Contracts.OCRAddr) + if err != nil { + return err + } + + err = m.setConfigDetails(m.Contracts.OCRAddr) + return err +} diff --git a/integration-tests/common/test_common.go b/integration-tests/common/test_common.go new file mode 100644 index 000000000..3d391a411 --- /dev/null +++ b/integration-tests/common/test_common.go @@ -0,0 +1,441 @@ +package common + +import ( + "context" + "fmt" + "math/big" + "net/http" + "testing" + "time" + + "github.com/NethermindEth/juno/core/felt" + starknetdevnet "github.com/NethermindEth/starknet.go/devnet" + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/go-resty/resty/v2" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + test_env_ctf "github.com/smartcontractkit/chainlink-testing-framework/docker/test_env" + "github.com/smartcontractkit/chainlink-testing-framework/logging" + "github.com/smartcontractkit/chainlink/integration-tests/client" + "github.com/smartcontractkit/chainlink/integration-tests/docker/test_env" + + test_env_starknet "github.com/smartcontractkit/chainlink-starknet/integration-tests/docker/testenv" + "github.com/smartcontractkit/chainlink-starknet/integration-tests/testconfig" + + "github.com/smartcontractkit/chainlink-starknet/ops" + "github.com/smartcontractkit/chainlink-starknet/ops/gauntlet" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +var ( + rpcRequestTimeout = time.Second * 300 +) + +// OCRv2TestState Main testing state struct +type OCRv2TestState struct { + Account *AccountDetails + Clients *Clients + ChainlinkNodesK8s []*client.ChainlinkK8sClient + Common *Common + TestConfig *TestConfig + Contracts *Contracts +} + +// AccountDetails for deployment and funding +type AccountDetails struct { + Account string + PrivateKey string +} + +// Clients to access internal methods +type Clients struct { + StarknetClient *starknet.Client + DevnetClient *starknetdevnet.DevNet + KillgraveClient *test_env_ctf.Killgrave + OCR2Client *ocr2.Client + ChainlinkClient *ChainlinkClient + GauntletClient *gauntlet.StarknetGauntlet + DockerEnv *StarknetClusterTestEnv +} + +// Contracts to store current deployed contract state +type Contracts struct { + LinkTokenAddr string + OCRAddr string + AccessControllerAddr string + ProxyAddr string + ObservationSource string + JuelsPerFeeCoinSource string +} + +// ChainlinkClient core node configs +type ChainlinkClient struct { + NKeys []client.NodeKeysBundle + ChainlinkNodes []*client.ChainlinkClient + bTypeAttr *client.BridgeTypeAttributes + bootstrapPeers []client.P2PData + AccountAddresses []string +} + +type StarknetClusterTestEnv struct { + *test_env.CLClusterTestEnv + Starknet *test_env_starknet.Starknet + Killgrave *test_env_ctf.Killgrave +} + +type TestConfig struct { + T *testing.T + L zerolog.Logger + TestConfig *testconfig.TestConfig + Resty *resty.Client + err error +} + +func NewOCRv2State(t *testing.T, namespacePrefix string, testConfig *testconfig.TestConfig) (*OCRv2TestState, error) { + c, err := New(testConfig).Default(t, namespacePrefix) + if err != nil { + return nil, err + } + state := &OCRv2TestState{ + Account: &AccountDetails{}, + Clients: &Clients{ + ChainlinkClient: &ChainlinkClient{}, + }, + Common: c, + TestConfig: &TestConfig{ + T: t, + L: log.Logger, + TestConfig: testConfig, + Resty: nil, + err: nil, + }, + Contracts: &Contracts{}, + } + + // Setting default job configs + state.Contracts.ObservationSource = state.GetDefaultObservationSource() + state.Contracts.JuelsPerFeeCoinSource = state.GetDefaultJuelsPerFeeCoinSource() + + if state.TestConfig.T != nil { + state.TestConfig.L = logging.GetTestLogger(state.TestConfig.T) + } + + return state, nil +} + +// DeployCluster Deploys and sets up config of the environment and nodes +func (m *OCRv2TestState) DeployCluster() { + // When running soak we need to use K8S + if *m.Common.TestConfig.Common.InsideK8s { + m.DeployEnv() + + if m.Common.Env.WillUseRemoteRunner() { + return + } + + m.Common.RPCDetails.RPCL2External = m.Common.Env.URLs["starknet-dev"][0] + + // Checking whether we are running in a remote runner since the forwarding is not working there and we need the public IP + // In that case it is http://127.0.0.1:0 so we do a check and get the public IP + if m.Common.RPCDetails.RPCL2External == "http://127.0.0.1:0" { + m.Common.RPCDetails.RPCL2External = m.Common.Env.URLs["starknet-dev"][1] + } + + // Setting RPC details + if *m.Common.TestConfig.Common.Network == "testnet" { + m.Common.RPCDetails.RPCL2External = *m.Common.TestConfig.Common.L2RPCUrl + m.Common.RPCDetails.RPCL2Internal = *m.Common.TestConfig.Common.L2RPCUrl + } + m.Common.RPCDetails.MockServerEndpoint = m.Common.Env.URLs["qa_mock_adapter_internal"][0] + m.Common.RPCDetails.MockServerURL = "five" + } else { // Otherwise use docker + env, err := test_env.NewTestEnv() + require.NoError(m.TestConfig.T, err) + stark := test_env_starknet.NewStarknet([]string{env.DockerNetwork.Name}, *m.Common.TestConfig.Common.DevnetImage) + err = stark.StartContainer() + require.NoError(m.TestConfig.T, err) + + // Setting RPC details + m.Common.RPCDetails.RPCL2External = stark.ExternalHTTPURL + m.Common.RPCDetails.RPCL2Internal = stark.InternalHTTPURL + + if *m.Common.TestConfig.Common.Network == "testnet" { + m.Common.RPCDetails.RPCL2External = *m.Common.TestConfig.Common.L2RPCUrl + m.Common.RPCDetails.RPCL2Internal = *m.Common.TestConfig.Common.L2RPCUrl + } + + // Creating docker containers + b, err := test_env.NewCLTestEnvBuilder(). + WithNonEVM(). + WithTestInstance(m.TestConfig.T). + WithTestConfig(m.TestConfig.TestConfig). + WithMockAdapter(). + WithCLNodes(*m.Common.TestConfig.OCR2.NodeCount). + WithCLNodeOptions(m.Common.TestEnvDetails.NodeOpts...). + WithStandardCleanup(). + WithTestEnv(env) + require.NoError(m.TestConfig.T, err) + env, err = b.Build() + require.NoError(m.TestConfig.T, err) + m.Clients.DockerEnv = &StarknetClusterTestEnv{ + CLClusterTestEnv: env, + Starknet: stark, + Killgrave: env.MockAdapter, + } + + // Setting up Mock adapter + m.Clients.KillgraveClient = env.MockAdapter + m.Common.RPCDetails.MockServerEndpoint = m.Clients.KillgraveClient.InternalEndpoint + m.Common.RPCDetails.MockServerURL = "mockserver-bridge" + err = m.Clients.KillgraveClient.SetAdapterBasedIntValuePath("/mockserver-bridge", []string{http.MethodGet, http.MethodPost}, 10) + require.NoError(m.TestConfig.T, err, "Failed to set mock adapter value") + } + + m.TestConfig.Resty = resty.New().SetBaseURL(m.Common.RPCDetails.RPCL2External) + + if *m.Common.TestConfig.Common.InsideK8s { + m.ChainlinkNodesK8s, m.TestConfig.err = client.ConnectChainlinkNodes(m.Common.Env) + require.NoError(m.TestConfig.T, m.TestConfig.err) + m.Clients.ChainlinkClient.ChainlinkNodes = m.GetChainlinkNodes() + m.Clients.ChainlinkClient.NKeys, m.TestConfig.err = m.Common.CreateNodeKeysBundle(m.Clients.ChainlinkClient.ChainlinkNodes) + require.NoError(m.TestConfig.T, m.TestConfig.err) + } else { + m.Clients.ChainlinkClient.ChainlinkNodes = m.Clients.DockerEnv.ClCluster.NodeAPIs() + m.Clients.ChainlinkClient.NKeys, m.TestConfig.err = m.Common.CreateNodeKeysBundle(m.Clients.DockerEnv.ClCluster.NodeAPIs()) + require.NoError(m.TestConfig.T, m.TestConfig.err) + } + lggr := logger.Nop() + m.Clients.StarknetClient, m.TestConfig.err = starknet.NewClient(m.Common.ChainDetails.ChainID, m.Common.RPCDetails.RPCL2External, m.Common.RPCDetails.RPCL2InternalAPIKey, lggr, &rpcRequestTimeout) + require.NoError(m.TestConfig.T, m.TestConfig.err, "Creating starknet client should not fail") + m.Clients.OCR2Client, m.TestConfig.err = ocr2.NewClient(m.Clients.StarknetClient, lggr) + require.NoError(m.TestConfig.T, m.TestConfig.err, "Creating ocr2 client should not fail") + + // If we are using devnet fetch the default keys + if *m.Common.TestConfig.Common.Network == "localnet" { + // fetch predeployed account 0 to use as funder + m.Clients.DevnetClient = starknetdevnet.NewDevNet(m.Common.RPCDetails.RPCL2External) + accounts, err := m.Clients.DevnetClient.Accounts() + require.NoError(m.TestConfig.T, err) + account := accounts[0] + m.Account.Account = account.Address + m.Account.PrivateKey = account.PrivateKey + } else { + m.Account.Account = *m.TestConfig.TestConfig.Common.Account + m.Account.PrivateKey = *m.TestConfig.TestConfig.Common.PrivateKey + } +} + +// DeployEnv Deploys the environment +func (m *OCRv2TestState) DeployEnv() { + err := m.Common.Env.Run() + require.NoError(m.TestConfig.T, err) +} + +// LoadOCR2Config Loads and returns the default starknet gauntlet config +func (m *OCRv2TestState) LoadOCR2Config() (*ops.OCR2Config, error) { + var offChaiNKeys []string + var onChaiNKeys []string + var peerIDs []string + var txKeys []string + var cfgKeys []string + for i, key := range m.Clients.ChainlinkClient.NKeys { + offChaiNKeys = append(offChaiNKeys, key.OCR2Key.Data.Attributes.OffChainPublicKey) + peerIDs = append(peerIDs, key.PeerID) + txKeys = append(txKeys, m.Clients.ChainlinkClient.AccountAddresses[i]) + onChaiNKeys = append(onChaiNKeys, key.OCR2Key.Data.Attributes.OnChainPublicKey) + cfgKeys = append(cfgKeys, key.OCR2Key.Data.Attributes.ConfigPublicKey) + } + + var payload = ops.TestOCR2Config + payload.Signers = onChaiNKeys + payload.Transmitters = txKeys + payload.OffchainConfig.OffchainPublicKeys = offChaiNKeys + payload.OffchainConfig.PeerIDs = peerIDs + payload.OffchainConfig.ConfigPublicKeys = cfgKeys + + return &payload, nil +} + +func (m *OCRv2TestState) SetUpNodes() { + err := m.Common.CreateJobsForContract(m.GetChainlinkClient(), m.Contracts.ObservationSource, m.Contracts.JuelsPerFeeCoinSource, m.Contracts.OCRAddr, m.Clients.ChainlinkClient.AccountAddresses) + require.NoError(m.TestConfig.T, err, "Creating jobs should not fail") +} + +// GetNodeKeys Returns the node key bundles +func (m *OCRv2TestState) GetNodeKeys() []client.NodeKeysBundle { + return m.Clients.ChainlinkClient.NKeys +} + +func (m *OCRv2TestState) GetChainlinkNodes() []*client.ChainlinkClient { + // retrieve client from K8s client + var chainlinkNodes []*client.ChainlinkClient + for i := range m.ChainlinkNodesK8s { + chainlinkNodes = append(chainlinkNodes, m.ChainlinkNodesK8s[i].ChainlinkClient) + } + return chainlinkNodes +} + +func (m *OCRv2TestState) GetChainlinkClient() *ChainlinkClient { + return m.Clients.ChainlinkClient +} + +func (m *OCRv2TestState) SetBridgeTypeAttrs(attr *client.BridgeTypeAttributes) { + m.Clients.ChainlinkClient.bTypeAttr = attr +} + +func (m *OCRv2TestState) GetDefaultObservationSource() string { + return ` + val [type = "bridge" name="mockserver-bridge"] + parse [type="jsonparse" path="data,result"] + val -> parse + ` +} + +func (m *OCRv2TestState) GetDefaultJuelsPerFeeCoinSource() string { + return `""" + sum [type="sum" values=<[451000]> ] + sum + """ + ` +} + +func (m *OCRv2TestState) ValidateRounds(rounds int, isSoak bool) error { + ctx := context.Background() // context background used because timeout handled by requestTimeout param + // assert new rounds are occurring + details := ocr2.TransmissionDetails{} + increasing := 0 // track number of increasing rounds + var stuck bool + stuckCount := 0 + var positive bool + + // validate balance in aggregator + linkContractAddress, err := starknetutils.HexToFelt(m.Contracts.LinkTokenAddr) + if err != nil { + return err + } + contractAddress, err := starknetutils.HexToFelt(m.Contracts.OCRAddr) + if err != nil { + return err + } + resLINK, errLINK := m.Clients.StarknetClient.CallContract(ctx, starknet.CallOps{ + ContractAddress: linkContractAddress, + Selector: starknetutils.GetSelectorFromNameFelt("balance_of"), + Calldata: []*felt.Felt{contractAddress}, + }) + require.NoError(m.TestConfig.T, errLINK, "Reader balance from LINK contract should not fail", "err", errLINK) + resAgg, errAgg := m.Clients.StarknetClient.CallContract(ctx, starknet.CallOps{ + ContractAddress: contractAddress, + Selector: starknetutils.GetSelectorFromNameFelt("link_available_for_payment"), + }) + require.NoError(m.TestConfig.T, errAgg, "link_available_for_payment should not fail", "err", errAgg) + balLINK := resLINK[0].BigInt(big.NewInt(0)) + balAgg := resAgg[1].BigInt(big.NewInt(0)) + isNegative := resAgg[0].BigInt(big.NewInt(0)) + if isNegative.Sign() > 0 { + balAgg = new(big.Int).Neg(balAgg) + } + + assert.Equal(m.TestConfig.T, balLINK.Cmp(big.NewInt(0)), 1, "Aggregator should have non-zero balance") + assert.GreaterOrEqual(m.TestConfig.T, balLINK.Cmp(balAgg), 0, "Aggregator payment balance should be <= actual LINK balance") + + for start := time.Now(); time.Since(start) < m.Common.TestEnvDetails.TestDuration; { + m.TestConfig.L.Info().Msg(fmt.Sprintf("Elapsed time: %s, Round wait: %s ", time.Since(start), m.Common.TestEnvDetails.TestDuration)) + res, err2 := m.Clients.OCR2Client.LatestTransmissionDetails(ctx, contractAddress) + require.NoError(m.TestConfig.T, err2, "Failed to get latest transmission details") + // end condition: enough rounds have occurred + if !isSoak && increasing >= rounds && positive { + break + } + + // end condition: rounds have been stuck + if stuck && stuckCount > 50 { + m.TestConfig.L.Debug().Msg("failing to fetch transmissions means blockchain may have stopped") + break + } + + // try to fetch rounds + time.Sleep(5 * time.Second) + + if err != nil { + m.TestConfig.L.Error().Msg(fmt.Sprintf("Transmission Error: %+v", err)) + continue + } + m.TestConfig.L.Info().Msg(fmt.Sprintf("Transmission Details: %+v", res)) + + // continue if no changes + if res.Epoch == 0 && res.Round == 0 { + continue + } + + ansCmp := res.LatestAnswer.Cmp(big.NewInt(0)) + positive = ansCmp == 1 || positive + + // if changes from zero values set (should only initially) + if res.Epoch > 0 && details.Epoch == 0 { + if !isSoak { + assert.Greater(m.TestConfig.T, res.Epoch, details.Epoch) + assert.GreaterOrEqual(m.TestConfig.T, res.Round, details.Round) + assert.NotEqual(m.TestConfig.T, ansCmp, 0) // assert changed from 0 + assert.NotEqual(m.TestConfig.T, res.Digest, details.Digest) + assert.Equal(m.TestConfig.T, details.LatestTimestamp.Before(res.LatestTimestamp), true) + } + details = res + continue + } + // check increasing rounds + if !isSoak { + assert.Equal(m.TestConfig.T, res.Digest, details.Digest, "Config digest should not change") + } else { + if res.Digest != details.Digest { + m.TestConfig.L.Error().Msg(fmt.Sprintf("Config digest should not change, expected %s got %s", details.Digest, res.Digest)) + } + } + if (res.Epoch > details.Epoch || (res.Epoch == details.Epoch && res.Round > details.Round)) && details.LatestTimestamp.Before(res.LatestTimestamp) { + increasing++ + stuck = false + stuckCount = 0 // reset counter + continue + } + + // reach this point, answer has not changed + stuckCount++ + if stuckCount > 30 { + stuck = true + increasing = 0 + } + } + if !isSoak { + assert.GreaterOrEqual(m.TestConfig.T, increasing, rounds, "Round + epochs should be increasing") + assert.Equal(m.TestConfig.T, positive, true, "Positive value should have been submitted") + assert.Equal(m.TestConfig.T, stuck, false, "Round + epochs should not be stuck") + } + + // Test proxy reading + // TODO: would be good to test proxy switching underlying feeds + + proxyAddress, err := starknetutils.HexToFelt(m.Contracts.ProxyAddr) + if err != nil { + return err + } + roundDataRaw, err := m.Clients.StarknetClient.CallContract(ctx, starknet.CallOps{ + ContractAddress: proxyAddress, + Selector: starknetutils.GetSelectorFromNameFelt("latest_round_data"), + }) + if !isSoak { + require.NoError(m.TestConfig.T, err, "Reading round data from proxy should not fail") + assert.Equal(m.TestConfig.T, len(roundDataRaw), 5, "Round data from proxy should match expected size") + } + valueBig := roundDataRaw[1].BigInt(big.NewInt(0)) + require.NoError(m.TestConfig.T, err) + value := valueBig.Int64() + if value < 0 { + assert.Equal(m.TestConfig.T, value, int64(5), "Reading from proxy should return correct value") + } + + return nil +} diff --git a/integration-tests/config/config.go b/integration-tests/config/config.go new file mode 100644 index 000000000..00dd293dd --- /dev/null +++ b/integration-tests/config/config.go @@ -0,0 +1,37 @@ +package config + +var ( + starkTokenAddress = "0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d" +) + +type Config struct { + ChainName string + ChainID string + StarkTokenAddress string + L2RPCInternal string + L2RPCInternalAPIKey string + TokenName string + FeederURL string +} + +func SepoliaConfig() *Config { + return &Config{ + ChainName: "starknet", + ChainID: "SN_SEPOLIA", + StarkTokenAddress: starkTokenAddress, + // Will be overridden if set in toml + L2RPCInternal: "https://starknet-sepolia.public.blastapi.io/rpc/v0_7", + FeederURL: "https://alpha-sepolia.starknet.io/feeder_gateway", + } +} + +func DevnetConfig() *Config { + return &Config{ + ChainName: "starknet", + ChainID: "SN_SEPOLIA", + StarkTokenAddress: starkTokenAddress, + // Will be overridden if set in toml + L2RPCInternal: "http://starknet-dev:5000", + TokenName: "FRI", + } +} diff --git a/integration-tests/deployer_ocr.go b/integration-tests/deployer_ocr.go deleted file mode 100644 index 4615323ec..000000000 --- a/integration-tests/deployer_ocr.go +++ /dev/null @@ -1,18 +0,0 @@ -package integration_tests - -import ( - "github.com/smartcontractkit/chainlink-testing-framework/blockchain" -) - -func NewOCRDeployer(c blockchain.EVMClient) (*OCRDeployer, error) { - return &OCRDeployer{c}, nil -} - -type OCRDeployer struct { - client blockchain.EVMClient -} - -func (e *OCRDeployer) Deploy() error { - //TODO implement me - return nil -} diff --git a/integration-tests/deployer_starknet.go b/integration-tests/deployer_starknet.go deleted file mode 100644 index 0d038f6d8..000000000 --- a/integration-tests/deployer_starknet.go +++ /dev/null @@ -1,18 +0,0 @@ -package integration_tests - -import ( - "github.com/smartcontractkit/chainlink-testing-framework/blockchain" -) - -func NewStarkNetContractDeployer(c blockchain.EVMClient) (*StarkNetContractDeployer, error) { - return &StarkNetContractDeployer{c}, nil -} - -type StarkNetContractDeployer struct { - client blockchain.EVMClient -} - -func (e *StarkNetContractDeployer) Deploy() error { - //TODO implement me - return nil -} diff --git a/integration-tests/docker/testenv/stark.go b/integration-tests/docker/testenv/stark.go new file mode 100644 index 000000000..c26d746f1 --- /dev/null +++ b/integration-tests/docker/testenv/stark.go @@ -0,0 +1,107 @@ +package testenv + +import ( + "fmt" + "testing" + "time" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + tc "github.com/testcontainers/testcontainers-go" + tcwait "github.com/testcontainers/testcontainers-go/wait" + + "github.com/smartcontractkit/chainlink-testing-framework/docker/test_env" + "github.com/smartcontractkit/chainlink-testing-framework/logging" + "github.com/smartcontractkit/chainlink-testing-framework/utils/testcontext" +) + +const ( + StarkHTTPPort = "5050" +) + +type Starknet struct { + test_env.EnvComponent + ExternalHTTPURL string + InternalHTTPURL string + t *testing.T + l zerolog.Logger + Image string +} + +func NewStarknet(networks []string, image string, opts ...test_env.EnvComponentOption) *Starknet { + ms := &Starknet{ + Image: image, + EnvComponent: test_env.EnvComponent{ + ContainerName: "starknet", + Networks: networks, + }, + + l: log.Logger, + } + for _, opt := range opts { + opt(&ms.EnvComponent) + } + return ms +} + +func (s *Starknet) WithTestLogger(t *testing.T) *Starknet { + s.l = logging.GetTestLogger(t) + s.t = t + return s +} + +func (s *Starknet) StartContainer() error { + l := tc.Logger + if s.t != nil { + l = logging.CustomT{ + T: s.t, + L: s.l, + } + } + cReq, err := s.getContainerRequest() + if err != nil { + return err + } + c, err := tc.GenericContainer(testcontext.Get(s.t), tc.GenericContainerRequest{ + ContainerRequest: *cReq, + Reuse: true, + Started: true, + Logger: l, + }) + if err != nil { + return fmt.Errorf("cannot start Starknet container: %w", err) + } + s.Container = c + host, err := test_env.GetHost(testcontext.Get(s.t), c) + if err != nil { + return err + } + httpPort, err := c.MappedPort(testcontext.Get(s.t), test_env.NatPort(StarkHTTPPort)) + if err != nil { + return err + } + + s.ExternalHTTPURL = fmt.Sprintf("http://%s:%s", host, httpPort.Port()) + s.InternalHTTPURL = fmt.Sprintf("http://%s:%s", s.ContainerName, StarkHTTPPort) + + s.l.Info(). + Any("ExternalHTTPURL", s.ExternalHTTPURL). + Any("InternalHTTPURL", s.InternalHTTPURL). + Str("containerName", s.ContainerName). + Msgf("Started Starknet container") + + return nil +} + +func (s *Starknet) getContainerRequest() (*tc.ContainerRequest, error) { + return &tc.ContainerRequest{ + Name: s.ContainerName, + Image: s.Image, + ExposedPorts: []string{test_env.NatPortFormat(StarkHTTPPort)}, + Networks: s.Networks, + WaitingFor: tcwait.ForLog("Starknet Devnet listening"). + WithStartupTimeout(30 * time.Second). + WithPollInterval(100 * time.Millisecond), + Entrypoint: []string{"sh", "-c", "tini -- starknet-devnet --host 0.0.0.0 --port 5050 --seed 0 --account-class cairo1 --gas-price 1 --data-gas-price 1"}, + }, nil +} diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 61373da93..ed6d7b13b 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -1,187 +1,486 @@ module github.com/smartcontractkit/chainlink-starknet/integration-tests -go 1.18 +go 1.22.5 require ( - github.com/onsi/ginkgo/v2 v2.1.3 - github.com/onsi/gomega v1.19.0 - github.com/smartcontractkit/chainlink-starknet v0.0.0-00010101000000-000000000000 - github.com/smartcontractkit/chainlink-testing-framework v1.1.21 - github.com/smartcontractkit/helmenv v1.0.71 + github.com/NethermindEth/juno v0.3.1 + github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb + github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df + github.com/go-resty/resty/v2 v2.11.0 + github.com/google/uuid v1.6.0 + github.com/lib/pq v1.10.9 + github.com/pelletier/go-toml/v2 v2.2.2 + github.com/rs/zerolog v1.31.0 + github.com/smartcontractkit/chainlink-common v0.1.7-0.20240703234618-dc1fbe45acc0 + github.com/smartcontractkit/chainlink-starknet/ops v0.0.0-20231205180940-ea2e3e916725 + github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240625074951-06ab5e670dba + github.com/smartcontractkit/chainlink-testing-framework v1.33.0 + github.com/smartcontractkit/chainlink/integration-tests v0.0.0-20240708135824-bf9122a8cee6 + github.com/smartcontractkit/chainlink/v2 v2.10.0-beta0.0.20240708135824-bf9122a8cee6 + github.com/smartcontractkit/seth v1.0.12 + github.com/stretchr/testify v1.9.0 + github.com/testcontainers/testcontainers-go v0.28.0 + go.uber.org/zap v1.26.0 + golang.org/x/text v0.16.0 + gopkg.in/guregu/null.v4 v4.0.0 ) require ( - cloud.google.com/go v0.99.0 // indirect - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/Azure/go-autorest v14.2.0+incompatible // indirect - github.com/Azure/go-autorest/autorest v0.11.20 // indirect - github.com/Azure/go-autorest/autorest/adal v0.9.15 // indirect - github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect - github.com/Azure/go-autorest/logger v0.2.1 // indirect - github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v0.4.1 // indirect + contrib.go.opencensus.io/exporter/stackdriver v0.13.5 // indirect + cosmossdk.io/api v0.3.1 // indirect + cosmossdk.io/core v0.5.1 // indirect + cosmossdk.io/depinject v1.0.0-alpha.4 // indirect + cosmossdk.io/errors v1.0.0 // indirect + cosmossdk.io/math v1.1.2 // indirect + dario.cat/mergo v1.0.0 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 // indirect + github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/CosmWasm/wasmd v0.40.1 // indirect + github.com/CosmWasm/wasmvm v1.2.4 // indirect + github.com/DataDog/zstd v1.5.2 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.1.1 // indirect - github.com/Masterminds/sprig/v3 v3.2.2 // indirect - github.com/Masterminds/squirrel v1.5.2 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/StackExchange/wmi v1.2.1 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect + github.com/Masterminds/semver/v3 v3.2.1 // indirect + github.com/Masterminds/sprig/v3 v3.2.3 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/hcsshim v0.11.4 // indirect + github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/XSAM/otelsql v0.27.0 // indirect + github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/avast/retry-go v3.0.0+incompatible // indirect + github.com/avast/retry-go/v4 v4.5.1 // indirect + github.com/aws/aws-sdk-go v1.45.25 // indirect + github.com/aws/constructs-go/constructs/v10 v10.1.255 // indirect + github.com/aws/jsii-runtime-go v1.75.0 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/btcsuite/btcd v0.22.0-beta // indirect - github.com/cavaliercoder/grab v2.0.0+incompatible // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect - github.com/containerd/containerd v1.5.10 // indirect - github.com/cyphar/filepath-securejoin v0.2.3 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/deckarep/golang-set v1.8.0 // indirect - github.com/docker/cli v20.10.11+incompatible // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect - github.com/docker/docker v20.10.12+incompatible // indirect - github.com/docker/docker-credential-helpers v0.6.4 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-metrics v0.0.1 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/ethereum/go-ethereum v1.10.16 + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/blendle/zapdriver v1.3.1 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/buger/jsonparser v1.1.1 // indirect + github.com/bytedance/sonic v1.10.1 // indirect + github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b // indirect + github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 // indirect + github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect + github.com/cenkalti/backoff v2.2.1+incompatible // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chai2010/gettext-go v1.0.2 // indirect + github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240709130330-9f4feec7553f // indirect + github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect + github.com/chenzhuoyu/iasm v0.9.0 // indirect + github.com/cockroachdb/errors v1.10.0 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/cometbft/cometbft v0.37.2 // indirect + github.com/cometbft/cometbft-db v0.8.0 // indirect + github.com/confio/ics23/go v0.9.0 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/containerd/containerd v1.7.12 // indirect + github.com/containerd/continuity v0.4.3 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/coreos/go-semver v0.3.1 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.2 // indirect + github.com/cosmos/cosmos-sdk v0.47.5 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogoproto v1.4.11 // indirect + github.com/cosmos/iavl v0.20.0 // indirect + github.com/cosmos/ibc-go/v7 v7.3.1 // indirect + github.com/cosmos/ics23/go v0.10.0 // indirect + github.com/cosmos/ledger-cosmos-go v0.12.1 // indirect + github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set/v2 v2.3.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/dennwc/varint v1.0.0 // indirect + github.com/dfuse-io/logging v0.0.0-20210109005628-b97a57253f70 // indirect + github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v25.0.2+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/dominikbraun/graph v0.23.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/esote/minmaxheap v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/go-ethereum v1.13.8 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect + github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect github.com/fatih/camelcase v1.0.0 // indirect - github.com/fatih/color v1.13.0 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/fvbommel/sortorder v1.0.1 // indirect - github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-errors/errors v1.4.1 // indirect - github.com/go-logr/logr v1.2.0 // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/felixge/httpsnoop v1.0.3 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fvbommel/sortorder v1.1.0 // indirect + github.com/fxamacker/cbor/v2 v2.5.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gagliardetto/binary v0.7.7 // indirect + github.com/gagliardetto/solana-go v1.8.4 // indirect + github.com/gagliardetto/treeout v0.1.4 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect + github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 // indirect + github.com/getsentry/sentry-go v0.23.0 // indirect + github.com/gin-contrib/sessions v0.0.5 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.9.1 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect + github.com/go-errors/errors v1.4.2 // indirect + github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-kit/kit v0.12.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-ldap/ldap/v3 v3.4.6 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/swag v0.19.15 // indirect - github.com/go-resty/resty/v2 v2.7.0 - github.com/go-stack/stack v1.8.1 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.3.0 // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/btree v1.0.1 // indirect - github.com/google/go-cmp v0.5.6 // indirect + github.com/go-openapi/analysis v0.21.4 // indirect + github.com/go-openapi/errors v0.20.4 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/loads v0.21.2 // indirect + github.com/go-openapi/spec v0.20.9 // indirect + github.com/go-openapi/strfmt v0.21.7 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-openapi/validate v0.22.1 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.15.5 // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect + github.com/go-webauthn/webauthn v0.9.4 // indirect + github.com/go-webauthn/x v0.1.5 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/googleapis v1.4.1 // indirect + github.com/gogo/protobuf v1.3.3 // indirect + github.com/gogo/status v1.1.1 // indirect + github.com/golang-jwt/jwt/v5 v5.2.0 // indirect + github.com/golang/glog v1.2.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/btree v1.1.2 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-github/v41 v41.0.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/go-tpm v0.9.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect + github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/mux v1.8.0 // indirect - github.com/gorilla/websocket v1.4.2 // indirect - github.com/gosuri/uitable v0.0.4 // indirect + github.com/gorilla/securecookie v1.1.2 // indirect + github.com/gorilla/sessions v1.2.2 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/grafana/dskit v0.0.0-20231120170505-765e343eda4f // indirect + github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586 // indirect + github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b // indirect + github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503 // indirect + github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4 // indirect + github.com/grafana/pyroscope-go v1.1.1 // indirect + github.com/grafana/pyroscope-go/godeltaprof v0.1.6 // indirect + github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/gtank/merlin v0.1.1 // indirect + github.com/gtank/ristretto255 v0.1.2 // indirect + github.com/hashicorp/consul/api v1.25.1 // indirect + github.com/hashicorp/consul/sdk v0.16.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-envparse v0.1.0 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-msgpack v0.5.5 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-plugin v1.6.0 // indirect + github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.2 // indirect + github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/huandu/xstrings v1.3.2 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/jmoiron/sqlx v1.3.5 // indirect + github.com/hashicorp/memberlist v0.5.0 // indirect + github.com/hashicorp/serf v0.10.1 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/huandu/skiplist v1.2.0 // indirect + github.com/huandu/xstrings v1.4.0 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/invopop/jsonschema v0.12.0 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.14.3 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/pgx/v4 v4.18.2 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/jmoiron/sqlx v1.4.0 // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect - github.com/klauspost/compress v1.13.6 // indirect - github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect - github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/lib/pq v1.10.5 // indirect + github.com/klauspost/compress v1.17.3 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/leanovate/gopter v0.2.10-0.20210127095200-9abe2343507a // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/magiconair/properties v1.8.5 // indirect + github.com/linxGnu/grocksdb v1.7.16 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/miekg/dns v1.1.56 // indirect + github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/moby/locker v1.0.1 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/spdystream v0.2.0 // indirect - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect github.com/morikuni/aec v1.0.0 // indirect + github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 // indirect github.com/mr-tron/base58 v1.2.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/mwitkow/grpc-proxy v0.0.0-20230212185441-f345521cb9c9 // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/oklog/ulid v1.3.1 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/pelletier/go-toml v1.9.4 // indirect + github.com/opencontainers/image-spec v1.1.0-rc5 // indirect + github.com/opencontainers/runc v1.1.10 // indirect + github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e // indirect + github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/otiai10/copy v1.14.0 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect + github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect + github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.33.0 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/rivo/uniseg v0.2.0 // indirect - github.com/rjeczalik/notify v0.9.2 // indirect - github.com/rs/zerolog v1.26.1 - github.com/rubenv/sql-migrate v0.0.0-20211023115951-9f02b1e13857 // indirect - github.com/russross/blackfriday v1.6.0 // indirect - github.com/satori/go.uuid v1.2.0 // indirect - github.com/shirou/gopsutil v3.21.10+incompatible // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/prometheus/alertmanager v0.26.0 // indirect + github.com/prometheus/client_golang v1.17.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/common/sigv4 v0.1.0 // indirect + github.com/prometheus/exporter-toolkit v0.10.1-0.20230714054209-2f4150c63f97 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/prometheus v0.48.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/sasha-s/go-deadlock v0.3.1 // indirect + github.com/scylladb/go-reflectx v1.0.1 // indirect + github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect + github.com/segmentio/ksuid v1.0.4 // indirect + github.com/sercand/kuberesolver/v5 v5.1.1 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shirou/gopsutil/v3 v3.24.3 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shopspring/decimal v1.3.1 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/slack-go/slack v0.10.2 // indirect - github.com/smartcontractkit/libocr v0.0.0-20220121130134-5d2b1d5f424b // indirect - github.com/spf13/afero v1.6.0 // indirect - github.com/spf13/cast v1.4.1 // indirect - github.com/spf13/cobra v1.3.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/slack-go/slack v0.12.2 // indirect + github.com/smartcontractkit/chain-selectors v1.0.10 // indirect + github.com/smartcontractkit/chainlink-automation v1.0.4 // indirect + github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240621143432-85370a54b141 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240702144807-761f63e7b527 // indirect + github.com/smartcontractkit/chainlink-feeds v0.0.0-20240522213638-159fb2d99917 // indirect + github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240708130426-294b81e4afe7 // indirect + github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.0-20240405215812-5a72bc9af239 // indirect + github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e // indirect + github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 // indirect + github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1 // indirect + github.com/smartcontractkit/wasp v0.4.7 // indirect + github.com/smartcontractkit/wsrpc v0.8.1 // indirect + github.com/soheilhy/cmux v0.1.5 // indirect + github.com/sony/gobreaker v0.5.0 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.10.1 // indirect - github.com/stretchr/testify v1.7.1 // indirect - github.com/subosito/gotenv v1.2.0 // indirect - github.com/tklauser/go-sysconf v0.3.9 // indirect - github.com/tklauser/numcpus v0.3.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 - github.com/xlab/treeprint v1.1.0 // indirect - go.starlark.net v0.0.0-20211013185944-b0039bd2cfe3 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e // indirect - golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect - golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 // indirect - google.golang.org/grpc v1.43.0 // indirect - google.golang.org/protobuf v1.27.1 // indirect - gopkg.in/gorp.v1 v1.7.2 // indirect - gopkg.in/guregu/null.v4 v4.0.0 // indirect + github.com/spf13/viper v1.16.0 // indirect + github.com/status-im/keycard-go v0.2.0 // indirect + github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 // indirect + github.com/test-go/testify v1.1.4 // indirect + github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a // indirect + github.com/tidwall/btree v1.6.0 // indirect + github.com/tidwall/gjson v1.17.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect + github.com/uber/jaeger-lib v2.4.1+incompatible // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/umbracle/ethgo v0.1.3 // indirect + github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 // indirect + github.com/valyala/fastjson v1.4.1 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/xlab/treeprint v1.2.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + github.com/zondax/hid v0.9.1 // indirect + github.com/zondax/ledger-go v0.14.1 // indirect + go.dedis.ch/fixbuf v1.0.3 // indirect + go.dedis.ch/kyber/v3 v3.1.0 // indirect + go.etcd.io/bbolt v1.3.7 // indirect + go.etcd.io/etcd/api/v3 v3.5.9 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect + go.etcd.io/etcd/client/v3 v3.5.9 // indirect + go.mongodb.org/mongo-driver v1.15.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/collector/pdata v1.0.0-rcv0016 // indirect + go.opentelemetry.io/collector/semconv v0.87.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect + go.opentelemetry.io/otel/metric v1.27.0 // indirect + go.opentelemetry.io/otel/sdk v1.27.0 // indirect + go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/proto/otlp v1.2.0 // indirect + go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/goleak v1.3.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/ratelimit v0.3.0 // indirect + go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect + golang.org/x/arch v0.7.0 // indirect + golang.org/x/crypto v0.24.0 // indirect + golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/oauth2 v0.20.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/term v0.21.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + gonum.org/v1/gonum v0.14.0 // indirect + google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 // indirect + google.golang.org/grpc v1.64.0 // indirect + google.golang.org/protobuf v1.34.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/ini.v1 v1.66.2 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - helm.sh/helm/v3 v3.8.1 // indirect - k8s.io/api v0.23.5 // indirect - k8s.io/apiextensions-apiserver v0.23.4 // indirect - k8s.io/apimachinery v0.23.5 // indirect - k8s.io/apiserver v0.23.4 // indirect - k8s.io/cli-runtime v0.23.5 // indirect - k8s.io/client-go v0.23.5 // indirect - k8s.io/component-base v0.23.5 // indirect - k8s.io/klog/v2 v2.30.0 // indirect - k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect - k8s.io/kubectl v0.23.5 // indirect - k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect - oras.land/oras-go v1.1.0 // indirect - sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect - sigs.k8s.io/kustomize/api v0.10.1 // indirect - sigs.k8s.io/kustomize/kyaml v0.13.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.28.2 // indirect + k8s.io/apiextensions-apiserver v0.28.2 // indirect + k8s.io/apimachinery v0.28.2 // indirect + k8s.io/cli-runtime v0.28.2 // indirect + k8s.io/client-go v0.28.2 // indirect + k8s.io/component-base v0.28.2 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect + k8s.io/kubectl v0.28.2 // indirect + k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect + nhooyr.io/websocket v1.8.7 // indirect + pgregory.net/rapid v0.5.5 // indirect + rsc.io/tmplfunc v0.0.3 // indirect + sigs.k8s.io/controller-runtime v0.16.2 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect + sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) -replace github.com/smartcontractkit/chainlink-starknet => ../../chainlink-starknet +replace ( + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + + // until merged upstream: https://github.com/hashicorp/go-plugin/pull/257 + github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 + + // until merged upstream: https://github.com/mwitkow/grpc-proxy/pull/69 + github.com/mwitkow/grpc-proxy => github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f + + // Make sure we're working with the latest ops + github.com/smartcontractkit/chainlink-starknet/ops => ../ops + github.com/smartcontractkit/chainlink-starknet/relayer => ../relayer +) diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 7e0cfa096..4a71ac8e5 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1,18 +1,13 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.33.1/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.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= 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.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= 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= @@ -22,30 +17,23 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go 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 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.110.9 h1:e7ITSqGFFk4rbz/JFIqZh3G4VEHguhAL4BQcFlWtU68= +cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= 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/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/iam v1.1.4 h1:K6n/GZHFTtEoKT5aUG3l9diPi0VduZNQ1PfdnpkkIFk= +cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8= 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= @@ -55,703 +43,620 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo 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= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +contrib.go.opencensus.io/exporter/stackdriver v0.12.6/go.mod h1:8x999/OcIPy5ivx/wDiV7Gx4D+VUPODf0mWRGRc5kSk= +contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +contrib.go.opencensus.io/exporter/stackdriver v0.13.5 h1:TNaexHK16gPUoc7uzELKOU7JULqccn1NDuqUxmxSqfo= +contrib.go.opencensus.io/exporter/stackdriver v0.13.5/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= +cosmossdk.io/api v0.3.1 h1:NNiOclKRR0AOlO4KIqeaG6PS6kswOMhHD0ir0SscNXE= +cosmossdk.io/api v0.3.1/go.mod h1:DfHfMkiNA2Uhy8fj0JJlOCYOBp4eWUUJ1te5zBGNyIw= +cosmossdk.io/core v0.5.1 h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI= +cosmossdk.io/core v0.5.1/go.mod h1:KZtwHCLjcFuo0nmDc24Xy6CRNEL9Vl/MeimQ2aC7NLE= +cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= +cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= +cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= +cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= +cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= +cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= +cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= +cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= +cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v56.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -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 h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -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 v0.11.20 h1:s8H1PbCZSqg/DH7JMlOz6YMig6htWLNPsjDdlLqCx3M= -github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -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.15 h1:X+p2GF0GWyOiSmqohIaEeuNFNDY4I4EOlVuUQvFdWMk= -github.com/Azure/go-autorest/autorest/adal v0.9.15/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -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 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= +github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= +github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0 h1:9kDVnTz3vbfweTqAUmk/a/pH5pWFCHtvRpHYC0G/dcA= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.8.0/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1 h1:UPeCRD+XY7QlaGQte2EVI2iOcWvUYA2XY8w5T/8v0NQ= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.2.1/go.mod h1:oGV6NlB0cvi1ZbYRR2UN44QHxWFyGk+iylgD0qaMXjA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1 h1:bWh0Z2rOEDfB/ywv/l0iHN1JgyazE6kW/aIA89+CEK0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v2 v2.2.1/go.mod h1:Bzf34hhAE9NSxailk8xVeLEZbUjOXcC+GnU1mMKdhLw= +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/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1 h1:WpB/QDNLpMw72xHJc34BNNykqSOeEJDAWkhf0u12/Jk= +github.com/AzureAD/microsoft-authentication-library-for-go v1.1.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw= -github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -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/DATA-DOG/go-txdb v0.1.3/go.mod h1:DhAhxMXZpUJVGnT+p9IbzJoRKvlArO2pkHjnGX7o0n0= +github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= +github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/CosmWasm/wasmd v0.40.1 h1:LxbO78t/6S8TkeQlUrJ0m5O87HtAwLx4RGHq3rdrOEU= +github.com/CosmWasm/wasmd v0.40.1/go.mod h1:6EOwnv7MpuFaEqxcUOdFV9i4yvrdOciaY6VQ1o7A3yg= +github.com/CosmWasm/wasmvm v1.2.4 h1:6OfeZuEcEH/9iqwrg2pkeVtDCkMoj9U6PpKtcrCyVrQ= +github.com/CosmWasm/wasmvm v1.2.4/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/Depado/ginprom v1.2.1-0.20200115153638-53bbba851bd8/go.mod h1:VHRucFf/9saDXsYg6uzQ8Oo8gUwngtWec9ZJ00H+ZCc= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Depado/ginprom v1.8.0 h1:zaaibRLNI1dMiiuj1MKzatm8qrcHzikMlCc1anqOdyo= +github.com/Depado/ginprom v1.8.0/go.mod h1:XBaKzeNBqPF4vxJpNLincSQZeMDnZp1tIbU0FU0UKgg= +github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= -github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= -github.com/Masterminds/squirrel v1.5.2 h1:UiOEi2ZX4RCSkpiNDQN5kro/XIBpSRk9iTqdIRPzUXE= -github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= -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 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -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.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim v0.9.1 h1:VfDCj+QnY19ktX5TsH22JHcjaZ05RWQiwDbOyEg5ziM= -github.com/Microsoft/hcsshim v0.9.1/go.mod h1:Y/0uV2jUab5kBI7SQgl62at0AVX7uaruzADAVmxm3eM= -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/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +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/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= +github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= +github.com/NethermindEth/juno v0.3.1/go.mod h1:SGbTpgGaCsxhFsKOid7Ylnz//WZ8swtILk+NbHGsk/Q= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb h1:Mv8SscePPyw2ju4igIJAjFgcq5zCQfjgbz53DwYu5mc= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb/go.mod h1:gQkhWpAs9/QR6reZU2xoi1UIYlMS64FLTlh9CrgHH/Y= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= 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 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= 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 h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= -github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= -github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/Workiva/go-datastructures v1.1.0 h1:hu20UpgZneBhQ3ZvwiOGlqJSKIosin2Rd5wAKUHEO/k= +github.com/Workiva/go-datastructures v1.1.0/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= +github.com/XSAM/otelsql v0.27.0 h1:i9xtxtdcqXV768a5C6SoT/RkG+ue3JTOgkYInzlTOqs= +github.com/XSAM/otelsql v0.27.0/go.mod h1:0mFB3TvLa7NCuhm/2nU7/b2wEtsczkj8Rey8ygO7V+A= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= 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/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= +github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= +github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= +github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= +github.com/alicebob/miniredis/v2 v2.30.4 h1:8S4/o1/KoUArAGbGwPxcwf0krlzceva2XVOSchFS7Eo= +github.com/alicebob/miniredis/v2 v2.30.4/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= -github.com/araddon/dateparse v0.0.0-20190622164848-0fb0a474d195/go.mod h1:SLqhdZcd+dF3TEVL2RMoob5bBP5R1P1qkox+HtCBgGI= -github.com/aristanetworks/fsnotify v1.4.2/go.mod h1:D/rtu7LpjYM8tRJphJ0hUBYpjai8SfX+aSNsWDTq/Ks= -github.com/aristanetworks/glog v0.0.0-20180419172825-c15b03b3054f/go.mod h1:KASm+qXFKs/xjSoWn30NrWBBvdTTQq+UjkhjEJHfSFA= -github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= -github.com/aristanetworks/goarista v0.0.0-20190204200901-2166578f3448/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= -github.com/aristanetworks/goarista v0.0.0-20191023202215-f096da5361bb/go.mod h1:Z4RTxGAuYhPzcq8+EdRM+R8M48Ssle2TsWtwRKa+vns= -github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/2YanvOEnLMUgsFrxBROc= 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-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= -github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/avast/retry-go/v4 v4.5.1 h1:AxIx0HGi4VZ3I02jr78j5lZ3M6x1E0Ivxa6b0pUUh7o= +github.com/avast/retry-go/v4 v4.5.1/go.mod h1:/sipNsvNB3RRuT5iNcb6h73nw3IBmXJ/H3XrCQYSOpc= +github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.45.25 h1:c4fLlh5sLdK2DCRTY1z0hyuJZU4ygxX8m1FswL6/nF4= +github.com/aws/aws-sdk-go v1.45.25/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/constructs-go/constructs/v10 v10.1.255 h1:5hARfEmhBqHSTQf/C3QLA3sWOxO2Dfja0iA1W7ZcI7g= +github.com/aws/constructs-go/constructs/v10 v10.1.255/go.mod h1:DCdBSjN04Ck2pajCacTD4RKFqSA7Utya8d62XreYctI= +github.com/aws/jsii-runtime-go v1.75.0 h1:NhpUfyiL7/wsRuUekFsz8FFBCYLfPD/l61kKg9kL/a4= +github.com/aws/jsii-runtime-go v1.75.0/go.mod h1:TKCyrtM0pygEPo4rDZzbMSDNCDNTSYSN6/mGyHI6O3I= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= +github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0= +github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df/go.mod h1:hiVxq5OP2bUGBRNS3Z/bt/reCLFNbdcST6gISi1fiOM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/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/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -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/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -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/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boj/redistore v0.0.0-20160128113310-fc113767cd6b/go.mod h1:5r9chGCb4uUhBCGMDDCYfyHU/awSRoBeG53Zaj1crhU= -github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= -github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= -github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= -github.com/btcsuite/btcd v0.0.0-20190523000118-16327141da8c/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= -github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= -github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cavaliercoder/grab v2.0.0+incompatible h1:wZHbBQx56+Yxjx2TCGDcenhh3cJn7cCLMfkEPmySTSE= -github.com/cavaliercoder/grab v2.0.0+incompatible/go.mod h1:tTBkfNqSBfuMmMBFaO2phgyhdYhiZQ/+iXCZDzcDsMI= +github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= +github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= +github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= +github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 h1:SDlJ7bAm4ewvrmZtR0DaiYbQGdKPeaaIm7bM+qRhFeU= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA= +github.com/bxcodec/faker v2.0.1+incompatible/go.mod h1:BNzfpVdTwnFJ6GtfYTcQu6l6rHShT+veBxNCnjCx5XM= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= +github.com/bytedance/sonic v1.10.1 h1:7a1wuFXL1cMy7a3f7/VFcEtriuXQnUBhtoVfOZiaysc= +github.com/bytedance/sonic v1.10.1/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b h1:6+ZFm0flnudZzdSE0JxlhR2hKnGPcNB35BjQf4RYQDY= +github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= +github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 h1:SjZ2GvvOononHOpK84APFuMvxqsk3tEIaKH/z4Rpu3g= +github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8/go.mod h1:uEyr4WpAH4hio6LFriaPkL938XnrvLpNPmQHBdrmbIE= +github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 h1:rvc39Ol6z3MvaBzXkxFC6Nfsnixq/dRypushKDd7Nc0= +github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5/go.mod h1:R/pdNYDYFQk+tuuOo7QES1kkv6OLmp5ze2XBZQIVffM= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.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/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -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/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +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/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= +github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= +github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240709130330-9f4feec7553f h1:onZ3oc6l1Gz8pVpQ0c1U1Cb11kIMoDb3xtEy/iZbYZM= +github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240709130330-9f4feec7553f/go.mod h1:x11iCbZV6hzzSQWMq610B6Wl5Lg1dhwqcVfeiWQQnQQ= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/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/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= 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/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/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= -github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -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.2 h1:mZBclaSgNDfPWtfhj2xJY28LZ9nYIgzB0pwSURPl6JM= -github.com/containerd/cgroups v1.0.2/go.mod h1:qpbpJ1jmlqsR9f2IyaLPsdkCdnt0rbDVqIDlhuu5tRY= -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/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.9/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= -github.com/containerd/containerd v1.5.10 h1:3cQ2uRVCkJVcx5VombsE7105Gl9Wrl7ORAO3+4+ogf4= -github.com/containerd/containerd v1.5.10/go.mod h1:fvQqCfadDGga5HZyn3j4+dx56qj2I9YwBrlSdalvJYQ= -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/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-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/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/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -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/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50 h1:DBmgJDC9dTfkVyGgipamEh2BpGYxScCH1TOF1LL1cXc= +github.com/cncf/xds/go v0.0.0-20240318125728-8a4994d93e50/go.mod h1:5e1+Vvlzido69INQaVO6d87Qn543Xr6nooe9Kz7oBFM= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= +github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.10.0 h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU= +github.com/cockroachdb/errors v1.10.0/go.mod h1:lknhIsEVQ9Ss/qKDBQS/UqFSvPQjOwNq2qyKAxtHRqE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= +github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= +github.com/cometbft/cometbft v0.37.2 h1:XB0yyHGT0lwmJlFmM4+rsRnczPlHoAKFX6K8Zgc2/Jc= +github.com/cometbft/cometbft v0.37.2/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= +github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= +github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= +github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= +github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= +github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= +github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= 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-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -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-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-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/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/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= +github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= +github.com/cosmos/cosmos-sdk v0.47.5 h1:n1+WjP/VM/gAEOx3TqU2/Ny734rj/MX1kpUnn7zVJP8= +github.com/cosmos/cosmos-sdk v0.47.5/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= +github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= +github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= +github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= +github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= +github.com/cosmos/ibc-go/v7 v7.3.1 h1:bil1IjnHdyWDASFYKfwdRiNtFP6WK3osW7QFEAgU4I8= +github.com/cosmos/ibc-go/v7 v7.3.1/go.mod h1:wvx4pPBofe5ZdMNV3OFRxSI4auEP5Qfqf8JXLLNV04g= +github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= +github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= +github.com/cosmos/ledger-cosmos-go v0.12.1 h1:sMBxza5p/rNK/06nBSNmsI/WDqI0pVJFVNihy1Y984w= +github.com/cosmos/ledger-cosmos-go v0.12.1/go.mod h1:dhO6kj+Y+AHIOgAe4L9HL/6NDdyyth4q238I9yFpD2g= +github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= +github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creachadair/taskgroup v0.4.2 h1:jsBLdAJE42asreGss2xZGZ8fJra7WtwnHWeJFxv2Li8= +github.com/creachadair/taskgroup v0.4.2/go.mod h1:qiXUOSrbwAY3u0JPGTzObbE3yf9hcXHDKBZ2ZjpCbgM= 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 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -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/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk= github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e/go.mod h1:IJgIiGUARc4aOr4bOQ85klmjsShkEEfiRc6q/yBSfo8= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20190912175916-7055855a373f/go.mod h1:rQYf4tfk5sSwFsnDg3qYaBxSjsD9S8+59vW0dKUgme4= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= -github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/denisenkom/go-mssqldb v0.0.0-20181014144952-4e0d7dc8888f/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= -github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgraph-io/badger v1.6.0-rc1/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger v1.6.1/go.mod h1:FRmFw3uxvcpa8zG3Rxs0th+hCLIuaQg8HlNV5bjgnuU= -github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +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/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= +github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +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/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= +github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= +github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= +github.com/dfuse-io/logging v0.0.0-20201110202154-26697de88c79/go.mod h1:V+ED4kT/t/lKtH99JQmKIb0v9WL3VaYkJ36CfHlVECI= +github.com/dfuse-io/logging v0.0.0-20210109005628-b97a57253f70 h1:CuJS05R9jmNlUK8GOxrEELPbfXm0EuGh/30LjkjN5vo= +github.com/dfuse-io/logging v0.0.0-20210109005628-b97a57253f70/go.mod h1:EoK/8RFbMEteaCaz89uessDTnCWjbbcr+DXcBh4el5o= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= -github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684 h1:DBZ2sN7CK6dgvHVpQsQj4sRMCbWTmd17l+5SUCjnQSY= -github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684/go.mod h1:UfCu3YXJJCI+IdnqGgYP82dk2+Joxmv+mUTVBES6wac= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -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/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc= -github.com/docker/cli v20.10.11+incompatible/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.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.11+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U= -github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= -github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= -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 h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= -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 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= -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/dop251/goja v0.0.0-20200219165308-d1232e640a87/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= -github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= -github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/digitalocean/godo v1.104.1 h1:SZNxjAsskM/su0YW9P8Wx3gU0W1Z13b6tZlYNpl5BnA= +github.com/digitalocean/godo v1.104.1/go.mod h1:VAI/L5YDzMuPRU01lEEUSQ/sp5Z//1HnnFv/RBTEdbg= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +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 v25.0.2+incompatible h1:/OaKeauroa10K4Nqavw4zlhcDq/WBcPMc5DbjOGgozY= +github.com/docker/docker v25.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +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/dominikbraun/graph v0.23.0 h1:TdZB4pPqCLFxYhdyMFb1TBdFxp8XLcJfTTBQucVPgCo= +github.com/dominikbraun/graph v0.23.0/go.mod h1:yOjYyogZLY1LSG9E33JWZJiq5k83Qy2C6POAuiViluc= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= -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.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= +github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= +github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= 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/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= +github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= 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/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= -github.com/ethereum/go-ethereum v1.9.18/go.mod h1:JSSTypSMTkGZtAdAChH2wP5dZEvPGh3nUTuDpH+hNrg= -github.com/ethereum/go-ethereum v1.9.24/go.mod h1:JIfVb6esrqALTExdz9hRYvrP0xBDf6wCncIu1hNwHpM= -github.com/ethereum/go-ethereum v1.10.11/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= -github.com/ethereum/go-ethereum v1.10.16 h1:3oPrumn0bCW/idjcxMn5YYVCdK7VzJYIvwGZUGLEaoc= -github.com/ethereum/go-ethereum v1.10.16/go.mod h1:Anj6cxczl+AHy63o4X9O8yWNHuN5wMpfb8MAnHkWn7Y= -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/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= +github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.8 h1:1od+thJel3tM52ZUNQwvpYOeRHlbkVFZ5S8fhi0Lgsg= +github.com/ethereum/go-ethereum v1.13.8/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/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/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE= -github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= -github.com/fxamacker/cbor/v2 v2.2.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQmYw= +github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/fxamacker/cbor/v2 v2.5.0 h1:oHsG0V/Q6E/wqTS2O1Cozzsy69nqCiguo5Q1a1ADivE= +github.com/fxamacker/cbor/v2 v2.5.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gagliardetto/binary v0.7.7 h1:QZpT38+sgoPg+TIQjH94sLbl/vX+nlIRA37pEyOsjfY= +github.com/gagliardetto/binary v0.7.7/go.mod h1:mUuay5LL8wFVnIlecHakSZMvcdqfs+CsotR5n77kyjM= +github.com/gagliardetto/gofuzz v1.2.2 h1:XL/8qDMzcgvR4+CyRQW9UGdwPRPMHVJfqQ/uMvSUuQw= +github.com/gagliardetto/gofuzz v1.2.2/go.mod h1:bkH/3hYLZrMLbfYWA0pWzXmi5TTRZnu4pMGZBkqMKvY= +github.com/gagliardetto/solana-go v1.8.4 h1:vmD/JmTlonyXGy39bAo0inMhmbdAwV7rXZtLDMZeodE= +github.com/gagliardetto/solana-go v1.8.4/go.mod h1:i+7aAyNDTHG0jK8GZIBSI4OVvDqkt2Qx+LklYclRNG8= +github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw= +github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= +github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSGFplbWBSHaGolEQlNLgMgSE3ccnIQ= github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9yhSRvsmYyZsshflcR6ePWYLql6UU1amW13IM= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -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/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= +github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/cors v1.3.1/go.mod h1:jjEJ4268OPZUcU7k9Pm653S7lXUGcqMADzFA61xsmDk= -github.com/gin-contrib/expvar v0.0.0-20181230111036-f23b556cc79f/go.mod h1:lKdjvm96uBFqhKVjrNmDm66m199oRiOxJAThyr6rdW8= -github.com/gin-contrib/size v0.0.0-20190528085907-355431950c57/go.mod h1:tnsW+BI6lwWXXNN+IJNJGRPjs10RYHJFCnbUOO1EPWc= -github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk= +github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI= +github.com/gin-contrib/expvar v0.0.1 h1:IuU5ArEgihz50vG8Onrwz22kJr7Mcvgv9xSSpfU5g+w= +github.com/gin-contrib/expvar v0.0.1/go.mod h1:8o2CznfQi1JjktORdHr2/abg3wSV6OCnXh0yGypvvVw= +github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE= +github.com/gin-contrib/sessions v0.0.5/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY= +github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4 h1:Z9J0PVIt1PuibOShaOw1jH8hUYz+Ak8NLsR/GI0Hv5I= +github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4/go.mod h1:CEPcgZiz8998l9E8fDm16h8UfHRL7b+5oG0j/0koeVw= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/contrib v0.0.0-20190526021735-7fb7810ed2a0/go.mod h1:iqneQ2Df3omzIVTkIfn7c1acsVnMGiSLn4XF5Blh3Yg= -github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= -github.com/gin-gonic/gin v1.6.0/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.4.1 h1:IvVlgbzSsaUNudsw5dcXSzF3EWyXTi5XrAdngnuhRyg= -github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA= +github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= +github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A= +github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc= 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-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -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 v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= +github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -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/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= +github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= +github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= +github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.4 h1:unTcVm6PispJsMECE3zWgvG4xTiKda1LIR5rCRWLG6M= +github.com/go-openapi/errors v0.20.4/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk= 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/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -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/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= +github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro= +github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= +github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= +github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= +github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= +github.com/go-openapi/strfmt v0.21.7 h1:rspiXgNWgeUzhjo1YU01do6qsahtJNByjLVbPLNHb8k= +github.com/go-openapi/strfmt v0.21.7/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew= 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.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU= +github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -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-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= +github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +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-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= +github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= +github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0= +github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY= +github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= +github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +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/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/logger v1.0.3 h1:YaXOTHNPCvkqqA7w05A4v0k2tCdpr+sgFlgINbQ6gqc= -github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= -github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM= -github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= -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/gobuffalo/packr/v2 v2.8.1 h1:tkQpju6i3EtMXJ9uoF5GT6kB+LMTimDWD8Xvbz6zDVA= -github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -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/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/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/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v3.3.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.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -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.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.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.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -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/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= +github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= 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 h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= 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= @@ -759,13 +664,11 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt 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 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v0.0.0-20170307001533-c9c7427a2a70/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.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/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= @@ -780,26 +683,20 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw 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-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2-0.20200707131729-196ae77b8a26/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= -github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= -github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/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 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.9.0/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= -github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= -github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= 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= @@ -811,23 +708,26 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= +github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/go-tpm v0.9.0 h1:sQF6YqWMi+SCXpsmS3fd21oPy/vSddwZry4JnmltHVk= +github.com/google/go-tpm v0.9.0/go.mod h1:FkNVkc6C+IsvDI9Jw1OveJmxGZUUaKxtrpOS47QWKfU= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= 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/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= +github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 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= @@ -837,244 +737,268 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b h1:RMpPgZTSApbPf7xaVel+QkoGPRLFLrwFO89uDUHEGf0= +github.com/google/pprof v0.0.0-20231023181126-ff6d637d2a7b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= 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.1.5/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.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +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/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 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gophercloud/gophercloud v1.7.0 h1:fyJGKh0LBvIZKLvBWvQdIgkaV5yTM3Jh9EYUh+UNCAs= +github.com/gophercloud/gophercloud v1.7.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= -github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/rpc v1.2.0/go.mod h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= +github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= +github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= -github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= -github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/grafana/dskit v0.0.0-20231120170505-765e343eda4f h1:gyojr97YeWZ70pKNakWv5/tKwBHuLy3icnIeCo9gQr4= +github.com/grafana/dskit v0.0.0-20231120170505-765e343eda4f/go.mod h1:8dsy5tQOkeNQyjXpm5mQsbCu3H5uzeBD35MzRQFznKU= +github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586 h1:/of8Z8taCPftShATouOrBVy6GaTTjgQd/VfNiZp/VXQ= +github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586/go.mod h1:PGk3RjYHpxMM8HFPhKKo+vve3DdlPUELZLSDEFehPuU= +github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b h1:Msqs1nc2qWMxTriDCITKl58Td+7Md/RURmUmH7RXKns= +github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b/go.mod h1:WtWosval1KCZP9BGa42b8aVoJmVXSg0EvQXi9LDSVZQ= +github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503 h1:gdrsYbmk8822v6qvPwZO5DC6QjnAW7uKJ9YXnoUmV8c= +github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503/go.mod h1:d8seWXCEXkL42mhuIJYcGi6DxfehzoIpLrMQWJojvOo= +github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4 h1:wQ0FnSeebhJIBkgYOD06Mxk9HV2KhtEG0hp/7R+5RUQ= +github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4/go.mod h1:f3JSoxBTPXX5ec4FxxeC19nTBSxoTz+cBgS3cYLMcr0= +github.com/grafana/pyroscope-go v1.1.1 h1:PQoUU9oWtO3ve/fgIiklYuGilvsm8qaGhlY4Vw6MAcQ= +github.com/grafana/pyroscope-go v1.1.1/go.mod h1:Mw26jU7jsL/KStNSGGuuVYdUq7Qghem5P8aXYXSXG88= +github.com/grafana/pyroscope-go/godeltaprof v0.1.6 h1:nEdZ8louGAplSvIJi1HVp7kWvFvdiiYg3COLlTwJiFo= +github.com/grafana/pyroscope-go/godeltaprof v0.1.6/go.mod h1:Tk376Nbldo4Cha9RgiU7ik8WKFkNpfds98aUzS8omLE= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/graph-gophers/dataloader v5.0.0+incompatible h1:R+yjsbrNq1Mo3aPG+Z/EKYrXrXXUNJHOgbRt+U6jOug= +github.com/graph-gophers/dataloader v5.0.0+incompatible/go.mod h1:jk4jk0c5ZISbKaMe8WsVopGB5/15GvGHMdMdPtwlRp4= +github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/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 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= 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 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/guregu/null v3.5.0+incompatible/go.mod h1:ePGpQaN9cw0tj45IR5E5ehMvsFlLlQZAkkOXZurJ3NM= -github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= -github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= +github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= +github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= +github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= +github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= +github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= +github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= 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-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-envparse v0.1.0 h1:bE++6bhIsNCPLvgDZkYqo3nA+/PFI51pkrHdmPSDFPY= +github.com/hashicorp/go-envparse v0.1.0/go.mod h1:OHheN1GoygLlAkTlXLXvAdnXdZxy8JUweQ1rAXx1xnc= +github.com/hashicorp/go-getter v1.7.1 h1:SWiSWN/42qdpR0MdhaOc/bLR48PLuP1ZQtYLRlM69uY= +github.com/hashicorp/go-getter v1.7.1/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/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-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-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-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= +github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= +github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= 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-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c h1:Nc3Mt2BAnq0/VoLEntF/nipX+K1S7pG+RgwiitSv6v0= +github.com/hashicorp/nomad/api v0.0.0-20230721134942-515895c7690c/go.mod h1:O23qLAZuCx4htdY9zBaO4cJPXgleSFEdq6D/sezGgYE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= +github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/hetznercloud/hcloud-go/v2 v2.4.0 h1:MqlAE+w125PLvJRCpAJmEwrIxoVdUdOyuFUhE/Ukbok= +github.com/hetznercloud/hcloud-go/v2 v2.4.0/go.mod h1:l7fA5xsncFBzQTyw29/dw5Yr88yEGKKdc6BHf24ONS0= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= -github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.0.2 h1:RfGLP+h3mvisuWEyybxNq5Eft3NWhHLPeUN72kpKZoI= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= +github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= +github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.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 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= +github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= -github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.2/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= -github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= -github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= -github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= -github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= -github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaHzfGTzuE3s= -github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= -github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= -github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= -github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= -github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= -github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= -github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= -github.com/ipfs/go-log v1.0.2/go.mod h1:1MNjMxe0u6xvJZgeqbJ8vdo2TKaGwZ1a0Bpza+sr2Sk= -github.com/ipfs/go-log v1.0.3/go.mod h1:OsLySYkwIbiSUR/yBTdv1qPtcE4FW3WPWk/ewz9Ru+A= -github.com/ipfs/go-log v1.0.4/go.mod h1:oDCg2FkjogeFOhqqb+N39l2RpTNPL6F/StPkB3kPgcs= -github.com/ipfs/go-log/v2 v2.0.2/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.3/go.mod h1:O7P1lJt27vWHhOwQmcFEvlmo49ry2VY2+JfBWFaa9+0= -github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= -github.com/ipfs/go-log/v2 v2.1.1/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= -github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/ionos-cloud/sdk-go/v6 v6.1.9 h1:Iq3VIXzeEbc8EbButuACgfLMiY5TPVWUPNrF+Vsddo4= +github.com/ionos-cloud/sdk-go/v6 v6.1.9/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +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 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +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.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +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/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/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.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +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.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +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.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +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.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.0.0-20150120210510-1bb1476777ec/go.mod h1:rGaEvXB4uRSZMmzKNLoXvTu1sfx+1kv/DojUlPrSZGs= -github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= -github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/gorm v1.9.2/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= -github.com/jinzhu/gorm v1.9.11-0.20190912141731-0c98e7d712e2/go.mod h1:bu/pK8szGZ2puuErfU0RwyeNdsf3e6nCX/noXaVxkfw= -github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= -github.com/jinzhu/inflection v0.0.0-20180308033659-04140366298a/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v0.0.0-20181116074157-8ec929ed50c3/go.mod h1:oHTiXerJ20+SfYcrdlBO7rzZRJWGwSTQ0iUY2jI6Gfc= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -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/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= -github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= 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 v0.0.0-20170918002102-8eab2debe79d/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -1082,364 +1006,131 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr 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/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/kami-zh/go-capturer v0.0.0-20171211120116-e492ea43421d/go.mod h1:P2viExyCEfeWGU259JnaQ34Inuec4R38JCyBx2edgD0= -github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/karalabe/usb v0.0.0-20191104083709-911d15fe12a9/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/karrick/godirwalk v1.15.8 h1:7+rWAZPn9zuRxaIqqT8Ohs2Q2Ac0msBqwRdxNCr2VVs= -github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +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/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.4.0/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.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= 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/koron/go-ssdp v0.0.0-20191105050749-2e1c40ed0b5d/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJuqPYs= -github.com/kortschak/utter v1.0.1/go.mod h1:vSmSjbyrlKjjsL71193LmzBOKgwePk9DH6uFaWHIInc= 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 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/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/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -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/leanovate/gopter v0.2.8/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leanovate/gopter v0.2.10-0.20210127095200-9abe2343507a h1:dHCfT5W7gghzPtfsW488uPmEOm85wewI+ypUwibyTdU= github.com/leanovate/gopter v0.2.10-0.20210127095200-9abe2343507a/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.1/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.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ= -github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= -github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= -github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= -github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5Jb/P5ohUnFLNzEAR4DLSzpn2QLU= -github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= -github.com/libp2p/go-eventbus v0.2.1/go.mod h1:jc2S4SoEVPP48H9Wpzm5aiGwUCBMfGhVhhBjyhhCJs8= -github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-flow-metrics v0.0.3/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZkfEI5sT54= -github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= -github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= -github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= -github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= -github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= -github.com/libp2p/go-libp2p v0.10.2/go.mod h1:BYckt6lmS/oA1SlRETSPWSUulCQKiZuTVsymVMc//HQ= -github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= -github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= -github.com/libp2p/go-libp2p-asn-util v0.0.0-20201026210036-4f868c957324/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= -github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/djNA3fdpCWloIudE= -github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= -github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= -github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= -github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= -github.com/libp2p/go-libp2p-autonat v0.3.1/go.mod h1:0OzOi1/cVc7UcxfOddemYD5vzEqi4fwRbnZcJGLi68U= -github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= -github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= -github.com/libp2p/go-libp2p-blankhost v0.1.4/go.mod h1:oJF0saYsAXQCSfDq254GMNmLNz6ZTHTOvtF4ZydUvwU= -github.com/libp2p/go-libp2p-blankhost v0.1.6/go.mod h1:jONCAJqEP+Z8T6EQviGL4JsQcLx1LgTGtVqFNY8EMfQ= -github.com/libp2p/go-libp2p-blankhost v0.2.0/go.mod h1:eduNKXGTioTuQAUcZ5epXi9vMl+t4d8ugUBRQ4SqaNQ= -github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= -github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-circuit v0.3.1/go.mod h1:8RMIlivu1+RxhebipJwFDA45DasLx+kkrp4IlJj53F4= -github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= -github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= -github.com/libp2p/go-libp2p-core v0.0.4/go.mod h1:jyuCQP356gzfCFtRKyvAbNkyeuxb7OlyhWZ3nls5d2I= -github.com/libp2p/go-libp2p-core v0.2.0/go.mod h1:X0eyB0Gy93v0DZtSYbEM7RnMChm9Uv3j7yRXjO77xSI= -github.com/libp2p/go-libp2p-core v0.2.2/go.mod h1:8fcwTbsG2B+lTgRJ1ICZtiM5GWCWZVoVrLaDRvIRng0= -github.com/libp2p/go-libp2p-core v0.2.4/go.mod h1:STh4fdfa5vDYr0/SzYYeqnt+E6KfEV5VxfIrm0bcI0g= -github.com/libp2p/go-libp2p-core v0.2.5/go.mod h1:6+5zJmKhsf7yHn1RbmYDu08qDUpIUxGdqHuEZckmZOA= -github.com/libp2p/go-libp2p-core v0.3.0/go.mod h1:ACp3DmS3/N64c2jDzcV429ukDpicbL6+TrrxANBjPGw= -github.com/libp2p/go-libp2p-core v0.3.1/go.mod h1:thvWy0hvaSBhnVBaW37BvzgVV68OUhgJJLAa6almrII= -github.com/libp2p/go-libp2p-core v0.4.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.0/go.mod h1:49XGI+kc38oGVwqSBhDEwytaAxgZasHhFfQKibzTls0= -github.com/libp2p/go-libp2p-core v0.5.1/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.2/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.3/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.4/go.mod h1:uN7L2D4EvPCvzSH5SrhR72UWbnSGpt5/a35Sm4upn4Y= -github.com/libp2p/go-libp2p-core v0.5.5/go.mod h1:vj3awlOr9+GMZJFH9s4mpt9RHHgGqeHCopzbYKZdRjM= -github.com/libp2p/go-libp2p-core v0.5.6/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.5.7/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.6.0/go.mod h1:txwbVEhHEXikXn9gfC7/UDDw7rkxuX0bJvM49Ykaswo= -github.com/libp2p/go-libp2p-core v0.6.1/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.7.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.0/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-core v0.8.5/go.mod h1:FfewUH/YpvWbEB+ZY9AQRQ4TAD8sJBt/G1rVvhz5XT8= -github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= -github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= -github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= -github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= -github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-kad-dht v0.8.3/go.mod h1:HnYYy8taJWESkqiESd1ngb9XX/XGGsMA5G0Vj2HoSh4= -github.com/libp2p/go-libp2p-kad-dht v0.11.1/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI= -github.com/libp2p/go-libp2p-kbucket v0.4.2/go.mod h1:7sCeZx2GkNK1S6lQnGUW5JYZCFPnXzAZCCBBS70lytY= -github.com/libp2p/go-libp2p-kbucket v0.4.7/go.mod h1:XyVo99AfQH0foSf176k4jY1xUJ2+jUJIZCSDm7r2YKk= -github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= -github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= -github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= -github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= -github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= -github.com/libp2p/go-libp2p-mplex v0.2.4/go.mod h1:mI7iOezdWFOisvUwaYd3IDrJ4oVmgoXK8H331ui39CE= -github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= -github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= -github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= -github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= -github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= -github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= -github.com/libp2p/go-libp2p-noise v0.1.2/go.mod h1:9B10b7ueo7TIxZHHcjcDCo5Hd6kfKT2m77by82SFRfE= -github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= -github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= -github.com/libp2p/go-libp2p-peerstore v0.1.3/go.mod h1:BJ9sHlm59/80oSkpWgr1MyY1ciXAXV397W6h1GH/uKI= -github.com/libp2p/go-libp2p-peerstore v0.1.4/go.mod h1:+4BDbDiiKf4PzpANZDAT+knVdLxvqh7hXOujessqdzs= -github.com/libp2p/go-libp2p-peerstore v0.2.0/go.mod h1:N2l3eVIeAitSg3Pi2ipSrJYnqhVnMNQZo9nkSCuAbnQ= -github.com/libp2p/go-libp2p-peerstore v0.2.1/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.2/go.mod h1:NQxhNjWxf1d4w6PihR8btWIRjwRLBr4TYKfNgrUkOPA= -github.com/libp2p/go-libp2p-peerstore v0.2.3/go.mod h1:K8ljLdFn590GMttg/luh4caB/3g0vKuY01psze0upRw= -github.com/libp2p/go-libp2p-peerstore v0.2.4/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-peerstore v0.2.6/go.mod h1:ss/TWTgHZTMpsU/oKVVPQCGuDHItOpf2W8RxAi50P2s= -github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYcO0BW4wssv21LA= -github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= -github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= -github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= -github.com/libp2p/go-libp2p-routing-helpers v0.2.3/go.mod h1:795bh+9YeoFl99rMASoiVgHdi5bjack0N1+AFAdbvBw= -github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= -github.com/libp2p/go-libp2p-secio v0.2.0/go.mod h1:2JdZepB8J5V9mBp79BmwsaPQhRPNN2NrnB2lKQcdy6g= -github.com/libp2p/go-libp2p-secio v0.2.1/go.mod h1:cWtZpILJqkqrSkiYcDBh5lA3wbT2Q+hz3rJQq3iftD8= -github.com/libp2p/go-libp2p-secio v0.2.2/go.mod h1:wP3bS+m5AUnFA+OFO7Er03uO1mncHG0uVwGrwvjYlNY= -github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= -github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= -github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= -github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= -github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= -github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= -github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= -github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.0.4/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= -github.com/libp2p/go-libp2p-testing v0.1.0/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.1/go.mod h1:xaZWMJrPUM5GlDBxCeGUi7kI4eqnjVyavGroI2nxEM0= -github.com/libp2p/go-libp2p-testing v0.1.2-0.20200422005655-8775583591d8/go.mod h1:Qy8sAncLKpwXtS2dSnDOP8ktexIAHKu+J+pnZOFZLTc= -github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehtsBXMrXnCfJIgDti5g= -github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= -github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= -github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= -github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= -github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= -github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= -github.com/libp2p/go-libp2p-yamux v0.2.2/go.mod h1:lIohaR0pT6mOt0AZ0L2dFze9hds9Req3OfS+B+dv4qw= -github.com/libp2p/go-libp2p-yamux v0.2.5/go.mod h1:Zpgj6arbyQrmZ3wxSZxfBmbdnWtbZ48OpsfmQVTErwA= -github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhLEn0XhIoZ5viCwU= -github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= -github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= -github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= -github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= -github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= -github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= -github.com/libp2p/go-maddr-filter v0.1.0/go.mod h1:VzZhTXkMucEGGEOSKddrwGiOv0tUhgnKqNEmIAz/bPU= -github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= -github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= -github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= -github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= -github.com/libp2p/go-msgio v0.0.6/go.mod h1:4ecVB6d9f4BDSL5fqvPiC4A3KivjWn+Venn/1ALLMWA= -github.com/libp2p/go-nat v0.0.4/go.mod h1:Nmw50VAvKuk38jUBcmNh6p9lUJLoODbJRvYAa/+KSDo= -github.com/libp2p/go-nat v0.0.5/go.mod h1:B7NxsVNPZmRLvMOwiEO1scOSyjA56zxYAGv1yQgRkEU= -github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.1.4/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= -github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.5/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-openssl v0.0.7/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= -github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= -github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= -github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= -github.com/libp2p/go-reuseport-transport v0.0.3/go.mod h1:Spv+MPft1exxARzP2Sruj2Wb5JSyHNncjf1Oi2dEbzM= -github.com/libp2p/go-reuseport-transport v0.0.4/go.mod h1:trPa7r/7TJK/d+0hdBLOCGvpQQVOU74OXbNCIMkufGw= -github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= -github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= -github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= -github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= -github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= -github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= -github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= -github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= -github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= -github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.0/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.5/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= -github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= -github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/linode/linodego v1.23.0 h1:s0ReCZtuN9Z1IoUN9w1RLeYO1dMZUGPwOQ/IBFsBHtU= +github.com/linode/linodego v1.23.0/go.mod h1:0U7wj/UQOqBNbKv1FYTXiBUXueR8DY4HvIotwE0ENgg= +github.com/linxGnu/grocksdb v1.7.16 h1:Q2co1xrpdkr5Hx3Fp+f+f7fRGhQFQhvi/+226dtLmA8= +github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= 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/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +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-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/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= -github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= -github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= -github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY= -github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= -github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= 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/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= -github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.0/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.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-isatty v0.0.2/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/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.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -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.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= +github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= 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 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +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/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.30/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= +github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= @@ -1447,29 +1138,28 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= 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 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -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/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1479,561 +1169,445 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 h1:mPMvm6X6tf4w8y7j9YIt6V9jfWhL6QlbEc7CCmeQlWk= +github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1/go.mod h1:ye2e/VUEtE2BHE+G/QcKkcLQVAEJoYRFj5VUOQatCRE= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= -github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.0/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= -github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.2.1/go.mod h1:s/Apk6IyxfvMjDafnhJgJ3/46z7tZ04iMk5wP4QMGGE= -github.com/multiformats/go-multiaddr v0.2.2/go.mod h1:NtfXiOtHvghW9KojvtySjH5y0u0xW5UouOmQQrn6a3Y= -github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4fJxp6ggJGteB8HQTI= -github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= -github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= -github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= -github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= -github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= -github.com/multiformats/go-multiaddr-net v0.1.0/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.1/go.mod h1:5JNbcfBOP4dnhoZOv10JJVkJO0pCCEf8mTnipAo2UZQ= -github.com/multiformats/go-multiaddr-net v0.1.2/go.mod h1:QsWt3XK/3hwvNxZJp92iMQKME1qHfpYmyIjFVsSOY6Y= -github.com/multiformats/go-multiaddr-net v0.1.3/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.4/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.1.5/go.mod h1:ilNnaM9HbmVFqsb/qcNysjCu4PVONlrBZpHIrw/qQuA= -github.com/multiformats/go-multiaddr-net v0.2.0/go.mod h1:gGdH3UXny6U3cKKYCvpXI5rnK7YaOIEOPVDI9tsJbEA= -github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= -github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= -github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= -github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= -github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= -github.com/multiformats/go-multistream v0.1.2/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= -github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.2/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= +github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249 h1:NHrXEjTNQY7P0Zfx1aMrNhpgxHmow66XQtm0aQLY0AE= +github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= 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/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= 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/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -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.7.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.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega 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.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.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/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI= +github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -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.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc= -github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw= -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.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= 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 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/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/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= +github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/runc v1.1.10 h1:EaL5WeO9lv9wmS6SASjszOeQdSctvpbu0DdBQBizE40= +github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= +github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= +github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= +github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= +github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= +github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= +github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= -github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -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.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +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.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= -github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU= +github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= 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/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -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.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/pressly/goose/v3 v3.16.0 h1:xMJUsZdHLqSnCqESyKSqEfcYVYsUuup1nrOhaEFftQg= +github.com/pressly/goose/v3 v3.16.0/go.mod h1:JwdKVnmCRhnF6XLQs2mHEQtucFD49cQBdRM4UiwkxsM= +github.com/prometheus/alertmanager v0.26.0 h1:uOMJWfIwJguc3NaM3appWNbbrh6G/OjvaHMk22aBBYc= +github.com/prometheus/alertmanager v0.26.0/go.mod h1:rVcnARltVjavgVaNnmevxK7kOn7IZavyf0KNgHkbEpU= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang 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.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +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.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181120120127-aeab699e26f4/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 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.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE= -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= +github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= +github.com/prometheus/exporter-toolkit v0.10.1-0.20230714054209-2f4150c63f97 h1:oHcfzdJnM/SFppy2aUlvomk37GI33x9vgJULihE5Dt8= +github.com/prometheus/exporter-toolkit v0.10.1-0.20230714054209-2f4150c63f97/go.mod h1:LoBCZeRh+5hX+fSULNyFnagYlQG/gBsyA/deNzROkq8= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.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 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/prometheus v0.48.1 h1:CTszphSNTXkuCG6O0IfpKdHcJkvvnAAE1GbELKS+NFk= +github.com/prometheus/prometheus v0.48.1/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= -github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/pyroscope-io/client v0.7.1 h1:yFRhj3vbgjBxehvxQmedmUWJQ4CAfCHhn+itPsuWsHw= +github.com/pyroscope-io/client v0.7.1/go.mod h1:4h21iOU4pUOq0prKyDlvYRL+SCKsBc5wKiEtV+rJGqU= +github.com/pyroscope-io/godeltaprof v0.1.2 h1:MdlEmYELd5w+lvIzmZvXGNMVzW2Qc9jDMuJaPOR75g4= +github.com/pyroscope-io/godeltaprof v0.1.2/go.mod h1:psMITXp90+8pFenXkKIpNhrfmI9saQnPbba27VIaiQE= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8= -github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 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.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= -github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= -github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= -github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc/go.mod h1:HFLT6i9iR4QBOF5rdCyjddC9t59ArqWJV2xx+jwcCMo= -github.com/rubenv/sql-migrate v0.0.0-20211023115951-9f02b1e13857 h1:nI2V0EI64bEYpbyOmwYfk0DYu26j0k4LhC7YS4tKkhA= -github.com/rubenv/sql-migrate v0.0.0-20211023115951-9f02b1e13857/go.mod h1:HFLT6i9iR4QBOF5rdCyjddC9t59ArqWJV2xx+jwcCMo= +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/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= +github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +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/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= +github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= -github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +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/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= +github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21 h1:yWfiTPwYxB0l5fGMhl/G+liULugVIHD9AU77iNLrURQ= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.21/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scylladb/go-reflectx v1.0.1 h1:b917wZM7189pZdlND9PbIJ6NQxfDPfBvUaQ7cjj1iZQ= +github.com/scylladb/go-reflectx v1.0.1/go.mod h1:rWnOfDIRWBGN0miMLIcoPt/Dhi2doCMZqwMCJ3KupFc= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= 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/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v3.21.10+incompatible h1:AL2kpVykjkqeN+MFe1WcwSBVUjGjvdU8/ubvCuXAjrU= -github.com/shirou/gopsutil v3.21.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= +github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= +github.com/sercand/kuberesolver/v5 v5.1.1 h1:CYH+d67G0sGBj7q5wLK61yzqJJ8gLLC8aeprPTHb6yY= +github.com/sercand/kuberesolver/v5 v5.1.1/go.mod h1:Fs1KbKhVRnB2aDWN12NjKCB+RgYMWZJ294T3BtmVCpQ= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= +github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.24.3 h1:eoUGJSmdfLzJ3mxIhmOAhgKEKgQkeOwKpz1NbhVnuPE= +github.com/shirou/gopsutil/v3 v3.24.3/go.mod h1:JpND7O217xa72ewWz9zN2eIIkPWsDN/3pl0H8Qt0uwg= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -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 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/slack-go/slack v0.10.2 h1:KMN/h2sgUninHXvQI8PrR/PHBUuWp2NPvz2Kr66tki4= -github.com/slack-go/slack v0.10.2/go.mod h1:5FLdBRv7VW/d9EBxx/eEktOptWygbA9K2QK/KW7ds1s= -github.com/smartcontractkit/chainlink v0.8.10-0.20200825114219-81dd2fc95bac/go.mod h1:j7qIYHGCN4QqMXdO8g8A9dmUT5vKFmkxPSbjAIfrfNU= -github.com/smartcontractkit/chainlink v0.9.5-0.20201207211610-6c7fee37d5b7/go.mod h1:kmdLJbVZRCnBLiL6gG+U+1+0ofT3bB48DOF8tjQvcoI= -github.com/smartcontractkit/chainlink-testing-framework v1.1.21 h1:a1aBPGHzJn9X5qmGm+NsxfAgn9woYjC3UuinS5mIGNQ= -github.com/smartcontractkit/chainlink-testing-framework v1.1.21/go.mod h1:Squ1stWJdnlxS74X6ie2ucPGp0tjSwW1lxscUdoDTLI= -github.com/smartcontractkit/helmenv v1.0.71 h1:M94EYcDbyu9zBn2iiNJ3rKxpPqJHT4AjY3yQod08QcU= -github.com/smartcontractkit/helmenv v1.0.71/go.mod h1:VbfetB06uItvuxJKdZ6AftpbATYCnT40IaKRr75ebcs= -github.com/smartcontractkit/libocr v0.0.0-20201203233047-5d9b24f0cbb5/go.mod h1:bfdSuLnBWCkafDvPGsQ1V6nrXhg046gh227MKi4zkpc= -github.com/smartcontractkit/libocr v0.0.0-20220121130134-5d2b1d5f424b h1:9xEvwk6fHqL9Fp/u8bLd7kbEQKrDSzwuDsH1ptHjE9g= -github.com/smartcontractkit/libocr v0.0.0-20220121130134-5d2b1d5f424b/go.mod h1:nq3crM3wVqnyMlM/4ZydTuJ/WyCapAsOt7P94oRgSPg= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ= +github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= +github.com/smartcontractkit/chain-selectors v1.0.10 h1:t9kJeE6B6G+hKD0GYR4kGJSCqR1LNS7aI3jT0V+xGrg= +github.com/smartcontractkit/chain-selectors v1.0.10/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE= +github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8= +github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240703234618-dc1fbe45acc0 h1:10Na2NvsD7cjNrcfi3OqXk14NVCAwmTvtIBYu9/IgBs= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240703234618-dc1fbe45acc0/go.mod h1:fh9eBbrReCmv31bfz52ENCAMa7nTKQbdhb2B3+S2VGo= +github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240621143432-85370a54b141 h1:TMOoYaeSDkkI3jkCH7lKHOZaLkeDuxFTNC+XblD6M0M= +github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240621143432-85370a54b141/go.mod h1:0UNuO3nDt9MFsZPaHJBEUolxVkN0iC69j1ccDp95e8k= +github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240702144807-761f63e7b527 h1:Vs6myS+bpPwb8chUY7XxveJyhvejknhOmhDTddgsK5I= +github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240702144807-761f63e7b527/go.mod h1:KRK7KlAEpmORi+nJgT0vxQVWvlLEBQ6zgzXziZuKvUM= +github.com/smartcontractkit/chainlink-feeds v0.0.0-20240522213638-159fb2d99917 h1:MD80ZRCTvxxJ8PBmhtrKoTnky8cVNYrCrIBLVRbrOM0= +github.com/smartcontractkit/chainlink-feeds v0.0.0-20240522213638-159fb2d99917/go.mod h1:jwVxhctE6BgLOSSsVq9wbREpZ8Ev34H+UBxeUhESZRs= +github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240708130426-294b81e4afe7 h1:tBJo/Rn0Ur7XtzqTEgIhLYDDWdcXBf985AF0PegsDk8= +github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240708130426-294b81e4afe7/go.mod h1:NbXXQaNFskVMYRut0MvBlcHu/vDgipGMwYjamvjVB9Y= +github.com/smartcontractkit/chainlink-testing-framework v1.33.0 h1:vHQODEdsq5AIbRiyZZ30de6uwJUNFXLYvCr+Odr8TIs= +github.com/smartcontractkit/chainlink-testing-framework v1.33.0/go.mod h1:GrhHthZ5AmceF82+Ypw6Fov1EvB05JJbb1T0EKyO1x0= +github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.0-20240405215812-5a72bc9af239 h1:Kk5OVlx/5g9q3Z3lhxytZS4/f8ds1MiNM8yaHgK3Oe8= +github.com/smartcontractkit/chainlink-testing-framework/grafana v0.0.0-20240405215812-5a72bc9af239/go.mod h1:DC8sQMyTlI/44UCTL8QWFwb0bYNoXCfjwCv2hMivYZU= +github.com/smartcontractkit/chainlink/integration-tests v0.0.0-20240708135824-bf9122a8cee6 h1:oxyhjC53wA3B8WG4TbRcIO/WCw9jzSFRzwQQ9QGbSck= +github.com/smartcontractkit/chainlink/integration-tests v0.0.0-20240708135824-bf9122a8cee6/go.mod h1:+lAHs46edxC7o1bURJBQ81rR/ej6PYCGU8l8dOgNRnM= +github.com/smartcontractkit/chainlink/v2 v2.10.0-beta0.0.20240708135824-bf9122a8cee6 h1:MHk1MDz1J0EzCH27UG9E+fT2tjddMSaoAXWxiOB2aBg= +github.com/smartcontractkit/chainlink/v2 v2.10.0-beta0.0.20240708135824-bf9122a8cee6/go.mod h1:UJKJcHY0iLvmZyUU2tyPVqUmfzmgSVDVtgjwCX8cE5M= +github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 h1:ko88+ZznniNJZbZPWAvHQU8SwKAdHngdDZ+pvVgB5ss= +github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJif132UCdjo8u43i7iPN1/MFnu49hv7lFGFftCHKU= +github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0= +github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e h1:9ypZ/8aW8Vm497i1gXHcT96oNLiu88jbg9QdX+IUE3E= +github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/seth v1.0.12 h1:iVdgMx42XWanPPnBaM5StR4c1XsTr/0/B/kKRZL5BsY= +github.com/smartcontractkit/seth v1.0.12/go.mod h1:thWtbLyW4nRHJGzC5heknQDORoJPErE15sF34LHkorg= +github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 h1:yiKnypAqP8l0OX0P3klzZ7SCcBUxy5KqTAKZmQOvSQE= +github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1/go.mod h1:q6f4fe39oZPdsh1i57WznEZgxd8siidMaSFq3wdPmVg= +github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1 h1:Dai1bn+Q5cpeGMQwRdjOdVjG8mmFFROVkSKuUgBErRQ= +github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1/go.mod h1:G5Sd/yzHWf26rQ+X0nG9E0buKPqRGPMJAfk2gwCzOOw= +github.com/smartcontractkit/wasp v0.4.7 h1:7mKJfwzFbuE8xVLUYtLt7Bjw8q/bmVZRW6Ks8kc1LVM= +github.com/smartcontractkit/wasp v0.4.7/go.mod h1:jeabvyXikb2aNoLQwcZGqaz17efrR8NJhpq4seAmdgs= +github.com/smartcontractkit/wsrpc v0.8.1 h1:kk0SXLqWrWaZ3J6c7n8D0NZ2uTMBBBpG5dZZXZX8UGE= +github.com/smartcontractkit/wsrpc v0.8.1/go.mod h1:yfg8v8fPLXkb6Mcnx6Pm/snP6jJ0r5Kf762Yd1a/KpA= 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/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= +github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -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 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +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 v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -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.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= -github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 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/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.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -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.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= -github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= -github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= -github.com/src-d/envconfig v1.0.0/go.mod h1:Q9YQZ7BKITldTBnoxsE5gOeB5y66RyPXeue/R4aaNBc= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 h1:ju5UTwk5Odtm4trrY+4Ca4RMj5OyXbmVeDAVad2T0Jw= -github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= -github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= -github.com/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/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75 h1:ZqpS7rAhhKD7S7DnrpEdrnW1/gZcv82ytpMviovkli4= +github.com/streamingfast/logging v0.0.0-20220405224725-2755dab2ce75/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= 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 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -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/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= -github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161/go.mod h1:wM7WEvslTq+iOEAMDLSzhVuOt5BRZ05WirO+b09GHQU= -github.com/templexxx/xor v0.0.0-20181023030647-4e92f724b73b/go.mod h1:5XA7W9S6mni3h5uvOC75dA3m9CCCaS83lltmc0ukdi4= -github.com/tevino/abool v0.0.0-20170917061928-9b9efcf221b5/go.mod h1:f1SCnEOt6sc3fOJfPQDRDzHOtSXuTtnz0ImG9kPRDV0= -github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= -github.com/tidwall/gjson v1.6.1/go.mod h1:BaHyNc5bjzYkPqgLq7mdVzeiRtULKULXLgZFKsxEHI0= -github.com/tidwall/gjson v1.6.3/go.mod h1:BaHyNc5bjzYkPqgLq7mdVzeiRtULKULXLgZFKsxEHI0= -github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= +github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 h1:3SNcvBmEPE1YlB1JpVZouslJpI3GBNoiqW7+wb0Rz7w= +github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= +github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= +github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= +github.com/testcontainers/testcontainers-go v0.28.0 h1:1HLm9qm+J5VikzFDYhOd+Zw12NtOl+8drH2E8nTY1r8= +github.com/testcontainers/testcontainers-go v0.28.0/go.mod h1:COlDpUXbwW3owtpMkEB1zo9gwb1CoKVKlyrVPejF4AU= +github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a h1:YuO+afVc3eqrjiCUizNCxI53bl/BnPiVwXqLzqYTqgU= +github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a/go.mod h1:/sfW47zCZp9FrtGcWyo1VjbgDaodxX9ovZvgLb/MxaA= +github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= +github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.9.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= +github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.0.1/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/sjson v1.1.1/go.mod h1:yvVuSnpEQv5cYIrO+AT6kw4QVfd5SDZoGIS7/5+fZFs= -github.com/tidwall/sjson v1.1.2/go.mod h1:SEzaDwxiPzKzNfUEO4HbYF/m4UCSJDsGgNqsS1LvdoY= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tjfoc/gmsm v1.0.1/go.mod h1:XxO4hdhhrzAd+G4CjDqaOkd0hUzmtPR/d3EiBBMn/wc= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-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-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.0.2 h1:+t3w+KwLXO6154GNJY+qUtIxLTmFjfUmpguQT1OlOT8= -github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v0.0.0-20181209151446-772ced7fd4c2/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ulule/limiter v0.0.0-20190417201358-7873d115fc4e/go.mod h1:VJx/ZNGmClQDS5F6EmsGqK8j3jz1qJYZ6D9+MdAD+kw= -github.com/unrolled/secure v0.0.0-20190624173513-716474489ad3/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= -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/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulule/limiter/v3 v3.11.2 h1:P4yOrxoEMJbOTfRJR2OzjL90oflzYPPmWg+dvwN2tHA= +github.com/ulule/limiter/v3 v3.11.2/go.mod h1:QG5GnFOCV+k7lrL5Y8kgEeeflPH3+Cviqlqa8SVSQxI= +github.com/umbracle/ethgo v0.1.3 h1:s8D7Rmphnt71zuqrgsGTMS5gTNbueGO1zKLh7qsFzTM= +github.com/umbracle/ethgo v0.1.3/go.mod h1:g9zclCLixH8liBI27Py82klDkW7Oo33AxUOr+M9lzrU= +github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 h1:10Nbw6cACsnQm7r34zlpJky+IzxVLRk6MKTS2d3Vp0E= +github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722/go.mod h1:c8J0h9aULj2i3umrfyestM6jCq0LK0U6ly6bWy96nd4= +github.com/unrolled/secure v1.13.0 h1:sdr3Phw2+f8Px8HE5sd1EHdj1aV3yUwed/uZXChLFsk= +github.com/unrolled/secure v1.13.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= +github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= +github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fastjson v1.4.1 h1:hrltpHpIpkaxll8QltMU8c3QZ5+qIiCL8yKqPFJI/yE= +github.com/valyala/fastjson v1.4.1/go.mod h1:nV6MsjxL2IMJQUoHDIrjEI7oLyeqK6aBD7EFWPsvP8o= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -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/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/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= -github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= -github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= -github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= -github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= -github.com/whyrusleeping/mdns v0.0.0-20190826153040-b9b60ed33aa9/go.mod h1:j4l84WPFclQPj320J9gp0XwNKBb3U0zt5CBqjPp22G4= -github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -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/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= +github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xeipuuv/gojsonpointer v0.0.0-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 v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/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/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= -github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xtaci/kcp-go v5.4.5+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= -github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/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/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= -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 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= -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 h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= -github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= +github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= +github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= +github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= -go.dedis.ch/kyber/v3 v3.0.12/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1U= -go.dedis.ch/kyber/v3 v3.0.13/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1U= +go.dedis.ch/kyber/v3 v3.1.0 h1:ghu+kiRgM5JyD9TJ0hTIxTLQlJBR/ehjWvWwYW3XsC0= +go.dedis.ch/kyber/v3 v3.1.0/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1U= go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= 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.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -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/api/v3 v3.5.1/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/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= -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.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= +go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= +go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= +go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= +go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= +go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= +go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= +go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= +go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= +go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= 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.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= @@ -2041,101 +1615,105 @@ 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 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -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/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/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -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/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/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.starlark.net v0.0.0-20211013185944-b0039bd2cfe3 h1:oBcONsksxvpeodDrLjiMDaKHXKAVVfAydhe/792CE/o= -go.starlark.net v0.0.0-20211013185944-b0039bd2cfe3/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/collector/pdata v1.0.0-rcv0016 h1:qCPXSQCoD3qeWFb1RuIks8fw9Atxpk78bmtVdi15KhE= +go.opentelemetry.io/collector/pdata v1.0.0-rcv0016/go.mod h1:OdN0alYOlYhHXu6BDlGehrZWgtBuiDsz/rlNeJeXiNg= +go.opentelemetry.io/collector/semconv v0.87.0 h1:BsG1jdLLRCBRlvUujk4QA86af7r/ZXnizczQpEs/gg8= +go.opentelemetry.io/collector/semconv v0.87.0/go.mod h1:j/8THcqVxFna1FpvA2zYIsUperEtOaRaqoLYIN4doWw= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 h1:x8Z78aZx8cOF0+Kkazoc7lwUNMGy0LrzEMxTm4BbTxg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= +go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/sdk/metric v1.21.0 h1:smhI5oD714d6jHE6Tie36fPx4WDFIg+Y6RfAY4ICcR0= +go.opentelemetry.io/otel/sdk/metric v1.21.0/go.mod h1:FJ8RAsoPGv/wYMgBdUJXOm+6pzFY3YdljnXtv1SBE8Q= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= +go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/ratelimit v0.2.0/go.mod h1:YYBV4e4naJvhpitQrWJu1vCpgB7CboMe0qhltKt6mUg= +go.uber.org/ratelimit v0.3.0 h1:IdZd9wqvFXnvLvSEBo0KPcGfkoBGNkpTHlrE3Rcjkjw= +go.uber.org/ratelimit v0.3.0/go.mod h1:So5LG7CV1zWpY1sHe+DXTJqQvOx+FFPFaAs2SnoyBaI= 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.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go4.org/netipx v0.0.0-20230125063823-8449b0a6169f h1:ketMxHg+vWm3yccyYiq+uK8D3fRmna2Fcj+awpQp84s= +go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= +golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= 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= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/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-20190313024323-a1f597ede03a/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-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20190513172903-22d7a77e9e5f/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-20190618222545-ea8f1a30c443/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/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-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/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-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/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-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e h1:1SzTfNOXwIS2oWiMF+6qu0OUDKb0dauo6MoDUQyu+yU= -golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -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/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= 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-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -2143,11 +1721,10 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20201008143054-e3b2a7f2fdc7/go.mod h1:1phAWC201xIgDyaFpmDeZkgf70Q4Pd/CNqfRtVPtxNw= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE= +golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 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= @@ -2159,57 +1736,42 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu 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/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= 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.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.3.1-0.20200828183125-ce943fd02449/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-20170324220409-6c2325251549/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/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-20190313220215-9f648a60d977/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/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-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/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= @@ -2224,39 +1786,33 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/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-20210220033124-5f55cee0dc0d/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-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= 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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220107192237-5cfca573fb4d/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 h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/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-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/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= @@ -2265,97 +1821,66 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/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 h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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/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 h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20170325170518-afadfcc7779c/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/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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-20180926160741-c2ed4eda69e7/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-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/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-20190219092855-153ac476189d/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-20190228124157-a34e9553db1e/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-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/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-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190526052359-791d8a0f4d09/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/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-20190804053845-51ab0e2deafa/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-20190912141932-bc967efca4b8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-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-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-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/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= @@ -2363,75 +1888,70 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/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-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/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-20201015000850-e3ed0017c211/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-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-20201204225414-ed752295db88/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-20210303074136-134d130e1a04/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-20210316164454-77fc1eacc6aa/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-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/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-20210816074244-15123e1e1f71/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-20210831042530-f4d43177bf5e/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-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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-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-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/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-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-20220728004956-3c1f35247d10/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.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.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.8.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.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/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 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +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.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2440,51 +1960,45 @@ 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 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.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.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= 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-20201208040808-7e3f01d25324/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 h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/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/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +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-20181030000716-a0a13e073c7b/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-20181130052023-1c3d964395ce/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-20190624180213-70d37148ca0c/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-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190912185636-87d9f09c5d89/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/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= @@ -2495,8 +2009,6 @@ golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/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= @@ -2506,60 +2018,48 @@ golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapK 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-20200308013534-11ec41452d41/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-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 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-20201124202034-299f270db459/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201202200335-bef1c476418a/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/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +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.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +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/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -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= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= +gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= 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.10.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= @@ -2575,43 +2075,23 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.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.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= -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/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.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.2/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 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= 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-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/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-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 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= @@ -2620,9 +2100,7 @@ google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvx 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-20200108215221-bd8f9a0ef82f/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= @@ -2630,6 +2108,7 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG 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-20200324203455-a04cca1dde73/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= @@ -2637,68 +2116,36 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG 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-20201102152239-715cce707fb0/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-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/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-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/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-20220107163113-42d7afdf6368 h1:Et6SkiuvnBn+SgrSYXs/BrUpGB4mbdwt4R3vaPIlicA= -google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5 h1:P8OJ/WCl/Xo4E4zoe4/bifHpSmmKwARqyqE4nW6J2GQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:RGnPtTG7r4i8sPlNyDeikXF99hMM+hN6QMm4ooG9g2g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5 h1:Q2RxlXqh1cgzzUgV261vBO2jI5R/3DD1J2pM0nI4NhU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240520151616-dc85e6b867a5/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.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.28.1/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= @@ -2707,19 +2154,9 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp 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 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= 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= @@ -2732,62 +2169,31 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= 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-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.1/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/gormigrate.v1 v1.6.0/go.mod h1:Lf00lQrHqfSYWiTtPcyQabsDdM6ejZaMgV0OU6JMSlw= -gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= -gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= -gopkg.in/guregu/null.v2 v2.1.2/go.mod h1:XORrx8tyS5ZDcyUboCIxQtta/Aujk/6pfWrn9Xe33mU= -gopkg.in/guregu/null.v3 v3.5.0/go.mod h1:E4tX2Qe3h7QdL+uZ3a0vqvYwKQsRSQKM5V4YltdgH9Y= gopkg.in/guregu/null.v4 v4.0.0 h1:1Wm3S1WEA2I26Kq+6vcW+w0gcDo44YKYD7YIEJNHDjg= gopkg.in/guregu/null.v4 v4.0.0/go.mod h1:YoQhUrADuG3i9WqesrCmpNRwm1ypAgSHYqoOcTu/JrI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= 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.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= -gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -gopkg.in/redis.v4 v4.2.4/go.mod h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA= +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.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/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/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= -gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= 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/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170208141851-a3f3340b5840/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 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= @@ -2799,18 +2205,14 @@ 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-20200605160147-a5ece683394c/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 h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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= 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 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -helm.sh/helm/v3 v3.8.1 h1:J1EzhvtvKJRdx9skjUVe5xPN7KK2VA1mVxiQ9Ic5+oU= -helm.sh/helm/v3 v3.8.1/go.mod h1:Nm0Z2ciZFFvR9cRKpiRE2SMhJTgqY0b+ezT2cDcyqNw= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-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= @@ -2818,101 +2220,47 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh 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= -honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -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.23.4/go.mod h1:i77F4JfyNNrhOjZF7OwwNJS5Y1S9dpwvb9iYRYRczfI= -k8s.io/api v0.23.5 h1:zno3LUiMubxD/V1Zw3ijyKO3wxrhbUF1Ck+VjBvfaoA= -k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8= -k8s.io/apiextensions-apiserver v0.23.4 h1:AFDUEu/yEf0YnuZhqhIFhPLPhhcQQVuR1u3WCh0rveU= -k8s.io/apiextensions-apiserver v0.23.4/go.mod h1:TWYAKymJx7nLMxWCgWm2RYGXHrGlVZnxIlGnvtfYu+g= -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.23.4/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -k8s.io/apimachinery v0.23.5 h1:Va7dwhp8wgkUPWsEXk6XglXWU4IKYLKNlv8VkX7SDM0= -k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -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.23.4 h1:zNvQlG+C/ERjuUz4p7eY/0IWHaMixRSBoxgmyIdwo9Y= -k8s.io/apiserver v0.23.4/go.mod h1:A6l/ZcNtxGfPSqbFDoxxOjEjSKBaQmE+UTveOmMkpNc= -k8s.io/cli-runtime v0.23.4/go.mod h1:7KywUNTUibmHPqmpDFuRO1kc9RhsufHv2lkjCm2YZyM= -k8s.io/cli-runtime v0.23.5 h1:Z7XUpGoJZYZB2uNjQfJjMbyDKyVkoBGye62Ap0sWQHY= -k8s.io/cli-runtime v0.23.5/go.mod h1:oY6QDF2qo9xndSq32tqcmRp2UyXssdGrLfjAVymgbx4= -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.23.4/go.mod h1:PKnIL4pqLuvYUK1WU7RLTMYKPiIh7MYShLshtRY9cj0= -k8s.io/client-go v0.23.5 h1:zUXHmEuqx0RY4+CsnkOn5l0GU+skkRXKGJrhmE2SLd8= -k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/code-generator v0.23.4/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= -k8s.io/code-generator v0.23.5/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk= -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.23.4/go.mod h1:8o3Gg8i2vnUXGPOwciiYlkSaZT+p+7gA9Scoz8y4W4E= -k8s.io/component-base v0.23.5 h1:8qgP5R6jG1BBSXmRYW+dsmitIrpk8F/fPEvgDenMCCE= -k8s.io/component-base v0.23.5/go.mod h1:c5Nq44KZyt1aLl0IpHX82fhsn84Sb0jjzwjpcA42bY0= -k8s.io/component-helpers v0.23.4/go.mod h1:1Pl7L4zukZ054ElzRbvmZ1FJIU8roBXFOeRFu8zipa4= -k8s.io/component-helpers v0.23.5/go.mod h1:5riXJgjTIs+ZB8xnf5M2anZ8iQuq37a0B/0BgoPQuSM= -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/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/gengo v0.0.0-20210813121822-485abfe95c7c/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.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= -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-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kubectl v0.23.4/go.mod h1:Dgb0Rvx/8JKS/C2EuvsNiQc6RZnX0SbHJVG3XUzH6ok= -k8s.io/kubectl v0.23.5 h1:DmDULqCaF4qstj0Im143XmncvqWtJxHzK8IrW2BzlU0= -k8s.io/kubectl v0.23.5/go.mod h1:lLgw7cVY8xbd7o637vOXPca/w6HC205KsPCRDYRCxwE= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/metrics v0.23.4/go.mod h1:cl6sY9BdVT3DubbpqnkPIKi6mn/F2ltkU4yH1tEJ3Bo= -k8s.io/metrics v0.23.5/go.mod h1:WNAtV2a5BYbmDS8+7jSqYYV6E3efuGTpIwJ8PTD1wgs= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -oras.land/oras-go v1.1.0 h1:tfWM1RT7PzUwWphqHU6ptPU3ZhwVnSw/9nEGf519rYg= -oras.land/oras-go v1.1.0/go.mod h1:1A7vR/0KknT2UkJVWh+xMi95I/AhK8ZrxrnUSmXN0bQ= +k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= +k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= +k8s.io/apiextensions-apiserver v0.28.2 h1:J6/QRWIKV2/HwBhHRVITMLYoypCoPY1ftigDM0Kn+QU= +k8s.io/apiextensions-apiserver v0.28.2/go.mod h1:5tnkxLGa9nefefYzWuAlWZ7RZYuN/765Au8cWLA6SRg= +k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= +k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= +k8s.io/cli-runtime v0.28.2 h1:64meB2fDj10/ThIMEJLO29a1oujSm0GQmKzh1RtA/uk= +k8s.io/cli-runtime v0.28.2/go.mod h1:bTpGOvpdsPtDKoyfG4EG041WIyFZLV9qq4rPlkyYfDA= +k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= +k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/component-base v0.28.2 h1:Yc1yU+6AQSlpJZyvehm/NkJBII72rzlEsd6MkBQ+G0E= +k8s.io/component-base v0.28.2/go.mod h1:4IuQPQviQCg3du4si8GpMrhAIegxpsgPngPRR/zWpzc= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ= +k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= +k8s.io/kubectl v0.28.2 h1:fOWOtU6S0smdNjG1PB9WFbqEIMlkzU5ahyHkc7ESHgM= +k8s.io/kubectl v0.28.2/go.mod h1:6EQWTPySF1fn7yKoQZHYf9TPwIl2AygHEcJoxFekr64= +k8s.io/utils v0.0.0-20230711102312-30195339c3c7 h1:ZgnF1KZsYxWIifwSNZFZgNtWE89WI5yiP5WwlfDoIyc= +k8s.io/utils v0.0.0-20230711102312-30195339c3c7/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= +pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/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.27/go.mod h1:tq2nT0Kx7W+/f2JVE+zxYtUhdjuELJkVpNz+x/QN5R4= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= -sigs.k8s.io/kustomize/api v0.10.1 h1:KgU7hfYoscuqag84kxtzKdEC3mKMb99DPI3a0eaV1d0= -sigs.k8s.io/kustomize/api v0.10.1/go.mod h1:2FigT1QN6xKdcnGS2Ppp1uIWrtWN28Ms8A3OZUZhwr8= -sigs.k8s.io/kustomize/cmd/config v0.10.2/go.mod h1:K2aW7nXJ0AaT+VA/eO0/dzFLxmpFcTzudmAgDwPY1HQ= -sigs.k8s.io/kustomize/kustomize/v4 v4.4.1/go.mod h1:qOKJMMz2mBP+vcS7vK+mNz4HBLjaQSWRY22EF6Tb7Io= -sigs.k8s.io/kustomize/kyaml v0.13.0 h1:9c+ETyNfSrVhxvphs+K2dzT3dh5oVPPEqPOE/cUpScY= -sigs.k8s.io/kustomize/kyaml v0.13.0/go.mod h1:FTJxEZ86ScK184NpGSAQcfEqee0nul8oLCK30D47m4E= -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.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y= -sigs.k8s.io/structured-merge-diff/v4 v4.2.1/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= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/controller-runtime v0.16.2 h1:mwXAVuEk3EQf478PQwQ48zGOXvW27UJc8NHktQVuIPU= +sigs.k8s.io/controller-runtime v0.16.2/go.mod h1:vpMu3LpI5sYWtujJOa2uPK61nB5rbwlN7BAB8aSLvGU= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 h1:XX3Ajgzov2RKUdc5jW3t5jwY7Bo7dcRm+tFxT+NfgY0= +sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3/go.mod h1:9n16EZKMhXBNSiUC5kSdFQJkdH3zbxS/JoO619G1VAY= +sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 h1:W6cLQc5pnqM7vh3b7HvGNfXrJ/xL6BDMS0v1V/HHg5U= +sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/integration-tests/networks.yaml b/integration-tests/networks.yaml index 1310d0aa8..5f434d1e1 100644 --- a/integration-tests/networks.yaml +++ b/integration-tests/networks.yaml @@ -39,7 +39,7 @@ networks: gas_estimation_buffer: 10000 block_gas_limit: 40000000 starknet-dev: - name: 'StarkNet dev simulator' + name: 'Starknet dev simulator' chain_id: 2020 type: l2_starknet_dev l1_bridge_addr: '0x83D76591560d9CD02CE16c060c92118d19F996b3' diff --git a/integration-tests/package.json b/integration-tests/package.json new file mode 100644 index 000000000..8d1f69ecd --- /dev/null +++ b/integration-tests/package.json @@ -0,0 +1,7 @@ +{ + "name": "@chainlink/starknet-integration-tests", + "version": "0.0.1", + "license": "MIT", + "dependencies": {}, + "devDependencies": {} +} diff --git a/integration-tests/scripts/buildTestImage b/integration-tests/scripts/buildTestImage new file mode 100755 index 000000000..d91f3f32e --- /dev/null +++ b/integration-tests/scripts/buildTestImage @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + +# build test binaries +# accepts a single space separated argument of the folders to build + +set -ex + +# get this scripts directory +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) + +cd "$SCRIPT_DIR"/../../ || exit 1 + +TAG_VERSION="${1}" +BASE_IMAGE_VERSION="${2}" +SUITES=$3 +DEFAULT_SUITES="smoke soak" +ACCOUNT=$(aws sts get-caller-identity | jq -r .Account) +AWS_BASE="${ACCOUNT}".dkr.ecr.us-west-2.amazonaws.com +TAG="${AWS_BASE}"/chainlink-starknet-tests:"${TAG_VERSION}" +BASE_IMAGE="${AWS_BASE}"/test-base-image + +if [ "${TAG_VERSION}" = "" ]; then + echo "Need an argument for the image tag version in argument 1" + exit 1 +fi + +if [ "${BASE_IMAGE_VERSION}" = "" ]; then + echo "Need an argument for the test-base-image tag version in argument 2" + exit 1 +fi + +if [ "${SUITES}" = "" ]; then + echo "SUITES not set, using defaults \"${DEFAULT_SUITES}\"" + SUITES=${DEFAULT_SUITES} +fi + +aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin "${AWS_BASE}" +docker build -t "${TAG}" -f "./integration-tests/test.Dockerfile" --build-arg BASE_IMAGE="${BASE_IMAGE}" --build-arg IMAGE_VERSION="${BASE_IMAGE_VERSION}" --build-arg SUITES="${SUITES}" . +if "${4}" = "true"]; then + docker push "${TAG}" +fi diff --git a/integration-tests/scripts/buildTests b/integration-tests/scripts/buildTests new file mode 100755 index 000000000..ed2ec1132 --- /dev/null +++ b/integration-tests/scripts/buildTests @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +# build test binaries +# accepts a single space separated argument of the folders to build + +set -ex + +# get this scripts directory +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) + +helm repo update + +cd "$SCRIPT_DIR"/../../ || exit 1 + +# integration prep +make test-integration-prep + +cd "$SCRIPT_DIR"/../ || exit 1 + +# parse out quotes if they exist in the string +temp="${1%\"}" +tosplit="${temp#\"}" + +# find the suite name +OIFS=$IFS +IFS=' ' +for x in $tosplit +do + go test -c ./"${x}" +done +IFS=$OIFS diff --git a/integration-tests/scripts/entrypoint b/integration-tests/scripts/entrypoint new file mode 100755 index 000000000..462aaaf2f --- /dev/null +++ b/integration-tests/scripts/entrypoint @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +# Runs tests for a specific product + +set -ex + +# get this scripts directory +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) + +cd "$SCRIPT_DIR"/../ || exit 1 + +# Arguments needed +# ARGS=${ARGS:=} any extra args for go test +# SUITE=${SUITE:=} the suite of tests you want to run +# TEST_NAME=${TEST_NAME:=} The specific test to run +# run the tests +nix develop -c helm repo update +nix develop -c ./"${SUITE}".test -test.v -test.count 1 ${ARGS} -test.run ^${TEST_NAME}$ diff --git a/integration-tests/smoke/ocr2_test.go b/integration-tests/smoke/ocr2_test.go index 1c98b7651..e112664f1 100644 --- a/integration-tests/smoke/ocr2_test.go +++ b/integration-tests/smoke/ocr2_test.go @@ -1,86 +1,89 @@ package smoke_test -//revive:disable:dot-imports import ( - "math/big" + "flag" + "fmt" + "maps" + "os" + "testing" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - it "github.com/smartcontractkit/chainlink-starknet/integration-tests" - "github.com/smartcontractkit/chainlink-starknet/ops" - "github.com/smartcontractkit/chainlink-testing-framework/actions" - "github.com/smartcontractkit/chainlink-testing-framework/blockchain" - "github.com/smartcontractkit/chainlink-testing-framework/client" - "github.com/smartcontractkit/chainlink-testing-framework/utils" - "github.com/smartcontractkit/helmenv/environment" -) + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" -var _ = Describe("StarkNET OCR suite @ocr", func() { - var ( - err error - nets *blockchain.Networks - cls []client.Chainlink - networkL1 blockchain.EVMClient - networkL2 blockchain.EVMClient - ocrDeployer *it.OCRDeployer - starkDeployer *it.StarkNetContractDeployer - e *environment.Environment - ) + "github.com/smartcontractkit/chainlink-testing-framework/logging" + "github.com/smartcontractkit/chainlink/integration-tests/actions" + "github.com/smartcontractkit/chainlink/integration-tests/docker/test_env" - BeforeEach(func() { - By("Deploying the environment", func() { - e, err = environment.DeployOrLoadEnvironment(ops.DefaultStarkNETEnv()) - Expect(err).ShouldNot(HaveOccurred()) - err = e.ConnectAll() - Expect(err).ShouldNot(HaveOccurred()) - }) + "github.com/smartcontractkit/chainlink-starknet/integration-tests/common" + tc "github.com/smartcontractkit/chainlink-starknet/integration-tests/testconfig" + "github.com/smartcontractkit/chainlink-starknet/ops/gauntlet" + "github.com/smartcontractkit/chainlink-starknet/ops/utils" +) - By("Connecting to launched resources", func() { - networkRegistry := blockchain.NewDefaultNetworkRegistry() - networkRegistry.RegisterNetwork( - "l2_starknet_dev", - it.GetStarkNetClient, - it.GetStarkNetURLs, - ) - nets, err = networkRegistry.GetNetworks(e) - Expect(err).ShouldNot(HaveOccurred()) - networkL1, err = nets.Get(0) - Expect(err).ShouldNot(HaveOccurred()) - networkL2, err = nets.Get(1) - Expect(err).ShouldNot(HaveOccurred()) - ocrDeployer, err = it.NewOCRDeployer(networkL1) - Expect(err).ShouldNot(HaveOccurred()) - starkDeployer, err = it.NewStarkNetContractDeployer(networkL2) - Expect(err).ShouldNot(HaveOccurred()) - nets.Default.ParallelTransactions(true) - }) - By("Funding Chainlink nodes", func() { - cls, err = client.ConnectChainlinkNodes(e) - Expect(err).ShouldNot(HaveOccurred()) - err = actions.FundChainlinkNodes(cls, networkL1, big.NewFloat(3)) - Expect(err).ShouldNot(HaveOccurred()) - }) +var ( + keepAlive bool + decimals = 9 +) - By("Deploying L1 contracts", func() { - err = ocrDeployer.Deploy() - Expect(err).ShouldNot(HaveOccurred()) - }) +func init() { + flag.BoolVar(&keepAlive, "keep-alive", false, "enable to keep the cluster alive") +} - By("Deploying L2 contracts", func() { - err = starkDeployer.Deploy() - Expect(err).ShouldNot(HaveOccurred()) - }) - }) +func TestOCRBasic(t *testing.T) { + for _, test := range []struct { + name string + env map[string]string + }{ + {name: "embedded"}, + {name: "plugins", env: map[string]string{ + "CL_MEDIAN_CMD": "chainlink-feeds", + "CL_SOLANA_CMD": "chainlink-solana", + }}, + } { + config, err := tc.GetConfig("Smoke", tc.OCR2) + if err != nil { + t.Fatal(err) + } + err = os.Setenv("CHAINLINK_ENV_USER", *config.Common.User) + require.NoError(t, err, "Could not set CHAINLINK_ENV_USER") + err = os.Setenv("INTERNAL_DOCKER_REPO", *config.Common.InternalDockerRepo) + require.NoError(t, err, "Could not set INTERNAL_DOCKER_REPO") + test := test + t.Run(test.name, func(t *testing.T) { + t.Parallel() + logging.Init() + // + state, err := common.NewOCRv2State(t, "smoke-ocr2", &config) + require.NoError(t, err, "Could not setup the ocrv2 state") - Describe("with OCRv2 job", func() { - It("works", func() { - }) - }) + // K8s specific config and cleanup + if *config.Common.InsideK8s { + t.Cleanup(func() { + if err = actions.TeardownSuite(t, nil, state.Common.Env, state.ChainlinkNodesK8s, nil, zapcore.PanicLevel, nil); err != nil { + state.TestConfig.L.Error().Err(err).Msg("Error tearing down environment") + } + }) + } + if len(test.env) > 0 { + state.Common.TestEnvDetails.NodeOpts = append(state.Common.TestEnvDetails.NodeOpts, func(n *test_env.ClNode) { + if n.ContainerEnvs == nil { + n.ContainerEnvs = map[string]string{} + } + maps.Copy(n.ContainerEnvs, test.env) + }) + } + state.DeployCluster() + state.Clients.GauntletClient, err = gauntlet.NewStarknetGauntlet(fmt.Sprintf("%s/", utils.ProjectRoot)) + require.NoError(t, err, "Setting up gauntlet should not fail") + err = state.Clients.GauntletClient.SetupNetwork(state.Common.RPCDetails.RPCL2External, state.Account.Account, state.Account.PrivateKey) + require.NoError(t, err, "Setting up gauntlet network should not fail") + err = state.DeployGauntlet(0, 100000000000, decimals, "auto", 1, 1) + require.NoError(t, err, "Deploying contracts should not fail") + + state.SetUpNodes() - AfterEach(func() { - By("Tearing down the environment", func() { - err = actions.TeardownSuite(e, nets, utils.ProjectRoot, nil, nil) - Expect(err).ShouldNot(HaveOccurred()) + err = state.ValidateRounds(*config.OCR2.NumberOfRounds, false) + require.NoError(t, err, "Validating round should not fail") }) - }) -}) + } +} diff --git a/integration-tests/smoke/suite_test.go b/integration-tests/smoke/suite_test.go deleted file mode 100644 index 04d839d47..000000000 --- a/integration-tests/smoke/suite_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package smoke_test - -//revive:disable:dot-imports -import ( - "testing" - - "github.com/smartcontractkit/chainlink-testing-framework/actions" - - . "github.com/onsi/ginkgo/v2" -) - -func Test_Suite(t *testing.T) { - actions.GinkgoSuite("../") - RunSpecs(t, "Integration") -} diff --git a/integration-tests/soak/ocr2_test.go b/integration-tests/soak/ocr2_test.go new file mode 100644 index 000000000..098b852e9 --- /dev/null +++ b/integration-tests/soak/ocr2_test.go @@ -0,0 +1,94 @@ +package smoke_test + +import ( + "flag" + "fmt" + "maps" + "os" + "testing" + + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + + "github.com/smartcontractkit/chainlink-testing-framework/logging" + "github.com/smartcontractkit/chainlink/integration-tests/actions" + "github.com/smartcontractkit/chainlink/integration-tests/docker/test_env" + + "github.com/smartcontractkit/chainlink-starknet/integration-tests/common" + tc "github.com/smartcontractkit/chainlink-starknet/integration-tests/testconfig" + "github.com/smartcontractkit/chainlink-starknet/ops/gauntlet" + "github.com/smartcontractkit/chainlink-starknet/ops/utils" +) + +var ( + keepAlive bool + decimals = 9 +) + +func init() { + flag.BoolVar(&keepAlive, "keep-alive", false, "enable to keep the cluster alive") +} + +func TestOCRBasicSoak(t *testing.T) { + for _, test := range []struct { + name string + env map[string]string + }{ + {name: "embedded"}, + {name: "plugins", env: map[string]string{ + "CL_MEDIAN_CMD": "chainlink-feeds", + "CL_SOLANA_CMD": "chainlink-solana", + }}, + } { + config, err := tc.GetConfig("Soak", tc.OCR2) + if err != nil { + t.Fatal(err) + } + err = os.Setenv("CHAINLINK_ENV_USER", *config.Common.User) + require.NoError(t, err, "Could not set CHAINLINK_ENV_USER") + err = os.Setenv("INTERNAL_DOCKER_REPO", *config.Common.InternalDockerRepo) + require.NoError(t, err, "Could not set INTERNAL_DOCKER_REPO") + test := test + t.Run(test.name, func(t *testing.T) { + t.Parallel() + logging.Init() + // + state, err := common.NewOCRv2State(t, "soak-ocr2", &config) + require.NoError(t, err, "Could not setup the ocrv2 state") + + // K8s specific config and cleanup + if *config.Common.InsideK8s { + t.Cleanup(func() { + if err = actions.TeardownSuite(t, nil, state.Common.Env, state.ChainlinkNodesK8s, nil, zapcore.PanicLevel, nil); err != nil { + state.TestConfig.L.Error().Err(err).Msg("Error tearing down environment") + } + }) + } + if len(test.env) > 0 { + state.Common.TestEnvDetails.NodeOpts = append(state.Common.TestEnvDetails.NodeOpts, func(n *test_env.ClNode) { + if n.ContainerEnvs == nil { + n.ContainerEnvs = map[string]string{} + } + maps.Copy(n.ContainerEnvs, test.env) + }) + } + state.DeployCluster() + + if state.Common.Env.WillUseRemoteRunner() { + return + } + + state.Clients.GauntletClient, err = gauntlet.NewStarknetGauntlet(fmt.Sprintf("%s/", utils.ProjectRoot)) + require.NoError(t, err, "Setting up gauntlet should not fail") + err = state.Clients.GauntletClient.SetupNetwork(state.Common.RPCDetails.RPCL2External, state.Account.Account, state.Account.PrivateKey) + require.NoError(t, err, "Setting up gauntlet network should not fail") + err = state.DeployGauntlet(0, 100000000000, decimals, "auto", 1, 1) + require.NoError(t, err, "Deploying contracts should not fail") + + state.SetUpNodes() + + err = state.ValidateRounds(*config.OCR2.NumberOfRounds, true) + require.NoError(t, err, "Validating round should not fail") + }) + } +} diff --git a/integration-tests/test.Dockerfile b/integration-tests/test.Dockerfile new file mode 100644 index 000000000..1c87a720e --- /dev/null +++ b/integration-tests/test.Dockerfile @@ -0,0 +1,11 @@ +FROM nixos/nix:latest + +ARG SUITES=smoke soak +ENV NIX_USER_CONF_FILES=/repo/nix.conf +ENV PATH="/repo/cairo-build/bin:/repo/scarb-build/bin:${PATH}" + +COPY . /repo/ +WORKDIR /repo +RUN nix develop -c helm repo update +RUN nix develop -c /repo/integration-tests/scripts/buildTests "${SUITES}" +ENTRYPOINT ["/repo/integration-tests/scripts/entrypoint"] diff --git a/integration-tests/test.Dockerfile.dockerignore b/integration-tests/test.Dockerfile.dockerignore new file mode 100644 index 000000000..201094100 --- /dev/null +++ b/integration-tests/test.Dockerfile.dockerignore @@ -0,0 +1,24 @@ +.direnv +.DS_Store +**/*.rs.bk +.idea +.vscode/ +.github/ + +# TS +node_modules/ +contracts/node_modules/ +**/tsconfig.tsbuildinfo +dist +.env +flow-report.jsons +report.json +bin + +# test +id.json +integration-tests/logs +integration-tests/smoke/logs +integration-teststests/smoke/contracts-chaos-state.json +tmp-manifest-* +tests-smoke-report.xml diff --git a/integration-tests/testconfig/configs_embed.go b/integration-tests/testconfig/configs_embed.go new file mode 100644 index 000000000..e9decaa4c --- /dev/null +++ b/integration-tests/testconfig/configs_embed.go @@ -0,0 +1,14 @@ +//go:build embed +// +build embed + +package testconfig + +import "embed" + +//go:embed default.toml +//go:embed ocr2/ocr2.toml +var embeddedConfigsFs embed.FS + +func init() { + areConfigsEmbedded = true +} diff --git a/integration-tests/testconfig/configs_noembed.go b/integration-tests/testconfig/configs_noembed.go new file mode 100644 index 000000000..95572c4a0 --- /dev/null +++ b/integration-tests/testconfig/configs_noembed.go @@ -0,0 +1,12 @@ +//go:build !embed +// +build !embed + +package testconfig + +import "embed" + +var embeddedConfigsFs embed.FS + +func init() { + areConfigsEmbedded = false +} diff --git a/integration-tests/testconfig/default.toml b/integration-tests/testconfig/default.toml new file mode 100644 index 000000000..9302ca824 --- /dev/null +++ b/integration-tests/testconfig/default.toml @@ -0,0 +1,38 @@ +# This is the default configuration so OCR2 tests can run without issues +[ChainlinkImage] +image="public.ecr.aws/chainlink/chainlink" +version="2.9.0" + +[Logging] +test_log_collect=false + +[Logging.LogStream] +log_targets=["file"] +log_producer_timeout="10s" +log_producer_retry_limit=10 + +[Network] +selected_networks=["SIMULATED"] # Not needed for Starknet but mandatory from CTF (do not change) + +[Network.RpcHttpUrls] +simulated = ["http://127.0.0.1"] # Not needed for Starknet but mandatory from CTF (do not change) + +[Network.RpcWsUrls] +simulated = ["wss://127.0.0.1"] # Not needed for Starknet but mandatory from CTF (do not change) + +[Common] +internal_docker_repo = "public.ecr.aws/chainlink" +inside_k8 = false +network = "localnet" +user = "satoshi" +stateful_db = false +devnet_image = "shardlabs/starknet-devnet-rs:a147b4cd72f9ce9d1fa665d871231370db0f51c7" +postgres_version = "15.7" + +[OCR2] +node_count = 6 +test_duration = "30m" +number_of_rounds = 10 + +[OCR2.Smoke] +enabled = true diff --git a/integration-tests/testconfig/ocr2/ocr2.go b/integration-tests/testconfig/ocr2/ocr2.go new file mode 100644 index 000000000..c16363b29 --- /dev/null +++ b/integration-tests/testconfig/ocr2/ocr2.go @@ -0,0 +1,27 @@ +package ocr2 + +import ( + "errors" +) + +type Config struct { + NumberOfRounds *int `toml:"number_of_rounds"` + NodeCount *int `toml:"node_count"` + TestDuration *string `toml:"test_duration"` +} + +func (o *Config) Validate() error { + if o.NodeCount != nil && *o.NodeCount < 3 { + return errors.New("node_count must be set and cannot be less than 3") + } + + if o.TestDuration == nil { + return errors.New("test_duration must be set") + } + + if o.NumberOfRounds == nil { + return errors.New("number_of_rounds must be set") + } + + return nil +} diff --git a/integration-tests/testconfig/ocr2/ocr2.toml b/integration-tests/testconfig/ocr2/ocr2.toml new file mode 100644 index 000000000..9d1493a89 --- /dev/null +++ b/integration-tests/testconfig/ocr2/ocr2.toml @@ -0,0 +1,3 @@ +[Common] +node_count = 6 +test_duration = "30m" \ No newline at end of file diff --git a/integration-tests/testconfig/testconfig.go b/integration-tests/testconfig/testconfig.go new file mode 100644 index 000000000..a9bb61c6a --- /dev/null +++ b/integration-tests/testconfig/testconfig.go @@ -0,0 +1,428 @@ +package testconfig + +import ( + "embed" + "encoding/base64" + "errors" + "fmt" + "log" + "os" + "strings" + "time" + + "github.com/barkimedes/go-deepcopy" + "github.com/google/uuid" + "github.com/pelletier/go-toml/v2" + "github.com/rs/zerolog" + "github.com/smartcontractkit/seth" + "golang.org/x/text/cases" + "golang.org/x/text/language" + + "github.com/smartcontractkit/chainlink/integration-tests/types/config/node" + + common_cfg "github.com/smartcontractkit/chainlink-common/pkg/config" + + ctf_config "github.com/smartcontractkit/chainlink-testing-framework/config" + k8s_config "github.com/smartcontractkit/chainlink-testing-framework/k8s/config" + "github.com/smartcontractkit/chainlink-testing-framework/logging" + "github.com/smartcontractkit/chainlink-testing-framework/utils/osutil" + "github.com/smartcontractkit/chainlink-testing-framework/utils/ptr" + + ocr2_config "github.com/smartcontractkit/chainlink-starknet/integration-tests/testconfig/ocr2" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/config" +) + +type TestConfig struct { + ChainlinkImage *ctf_config.ChainlinkImageConfig `toml:"ChainlinkImage"` + Logging *ctf_config.LoggingConfig `toml:"Logging"` + ChainlinkUpgradeImage *ctf_config.ChainlinkImageConfig `toml:"ChainlinkUpgradeImage"` + Network *ctf_config.NetworkConfig `toml:"Network"` + Common *Common `toml:"Common"` + OCR2 *ocr2_config.Config `toml:"OCR2"` + ConfigurationName string `toml:"-"` + + // getter funcs for passing parameters + GetChainID, GetFeederURL, GetRPCL2Internal, GetRPCL2InternalAPIKey func() string +} + +func (c *TestConfig) GetLoggingConfig() *ctf_config.LoggingConfig { + return c.Logging +} + +func (c *TestConfig) GetPrivateEthereumNetworkConfig() *ctf_config.EthereumNetworkConfig { + return &ctf_config.EthereumNetworkConfig{} +} + +func (c *TestConfig) GetSethConfig() *seth.Config { + return nil +} + +func (c *TestConfig) GetPyroscopeConfig() *ctf_config.PyroscopeConfig { + return &ctf_config.PyroscopeConfig{} +} + +var embeddedConfigs embed.FS +var areConfigsEmbedded bool + +func init() { + embeddedConfigs = embeddedConfigsFs +} + +// Saves Test Config to a local file +func (c *TestConfig) Save() (string, error) { + filePath := fmt.Sprintf("test_config-%s.toml", uuid.New()) + + content, err := toml.Marshal(*c) + if err != nil { + return "", fmt.Errorf("error marshaling test config: %w", err) + } + + err = os.WriteFile(filePath, content, 0600) + if err != nil { + return "", fmt.Errorf("error writing test config: %w", err) + } + + return filePath, nil +} + +// MustCopy Returns a deep copy of the Test Config or panics on error +func (c TestConfig) MustCopy() any { + return deepcopy.MustAnything(c).(TestConfig) +} + +// MustCopy Returns a deep copy of struct passed to it and returns a typed copy (or panics on error) +func MustCopy[T any](c T) T { + return deepcopy.MustAnything(c).(T) +} + +func (c TestConfig) GetNetworkConfig() *ctf_config.NetworkConfig { + return c.Network +} + +func (c TestConfig) GetChainlinkImageConfig() *ctf_config.ChainlinkImageConfig { + return c.ChainlinkImage +} + +func (c TestConfig) GetCommonConfig() *Common { + return c.Common +} + +func (c *TestConfig) GetNodeConfig() *ctf_config.NodeConfig { + cfgTOML, err := c.GetNodeConfigTOML() + if err != nil { + log.Fatalf("failed to parse TOML config: %s", err) + return nil + } + + return &ctf_config.NodeConfig{ + BaseConfigTOML: cfgTOML, + } +} + +func (c TestConfig) GetNodeConfigTOML() (string, error) { + var chainID, feederURL, RPCL2Internal, RPCL2InternalAPIKey string + if c.GetChainID != nil { + chainID = c.GetChainID() + } + if c.GetFeederURL != nil { + feederURL = c.GetFeederURL() + } + if c.GetRPCL2Internal != nil { + RPCL2Internal = c.GetRPCL2Internal() + } + if c.GetRPCL2InternalAPIKey != nil { + RPCL2InternalAPIKey = c.GetRPCL2InternalAPIKey() + } + + starkConfig := config.TOMLConfig{ + Enabled: ptr.Ptr(true), + ChainID: ptr.Ptr(chainID), + FeederURL: common_cfg.MustParseURL(feederURL), + Nodes: []*config.Node{ + { + Name: ptr.Ptr("primary"), + URL: common_cfg.MustParseURL(RPCL2Internal), + APIKey: ptr.Ptr(RPCL2InternalAPIKey), + }, + }, + } + baseConfig := node.NewBaseConfig() + baseConfig.Starknet = config.TOMLConfigs{ + &starkConfig, + } + baseConfig.OCR2.Enabled = ptr.Ptr(true) + baseConfig.P2P.V2.Enabled = ptr.Ptr(true) + fiveSecondDuration := common_cfg.MustNewDuration(5 * time.Second) + + baseConfig.P2P.V2.DeltaDial = fiveSecondDuration + baseConfig.P2P.V2.DeltaReconcile = fiveSecondDuration + baseConfig.P2P.V2.ListenAddresses = &[]string{"0.0.0.0:6690"} + + return baseConfig.TOMLString() +} + +func (c TestConfig) GetChainlinkUpgradeImageConfig() *ctf_config.ChainlinkImageConfig { + return c.ChainlinkUpgradeImage +} + +func (c TestConfig) GetConfigurationName() string { + return c.ConfigurationName +} + +func (c *TestConfig) AsBase64() (string, error) { + content, err := toml.Marshal(*c) + if err != nil { + return "", fmt.Errorf("error marshaling test config: %w", err) + } + + return base64.StdEncoding.EncodeToString(content), nil +} + +type Common struct { + Network *string `toml:"network"` + InsideK8s *bool `toml:"inside_k8"` + User *string `toml:"user"` + // if rpc requires api key to be passed as an HTTP header + L2RPCApiKey *string `toml:"l2_rpc_url_api_key"` + L2RPCUrl *string `toml:"l2_rpc_url"` + PrivateKey *string `toml:"private_key"` + Account *string `toml:"account"` + Stateful *bool `toml:"stateful_db"` + InternalDockerRepo *string `toml:"internal_docker_repo"` + DevnetImage *string `toml:"devnet_image"` + PostgresVersion *string `toml:"postgres_version"` +} + +func (c *Common) Validate() error { + if c.Network == nil { + return fmt.Errorf("network must be set") + } + + switch *c.Network { + case "localnet": + if c.DevnetImage == nil { + return fmt.Errorf("devnet_image must be set") + } + case "testnet": + if c.PrivateKey == nil { + return fmt.Errorf("private_key must be set") + } + if c.L2RPCUrl == nil { + return fmt.Errorf("l2_rpc_url must be set") + } + + if c.Account == nil { + return fmt.Errorf("account must be set") + } + default: + return fmt.Errorf("network must be either 'localnet' or 'testnet'") + } + + if c.InsideK8s == nil { + return fmt.Errorf("inside_k8 must be set") + } + + if c.InternalDockerRepo == nil { + return fmt.Errorf("internal_docker_repo must be set") + } + + if c.User == nil { + return fmt.Errorf("user must be set") + } + + if c.Stateful == nil { + return fmt.Errorf("stateful_db state for db must be set") + } + + if c.PostgresVersion == nil { + return fmt.Errorf("postgres_version must be set") + } + + return nil +} + +type Product string + +const ( + OCR2 Product = "ocr2" +) + +const TestTypeEnvVarName = "TEST_TYPE" + +const ( + Base64OverrideEnvVarName = k8s_config.EnvBase64ConfigOverride + NoKey = "NO_KEY" +) + +func GetConfig(configurationName string, product Product) (TestConfig, error) { + logger := logging.GetTestLogger(nil) + + configurationName = strings.ReplaceAll(configurationName, "/", "_") + configurationName = strings.ReplaceAll(configurationName, " ", "_") + configurationName = cases.Title(language.English, cases.NoLower).String(configurationName) + fileNames := []string{ + "default.toml", + fmt.Sprintf("%s.toml", product), + "overrides.toml", + } + + testConfig := TestConfig{} + testConfig.ConfigurationName = configurationName + logger.Debug().Msgf("Will apply configuration named '%s' if it is found in any of the configs", configurationName) + + var handleSpecialOverrides = func(logger zerolog.Logger, filename, configurationName string, target *TestConfig, content []byte, product Product) error { + switch product { + default: + err := ctf_config.BytesToAnyTomlStruct(logger, filename, configurationName, target, content) + if err != nil { + return fmt.Errorf("error reading file %s: %w", filename, err) + } + + return nil + } + } + + // read embedded configs is build tag "embed" is set + // this makes our life much easier when using a binary + if areConfigsEmbedded { + logger.Info().Msg("Reading embedded configs") + embeddedFiles := []string{"default.toml", fmt.Sprintf("%s/%s.toml", product, product)} + for _, fileName := range embeddedFiles { + file, err := embeddedConfigs.ReadFile(fileName) + if err != nil && errors.Is(err, os.ErrNotExist) { + logger.Debug().Msgf("Embedded config file %s not found. Continuing", fileName) + continue + } else if err != nil { + return TestConfig{}, fmt.Errorf("error reading embedded config: %w", err) + } + + err = handleSpecialOverrides(logger, fileName, "", &testConfig, file, product) // use empty configurationName to read default config + if err != nil { + return TestConfig{}, fmt.Errorf("error unmarshalling embedded config: %w", err) + } + } + } + + logger.Info().Msg("Reading configs from file system") + for _, fileName := range fileNames { + logger.Debug().Msgf("Looking for config file %s", fileName) + filePath, err := osutil.FindFile(fileName, osutil.DEFAULT_STOP_FILE_NAME, 3) + + if err != nil && errors.Is(err, os.ErrNotExist) { + logger.Debug().Msgf("Config file %s not found", fileName) + continue + } else if err != nil { + return TestConfig{}, fmt.Errorf("error looking for file %s: %w", filePath, err) + } + logger.Debug().Str("location", filePath).Msgf("Found config file %s", fileName) + + content, err := readFile(filePath) + if err != nil { + return TestConfig{}, fmt.Errorf("error reading file %s: %w", filePath, err) + } + + err = handleSpecialOverrides(logger, fileName, "", &testConfig, content, product) // use empty configurationName to read default config + if err != nil { + return TestConfig{}, fmt.Errorf("error reading file %s: %w", filePath, err) + } + } + + logger.Info().Msg("Reading configs from Base64 override env var") + configEncoded, isSet := os.LookupEnv(Base64OverrideEnvVarName) + if isSet && configEncoded != "" { + logger.Debug().Msgf("Found base64 config override environment variable '%s' found", Base64OverrideEnvVarName) + decoded, err := base64.StdEncoding.DecodeString(configEncoded) + if err != nil { + return TestConfig{}, err + } + + err = handleSpecialOverrides(logger, Base64OverrideEnvVarName, "", &testConfig, decoded, product) // use empty configurationName to read default config + if err != nil { + return TestConfig{}, fmt.Errorf("error unmarshaling base64 config: %w", err) + } + } else { + logger.Debug().Msg("Base64 config override from environment variable not found") + } + + // it neede some custom logic, so we do it separately + err := testConfig.readNetworkConfiguration() + if err != nil { + return TestConfig{}, fmt.Errorf("error reading network config: %w", err) + } + + logger.Debug().Msg("Validating test config") + err = testConfig.Validate() + if err != nil { + return TestConfig{}, fmt.Errorf("error validating test config: %w", err) + } + + if testConfig.Common == nil { + testConfig.Common = &Common{} + } + + logger.Debug().Msg("Correct test config constructed successfully") + return testConfig, nil +} + +func (c *TestConfig) readNetworkConfiguration() error { + // currently we need to read that kind of secrets only for network configuration + if c == nil { + c.Network = &ctf_config.NetworkConfig{} + } + + c.Network.UpperCaseNetworkNames() + err := c.Network.Default() + if err != nil { + return fmt.Errorf("error reading default network config: %w", err) + } + + return nil +} + +func (c *TestConfig) Validate() error { + defer func() { + if r := recover(); r != nil { + panic(fmt.Errorf("Panic during test config validation: '%v'. Most probably due to presence of partial product config", r)) + } + }() + if c.ChainlinkImage == nil { + return fmt.Errorf("chainlink image config must be set") + } + if err := c.ChainlinkImage.Validate(); err != nil { + return fmt.Errorf("chainlink image config validation failed: %w", err) + } + if c.ChainlinkUpgradeImage != nil { + if err := c.ChainlinkUpgradeImage.Validate(); err != nil { + return fmt.Errorf("chainlink upgrade image config validation failed: %w", err) + } + } + if err := c.Network.Validate(); err != nil { + return fmt.Errorf("network config validation failed: %w", err) + } + + if c.Common == nil { + return fmt.Errorf("common config must be set") + } + + if err := c.Common.Validate(); err != nil { + return fmt.Errorf("Common config validation failed: %w", err) + } + + if c.OCR2 == nil { + return fmt.Errorf("OCR2 config must be set") + } + + if err := c.OCR2.Validate(); err != nil { + return fmt.Errorf("OCR2 config validation failed: %w", err) + } + return nil +} + +func readFile(filePath string) ([]byte, error) { + content, err := os.ReadFile(filePath) + if err != nil { + return nil, fmt.Errorf("error reading file %s: %w", filePath, err) + } + + return content, nil +} diff --git a/integration-tests/utils/common.go b/integration-tests/utils/common.go new file mode 100644 index 000000000..7cce3691c --- /dev/null +++ b/integration-tests/utils/common.go @@ -0,0 +1,26 @@ +package utils + +import ( + "os" + "testing" + + "github.com/rs/zerolog" + "github.com/stretchr/testify/require" + + envConf "github.com/smartcontractkit/chainlink-testing-framework/k8s/config" +) + +// GetTestLogger TODO: This is a duplicate of the same function in chainlink-testing-framework. We should replace this with a call to the ctf version when chainlink-starknet is updated to use the latest ctf version. +// GetTestLogger instantiates a logger that takes into account the test context and the log level +func GetTestLogger(t *testing.T) zerolog.Logger { + lvlStr := os.Getenv(envConf.EnvVarLogLevel) + if lvlStr == "" { + lvlStr = "info" + } + lvl, err := zerolog.ParseLevel(lvlStr) + require.NoError(t, err, "error parsing log level") + l := zerolog.New(zerolog.NewTestWriter(t)). + Output(zerolog.ConsoleWriter{Out: os.Stderr, NoColor: true}). + Level(lvl).With().Timestamp().Logger() + return l +} diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 260fe56c2..000000000 --- a/jest.config.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = { - rootDir: '.', - projects: [ - { - displayName: 'gauntlet-starknet', - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['/packages-ts/gauntlet-starknet/**/*.test.ts'], - globals: { - 'ts-jest': { - tsconfig: '/packages-ts/gauntlet-starknet/tsconfig.json', - }, - }, - }, - { - displayName: 'gauntlet-starknet-account', - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['/packages-ts/gauntlet-starknet-account/**/*.test.ts'], - globals: { - 'ts-jest': { - tsconfig: '/packages-ts/gauntlet-starknet-account/tsconfig.json', - }, - }, - }, - { - displayName: 'gauntlet-starknet-ocr2', - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['/packages-ts/gauntlet-starknet-ocr2/**/*.test.ts'], - globals: { - 'ts-jest': { - tsconfig: '/packages-ts/gauntlet-starknet-ocr2/tsconfig.json', - }, - }, - }, - ], -} diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 000000000..c788af510 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,38 @@ +// jest.config.ts +import type { Config } from '@jest/types' + +// Prepares 'config.projects' entry for a Jest TS project under '/packages-ts' +const projectConfig = (name: string) => ({ + displayName: name, + testMatch: [`/packages-ts/${name}/**/*.test.ts`], + transform: { + '^.+\\.(ts|tsx)$': 'ts-jest', + }, + globals: { + 'ts-jest': { + tsconfig: `/packages-ts/${name}/tsconfig.json`, + }, + }, +}) + +const config: Config.InitialOptions = { + rootDir: '.', + preset: 'ts-jest', + testEnvironment: 'node', + verbose: true, + automock: true, + testPathIgnorePatterns: ['dist/', 'node_modules/'], + projects: [ + projectConfig('starknet-gauntlet'), + projectConfig('starknet-gauntlet-argent'), + projectConfig('starknet-gauntlet-cli'), + projectConfig('starknet-gauntlet-example'), + projectConfig('starknet-gauntlet-multisig'), + projectConfig('starknet-gauntlet-ocr2'), + projectConfig('starknet-gauntlet-oz'), + projectConfig('starknet-gauntlet-token'), + projectConfig('starknet-gauntlet-emergency-protocol'), + projectConfig('starknet-gauntlet-ledger'), + ], +} +export default config diff --git a/monitoring/README.md b/monitoring/README.md new file mode 100644 index 000000000..dc0e62d88 --- /dev/null +++ b/monitoring/README.md @@ -0,0 +1,68 @@ +# STOM + +## Useful links + +- Starknet on-chain monitor [generated docs](https://pkg.go.dev/github.com/smartcontractkit/chainlink-starknet/monitoring/pkg/monitoring). +- On-chain monitoring (OM) framework architecture docs in [blueprints](https://github.com/smartcontractkit/chainlink-blueprints/blob/master/monitoring/README.md). +- OM framework [generated docs](https://pkg.go.dev/github.com/smartcontractkit/chainlink-common/pkg/monitoring). + +## Local development + +Note: Previously, this monitor also wrote to Kafka, but the dependency on Kafka has been removed in order to simplify deployment. The kafka topics were unused anyway. + +- Start an http server that mimics weiwatchers locally. It needs to export a json configuration file for feeds: + +```json +[ + { + "name": "LINK / USD", + "path": "link-usd", + "symbol": "$", + "heartbeat": 0, + "contract_type": "numerical_median_feed", + "status": "testing", + "contract_address": "", + "multiply": "100000000", + "proxy_address": "" + } +] +``` + +It also needs to export a json configuration for for node operators: + +```json +[ + { + "id": "noop", + "nodeAddress": [] + } +] +``` + +One option is to create a folder `/tmp/configs` and add two files `feeds.json` and `nodes.json` with the configs from above, then: + +```bash +python3 -m http.server 4000 +``` + +- Start STOM locally. You will need and RPC endpoint and the address of the LINK token. Make sure you `cd ./monitoring`. + +```bash +STARKNET_RPC_ENDPOINT="" \ +STARKNET_NETWORK_NAME="devnet" \ +STARKNET_NETWORK_ID="1" \ +STARKNET_CHAIN_ID="1" \ +STARKNET_READ_TIMEOUT="5s" \ +STARKNET_POLL_INTERVAL="10s" #test \ +STARKNET_LINK_TOKEN_ADDRESS="" \ +HTTP_ADDRESS="localhost:3000" \ +FEEDS_URL="http://localhost:4000/feeds.json" \ +NODES_URL="http://localhost:4000/nodes.json" \ +go run ./cmd/monitoring/main.go +``` + +- Check the output for the Prometheus scraper + +```bash +curl http://localhost:3000/metrics +``` diff --git a/monitoring/cmd/monitoring/main.go b/monitoring/cmd/monitoring/main.go new file mode 100644 index 000000000..a94d8b7db --- /dev/null +++ b/monitoring/cmd/monitoring/main.go @@ -0,0 +1,101 @@ +package main + +import ( + "fmt" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/erc20" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" + + "github.com/smartcontractkit/chainlink-starknet/monitoring/pkg/monitoring" +) + +func main() { + log, err := logger.New() + if err != nil { + log.Fatal(err) + } + defer func() { + if serr := log.Sync(); serr != nil { + fmt.Printf("Error while closing Logger: %v\n", serr) + } + }() + + starknetConfig, err := monitoring.ParseStarknetConfig() + if err != nil { + log.Fatalw("failed to parse starknet specific configuration", "error", err) + return + } + + readTimeout := starknetConfig.GetReadTimeout() + starknetClient, err := starknet.NewClient( + starknetConfig.GetChainID(), + starknetConfig.GetRPCEndpoint(), + starknetConfig.GetRPCApiKey(), + logger.With(log, "component", "starknet-client"), + &readTimeout, + ) + if err != nil { + log.Fatalw("failed to build a starknet.Client", "error", err) + } + ocr2Client, err := ocr2.NewClient( + starknetClient, + logger.With(log, "component", "ocr2-client"), + ) + if err != nil { + log.Fatalw("failed to build a ocr2.Client", "error", err) + } + + strTokenClient, err := erc20.NewClient( + starknetClient, + logger.With(log, "component", "erc20-client"), + starknetConfig.GetStrkTokenAddress(), + ) + + if err != nil { + log.Fatalw("failed to build erc20-client", "error", err) + } + + envelopeSourceFactory := monitoring.NewEnvelopeSourceFactory(ocr2Client) + txResultsFactory := monitoring.NewTxResultsSourceFactory(ocr2Client) + + monitor, err := monitoring.NewMonitorPrometheusOnly( + make(chan struct{}), + logger.With(log, "component", "monitor"), + starknetConfig, + envelopeSourceFactory, + txResultsFactory, + monitoring.StarknetFeedsParser, + monitoring.StarknetNodesParser, + ) + if err != nil { + log.Fatalw("failed to build monitor", "error", err) + return + } + + // per-feed factories + proxySourceFactory := monitoring.NewProxySourceFactory(ocr2Client) + transmissionsDetailsSourceFactory := monitoring.NewTransmissionDetailsSourceFactory(ocr2Client) + monitor.SourceFactories = append(monitor.SourceFactories, proxySourceFactory, transmissionsDetailsSourceFactory) + + metricsBuilder := monitoring.NewMetrics(logger.With(log, "component", "starknet-metrics-builder")) + + prometheusExporterFactory := monitoring.NewPrometheusExporterFactory(metricsBuilder) + transmissionsDetailsExporterFactory := monitoring.NewTransmissionDetailsExporterFactory(metricsBuilder) + monitor.ExporterFactories = append(monitor.ExporterFactories, prometheusExporterFactory, transmissionsDetailsExporterFactory) + + // network factories + nodeBalancesSourceFactory := monitoring.NewNodeBalancesSourceFactory(strTokenClient) + monitor.NetworkSourceFactories = append(monitor.NetworkSourceFactories, nodeBalancesSourceFactory) + + nodeBalancesExporterFactory := monitoring.NewNodeBalancesExporterFactory( + logger.With(log, "node-balances-exporter"), + metricsBuilder, + ) + monitor.NetworkExporterFactories = append(monitor.NetworkExporterFactories, nodeBalancesExporterFactory) + + monitor.Run() + log.Info("monitor stopped") +} diff --git a/monitoring/go.mod b/monitoring/go.mod new file mode 100644 index 000000000..9a152b2fa --- /dev/null +++ b/monitoring/go.mod @@ -0,0 +1,136 @@ +module github.com/smartcontractkit/chainlink-starknet/monitoring + +go 1.21.3 + +toolchain go1.21.5 + +require ( + github.com/NethermindEth/juno v0.3.1 + github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb + github.com/prometheus/client_golang v1.17.0 + github.com/smartcontractkit/chainlink-common v0.1.7-0.20240625074419-c278d083facf + github.com/smartcontractkit/chainlink-starknet/relayer v0.0.0-20230508053614-9f2fd5fd4ff1 + github.com/smartcontractkit/libocr v0.0.0-20240419185742-fd3cab206b2c + github.com/stretchr/testify v1.9.0 + go.uber.org/multierr v1.11.0 +) + +require ( + cloud.google.com/go/compute/metadata v0.2.3 // indirect + github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 // indirect + github.com/buger/jsonparser v1.1.1 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect + github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/confluentinc/confluent-kafka-go/v2 v2.3.0 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set/v2 v2.3.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/ethereum/go-ethereum v1.13.8 // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fxamacker/cbor/v2 v2.5.0 // indirect + github.com/getsentry/sentry-go v0.19.0 // indirect + github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/gogo/protobuf v1.3.3 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-plugin v1.6.0 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/invopop/jsonschema v0.12.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/klauspost/compress v1.17.2 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/linkedin/goavro/v2 v2.12.0 // 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.20 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/mwitkow/grpc-proxy v0.0.0-20230212185441-f345521cb9c9 // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/pkg/errors v0.9.1 // 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/riferrei/srclient v0.5.4 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.2.0 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shopspring/decimal v1.3.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/test-go/testify v1.1.4 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.16.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/grpc v1.59.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) + +replace ( + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + + // until merged upstream: https://github.com/hashicorp/go-plugin/pull/257 + github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 + + // until merged upstream: https://github.com/mwitkow/grpc-proxy/pull/69 + github.com/mwitkow/grpc-proxy => github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f + + github.com/smartcontractkit/chainlink-starknet/relayer => ../relayer +) diff --git a/monitoring/go.sum b/monitoring/go.sum new file mode 100644 index 000000000..4e7354312 --- /dev/null +++ b/monitoring/go.sum @@ -0,0 +1,947 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +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/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/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/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +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/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/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +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/Microsoft/hcsshim v0.9.4 h1:mnUj0ivWy6UzbB1uLFqKR6F+ZyiDc7j4iGgHTpO+5+I= +github.com/Microsoft/hcsshim v0.9.4/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= +github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= +github.com/NethermindEth/juno v0.3.1/go.mod h1:SGbTpgGaCsxhFsKOid7Ylnz//WZ8swtILk+NbHGsk/Q= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb h1:Mv8SscePPyw2ju4igIJAjFgcq5zCQfjgbz53DwYu5mc= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb/go.mod h1:gQkhWpAs9/QR6reZU2xoi1UIYlMS64FLTlh9CrgHH/Y= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= +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/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 h1:SDlJ7bAm4ewvrmZtR0DaiYbQGdKPeaaIm7bM+qRhFeU= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +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/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= +github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= +github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/confluentinc/confluent-kafka-go/v2 v2.3.0 h1:icCHutJouWlQREayFwCc7lxDAhws08td+W3/gdqgZts= +github.com/confluentinc/confluent-kafka-go/v2 v2.3.0/go.mod h1:/VTy8iEpe6mD9pkCH5BhijlUl8ulUXymKv1Qig5Rgb8= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= +github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= +github.com/containerd/containerd v1.6.8 h1:h4dOFDwzHmqFEP754PgfgTeVXFnLiRc6kiqC7tplDJs= +github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= +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/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= +github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +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/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +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 v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= +github.com/docker/docker v20.10.17+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-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.8 h1:1od+thJel3tM52ZUNQwvpYOeRHlbkVFZ5S8fhi0Lgsg= +github.com/ethereum/go-ethereum v1.13.8/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fxamacker/cbor/v2 v2.5.0 h1:oHsG0V/Q6E/wqTS2O1Cozzsy69nqCiguo5Q1a1ADivE= +github.com/fxamacker/cbor/v2 v2.5.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= +github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= +github.com/getsentry/sentry-go v0.19.0 h1:BcCH3CN5tXt5aML+gwmbFwVptLLQA+eT866fCO9wVOM= +github.com/getsentry/sentry-go v0.19.0/go.mod h1:y3+lGEFEFexZtpbG1GUE2WD/f9zGyKYwpEqryTOC/nE= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-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-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= +github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/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 h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +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.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.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/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +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/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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0 h1:f4tggROQKKcnh4eItay6z/HbHLqghBxS8g7pyMhmDio= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0/go.mod h1:hKAkSgNkL0FII46ZkJcpVEAai4KV+swlIWCKfekd1pA= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3 h1:o95KDiV/b1xdkumY5YbLR0/n2+wBxUpgf3HgfKgTyLI= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3/go.mod h1:hTxjzRcX49ogbTGVJ1sM5mz5s+SSgiGIyL3jjPxl32E= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= +github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +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/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= +github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +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.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +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/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= +github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= +github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= +github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= +github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +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.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +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/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/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.10-0.20210127095200-9abe2343507a h1:dHCfT5W7gghzPtfsW488uPmEOm85wewI+ypUwibyTdU= +github.com/leanovate/gopter v0.2.10-0.20210127095200-9abe2343507a/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/linkedin/goavro/v2 v2.9.7/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.12.0 h1:rIQQSj8jdAUlKQh6DttK8wCRv4t4QO09g1C4aBWXslg= +github.com/linkedin/goavro/v2 v2.12.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.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.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +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/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/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/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= +github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= +github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +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/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249 h1:NHrXEjTNQY7P0Zfx1aMrNhpgxHmow66XQtm0aQLY0AE= +github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +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.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= +github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +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/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +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/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/riferrei/srclient v0.5.4 h1:dfwyR5u23QF7beuVl2WemUY2KXh5+Sc4DHKyPXBNYuc= +github.com/riferrei/srclient v0.5.4/go.mod h1:vbkLmWcgYa7JgfPvuy/+K8fTS0p1bApqadxrxi/S1MI= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/santhosh-tekuri/jsonschema/v5 v5.2.0 h1:WCcC4vZDS1tYNxjWlwRJZQy28r8CMoggKnxNzxsVDMQ= +github.com/santhosh-tekuri/jsonschema/v5 v5.2.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240625074419-c278d083facf h1:d9AS/K8RSVG64USb20N/U7RaPOsYPcmuLGJq7iE+caM= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240625074419-c278d083facf/go.mod h1:L32xvCpk84Nglit64OhySPMP1tM3TTBK7Tw0qZl7Sd4= +github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 h1:ko88+ZznniNJZbZPWAvHQU8SwKAdHngdDZ+pvVgB5ss= +github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJif132UCdjo8u43i7iPN1/MFnu49hv7lFGFftCHKU= +github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0= +github.com/smartcontractkit/libocr v0.0.0-20240419185742-fd3cab206b2c h1:lIyMbTaF2H0Q71vkwZHX/Ew4KF2BxiKhqEXwF8rn+KI= +github.com/smartcontractkit/libocr v0.0.0-20240419185742-fd3cab206b2c/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +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.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= +github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= +github.com/testcontainers/testcontainers-go v0.14.0 h1:h0D5GaYG9mhOWr2qHdEKDXpkce/VlvaYOCzTRi6UBi8= +github.com/testcontainers/testcontainers-go v0.14.0/go.mod h1:hSRGJ1G8Q5Bw2gXgPulJOLlEBaYJHeBSOkQM5JLG+JQ= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +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 v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +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/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +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.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +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-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/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.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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-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-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-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-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-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +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/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +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-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-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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-20190813064441-fde4db37ae7a/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-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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-20220503163025-988cb79eb6c6/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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.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/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +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-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +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= +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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/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-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/grpc v1.12.0/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.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +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/examples v0.0.0-20210424002626-9572fd6faeae/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= +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.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/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-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +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= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/monitoring/ops/Dockerfile b/monitoring/ops/Dockerfile new file mode 100644 index 000000000..14cd87e6f --- /dev/null +++ b/monitoring/ops/Dockerfile @@ -0,0 +1,32 @@ +# Build image + +FROM golang:1.21.5 as build + +# Copy source + +RUN mkdir -p /build/starknet-monitoring/cmd +COPY ./monitoring/cmd/monitoring /build/starknet-monitoring/cmd/monitoring +COPY ./monitoring/pkg /build/starknet-monitoring/pkg +COPY ./monitoring/go.mod /build/starknet-monitoring/ +COPY ./monitoring/go.sum /build/starknet-monitoring/ + +# Copy relayer +COPY ./relayer /build/relayer + +# Compile binary + +WORKDIR /build/starknet-monitoring +RUN go build -o ./monitoring ./cmd/monitoring/*.go + +# Production image + +FROM ubuntu:22.04 + +RUN apt-get update && apt-get install -y ca-certificates +COPY --from=build /build/starknet-monitoring/monitoring /monitoring + +# Expose prometheus default port +EXPOSE 9090/tcp + +ENTRYPOINT ["/monitoring"] +CMD ["--help"] diff --git a/monitoring/ops/docker-compose.yml b/monitoring/ops/docker-compose.yml new file mode 100644 index 000000000..62a57b143 --- /dev/null +++ b/monitoring/ops/docker-compose.yml @@ -0,0 +1,49 @@ +--- +version: '3' +services: + zookeeper: + image: confluentinc/cp-zookeeper:6.2.1 + hostname: zookeeper + container_name: zookeeper + ports: + - "2181:2181" + environment: + ZOOKEEPER_CLIENT_PORT: 2181 + ZOOKEEPER_TICK_TIME: 2000 + + kafka: + image: confluentinc/cp-kafka:6.2.1 + hostname: kafka + container_name: kafka + depends_on: + - zookeeper + ports: + - "29092:29092" + environment: + KAFKA_BROKER_ID: 1 + KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 + KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 + KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 + KAFKA_SOCKET_REQUEST_MAX_BYTES: 80001200 + KAFKA_MESSAGE_MAX_BYTES: 80001200 + KAFKA_CFG_MAX_REQUEST_SIZE: 80001200 + + schema-registry: + image: confluentinc/cp-schema-registry:6.2.1 + hostname: schema-registry + container_name: schema-registry + depends_on: + - zookeeper + - kafka + ports: + - "8989:8989" + environment: + SCHEMA_REGISTRY_HOST_NAME: schema-registry + SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: 'zookeeper:2181' + SCHEMA_REGISTRY_DEBUG: 'true' + SCHEMA_REGISTRY_LISTENERS: 'http://schema-registry:8989' + SCHEMA_REGISTRY_SCHEMA_COMPATIBILITY_LEVEL: 'full_transitive' diff --git a/monitoring/pkg/monitoring/config_chain.go b/monitoring/pkg/monitoring/config_chain.go new file mode 100644 index 000000000..17b41644b --- /dev/null +++ b/monitoring/pkg/monitoring/config_chain.go @@ -0,0 +1,133 @@ +package monitoring + +import ( + "fmt" + "net/url" + "os" + "time" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" +) + +type StarknetConfig struct { + rpcEndpoint string + rpcApiKey string + networkName string + networkID string + chainID string + readTimeout time.Duration + pollInterval time.Duration + linkTokenAddress string + strkTokenAddress *felt.Felt +} + +var _ relayMonitoring.ChainConfig = StarknetConfig{} + +func (s StarknetConfig) GetRPCEndpoint() string { return s.rpcEndpoint } +func (s StarknetConfig) GetRPCApiKey() string { return s.rpcApiKey } +func (s StarknetConfig) GetNetworkName() string { return s.networkName } +func (s StarknetConfig) GetNetworkID() string { return s.networkID } +func (s StarknetConfig) GetChainID() string { return s.chainID } +func (s StarknetConfig) GetReadTimeout() time.Duration { return s.readTimeout } +func (s StarknetConfig) GetPollInterval() time.Duration { return s.pollInterval } +func (s StarknetConfig) GetLinkTokenAddress() string { return s.linkTokenAddress } +func (s StarknetConfig) GetStrkTokenAddress() *felt.Felt { return s.strkTokenAddress } + +func (s StarknetConfig) ToMapping() map[string]interface{} { + return map[string]interface{}{ + "network_name": s.networkName, + "network_id": s.networkID, + "chain_id": s.chainID, + } +} + +func ParseStarknetConfig() (StarknetConfig, error) { + cfg := StarknetConfig{} + + if err := parseEnvVars(&cfg); err != nil { + return cfg, err + } + + applyDefaults(&cfg) + + err := validateConfig(cfg) + return cfg, err +} + +func parseEnvVars(cfg *StarknetConfig) error { + if value, isPresent := os.LookupEnv("STARKNET_RPC_ENDPOINT"); isPresent { + cfg.rpcEndpoint = value + } + if value, isPresent := os.LookupEnv("STARKNET_RPC_API_KEY"); isPresent { + cfg.rpcApiKey = value + } + if value, isPresent := os.LookupEnv("STARKNET_NETWORK_NAME"); isPresent { + cfg.networkName = value + } + if value, isPresent := os.LookupEnv("STARKNET_NETWORK_ID"); isPresent { + cfg.networkID = value + } + if value, isPresent := os.LookupEnv("STARKNET_CHAIN_ID"); isPresent { + cfg.chainID = value + } + if value, isPresent := os.LookupEnv("STARKNET_READ_TIMEOUT"); isPresent { + readTimeout, err := time.ParseDuration(value) + if err != nil { + return fmt.Errorf("failed to parse env var STARKNET_READ_TIMEOUT, see https://pkg.go.dev/time#ParseDuration: %w", err) + } + cfg.readTimeout = readTimeout + } + if value, isPresent := os.LookupEnv("STARKNET_POLL_INTERVAL"); isPresent { + pollInterval, err := time.ParseDuration(value) + if err != nil { + return fmt.Errorf("failed to parse env var STARKNET_POLL_INTERVAL, see https://pkg.go.dev/time#ParseDuration: %w", err) + } + cfg.pollInterval = pollInterval + } + if value, isPresent := os.LookupEnv("STARKNET_LINK_TOKEN_ADDRESS"); isPresent { + cfg.linkTokenAddress = value + } + if value, isPresent := os.LookupEnv("STRK_TOKEN_ADDRESS"); isPresent { + feltValue, err := starknetutils.HexToFelt(value) + if err != nil { + return fmt.Errorf("failed to parse env var STRK_TOKEN_ADDRESS %w", err) + } + cfg.strkTokenAddress = feltValue + } + return nil +} + +func validateConfig(cfg StarknetConfig) error { + // Required config + for envVarName, currentValue := range map[string]string{ + "STARKNET_RPC_ENDPOINT": cfg.rpcEndpoint, + "STARKNET_NETWORK_NAME": cfg.networkName, + "STARKNET_NETWORK_ID": cfg.networkID, + "STARKNET_CHAIN_ID": cfg.chainID, + "STARKNET_LINK_TOKEN_ADDRESS": cfg.linkTokenAddress, + } { + if currentValue == "" { + return fmt.Errorf("'%s' env var is required", envVarName) + } + } + // Validate URLs. + for envVarName, currentValue := range map[string]string{ + "STARKNET_RPC_ENDPOINT": cfg.rpcEndpoint, + } { + if _, err := url.ParseRequestURI(currentValue); err != nil { + return fmt.Errorf("%s='%s' is not a valid URL: %w", envVarName, currentValue, err) + } + } + return nil +} + +func applyDefaults(cfg *StarknetConfig) { + if cfg.readTimeout == 0 { + cfg.readTimeout = 2 * time.Second + } + if cfg.pollInterval == 0 { + cfg.pollInterval = 5 * time.Second + } +} diff --git a/monitoring/pkg/monitoring/config_feed.go b/monitoring/pkg/monitoring/config_feed.go new file mode 100644 index 000000000..3579a9752 --- /dev/null +++ b/monitoring/pkg/monitoring/config_feed.go @@ -0,0 +1,110 @@ +package monitoring + +import ( + "encoding/json" + "fmt" + "io" + "math/big" + + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" +) + +type StarknetFeedConfig struct { + Name string `json:"name,omitempty"` + Path string `json:"path,omitempty"` + Symbol string `json:"symbol,omitempty"` + HeartbeatSec int64 `json:"heartbeat,omitempty"` + ContractType string `json:"contract_type,omitempty"` + ContractStatus string `json:"status,omitempty"` + MultiplyRaw string `json:"multiply,omitempty"` + Multiply *big.Int `json:"-"` + + ContractAddress string `json:"contract_address,omitempty"` + ProxyAddress string `json:"proxy_address,omitempty"` +} + +var _ relayMonitoring.FeedConfig = StarknetFeedConfig{} + +// GetID returns the state account's address as that uniquely +// identifies a feed on Starknet. In Starknet, a program is stateless and we +// use the same program for all feeds so we can't use the program +// account's address. +func (s StarknetFeedConfig) GetID() string { + return s.ContractAddress +} + +func (s StarknetFeedConfig) GetName() string { + return s.Name +} + +func (s StarknetFeedConfig) GetPath() string { + return s.Path +} + +func (s StarknetFeedConfig) GetFeedPath() string { + return s.Path +} + +func (s StarknetFeedConfig) GetSymbol() string { + return s.Symbol +} + +func (s StarknetFeedConfig) GetHeartbeatSec() int64 { + return s.HeartbeatSec +} + +func (s StarknetFeedConfig) GetContractType() string { + return s.ContractType +} + +func (s StarknetFeedConfig) GetContractStatus() string { + return s.ContractStatus +} + +func (s StarknetFeedConfig) GetMultiply() *big.Int { + return s.Multiply +} + +func (s StarknetFeedConfig) GetContractAddress() string { + return s.ContractAddress +} + +func (s StarknetFeedConfig) GetContractAddressBytes() []byte { + return []byte(s.ContractAddress) +} + +func (s StarknetFeedConfig) ToMapping() map[string]interface{} { + return map[string]interface{}{ + "feed_name": s.Name, + "feed_path": s.Path, + "symbol": s.Symbol, + "heartbeat_sec": int64(s.HeartbeatSec), + "contract_type": s.ContractType, + "contract_status": s.ContractStatus, + "contract_address": []byte(s.ContractAddress), + + // These fields are legacy. They are required in the schema but they + // should be set to a zero value for any other chain. + "transmissions_account": []byte{}, + "state_account": []byte{}, + } +} + +func StarknetFeedsParser(buf io.ReadCloser) ([]relayMonitoring.FeedConfig, error) { + rawFeeds := []StarknetFeedConfig{} + decoder := json.NewDecoder(buf) + if err := decoder.Decode(&rawFeeds); err != nil { + return nil, fmt.Errorf("unable to unmarshal feeds config data: %w", err) + } + feeds := make([]relayMonitoring.FeedConfig, len(rawFeeds)) + for i, rawFeed := range rawFeeds { + multiply, ok := new(big.Int).SetString(rawFeed.MultiplyRaw, 10) + if !ok { + return nil, fmt.Errorf("failed to parse multiply '%s' into a big.Int", rawFeed.MultiplyRaw) + } + // NOTE: multiply is not required so if a parse error occurs, we'll use 0. + rawFeed.Multiply = multiply + feeds[i] = relayMonitoring.FeedConfig(rawFeed) + } + return feeds, nil +} diff --git a/monitoring/pkg/monitoring/config_node.go b/monitoring/pkg/monitoring/config_node.go new file mode 100644 index 000000000..37e52fb6a --- /dev/null +++ b/monitoring/pkg/monitoring/config_node.go @@ -0,0 +1,41 @@ +package monitoring + +import ( + "encoding/json" + "fmt" + "io" + + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + commonMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" +) + +type StarknetNodeConfig struct { + ID string `json:"id,omitempty"` + NodeAddress []string `json:"nodeAddress,omitempty"` +} + +func (s StarknetNodeConfig) GetName() string { + return s.ID +} + +func (s StarknetNodeConfig) GetAccount() types.Account { + address := "" + if len(s.NodeAddress) != 0 { + address = s.NodeAddress[0] + } + return types.Account(address) +} + +func StarknetNodesParser(buf io.ReadCloser) ([]commonMonitoring.NodeConfig, error) { + rawNodes := []StarknetNodeConfig{} + decoder := json.NewDecoder(buf) + if err := decoder.Decode(&rawNodes); err != nil { + return nil, fmt.Errorf("unable to unmarshal nodes config data: %w", err) + } + nodes := make([]commonMonitoring.NodeConfig, len(rawNodes)) + for i, rawNode := range rawNodes { + nodes[i] = rawNode + } + return nodes, nil +} diff --git a/monitoring/pkg/monitoring/exporter_contract_balance.go b/monitoring/pkg/monitoring/exporter_contract_balance.go new file mode 100644 index 000000000..df538abc5 --- /dev/null +++ b/monitoring/pkg/monitoring/exporter_contract_balance.go @@ -0,0 +1,79 @@ +package monitoring + +import ( + "context" + "math/big" + "sync" + + commonMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" +) + +func NewNodeBalancesExporterFactory(log commonMonitoring.Logger, metrics Metrics) commonMonitoring.ExporterFactory { + return &nodeBalancesExporterFactory{ + log, + metrics, + } +} + +type nodeBalancesExporterFactory struct { + log commonMonitoring.Logger + metrics Metrics +} + +func (f *nodeBalancesExporterFactory) NewExporter(params commonMonitoring.ExporterParams) (commonMonitoring.Exporter, error) { + return &nodeBalancesExporter{ + log: f.log, + metrics: f.metrics, + chainConfig: params.ChainConfig, + }, nil +} + +type nodeBalancesExporter struct { + log commonMonitoring.Logger + metrics Metrics + chainConfig commonMonitoring.ChainConfig + addrsSet []ContractAddressWithBalance + addrsMu sync.Mutex +} + +func (e *nodeBalancesExporter) Export(ctx context.Context, data interface{}) { + balanceEnvelope, isBalanceEnvelope := data.(BalanceEnvelope) + if !isBalanceEnvelope { + return + } + + decimals := balanceEnvelope.Decimals + divisor := new(big.Int).Exp(new(big.Int).SetUint64(10), decimals, nil) // 10^(decimals) + + for _, c := range balanceEnvelope.Contracts { + balanceAns := new(big.Int).Div(c.Balance, divisor) + + e.metrics.SetBalance( + toFloat64(balanceAns), + c.Address.String(), + c.Name, + e.chainConfig.GetNetworkID(), + e.chainConfig.GetNetworkName(), + e.chainConfig.GetChainID()) + } + + e.addrsMu.Lock() + defer e.addrsMu.Unlock() + + e.addrsSet = balanceEnvelope.Contracts + +} + +func (e *nodeBalancesExporter) Cleanup(_ context.Context) { + e.addrsMu.Lock() + defer e.addrsMu.Unlock() + + for _, c := range e.addrsSet { + e.metrics.CleanupBalance(c.Address.String(), c.Name, e.chainConfig.GetNetworkID(), e.chainConfig.GetNetworkName(), e.chainConfig.GetChainID()) + } +} + +func toFloat64(bignum *big.Int) float64 { + val, _ := new(big.Float).SetInt(bignum).Float64() + return val +} diff --git a/monitoring/pkg/monitoring/exporter_prometheus.go b/monitoring/pkg/monitoring/exporter_prometheus.go new file mode 100644 index 000000000..402772e43 --- /dev/null +++ b/monitoring/pkg/monitoring/exporter_prometheus.go @@ -0,0 +1,103 @@ +package monitoring + +import ( + "context" + "fmt" + "sync" + + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" +) + +// NewPrometheusExporterFactory builds an implementation of the Exporter for prometheus. +func NewPrometheusExporterFactory( + metrics Metrics, +) relayMonitoring.ExporterFactory { + return &prometheusExporterFactory{ + metrics, + } +} + +type prometheusExporterFactory struct { + metrics Metrics +} + +func (p *prometheusExporterFactory) NewExporter( + params relayMonitoring.ExporterParams, +) (relayMonitoring.Exporter, error) { + starknetFeedConfig, ok := params.FeedConfig.(StarknetFeedConfig) + if !ok { + return nil, fmt.Errorf("expected feedConfig to be of type StarknetFeedConfig not %T", params.FeedConfig) + } + return &prometheusExporter{ + params.ChainConfig, + starknetFeedConfig, + p.metrics, + sync.Mutex{}, + map[string]struct{}{}, + }, nil +} + +type prometheusExporter struct { + chainConfig relayMonitoring.ChainConfig + feedConfig StarknetFeedConfig + metrics Metrics + addressesMu sync.Mutex + addressesSet map[string]struct{} +} + +func (p *prometheusExporter) Export(ctx context.Context, data interface{}) { + proxyData, isProxyData := data.(ProxyData) + if !isProxyData { + return + } + answer := float64(proxyData.Answer.Uint64()) + multiply := float64(p.feedConfig.Multiply.Uint64()) + if multiply == 0 { + multiply = 1.0 + } + p.metrics.SetProxyAnswersRaw( + answer, + p.feedConfig.ProxyAddress, + p.feedConfig.GetID(), + p.chainConfig.GetChainID(), + p.feedConfig.GetContractStatus(), + p.feedConfig.GetContractType(), + p.feedConfig.GetName(), + p.feedConfig.GetPath(), + p.chainConfig.GetNetworkID(), + p.chainConfig.GetNetworkName(), + ) + p.metrics.SetProxyAnswers( + answer/multiply, + p.feedConfig.ProxyAddress, + p.feedConfig.GetID(), + p.chainConfig.GetChainID(), + p.feedConfig.GetContractStatus(), + p.feedConfig.GetContractType(), + p.feedConfig.GetName(), + p.feedConfig.GetPath(), + p.chainConfig.GetNetworkID(), + p.chainConfig.GetNetworkName(), + ) + p.addressesMu.Lock() + defer p.addressesMu.Unlock() + p.addressesSet[p.feedConfig.ProxyAddress] = struct{}{} +} + +func (p *prometheusExporter) Cleanup(_ context.Context) { + p.addressesMu.Lock() + defer p.addressesMu.Unlock() + for address := range p.addressesSet { + p.metrics.CleanupProxy( + address, + p.feedConfig.GetContractAddress(), + p.chainConfig.GetChainID(), + p.feedConfig.GetContractStatus(), + p.feedConfig.GetContractType(), + p.feedConfig.GetName(), + p.feedConfig.GetPath(), + p.chainConfig.GetNetworkID(), + p.chainConfig.GetNetworkName(), + ) + } +} diff --git a/monitoring/pkg/monitoring/exporter_transmission_details.go b/monitoring/pkg/monitoring/exporter_transmission_details.go new file mode 100644 index 000000000..64cc5e99e --- /dev/null +++ b/monitoring/pkg/monitoring/exporter_transmission_details.go @@ -0,0 +1,107 @@ +package monitoring + +import ( + "context" + "fmt" + "math/big" + + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" +) + +// NewPrometheusExporterFactory builds an implementation of the Exporter for prometheus. +func NewTransmissionDetailsExporterFactory( + metrics Metrics, +) relayMonitoring.ExporterFactory { + return &transmissionDetailsExporterFactory{ + metrics, + } +} + +type transmissionDetailsExporterFactory struct { + metrics Metrics +} + +func (p *transmissionDetailsExporterFactory) NewExporter( + params relayMonitoring.ExporterParams, +) (relayMonitoring.Exporter, error) { + starknetFeedConfig, ok := params.FeedConfig.(StarknetFeedConfig) + if !ok { + return nil, fmt.Errorf("expected feedConfig to be of type StarknetFeedConfig not %T", params.FeedConfig) + } + return &transmissionDetailsExporter{ + params.ChainConfig, + starknetFeedConfig, + p.metrics, + }, nil +} + +type transmissionDetailsExporter struct { + chainConfig relayMonitoring.ChainConfig + feedConfig StarknetFeedConfig + metrics Metrics +} + +func (p *transmissionDetailsExporter) Export(ctx context.Context, data interface{}) { + transmissionsEnvelope, found := data.(TransmissionsEnvelope) + if !found { + return + } + + for _, t := range transmissionsEnvelope.Transmissions { + // gas price + divisor := new(big.Int).Exp(new(big.Int).SetUint64(10), new(big.Int).SetUint64(18), nil) // 10^18 + gasPriceInSTRK := new(big.Int).Div(t.GasPrice, divisor) + p.metrics.SetTransmissionGasPrice( + toFloat64(gasPriceInSTRK), + p.feedConfig.ContractAddress, + p.feedConfig.GetID(), + p.chainConfig.GetChainID(), + p.feedConfig.GetContractStatus(), + p.feedConfig.GetContractType(), + p.feedConfig.Name, + p.feedConfig.Path, + p.chainConfig.GetNetworkID(), + p.chainConfig.GetNetworkName(), + ) + + // observation length + observationLength := float64(t.ObservationLength) + p.metrics.SetReportObservations( + observationLength, + p.feedConfig.ContractAddress, + p.feedConfig.GetID(), + p.chainConfig.GetChainID(), + p.feedConfig.GetContractStatus(), + p.feedConfig.GetContractType(), + p.feedConfig.Name, + p.feedConfig.Path, + p.chainConfig.GetNetworkID(), + p.chainConfig.GetNetworkName(), + ) + } +} + +func (p *transmissionDetailsExporter) Cleanup(_ context.Context) { + p.metrics.CleanupTransmissionGasPrice( + p.feedConfig.GetContractAddress(), + p.feedConfig.GetID(), + p.chainConfig.GetChainID(), + p.feedConfig.GetContractStatus(), + p.feedConfig.GetContractType(), + p.feedConfig.GetName(), + p.feedConfig.GetPath(), + p.chainConfig.GetNetworkID(), + p.chainConfig.GetNetworkName(), + ) + p.metrics.CleanupReportObservations( + p.feedConfig.GetContractAddress(), + p.feedConfig.GetID(), + p.chainConfig.GetChainID(), + p.feedConfig.GetContractStatus(), + p.feedConfig.GetContractType(), + p.feedConfig.GetName(), + p.feedConfig.GetPath(), + p.chainConfig.GetNetworkID(), + p.chainConfig.GetNetworkName(), + ) +} diff --git a/monitoring/pkg/monitoring/exporter_transmission_details_test.go b/monitoring/pkg/monitoring/exporter_transmission_details_test.go new file mode 100644 index 000000000..b8597cd3d --- /dev/null +++ b/monitoring/pkg/monitoring/exporter_transmission_details_test.go @@ -0,0 +1,97 @@ +package monitoring + +import ( + "context" + "math/big" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-starknet/monitoring/pkg/monitoring/mocks" + + commonMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" +) + +func TestTransmissionDetailsExporter(t *testing.T) { + chainConfig := generateChainConfig() + feedConfig := generateFeedConfig() + + mockMetrics := mocks.NewMetrics(t) + factory := NewTransmissionDetailsExporterFactory(mockMetrics) + + gasPrice, ok := new(big.Int).SetString("10000000000000000000", 10) + require.True(t, ok) + + envelope := TransmissionsEnvelope{ + Transmissions: []TransmissionInfo{{ + GasPrice: gasPrice, // 10 STRK (10^19 FRI) + ObservationLength: 123, + }, + }, + } + + mockMetrics.On( + "SetTransmissionGasPrice", + float64(10), + feedConfig.ContractAddress, + feedConfig.GetID(), + chainConfig.GetChainID(), + feedConfig.GetContractStatus(), + feedConfig.GetContractType(), + feedConfig.Name, + feedConfig.Path, + chainConfig.GetNetworkID(), + chainConfig.GetNetworkName(), + ).Once() + + mockMetrics.On( + "SetReportObservations", + float64(123), + feedConfig.ContractAddress, + feedConfig.GetID(), + chainConfig.GetChainID(), + feedConfig.GetContractStatus(), + feedConfig.GetContractType(), + feedConfig.Name, + feedConfig.Path, + chainConfig.GetNetworkID(), + chainConfig.GetNetworkName(), + ).Once() + + exporter, err := factory.NewExporter(commonMonitoring.ExporterParams{ + ChainConfig: chainConfig, + FeedConfig: feedConfig, + }) + require.NoError(t, err) + + exporter.Export(context.Background(), envelope) + + // cleanup + mockMetrics.On( + "CleanupReportObservations", + feedConfig.ContractAddress, + feedConfig.GetID(), + chainConfig.GetChainID(), + feedConfig.GetContractStatus(), + feedConfig.GetContractType(), + feedConfig.Name, + feedConfig.Path, + chainConfig.GetNetworkID(), + chainConfig.GetNetworkName(), + ).Once() + mockMetrics.On( + "CleanupTransmissionGasPrice", + feedConfig.ContractAddress, + feedConfig.GetID(), + chainConfig.GetChainID(), + feedConfig.GetContractStatus(), + feedConfig.GetContractType(), + feedConfig.Name, + feedConfig.Path, + chainConfig.GetNetworkID(), + chainConfig.GetNetworkName(), + ).Once() + + exporter.Cleanup(context.Background()) + +} diff --git a/monitoring/pkg/monitoring/metrics.go b/monitoring/pkg/monitoring/metrics.go new file mode 100644 index 000000000..00bf03fca --- /dev/null +++ b/monitoring/pkg/monitoring/metrics.go @@ -0,0 +1,227 @@ +package monitoring + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" +) + +// Metrics is an interface for prometheus metrics. Makes testing easier. +// +//go:generate mockery --name Metrics --output ./mocks/ +type Metrics interface { + SetTransmissionGasPrice(answer float64, contractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) + CleanupTransmissionGasPrice(contractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) + SetReportObservations(answer float64, accountAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) + CleanupReportObservations(accountAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) + SetProxyAnswersRaw(answer float64, proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) + SetProxyAnswers(answer float64, proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) + CleanupProxy(proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) + SetBalance(answer float64, contractAddress, alias, networkId, networkName, chainID string) + CleanupBalance(contractAddress, alias, networkId, networkName, chainID string) +} + +var ( + transmissionGasPrice = promauto.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "starknet_transmission_gas_price", + Help: "Reports gas price (units STRK) reported with transmission", + }, + []string{ + "contract_address", + "feed_id", + "chain_id", + "contract_status", + "contract_type", + "feed_name", + "feed_path", + "network_id", + "network_name", + }, + ) + reportObservations = promauto.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "report_observations", + Help: "Reports # of observations included in a transmission report", + }, + []string{ + // uses "account_address" instead of "contract_address" for consistency with solana dashboards + "account_address", + "feed_id", + "chain_id", + "contract_status", + "contract_type", + "feed_name", + "feed_path", + "network_id", + "network_name", + }, + ) + proxyAnswersRaw = promauto.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "proxy_answers_raw", + Help: "Reports the latest raw answer from the proxy contract.", + }, + []string{"proxy_contract_address", "feed_id", "chain_id", "contract_status", "contract_type", "feed_name", "feed_path", "network_id", "network_name"}, + ) + proxyAnswers = promauto.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "proxy_answers", + Help: "Reports the latest answer from the proxy contract divided by the feed's multiplier parameter.", + }, + []string{"proxy_contract_address", "feed_id", "chain_id", "contract_status", "contract_type", "feed_name", "feed_path", "network_id", "network_name"}, + ) + contractBalance = promauto.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "strk_contract_balance", + Help: "Reports the latest STRK balance of a contract address", + }, + []string{"contract_address", "alias", "network_id", "network_name", "chain_id"}, + ) +) + +// NewMetrics does wisott +func NewMetrics(log relayMonitoring.Logger) Metrics { + return &defaultMetrics{log} +} + +type defaultMetrics struct { + log relayMonitoring.Logger +} + +func (d *defaultMetrics) SetTransmissionGasPrice(answer float64, contractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) { + transmissionGasPrice.With(prometheus.Labels{ + "contract_address": contractAddress, + "feed_id": feedID, + "chain_id": chainID, + "contract_status": contractStatus, + "contract_type": contractType, + "feed_name": feedName, + "feed_path": feedPath, + "network_id": networkID, + "network_name": networkName, + }).Set(answer) +} + +func (d *defaultMetrics) CleanupTransmissionGasPrice(contractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) { + labels := prometheus.Labels{ + "contract_address": contractAddress, + "feed_id": feedID, + "chain_id": chainID, + "contract_status": contractStatus, + "contract_type": contractType, + "feed_name": feedName, + "feed_path": feedPath, + "network_id": networkID, + "network_name": networkName, + } + if !transmissionGasPrice.Delete(labels) { + d.log.Errorw("failed to delete metric", "name", "starknet_transmission_gas_price", "labels", labels) + } +} + +func (d *defaultMetrics) SetBalance(answer float64, contractAddress, alias, networkId, networkName, chainID string) { + contractBalance.With(prometheus.Labels{ + "contract_address": contractAddress, + "alias": alias, + "network_id": networkId, + "network_name": networkName, + "chain_id": chainID, + }).Set(answer) +} + +func (d *defaultMetrics) CleanupBalance(contractAddress, alias, networkId, networkName, chainID string) { + labels := prometheus.Labels{ + "contract_address": contractAddress, + "alias": alias, + "network_id": networkId, + "network_name": networkName, + "chain_id": chainID, + } + if !contractBalance.Delete(labels) { + d.log.Errorw("failed to delete metric", "name", "strk_contract_balance", "labels", labels) + } +} + +func (d *defaultMetrics) SetReportObservations(answer float64, accountAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) { + reportObservations.With(prometheus.Labels{ + "account_address": accountAddress, + "feed_id": feedID, + "chain_id": chainID, + "contract_status": contractStatus, + "contract_type": contractType, + "feed_name": feedName, + "feed_path": feedPath, + "network_id": networkID, + "network_name": networkName, + }).Set(answer) +} + +func (d *defaultMetrics) CleanupReportObservations(accountAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) { + labels := prometheus.Labels{ + "account_address": accountAddress, + "feed_id": feedID, + "chain_id": chainID, + "contract_status": contractStatus, + "contract_type": contractType, + "feed_name": feedName, + "feed_path": feedPath, + "network_id": networkID, + "network_name": networkName, + } + if !reportObservations.Delete(labels) { + d.log.Errorw("failed to delete metric", "name", "report_observations", "labels", labels) + } +} + +func (d *defaultMetrics) SetProxyAnswersRaw(answer float64, proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) { + proxyAnswersRaw.With(prometheus.Labels{ + "proxy_contract_address": proxyContractAddress, + "feed_id": feedID, + "chain_id": chainID, + "contract_status": contractStatus, + "contract_type": contractType, + "feed_name": feedName, + "feed_path": feedPath, + "network_id": networkID, + "network_name": networkName, + }).Set(answer) +} + +func (d *defaultMetrics) SetProxyAnswers(answer float64, proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName string) { + proxyAnswers.With(prometheus.Labels{ + "proxy_contract_address": proxyContractAddress, + "feed_id": feedID, + "chain_id": chainID, + "contract_status": contractStatus, + "contract_type": contractType, + "feed_name": feedName, + "feed_path": feedPath, + "network_id": networkID, + "network_name": networkName, + }).Set(answer) +} + +func (d *defaultMetrics) CleanupProxy( + proxyContractAddress, feedID, chainID, contractStatus, contractType string, + feedName, feedPath, networkID, networkName string, +) { + labels := prometheus.Labels{ + "proxy_contract_address": proxyContractAddress, + "feed_id": feedID, + "chain_id": chainID, + "contract_status": contractStatus, + "contract_type": contractType, + "feed_name": feedName, + "feed_path": feedPath, + "network_id": networkID, + "network_name": networkName, + } + if !proxyAnswersRaw.Delete(labels) { + d.log.Errorw("failed to delete metric", "name", "proxy_answers_raw", "labels", labels) + } + if !proxyAnswers.Delete(labels) { + d.log.Errorw("failed to delete metric", "name", "proxy_answers", "labels", labels) + } +} diff --git a/monitoring/pkg/monitoring/mocks/Metrics.go b/monitoring/pkg/monitoring/mocks/Metrics.go new file mode 100644 index 000000000..fa9e1bbd0 --- /dev/null +++ b/monitoring/pkg/monitoring/mocks/Metrics.go @@ -0,0 +1,69 @@ +// Code generated by mockery v2.43.2. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Metrics is an autogenerated mock type for the Metrics type +type Metrics struct { + mock.Mock +} + +// CleanupBalance provides a mock function with given fields: contractAddress, alias, networkId, networkName, chainID +func (_m *Metrics) CleanupBalance(contractAddress string, alias string, networkId string, networkName string, chainID string) { + _m.Called(contractAddress, alias, networkId, networkName, chainID) +} + +// CleanupProxy provides a mock function with given fields: proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName +func (_m *Metrics) CleanupProxy(proxyContractAddress string, feedID string, chainID string, contractStatus string, contractType string, feedName string, feedPath string, networkID string, networkName string) { + _m.Called(proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName) +} + +// CleanupReportObservations provides a mock function with given fields: accountAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName +func (_m *Metrics) CleanupReportObservations(accountAddress string, feedID string, chainID string, contractStatus string, contractType string, feedName string, feedPath string, networkID string, networkName string) { + _m.Called(accountAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName) +} + +// CleanupTransmissionGasPrice provides a mock function with given fields: contractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName +func (_m *Metrics) CleanupTransmissionGasPrice(contractAddress string, feedID string, chainID string, contractStatus string, contractType string, feedName string, feedPath string, networkID string, networkName string) { + _m.Called(contractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName) +} + +// SetBalance provides a mock function with given fields: answer, contractAddress, alias, networkId, networkName, chainID +func (_m *Metrics) SetBalance(answer float64, contractAddress string, alias string, networkId string, networkName string, chainID string) { + _m.Called(answer, contractAddress, alias, networkId, networkName, chainID) +} + +// SetProxyAnswers provides a mock function with given fields: answer, proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName +func (_m *Metrics) SetProxyAnswers(answer float64, proxyContractAddress string, feedID string, chainID string, contractStatus string, contractType string, feedName string, feedPath string, networkID string, networkName string) { + _m.Called(answer, proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName) +} + +// SetProxyAnswersRaw provides a mock function with given fields: answer, proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName +func (_m *Metrics) SetProxyAnswersRaw(answer float64, proxyContractAddress string, feedID string, chainID string, contractStatus string, contractType string, feedName string, feedPath string, networkID string, networkName string) { + _m.Called(answer, proxyContractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName) +} + +// SetReportObservations provides a mock function with given fields: answer, accountAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName +func (_m *Metrics) SetReportObservations(answer float64, accountAddress string, feedID string, chainID string, contractStatus string, contractType string, feedName string, feedPath string, networkID string, networkName string) { + _m.Called(answer, accountAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName) +} + +// SetTransmissionGasPrice provides a mock function with given fields: answer, contractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName +func (_m *Metrics) SetTransmissionGasPrice(answer float64, contractAddress string, feedID string, chainID string, contractStatus string, contractType string, feedName string, feedPath string, networkID string, networkName string) { + _m.Called(answer, contractAddress, feedID, chainID, contractStatus, contractType, feedName, feedPath, networkID, networkName) +} + +// NewMetrics creates a new instance of Metrics. 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 NewMetrics(t interface { + mock.TestingT + Cleanup(func()) +}) *Metrics { + mock := &Metrics{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/monitoring/pkg/monitoring/monitor.go b/monitoring/pkg/monitoring/monitor.go new file mode 100644 index 000000000..8dbbbf6a7 --- /dev/null +++ b/monitoring/pkg/monitoring/monitor.go @@ -0,0 +1,182 @@ +package monitoring + +import ( + "fmt" + "net/http" + "net/url" + "os" + "strings" + "time" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + commonMonitor "github.com/smartcontractkit/chainlink-common/pkg/monitoring" + "github.com/smartcontractkit/chainlink-common/pkg/monitoring/config" + "github.com/smartcontractkit/chainlink-common/pkg/services" +) + +// Builds monitor instance with only the prometheus exporter. +// Does not contain kafka exporter. +func NewMonitorPrometheusOnly( + stopCh services.StopRChan, + log commonMonitor.Logger, + chainConfig commonMonitor.ChainConfig, + envelopeSourceFactory commonMonitor.SourceFactory, + txResultsSourceFactory commonMonitor.SourceFactory, + feedsParser commonMonitor.FeedsParser, + nodesParser commonMonitor.NodesParser, +) (*commonMonitor.Monitor, error) { + cfg, err := ParseWithoutKafka() + if err != nil { + return nil, fmt.Errorf("failed to parse generic configuration: %w", err) + } + + metrics := commonMonitor.NewMetrics(logger.With(log, "component", "metrics")) + chainMetrics := commonMonitor.NewChainMetrics(chainConfig) + + sourceFactories := []commonMonitor.SourceFactory{envelopeSourceFactory, txResultsSourceFactory} + + prometheusExporterFactory := commonMonitor.NewPrometheusExporterFactory( + logger.With(log, "component", "prometheus-exporter"), + metrics, + ) + + exporterFactories := []commonMonitor.ExporterFactory{prometheusExporterFactory} + + rddSource := commonMonitor.NewRDDSource( + cfg.Feeds.URL, feedsParser, cfg.Feeds.IgnoreIDs, + cfg.Nodes.URL, nodesParser, + logger.With(log, "component", "rdd-source"), + ) + + rddPoller := commonMonitor.NewSourcePoller( + rddSource, + logger.With(log, "component", "rdd-poller"), + cfg.Feeds.RDDPollInterval, + cfg.Feeds.RDDReadTimeout, + 0, // no buffering! + ) + + manager := commonMonitor.NewManager( + logger.With(log, "component", "manager"), + rddPoller, + ) + + // Configure HTTP server + httpServer := commonMonitor.NewHTTPServer(stopCh, cfg.HTTP.Address, logger.With(log, "component", "http-server")) + httpServer.Handle("/metrics", metrics.HTTPHandler()) + httpServer.Handle("/debug", manager.HTTPHandler()) + // Required for k8s. + httpServer.Handle("/health", http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + })) + + return &commonMonitor.Monitor{ + StopCh: stopCh, + ChainConfig: chainConfig, + Config: cfg, + Log: log, + // no kafka + Producer: nil, + Metrics: metrics, + ChainMetrics: chainMetrics, + // no kafka + SchemaRegistry: nil, + SourceFactories: sourceFactories, + ExporterFactories: exporterFactories, + + RDDSource: rddSource, + RDDPoller: rddPoller, + + Manager: manager, + + HTTPServer: httpServer, + }, nil +} + +type MyConfig = config.Config + +func ParseWithoutKafka() (MyConfig, error) { + cfg := MyConfig{} + + if err := parseConfigEnvVars(&cfg); err != nil { + return cfg, err + } + + applyConfigDefaults(&cfg) + + err := validateConfigWithoutKafka(cfg) + + return cfg, err +} + +func applyConfigDefaults(cfg *MyConfig) { + if cfg.Feeds.RDDReadTimeout == 0 { + cfg.Feeds.RDDReadTimeout = 1 * time.Second + } + if cfg.Feeds.RDDPollInterval == 0 { + cfg.Feeds.RDDPollInterval = 10 * time.Second + } +} + +func parseConfigEnvVars(cfg *MyConfig) error { + if value, isPresent := os.LookupEnv("FEEDS_URL"); isPresent { + cfg.Feeds.URL = value + } + if value, isPresent := os.LookupEnv("FEEDS_RDD_READ_TIMEOUT"); isPresent { + readTimeout, err := time.ParseDuration(value) + if err != nil { + return fmt.Errorf("failed to parse env var FEEDS_RDD_READ_TIMEOUT, see https://pkg.go.dev/time#ParseDuration: %w", err) + } + cfg.Feeds.RDDReadTimeout = readTimeout + } + if value, isPresent := os.LookupEnv("FEEDS_RDD_POLL_INTERVAL"); isPresent { + pollInterval, err := time.ParseDuration(value) + if err != nil { + return fmt.Errorf("failed to parse env var FEEDS_RDD_POLL_INTERVAL, see https://pkg.go.dev/time#ParseDuration: %w", err) + } + cfg.Feeds.RDDPollInterval = pollInterval + } + if value, isPresent := os.LookupEnv("FEEDS_IGNORE_IDS"); isPresent { + ids := strings.Split(value, ",") + for _, id := range ids { + if id == "" { + continue + } + cfg.Feeds.IgnoreIDs = append(cfg.Feeds.IgnoreIDs, strings.TrimSpace(id)) + } + } + if value, isPresent := os.LookupEnv("NODES_URL"); isPresent { + cfg.Nodes.URL = value + } + + if value, isPresent := os.LookupEnv("HTTP_ADDRESS"); isPresent { + cfg.HTTP.Address = value + } + + return nil +} + +func validateConfigWithoutKafka(cfg MyConfig) error { + // Required config + for envVarName, currentValue := range map[string]string{ + "FEEDS_URL": cfg.Feeds.URL, + "NODES_URL": cfg.Nodes.URL, + + "HTTP_ADDRESS": cfg.HTTP.Address, + } { + if currentValue == "" { + return fmt.Errorf("'%s' env var is required", envVarName) + } + } + // Validate URLs. + for envVarName, currentValue := range map[string]string{ + "FEEDS_URL": cfg.Feeds.URL, + "NODES_URL": cfg.Nodes.URL, + } { + if _, err := url.ParseRequestURI(currentValue); err != nil { + return fmt.Errorf("%s='%s' is not a valid URL: %w", envVarName, currentValue, err) + } + } + + return nil +} diff --git a/monitoring/pkg/monitoring/source_contract_balance.go b/monitoring/pkg/monitoring/source_contract_balance.go new file mode 100644 index 000000000..1c7d59d39 --- /dev/null +++ b/monitoring/pkg/monitoring/source_contract_balance.go @@ -0,0 +1,92 @@ +package monitoring + +import ( + "context" + "fmt" + "math/big" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + commonMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/erc20" +) + +type ContractAddress struct { + Address *felt.Felt + Name string +} + +type ContractAddressWithBalance struct { + ContractAddress + Balance *big.Int +} + +type BalanceEnvelope struct { + Contracts []ContractAddressWithBalance + Decimals *big.Int +} + +func NewContractAddress(address string, name string) (ContractAddress, error) { + ans := ContractAddress{} + addr, err := starknetutils.HexToFelt(address) + if err != nil { + return ans, fmt.Errorf("error parsing contract address: %w", err) + } + ans.Address = addr + ans.Name = name + return ans, nil +} + +type nodeBalancesSourceFactory struct { + erc20Reader erc20.ERC20Reader +} + +func NewNodeBalancesSourceFactory(erc20Reader erc20.ERC20Reader) *nodeBalancesSourceFactory { + return &nodeBalancesSourceFactory{ + erc20Reader: erc20Reader, + } +} + +func (f *nodeBalancesSourceFactory) NewSource( + _ commonMonitoring.ChainConfig, + rddNodes []commonMonitoring.NodeConfig, +) (commonMonitoring.Source, error) { + var addrs []ContractAddress + + for _, n := range rddNodes { + addr, err := NewContractAddress(string(n.GetAccount()), n.GetName()) + if err != nil { + return nil, err + } + addrs = append(addrs, addr) + } + + return &contractBalancesSource{erc20Reader: f.erc20Reader, contracts: addrs}, nil +} + +func (f *nodeBalancesSourceFactory) GetType() string { + return "nodeBalances" +} + +// contract balances sources can be potentially reused for other contracts (not just the node account contracts) +type contractBalancesSource struct { + erc20Reader erc20.ERC20Reader + contracts []ContractAddress +} + +func (s *contractBalancesSource) Fetch(ctx context.Context) (interface{}, error) { + var cAns []ContractAddressWithBalance + for _, c := range s.contracts { + balance, err := s.erc20Reader.BalanceOf(ctx, c.Address) + if err != nil { + return nil, fmt.Errorf("could not fetch address balance %w", err) + } + cAns = append(cAns, ContractAddressWithBalance{c, balance}) + } + dAns, err := s.erc20Reader.Decimals(ctx) + if err != nil { + return nil, fmt.Errorf("could not fetch decimals %w", err) + } + + return BalanceEnvelope{Contracts: cAns, Decimals: dAns}, nil +} diff --git a/monitoring/pkg/monitoring/source_contract_balance_test.go b/monitoring/pkg/monitoring/source_contract_balance_test.go new file mode 100644 index 000000000..7ccae8284 --- /dev/null +++ b/monitoring/pkg/monitoring/source_contract_balance_test.go @@ -0,0 +1,50 @@ +package monitoring + +import ( + "context" + "math/big" + "testing" + + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + erc20Mocks "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/erc20/mocks" +) + +func TestContractBalancesSource(t *testing.T) { + chainConfig := generateChainConfig() + nodeConfig := generateNodeConfig() + + erc20Reader := erc20Mocks.NewERC20Reader(t) + + for _, x := range nodeConfig { + nodeAddressFelt, err := starknetutils.HexToFelt(string(x.GetAccount())) + require.NoError(t, err) + + erc20Reader.On( + "BalanceOf", + mock.Anything, // ctx + nodeAddressFelt, // address + ).Return(new(big.Int).SetUint64(777), nil) + } + + erc20Reader.On( + "Decimals", + mock.Anything, // ctx + ).Return(new(big.Int).SetUint64(18), nil) + + factory := NewNodeBalancesSourceFactory(erc20Reader) + source, err := factory.NewSource(chainConfig, nodeConfig) + require.NoError(t, err) + rawBalanceEnvelope, err := source.Fetch(context.Background()) + require.NoError(t, err) + balanceEnvelope, ok := rawBalanceEnvelope.(BalanceEnvelope) + require.True(t, ok) + + require.Equal(t, balanceEnvelope.Decimals.Uint64(), uint64(18)) + + require.Equal(t, balanceEnvelope.Contracts[0].Balance.Uint64(), uint64(777)) + require.Equal(t, balanceEnvelope.Contracts[1].Balance.Uint64(), uint64(777)) + +} diff --git a/monitoring/pkg/monitoring/source_envelope.go b/monitoring/pkg/monitoring/source_envelope.go new file mode 100644 index 000000000..969672271 --- /dev/null +++ b/monitoring/pkg/monitoring/source_envelope.go @@ -0,0 +1,183 @@ +package monitoring + +import ( + "context" + "errors" + "fmt" + "math/big" + "sync" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/smartcontractkit/libocr/offchainreporting2/types" + "go.uber.org/multierr" + + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" + relayUtils "github.com/smartcontractkit/chainlink-common/pkg/utils" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +func NewEnvelopeSourceFactory( + ocr2Reader ocr2.OCR2Reader, +) relayMonitoring.SourceFactory { + return &envelopeSourceFactory{ + ocr2Reader, + } +} + +type envelopeSourceFactory struct { + ocr2Reader ocr2.OCR2Reader +} + +func (s *envelopeSourceFactory) NewSource( + chainConfig relayMonitoring.ChainConfig, + feedConfig relayMonitoring.FeedConfig, +) (relayMonitoring.Source, error) { + starknetChainConfig, ok := chainConfig.(StarknetConfig) + if !ok { + return nil, fmt.Errorf("expected feedConfig to be of type StarknetFeedConfig not %T", feedConfig) + } + contractAddress, err := starknetutils.HexToFelt(feedConfig.GetContractAddress()) + if err != nil { + return nil, err + } + linkTokenAddress, err := starknetutils.HexToFelt(starknetChainConfig.GetLinkTokenAddress()) + if err != nil { + return nil, err + } + return &envelopeSource{ + contractAddress, + linkTokenAddress, + s.ocr2Reader, + }, nil +} + +func (s *envelopeSourceFactory) GetType() string { + return "envelope" +} + +type envelopeSource struct { + contractAddress *felt.Felt + linkTokenAddress *felt.Felt + ocr2Reader ocr2.OCR2Reader +} + +func (s *envelopeSource) Fetch(ctx context.Context) (interface{}, error) { + envelope := relayMonitoring.Envelope{} + var envelopeMu sync.Mutex + var envelopeErr error + subs := &relayUtils.Subprocesses{} + + subs.Go(func() { + latestRoundData, newTransmissionEvent, err := s.fetchLatestNewTransmissionEvent(ctx, s.contractAddress) + envelopeMu.Lock() + defer envelopeMu.Unlock() + if err != nil { + envelopeErr = errors.Join(envelopeErr, fmt.Errorf("fetchLatestNewTransmissionEvent failed: %w", err)) + return + } + envelope.BlockNumber = latestRoundData.BlockNumber + envelope.Transmitter = types.Account(newTransmissionEvent.Transmitter.String()) + envelope.AggregatorRoundID = latestRoundData.RoundID + envelope.ConfigDigest = newTransmissionEvent.ConfigDigest + envelope.Epoch = newTransmissionEvent.Epoch + envelope.Round = newTransmissionEvent.Round + envelope.LatestAnswer = newTransmissionEvent.LatestAnswer + envelope.LatestTimestamp = newTransmissionEvent.LatestTimestamp + envelope.JuelsPerFeeCoin = newTransmissionEvent.JuelsPerFeeCoin + }) + + subs.Go(func() { + contractConfig, err := s.fetchContractConfig(ctx, s.contractAddress) + envelopeMu.Lock() + defer envelopeMu.Unlock() + if err != nil { + envelopeErr = multierr.Combine(envelopeErr, fmt.Errorf("fetchContractConfig failed: %w", err)) + return + } + envelope.ContractConfig = contractConfig.Config + }) + + subs.Go(func() { + availableLink, err := s.ocr2Reader.LinkAvailableForPayment(ctx, s.contractAddress) + envelopeMu.Lock() + defer envelopeMu.Unlock() + if err != nil { + envelopeErr = multierr.Combine(envelopeErr, fmt.Errorf("fetch LinkAvailableForPayment failed: %w", err)) + return + } + envelope.LinkAvailableForPayment = availableLink + }) + + subs.Go(func() { + balance, err := s.fetchLinkBalance(ctx, s.linkTokenAddress, s.contractAddress) + envelopeMu.Lock() + defer envelopeMu.Unlock() + if err != nil { + envelopeErr = multierr.Combine(envelopeErr, fmt.Errorf("fetchLinkBalance failed: %w", err)) + return + } + envelope.LinkBalance = balance + }) + + subs.Wait() + return envelope, envelopeErr +} + +func (s *envelopeSource) fetchLatestNewTransmissionEvent(ctx context.Context, contractAddress *felt.Felt) ( + latestRound ocr2.RoundData, + transmission ocr2.NewTransmissionEvent, + err error, +) { + latestRound, err = s.ocr2Reader.LatestRoundData(ctx, contractAddress) + if err != nil { + return latestRound, transmission, fmt.Errorf("failed to fetch latest_round_data: %w", err) + } + transmissions, err := s.ocr2Reader.NewTransmissionsFromEventsAt(ctx, contractAddress, latestRound.BlockNumber) + if err != nil { + return latestRound, transmission, fmt.Errorf("failed to fetch new_transmission events: %w", err) + } + if len(transmissions) == 0 { + // NOTE This shouldn't happen! LatestRound says this block should have a transmission and we didn't find any! + return latestRound, transmission, fmt.Errorf("no transmissions found in the block %d", latestRound.BlockNumber) + } + for _, transmission = range transmissions { + if transmission.RoundId == latestRound.RoundID { + return latestRound, transmission, nil + } + } + // NOTE! This also shouldn't happen! We found transmissions in the block suggested by LatestRound but they have a different round id! + return latestRound, transmission, fmt.Errorf("no new_trasmission event found to correspond with the round id %d in block %d", latestRound.RoundID, latestRound.BlockNumber) +} + +func (s *envelopeSource) fetchContractConfig(ctx context.Context, contractAddress *felt.Felt) (config ocr2.ContractConfig, err error) { + configDetails, err := s.ocr2Reader.LatestConfigDetails(ctx, contractAddress) + if err != nil { + return config, fmt.Errorf("couldn't fetch latest config details for contract '%s': %w", contractAddress, err) + } + config, err = s.ocr2Reader.ConfigFromEventAt(ctx, contractAddress, configDetails.Block) + if err != nil { + return config, fmt.Errorf("couldn't fetch config at block '%d' for contract '%s': %w", configDetails.Block, contractAddress, err) + } + return config, nil +} + +var zeroBigInt = big.NewInt(0) + +func (s *envelopeSource) fetchLinkBalance(ctx context.Context, linkTokenAddress, contractAddress *felt.Felt) (*big.Int, error) { + results, err := s.ocr2Reader.BaseReader().CallContract(ctx, starknet.CallOps{ + ContractAddress: linkTokenAddress, + Selector: starknetutils.GetSelectorFromNameFelt("balance_of"), + Calldata: []*felt.Felt{contractAddress}, + }) + if err != nil { + return nil, fmt.Errorf("failed call to ECR20 contract, balance_of method: %w", err) + } + if len(results) < 1 { + return nil, fmt.Errorf("insufficient data from balance_of '%v': %w", results, err) + } + linkBalance := results[0].BigInt(big.NewInt(0)) + return linkBalance, nil +} diff --git a/monitoring/pkg/monitoring/source_envelope_test.go b/monitoring/pkg/monitoring/source_envelope_test.go new file mode 100644 index 000000000..77e329f20 --- /dev/null +++ b/monitoring/pkg/monitoring/source_envelope_test.go @@ -0,0 +1,199 @@ +package monitoring + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/smartcontractkit/libocr/offchainreporting2/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + + ocr2Mocks "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2/mocks" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" + starknetMocks "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet/mocks" +) + +func TestEnvelopeSource(t *testing.T) { + // This test makes sure that the mapping between the response from the ocr2.Client + // method calls and the output of the Envelope source is correct. + + chainConfig := generateChainConfig() + feedConfig := generateFeedConfig() + + feedContractAddressFelt, err := starknetutils.HexToFelt(feedConfig.ContractAddress) + require.NoError(t, err) + + transmitterContractAddressFelt, err := starknetutils.HexToFelt("0x16715b5cc943835f196b7caf5a8aeb0e85b3f975dc43c14c90d0376e87eead1") + require.NoError(t, err) + + ocr2ClientNewTransmissionEventAtResponse := []ocr2.NewTransmissionEvent{ + { + RoundId: 0xf5b, + LatestAnswer: bigIntFromString("-900000000"), + Transmitter: transmitterContractAddressFelt, + LatestTimestamp: time.Date(2022, time.September, 27, 18, 51, 0, 0, time.Local), + Observers: []uint8{0x1, 0x2, 0x3, 0x4}, + ObservationsLen: 0x4, + Observations: []*big.Int{ + bigIntFromString("3618502788666131213697322783095070105623107215331596699973092056134972020481"), + bigIntFromString("3618502788666131213697322783095070105623107215331596699973092056134972020481"), + bigIntFromString("3618502788666131213697322783095070105623107215331596699973092056134972020481"), + bigIntFromString("3618502788666131213697322783095070105623107215331596699973092056134972020481"), + }, + JuelsPerFeeCoin: big.NewInt(451000), + GasPrice: big.NewInt(1), + ConfigDigest: types.ConfigDigest{0x0, 0x4, 0x18, 0xe5, 0x44, 0xab, 0xa8, 0x18, 0x15, 0xa5, 0x2b, 0xf0, 0x11, 0x58, 0xc6, 0x9b, 0x38, 0x8a, 0x48, 0x9f, 0x76, 0xd, 0xd8, 0x3d, 0x84, 0x3f, 0x1d, 0x31, 0x22, 0xdb, 0x78, 0xa}, + Epoch: 0x519, + Round: 0x5, + Reimbursement: big.NewInt(0), + }, + } + + ocr2Reader := ocr2Mocks.NewOCR2Reader(t) + ocr2Reader.On( + "LatestRoundData", + mock.Anything, // ctx + feedContractAddressFelt, + ).Return(ocr2ClientLatestRoundDataResponse, nil).Once() + ocr2Reader.On( + "NewTransmissionsFromEventsAt", + mock.Anything, // ctx + feedContractAddressFelt, + ocr2ClientLatestRoundDataResponse.BlockNumber, + ).Return(ocr2ClientNewTransmissionEventAtResponse, nil).Once() + ocr2Reader.On( + "LatestConfigDetails", + mock.Anything, // ctx + feedContractAddressFelt, + ).Return(ocr2ClientLatestConfigDetailsResponse, nil).Once() + ocr2Reader.On( + "ConfigFromEventAt", + mock.Anything, // ctx + feedContractAddressFelt, + ocr2ClientLatestConfigDetailsResponse.Block, + ).Return(ocr2ClientConfigFromEventAtResponse, nil).Once() + ocr2Reader.On( + "LinkAvailableForPayment", + mock.Anything, // ctx + feedContractAddressFelt, + ).Return(ocr2ClientLinkAvailableForPaymentResponse, nil).Once() + + baseReader := starknetMocks.NewReader(t) + ocr2Reader.On("BaseReader").Return(baseReader) + + linkTokenAddressFelt, err := starknetutils.HexToFelt(chainConfig.GetLinkTokenAddress()) + require.NoError(t, err) + + accountBalanceFelt, err := starknetutils.HexToFelt("0x56bc75e2d63100000") + require.NoError(t, err) + starknetReaderCallContractBalanceOfResponse := []*felt.Felt{accountBalanceFelt, &felt.Zero} + + baseReader.On( + "CallContract", + mock.Anything, // ctx + starknet.CallOps{ + ContractAddress: linkTokenAddressFelt, + Selector: starknetutils.GetSelectorFromNameFelt("balance_of"), + Calldata: []*felt.Felt{feedContractAddressFelt}, + }, + ).Return(starknetReaderCallContractBalanceOfResponse, nil) + + factory := NewEnvelopeSourceFactory(ocr2Reader) + source, err := factory.NewSource(chainConfig, feedConfig) + require.NoError(t, err) + rawEnvelope, err := source.Fetch(context.Background()) + require.NoError(t, err) + envelope, ok := rawEnvelope.(relayMonitoring.Envelope) + require.True(t, ok) + + require.Equal(t, expectedEnvelope, envelope) + +} + +var ( + ocr2ClientLatestRoundDataResponse = ocr2.RoundData{ + RoundID: 0xf5b, + Answer: bigIntFromString("3618502788666131213697322783095070105623107215331596699973092056134972020481"), + BlockNumber: 0xe07, + StartedAt: time.Date(2022, time.September, 27, 18, 50, 0, 0, time.Local), + UpdatedAt: time.Date(2022, time.September, 27, 18, 51, 0, 0, time.Local), + } + ocr2ClientLatestConfigDetailsResponse = ocr2.ContractConfigDetails{ + Block: 0x11, + Digest: types.ConfigDigest{0x0, 0x4, 0x18, 0xe5, 0x44, 0xab, 0xa8, 0x18, 0x15, 0xa5, 0x2b, 0xf0, 0x11, 0x58, 0xc6, 0x9b, 0x38, 0x8a, 0x48, 0x9f, 0x76, 0xd, 0xd8, 0x3d, 0x84, 0x3f, 0x1d, 0x31, 0x22, 0xdb, 0x78, 0xa}, + } + ocr2ClientConfigFromEventAtResponse = ocr2.ContractConfig{ + Config: types.ContractConfig{ + ConfigDigest: types.ConfigDigest{0x0, 0x4, 0x18, 0xe5, 0x44, 0xab, 0xa8, 0x18, 0x15, 0xa5, 0x2b, 0xf0, 0x11, 0x58, 0xc6, 0x9b, 0x38, 0x8a, 0x48, 0x9f, 0x76, 0xd, 0xd8, 0x3d, 0x84, 0x3f, 0x1d, 0x31, 0x22, 0xdb, 0x78, 0xa}, + ConfigCount: 0x1, + Signers: []types.OnchainPublicKey{ + {0x6, 0x43, 0x41, 0xfa, 0xc3, 0x1, 0xc6, 0x2c, 0x38, 0xa9, 0xef, 0xdb, 0x86, 0xf6, 0xa2, 0x5a, 0x34, 0xd2, 0x4, 0x4f, 0x29, 0x2e, 0x94, 0xfb, 0xe4, 0x78, 0xa6, 0x67, 0x19, 0xb3, 0x80, 0x9e}, + {0x1, 0xe2, 0xe1, 0x45, 0x47, 0x3, 0x7d, 0xb0, 0xd2, 0xe, 0xc6, 0xc9, 0x4b, 0xc7, 0x91, 0xea, 0xf2, 0xc9, 0x98, 0xad, 0x92, 0x79, 0xbb, 0xd, 0x21, 0x80, 0x15, 0x14, 0xd0, 0x6f, 0xa5, 0x7e}, + {0x3, 0xb6, 0xcb, 0xd7, 0xbd, 0x52, 0x2d, 0xc8, 0xb0, 0xb4, 0x15, 0x3d, 0x60, 0x44, 0xec, 0xa7, 0x7e, 0x3e, 0xcf, 0xde, 0xe0, 0xc9, 0x5d, 0x20, 0x75, 0x50, 0x61, 0xf4, 0xbc, 0x7b, 0xf5, 0x4d}, + {0x2, 0x4a, 0xa1, 0x21, 0x5b, 0xf4, 0xa3, 0xbb, 0x13, 0xea, 0x19, 0x57, 0x74, 0x28, 0xb7, 0xbe, 0xb5, 0xb9, 0x28, 0xb5, 0x74, 0x96, 0x78, 0xfa, 0x46, 0x87, 0x3b, 0x62, 0x7b, 0x22, 0x2a, 0x14}, + {0x2, 0xa9, 0xc8, 0x4f, 0x88, 0x14, 0x17, 0xb5, 0xc9, 0xd1, 0x3b, 0x80, 0x2a, 0xc9, 0x93, 0xc5, 0x2c, 0x82, 0x88, 0x62, 0x32, 0xf7, 0x4e, 0x47, 0x5a, 0x92, 0xcc, 0x1a, 0xa, 0x1, 0x10, 0xda}, + }, + Transmitters: []types.Account{ + "0x033c95af529827a2372743bfc820b4d0bd08605fda5e089d1a7ad3a33caa48fc", + "0x05e457e084ff8e7279985ffb7ad7a65a6adfa8485e7d5d615c015268d5aa9971", + "0x0692a71d868ee9fc22091d8f73c16dabaf9219fa74c4bcc7d385f398949ba8d2", + "0x01232b74b82e490f373453baebe7e217cc6d33d798824a04f8274fa83bc2acd4", + "0x016715b5cc943835f196b7caf5a8aeb0e85b3f975dc43c14c90d0376e87eead1", + }, + F: 0x1, + OnchainConfig: []uint8{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xb7, 0x89, 0x18, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x48, 0x76, 0xe8, 0x0}, + OffchainConfigVersion: 0x2, + OffchainConfig: []uint8{0x8, 0x80, 0xa0, 0xd9, 0xe6, 0x1d, 0x10, 0x80, 0xd8, 0x8e, 0xe1, 0x6f, 0x18, 0x80, 0xbc, 0xc1, 0x96, 0xb, 0x20, 0x80, 0xca, 0xb5, 0xee, 0x1, 0x28, 0x80, 0x90, 0xdf, 0xc0, 0x4a, 0x30, 0x5, 0x3a, 0x2, 0x1, 0x2, 0x42, 0x20, 0xe9, 0x4f, 0x24, 0x4a, 0xcd, 0x86, 0x7d, 0xa5, 0x72, 0x54, 0x35, 0x57, 0x82, 0xb7, 0x1d, 0xb4, 0x50, 0x83, 0xd3, 0x67, 0xa7, 0xef, 0x23, 0x71, 0x5e, 0xb5, 0xce, 0x64, 0x38, 0xdf, 0x16, 0x1b, 0x42, 0x20, 0x34, 0xb6, 0xb5, 0xd, 0x9a, 0x47, 0xa2, 0x25, 0xe7, 0x91, 0xb3, 0x67, 0x7a, 0x1e, 0xd, 0x12, 0x2b, 0xa0, 0xc, 0xe9, 0x60, 0xd3, 0x7c, 0x76, 0x46, 0xec, 0x84, 0xcd, 0xd6, 0xfa, 0x9c, 0x48, 0x42, 0x20, 0x6a, 0xbc, 0xb4, 0x9d, 0xc7, 0xf4, 0xa9, 0x2f, 0xc4, 0x50, 0x89, 0x82, 0xa8, 0xa, 0xc1, 0x54, 0x23, 0x79, 0x8a, 0x2d, 0xe, 0x47, 0x1e, 0x95, 0xf4, 0x1e, 0x30, 0xeb, 0x68, 0x85, 0x29, 0xa6, 0x42, 0x20, 0x9b, 0xab, 0xa6, 0x36, 0x27, 0xbf, 0xa5, 0x31, 0x26, 0x9f, 0x32, 0x40, 0xb4, 0xc4, 0xe9, 0x8e, 0x86, 0xbc, 0xd5, 0x99, 0x83, 0xc5, 0x27, 0x31, 0x5f, 0x7a, 0xd1, 0x2f, 0x51, 0x5d, 0xd8, 0xfc, 0x42, 0x20, 0x72, 0xd7, 0x97, 0xfe, 0x3c, 0x8, 0xd8, 0x97, 0xfe, 0xe8, 0xdd, 0xa3, 0xa9, 0x40, 0x66, 0xa3, 0x4d, 0xa7, 0x27, 0x81, 0x4f, 0xf, 0x1f, 0x6c, 0x72, 0x22, 0xba, 0xdc, 0x52, 0x18, 0xcf, 0xb2, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x45, 0x7a, 0x66, 0x67, 0x38, 0x70, 0x32, 0x71, 0x58, 0x42, 0x38, 0x74, 0x77, 0x37, 0x6b, 0x42, 0x59, 0x72, 0x76, 0x75, 0x4d, 0x6e, 0x75, 0x47, 0x70, 0x66, 0x75, 0x79, 0x71, 0x59, 0x67, 0x4a, 0x50, 0x76, 0x78, 0x70, 0x77, 0x69, 0x62, 0x73, 0x50, 0x68, 0x67, 0x5a, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x4c, 0x5a, 0x4a, 0x58, 0x71, 0x44, 0x59, 0x56, 0x32, 0x48, 0x45, 0x53, 0x35, 0x4a, 0x76, 0x6b, 0x4b, 0x35, 0x72, 0x6f, 0x65, 0x39, 0x77, 0x67, 0x44, 0x38, 0x4c, 0x67, 0x6d, 0x73, 0x69, 0x36, 0x51, 0x69, 0x71, 0x6a, 0x6d, 0x46, 0x31, 0x4b, 0x38, 0x38, 0x4d, 0x57, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x39, 0x73, 0x45, 0x63, 0x45, 0x33, 0x50, 0x32, 0x79, 0x6d, 0x4b, 0x39, 0x42, 0x5a, 0x50, 0x45, 0x51, 0x43, 0x47, 0x35, 0x6d, 0x6f, 0x67, 0x59, 0x4b, 0x48, 0x63, 0x68, 0x71, 0x48, 0x53, 0x69, 0x57, 0x52, 0x45, 0x4c, 0x68, 0x4a, 0x52, 0x5a, 0x32, 0x69, 0x69, 0x56, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x45, 0x33, 0x56, 0x76, 0x4b, 0x79, 0x47, 0x70, 0x6d, 0x74, 0x52, 0x36, 0x55, 0x48, 0x6b, 0x51, 0x45, 0x75, 0x31, 0x43, 0x73, 0x70, 0x51, 0x47, 0x78, 0x4c, 0x67, 0x55, 0x56, 0x77, 0x4b, 0x64, 0x4c, 0x64, 0x4b, 0x46, 0x71, 0x4a, 0x35, 0x4e, 0x52, 0x74, 0x47, 0x74, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x52, 0x6b, 0x62, 0x7a, 0x79, 0x6b, 0x41, 0x48, 0x38, 0x4b, 0x55, 0x48, 0x57, 0x69, 0x52, 0x77, 0x66, 0x31, 0x45, 0x73, 0x55, 0x33, 0x46, 0x65, 0x67, 0x37, 0x73, 0x53, 0x57, 0x42, 0x65, 0x56, 0x43, 0x6b, 0x77, 0x6e, 0x4e, 0x57, 0x46, 0x57, 0x74, 0x36, 0x5a, 0x73, 0x52, 0x0, 0x60, 0x80, 0x94, 0xeb, 0xdc, 0x3, 0x68, 0x80, 0x84, 0xaf, 0x5f, 0x70, 0x80, 0x84, 0xaf, 0x5f, 0x78, 0x80, 0x84, 0xaf, 0x5f, 0x82, 0x1, 0x9e, 0x1, 0xa, 0x20, 0x54, 0x42, 0xd5, 0xda, 0xdc, 0x41, 0xfc, 0xf, 0xf1, 0xca, 0xc, 0x31, 0x37, 0x72, 0xe3, 0xed, 0xb7, 0xb7, 0xfd, 0x1e, 0x79, 0x49, 0x5b, 0x8e, 0xa6, 0x69, 0x94, 0xb6, 0x7e, 0xf9, 0xed, 0x40, 0x12, 0x20, 0x62, 0x28, 0x9f, 0xaf, 0xb1, 0x57, 0xd5, 0x85, 0x2a, 0xb2, 0x6c, 0x41, 0x3f, 0xf2, 0xb8, 0x41, 0x45, 0x9b, 0x80, 0x2c, 0x30, 0xe2, 0x4d, 0xf5, 0xf7, 0x9e, 0x85, 0x9c, 0xff, 0xc, 0x21, 0xb4, 0x1a, 0x10, 0x26, 0xbd, 0x1f, 0x5e, 0x13, 0xa5, 0x3d, 0x8b, 0xc2, 0xaf, 0xc1, 0x73, 0x33, 0x6c, 0xa5, 0xa4, 0x1a, 0x10, 0xe, 0x7a, 0xe, 0x77, 0x3a, 0xec, 0x57, 0x35, 0x1d, 0xb7, 0xc, 0xf0, 0x7f, 0x86, 0x74, 0x1, 0x1a, 0x10, 0x45, 0xaa, 0x20, 0x68, 0x4b, 0x49, 0x97, 0x3a, 0x26, 0x22, 0x18, 0x77, 0x9f, 0x67, 0x93, 0x72, 0x1a, 0x10, 0x1c, 0x4d, 0xd7, 0x4a, 0x54, 0xb2, 0xd, 0x92, 0x7, 0xec, 0xcd, 0x95, 0xe6, 0xd4, 0xaf, 0x91, 0x1a, 0x10, 0xea, 0x76, 0xae, 0x49, 0x62, 0x87, 0xef, 0xb7, 0x12, 0x60, 0xfb, 0xd6, 0x13, 0xfe, 0x48, 0xcb}, + }, + ConfigBlock: 0x11, + } + ocr2ClientLinkAvailableForPaymentResponse = bigIntFromString("99999991552000000000") + expectedEnvelope = relayMonitoring.Envelope{ + ConfigDigest: types.ConfigDigest{0x0, 0x4, 0x18, 0xe5, 0x44, 0xab, 0xa8, 0x18, 0x15, 0xa5, 0x2b, 0xf0, 0x11, 0x58, 0xc6, 0x9b, 0x38, 0x8a, 0x48, 0x9f, 0x76, 0xd, 0xd8, 0x3d, 0x84, 0x3f, 0x1d, 0x31, 0x22, 0xdb, 0x78, 0xa}, + Epoch: 0x519, + Round: 0x5, + LatestAnswer: bigIntFromString("-900000000"), + LatestTimestamp: time.Date(2022, time.September, 27, 18, 51, 0, 0, time.Local), + ContractConfig: types.ContractConfig{ + ConfigDigest: types.ConfigDigest{0x0, 0x4, 0x18, 0xe5, 0x44, 0xab, 0xa8, 0x18, 0x15, 0xa5, 0x2b, 0xf0, 0x11, 0x58, 0xc6, 0x9b, 0x38, 0x8a, 0x48, 0x9f, 0x76, 0xd, 0xd8, 0x3d, 0x84, 0x3f, 0x1d, 0x31, 0x22, 0xdb, 0x78, 0xa}, + ConfigCount: 0x1, + Signers: []types.OnchainPublicKey{ + {0x6, 0x43, 0x41, 0xfa, 0xc3, 0x1, 0xc6, 0x2c, 0x38, 0xa9, 0xef, 0xdb, 0x86, 0xf6, 0xa2, 0x5a, 0x34, 0xd2, 0x4, 0x4f, 0x29, 0x2e, 0x94, 0xfb, 0xe4, 0x78, 0xa6, 0x67, 0x19, 0xb3, 0x80, 0x9e}, + {0x1, 0xe2, 0xe1, 0x45, 0x47, 0x3, 0x7d, 0xb0, 0xd2, 0xe, 0xc6, 0xc9, 0x4b, 0xc7, 0x91, 0xea, 0xf2, 0xc9, 0x98, 0xad, 0x92, 0x79, 0xbb, 0xd, 0x21, 0x80, 0x15, 0x14, 0xd0, 0x6f, 0xa5, 0x7e}, + {0x3, 0xb6, 0xcb, 0xd7, 0xbd, 0x52, 0x2d, 0xc8, 0xb0, 0xb4, 0x15, 0x3d, 0x60, 0x44, 0xec, 0xa7, 0x7e, 0x3e, 0xcf, 0xde, 0xe0, 0xc9, 0x5d, 0x20, 0x75, 0x50, 0x61, 0xf4, 0xbc, 0x7b, 0xf5, 0x4d}, + {0x2, 0x4a, 0xa1, 0x21, 0x5b, 0xf4, 0xa3, 0xbb, 0x13, 0xea, 0x19, 0x57, 0x74, 0x28, 0xb7, 0xbe, 0xb5, 0xb9, 0x28, 0xb5, 0x74, 0x96, 0x78, 0xfa, 0x46, 0x87, 0x3b, 0x62, 0x7b, 0x22, 0x2a, 0x14}, + {0x2, 0xa9, 0xc8, 0x4f, 0x88, 0x14, 0x17, 0xb5, 0xc9, 0xd1, 0x3b, 0x80, 0x2a, 0xc9, 0x93, 0xc5, 0x2c, 0x82, 0x88, 0x62, 0x32, 0xf7, 0x4e, 0x47, 0x5a, 0x92, 0xcc, 0x1a, 0xa, 0x1, 0x10, 0xda}, + }, + Transmitters: []types.Account{ + "0x033c95af529827a2372743bfc820b4d0bd08605fda5e089d1a7ad3a33caa48fc", + "0x05e457e084ff8e7279985ffb7ad7a65a6adfa8485e7d5d615c015268d5aa9971", + "0x0692a71d868ee9fc22091d8f73c16dabaf9219fa74c4bcc7d385f398949ba8d2", + "0x01232b74b82e490f373453baebe7e217cc6d33d798824a04f8274fa83bc2acd4", + "0x016715b5cc943835f196b7caf5a8aeb0e85b3f975dc43c14c90d0376e87eead1", + }, + F: 0x1, + OnchainConfig: []uint8{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0xb7, 0x89, 0x18, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, 0x48, 0x76, 0xe8, 0x0}, + OffchainConfigVersion: 0x2, + OffchainConfig: []uint8{0x8, 0x80, 0xa0, 0xd9, 0xe6, 0x1d, 0x10, 0x80, 0xd8, 0x8e, 0xe1, 0x6f, 0x18, 0x80, 0xbc, 0xc1, 0x96, 0xb, 0x20, 0x80, 0xca, 0xb5, 0xee, 0x1, 0x28, 0x80, 0x90, 0xdf, 0xc0, 0x4a, 0x30, 0x5, 0x3a, 0x2, 0x1, 0x2, 0x42, 0x20, 0xe9, 0x4f, 0x24, 0x4a, 0xcd, 0x86, 0x7d, 0xa5, 0x72, 0x54, 0x35, 0x57, 0x82, 0xb7, 0x1d, 0xb4, 0x50, 0x83, 0xd3, 0x67, 0xa7, 0xef, 0x23, 0x71, 0x5e, 0xb5, 0xce, 0x64, 0x38, 0xdf, 0x16, 0x1b, 0x42, 0x20, 0x34, 0xb6, 0xb5, 0xd, 0x9a, 0x47, 0xa2, 0x25, 0xe7, 0x91, 0xb3, 0x67, 0x7a, 0x1e, 0xd, 0x12, 0x2b, 0xa0, 0xc, 0xe9, 0x60, 0xd3, 0x7c, 0x76, 0x46, 0xec, 0x84, 0xcd, 0xd6, 0xfa, 0x9c, 0x48, 0x42, 0x20, 0x6a, 0xbc, 0xb4, 0x9d, 0xc7, 0xf4, 0xa9, 0x2f, 0xc4, 0x50, 0x89, 0x82, 0xa8, 0xa, 0xc1, 0x54, 0x23, 0x79, 0x8a, 0x2d, 0xe, 0x47, 0x1e, 0x95, 0xf4, 0x1e, 0x30, 0xeb, 0x68, 0x85, 0x29, 0xa6, 0x42, 0x20, 0x9b, 0xab, 0xa6, 0x36, 0x27, 0xbf, 0xa5, 0x31, 0x26, 0x9f, 0x32, 0x40, 0xb4, 0xc4, 0xe9, 0x8e, 0x86, 0xbc, 0xd5, 0x99, 0x83, 0xc5, 0x27, 0x31, 0x5f, 0x7a, 0xd1, 0x2f, 0x51, 0x5d, 0xd8, 0xfc, 0x42, 0x20, 0x72, 0xd7, 0x97, 0xfe, 0x3c, 0x8, 0xd8, 0x97, 0xfe, 0xe8, 0xdd, 0xa3, 0xa9, 0x40, 0x66, 0xa3, 0x4d, 0xa7, 0x27, 0x81, 0x4f, 0xf, 0x1f, 0x6c, 0x72, 0x22, 0xba, 0xdc, 0x52, 0x18, 0xcf, 0xb2, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x45, 0x7a, 0x66, 0x67, 0x38, 0x70, 0x32, 0x71, 0x58, 0x42, 0x38, 0x74, 0x77, 0x37, 0x6b, 0x42, 0x59, 0x72, 0x76, 0x75, 0x4d, 0x6e, 0x75, 0x47, 0x70, 0x66, 0x75, 0x79, 0x71, 0x59, 0x67, 0x4a, 0x50, 0x76, 0x78, 0x70, 0x77, 0x69, 0x62, 0x73, 0x50, 0x68, 0x67, 0x5a, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x4c, 0x5a, 0x4a, 0x58, 0x71, 0x44, 0x59, 0x56, 0x32, 0x48, 0x45, 0x53, 0x35, 0x4a, 0x76, 0x6b, 0x4b, 0x35, 0x72, 0x6f, 0x65, 0x39, 0x77, 0x67, 0x44, 0x38, 0x4c, 0x67, 0x6d, 0x73, 0x69, 0x36, 0x51, 0x69, 0x71, 0x6a, 0x6d, 0x46, 0x31, 0x4b, 0x38, 0x38, 0x4d, 0x57, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x39, 0x73, 0x45, 0x63, 0x45, 0x33, 0x50, 0x32, 0x79, 0x6d, 0x4b, 0x39, 0x42, 0x5a, 0x50, 0x45, 0x51, 0x43, 0x47, 0x35, 0x6d, 0x6f, 0x67, 0x59, 0x4b, 0x48, 0x63, 0x68, 0x71, 0x48, 0x53, 0x69, 0x57, 0x52, 0x45, 0x4c, 0x68, 0x4a, 0x52, 0x5a, 0x32, 0x69, 0x69, 0x56, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x45, 0x33, 0x56, 0x76, 0x4b, 0x79, 0x47, 0x70, 0x6d, 0x74, 0x52, 0x36, 0x55, 0x48, 0x6b, 0x51, 0x45, 0x75, 0x31, 0x43, 0x73, 0x70, 0x51, 0x47, 0x78, 0x4c, 0x67, 0x55, 0x56, 0x77, 0x4b, 0x64, 0x4c, 0x64, 0x4b, 0x46, 0x71, 0x4a, 0x35, 0x4e, 0x52, 0x74, 0x47, 0x74, 0x4a, 0x34, 0x31, 0x32, 0x44, 0x33, 0x4b, 0x6f, 0x6f, 0x57, 0x52, 0x6b, 0x62, 0x7a, 0x79, 0x6b, 0x41, 0x48, 0x38, 0x4b, 0x55, 0x48, 0x57, 0x69, 0x52, 0x77, 0x66, 0x31, 0x45, 0x73, 0x55, 0x33, 0x46, 0x65, 0x67, 0x37, 0x73, 0x53, 0x57, 0x42, 0x65, 0x56, 0x43, 0x6b, 0x77, 0x6e, 0x4e, 0x57, 0x46, 0x57, 0x74, 0x36, 0x5a, 0x73, 0x52, 0x0, 0x60, 0x80, 0x94, 0xeb, 0xdc, 0x3, 0x68, 0x80, 0x84, 0xaf, 0x5f, 0x70, 0x80, 0x84, 0xaf, 0x5f, 0x78, 0x80, 0x84, 0xaf, 0x5f, 0x82, 0x1, 0x9e, 0x1, 0xa, 0x20, 0x54, 0x42, 0xd5, 0xda, 0xdc, 0x41, 0xfc, 0xf, 0xf1, 0xca, 0xc, 0x31, 0x37, 0x72, 0xe3, 0xed, 0xb7, 0xb7, 0xfd, 0x1e, 0x79, 0x49, 0x5b, 0x8e, 0xa6, 0x69, 0x94, 0xb6, 0x7e, 0xf9, 0xed, 0x40, 0x12, 0x20, 0x62, 0x28, 0x9f, 0xaf, 0xb1, 0x57, 0xd5, 0x85, 0x2a, 0xb2, 0x6c, 0x41, 0x3f, 0xf2, 0xb8, 0x41, 0x45, 0x9b, 0x80, 0x2c, 0x30, 0xe2, 0x4d, 0xf5, 0xf7, 0x9e, 0x85, 0x9c, 0xff, 0xc, 0x21, 0xb4, 0x1a, 0x10, 0x26, 0xbd, 0x1f, 0x5e, 0x13, 0xa5, 0x3d, 0x8b, 0xc2, 0xaf, 0xc1, 0x73, 0x33, 0x6c, 0xa5, 0xa4, 0x1a, 0x10, 0xe, 0x7a, 0xe, 0x77, 0x3a, 0xec, 0x57, 0x35, 0x1d, 0xb7, 0xc, 0xf0, 0x7f, 0x86, 0x74, 0x1, 0x1a, 0x10, 0x45, 0xaa, 0x20, 0x68, 0x4b, 0x49, 0x97, 0x3a, 0x26, 0x22, 0x18, 0x77, 0x9f, 0x67, 0x93, 0x72, 0x1a, 0x10, 0x1c, 0x4d, 0xd7, 0x4a, 0x54, 0xb2, 0xd, 0x92, 0x7, 0xec, 0xcd, 0x95, 0xe6, 0xd4, 0xaf, 0x91, 0x1a, 0x10, 0xea, 0x76, 0xae, 0x49, 0x62, 0x87, 0xef, 0xb7, 0x12, 0x60, 0xfb, 0xd6, 0x13, 0xfe, 0x48, 0xcb}, + }, + BlockNumber: 0xe07, + Transmitter: types.Account("0x16715b5cc943835f196b7caf5a8aeb0e85b3f975dc43c14c90d0376e87eead1"), + LinkBalance: bigIntFromString("100000000000000000000"), + LinkAvailableForPayment: bigIntFromString("99999991552000000000"), + JuelsPerFeeCoin: big.NewInt(451000), + AggregatorRoundID: 0xf5b, + } +) + +func bigIntFromString(s string) *big.Int { + out, _ := new(big.Int).SetString(s, 10) + return out +} diff --git a/monitoring/pkg/monitoring/source_proxy.go b/monitoring/pkg/monitoring/source_proxy.go new file mode 100644 index 000000000..8578268cd --- /dev/null +++ b/monitoring/pkg/monitoring/source_proxy.go @@ -0,0 +1,67 @@ +package monitoring + +import ( + "context" + "fmt" + "math/big" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" +) + +type ProxyData struct { + Answer *big.Int +} + +func NewProxySourceFactory( + ocr2Reader ocr2.OCR2Reader, +) relayMonitoring.SourceFactory { + return &proxySourceFactory{ + ocr2Reader, + } +} + +type proxySourceFactory struct { + ocr2Reader ocr2.OCR2Reader +} + +func (s *proxySourceFactory) NewSource( + _ relayMonitoring.ChainConfig, + feedConfig relayMonitoring.FeedConfig, +) (relayMonitoring.Source, error) { + starknetFeedConfig, ok := feedConfig.(StarknetFeedConfig) + if !ok { + return nil, fmt.Errorf("expected feedConfig to be of type StarknetFeedConfig not %T", feedConfig) + } + contractAddress, err := starknetutils.HexToFelt(starknetFeedConfig.ProxyAddress) + if err != nil { + return nil, err + } + return &proxySource{ + contractAddress, + s.ocr2Reader, + }, nil +} + +func (s *proxySourceFactory) GetType() string { + return "proxy" +} + +type proxySource struct { + contractAddress *felt.Felt + ocr2Reader ocr2.OCR2Reader +} + +func (s *proxySource) Fetch(ctx context.Context) (interface{}, error) { + latestRoundData, err := s.ocr2Reader.LatestRoundData(ctx, s.contractAddress) + if err != nil { + return nil, fmt.Errorf("couldn't fetch latest_round_data: %w", err) + } + return ProxyData{ + Answer: latestRoundData.Answer, + }, nil +} diff --git a/monitoring/pkg/monitoring/source_proxy_test.go b/monitoring/pkg/monitoring/source_proxy_test.go new file mode 100644 index 000000000..ef70b404a --- /dev/null +++ b/monitoring/pkg/monitoring/source_proxy_test.go @@ -0,0 +1,56 @@ +package monitoring + +import ( + "context" + "math/big" + "testing" + "time" + + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + ocr2Mocks "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2/mocks" +) + +func TestProxySource(t *testing.T) { + // This test makes sure that the mapping between the response from the ocr2.Client + // method calls and the output of the Proxy source is correct. + + chainConfig := generateChainConfig() + feedConfig := generateFeedConfig() + + proxyContractAddressFelt, err := starknetutils.HexToFelt(feedConfig.ProxyAddress) + require.NoError(t, err) + + ocr2Reader := ocr2Mocks.NewOCR2Reader(t) + ocr2Reader.On( + "LatestRoundData", + mock.Anything, // ctx + proxyContractAddressFelt, + ).Return(ocr2ClientLatestRoundDataResponseForProxy, nil).Once() + + factory := NewProxySourceFactory(ocr2Reader) + source, err := factory.NewSource(chainConfig, feedConfig) + require.NoError(t, err) + rawProxyData, err := source.Fetch(context.Background()) + require.NoError(t, err) + proxyData, ok := rawProxyData.(ProxyData) + require.True(t, ok) + + require.Equal(t, + ocr2ClientLatestRoundDataResponseForProxy.Answer.String(), + proxyData.Answer.String(), + ) +} + +var ( + ocr2ClientLatestRoundDataResponseForProxy = ocr2.RoundData{ + RoundID: 9, + Answer: big.NewInt(10000), + BlockNumber: 777, + StartedAt: time.Now(), + UpdatedAt: time.Now(), + } +) diff --git a/monitoring/pkg/monitoring/source_transmission_details.go b/monitoring/pkg/monitoring/source_transmission_details.go new file mode 100644 index 000000000..d0dd3c177 --- /dev/null +++ b/monitoring/pkg/monitoring/source_transmission_details.go @@ -0,0 +1,82 @@ +package monitoring + +import ( + "context" + "fmt" + "math/big" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" +) + +type TransmissionInfo struct { + GasPrice *big.Int + ObservationLength uint32 +} + +type TransmissionsEnvelope struct { + Transmissions []TransmissionInfo +} + +func NewTransmissionDetailsSourceFactory( + ocr2Reader ocr2.OCR2Reader, +) relayMonitoring.SourceFactory { + return &transmissionDetailsSourceFactory{ + ocr2Reader, + } +} + +type transmissionDetailsSourceFactory struct { + ocr2Reader ocr2.OCR2Reader +} + +func (s *transmissionDetailsSourceFactory) NewSource( + _ relayMonitoring.ChainConfig, + feedConfig relayMonitoring.FeedConfig, +) (relayMonitoring.Source, error) { + starknetFeedConfig, ok := feedConfig.(StarknetFeedConfig) + if !ok { + return nil, fmt.Errorf("expected feedConfig to be of type StarknetFeedConfig not %T", feedConfig) + } + contractAddress, err := starknetutils.HexToFelt(starknetFeedConfig.ContractAddress) + if err != nil { + return nil, err + } + return &transmissionDetailsSource{ + contractAddress, + s.ocr2Reader, + }, nil +} + +func (s *transmissionDetailsSourceFactory) GetType() string { + return "transmission details" +} + +type transmissionDetailsSource struct { + contractAddress *felt.Felt + ocr2Reader ocr2.OCR2Reader +} + +func (s *transmissionDetailsSource) Fetch(ctx context.Context) (interface{}, error) { + latestRound, err := s.ocr2Reader.LatestRoundData(ctx, s.contractAddress) + if err != nil { + return nil, fmt.Errorf("failed to fetch latest_round_data: %w", err) + } + transmissions, err := s.ocr2Reader.NewTransmissionsFromEventsAt(ctx, s.contractAddress, latestRound.BlockNumber) + if err != nil { + return nil, fmt.Errorf("couldn't fetch transmission events: %w", err) + } + var envelope TransmissionsEnvelope + for _, t := range transmissions { + envelope.Transmissions = append( + envelope.Transmissions, + TransmissionInfo{GasPrice: t.GasPrice, ObservationLength: t.ObservationsLen}, + ) + } + + return envelope, nil +} diff --git a/monitoring/pkg/monitoring/source_transmission_details_test.go b/monitoring/pkg/monitoring/source_transmission_details_test.go new file mode 100644 index 000000000..3b7d07528 --- /dev/null +++ b/monitoring/pkg/monitoring/source_transmission_details_test.go @@ -0,0 +1,57 @@ +package monitoring + +import ( + "context" + "math/big" + "testing" + + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + ocr2Mocks "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2/mocks" +) + +func TestTransmissionDetailsSource(t *testing.T) { + chainConfig := generateChainConfig() + feedConfig := generateFeedConfig() + + contractAddressFelt, err := starknetutils.HexToFelt(feedConfig.ContractAddress) + require.NoError(t, err) + + ocr2Reader := ocr2Mocks.NewOCR2Reader(t) + blockNumber := uint64(777) + ocr2Reader.On( + "LatestRoundData", + mock.Anything, // ctx + contractAddressFelt, + ).Return(ocr2.RoundData{BlockNumber: blockNumber}, nil).Once() + ocr2Reader.On( + "NewTransmissionsFromEventsAt", + mock.Anything, // ctx + contractAddressFelt, + blockNumber, + ).Return( + []ocr2.NewTransmissionEvent{ + { + GasPrice: new(big.Int).SetUint64(7), + ObservationsLen: 7, + }, + }, + nil, + ).Once() + + factory := NewTransmissionDetailsSourceFactory(ocr2Reader) + source, err := factory.NewSource(chainConfig, feedConfig) + require.NoError(t, err) + + transmissionsEnvelope, err := source.Fetch(context.Background()) + require.NoError(t, err) + envelope, ok := transmissionsEnvelope.(TransmissionsEnvelope) + require.True(t, ok) + + require.Equal(t, len(envelope.Transmissions), 1) + require.Equal(t, envelope.Transmissions[0].GasPrice.Uint64(), uint64(7)) + require.Equal(t, envelope.Transmissions[0].ObservationLength, uint32(7)) +} diff --git a/monitoring/pkg/monitoring/source_txresults.go b/monitoring/pkg/monitoring/source_txresults.go new file mode 100644 index 000000000..19ca6a885 --- /dev/null +++ b/monitoring/pkg/monitoring/source_txresults.go @@ -0,0 +1,70 @@ +package monitoring + +import ( + "context" + "fmt" + "sync" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" +) + +func NewTxResultsSourceFactory( + ocr2Reader ocr2.OCR2Reader, +) relayMonitoring.SourceFactory { + return &txResultsSourceFactory{ + ocr2Reader, + } +} + +type txResultsSourceFactory struct { + ocr2Reader ocr2.OCR2Reader +} + +func (s *txResultsSourceFactory) NewSource( + _ relayMonitoring.ChainConfig, + feedConfig relayMonitoring.FeedConfig, +) (relayMonitoring.Source, error) { + contractAddress, err := starknetutils.HexToFelt(feedConfig.GetContractAddress()) + if err != nil { + return nil, err + } + return &txResultsSource{ + contractAddress, + s.ocr2Reader, + 0, + sync.Mutex{}, + }, nil +} + +func (s *txResultsSourceFactory) GetType() string { + return "txresults" +} + +type txResultsSource struct { + contractAddress *felt.Felt + ocr2Reader ocr2.OCR2Reader + + prevRoundID uint32 + prevRoundIDMu sync.Mutex +} + +func (s *txResultsSource) Fetch(ctx context.Context) (interface{}, error) { + latestRoundData, err := s.ocr2Reader.LatestRoundData(ctx, s.contractAddress) + if err != nil { + return nil, fmt.Errorf("failed to fetch latest_round_data: %w", err) + } + s.prevRoundIDMu.Lock() + defer s.prevRoundIDMu.Unlock() + var numSucceeded uint32 + if s.prevRoundID != 0 { + numSucceeded = latestRoundData.RoundID - s.prevRoundID + } + s.prevRoundID = latestRoundData.RoundID + // Note that failed/rejected transactions count is always set to 0 because there is no way to count them. + return relayMonitoring.TxResults{NumSucceeded: uint64(numSucceeded), NumFailed: 0}, nil +} diff --git a/monitoring/pkg/monitoring/source_txresults_test.go b/monitoring/pkg/monitoring/source_txresults_test.go new file mode 100644 index 000000000..556c39d0a --- /dev/null +++ b/monitoring/pkg/monitoring/source_txresults_test.go @@ -0,0 +1,65 @@ +package monitoring + +import ( + "context" + "testing" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + starknetutils "github.com/NethermindEth/starknet.go/utils" + relayMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + ocr2Mocks "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2/mocks" +) + +func TestTxResultsSource(t *testing.T) { + // This test makes sure that the mapping between the response from the ocr2.Client + // method calls and the output of the TxResults source is correct. + + chainConfig := generateChainConfig() + feedConfig := generateFeedConfig() + + feedContractAddressFelt, err := starknetutils.HexToFelt(feedConfig.ContractAddress) + require.NoError(t, err) + + ocr2Reader := ocr2Mocks.NewOCR2Reader(t) + ocr2Reader.On( + "LatestRoundData", + mock.Anything, // ctx + feedContractAddressFelt, + ).Return(ocr2ClientLatestRoundDataResponseForTxResults1, nil).Once() + ocr2Reader.On( + "LatestRoundData", + mock.Anything, // ctx + feedContractAddressFelt, + ).Return(ocr2ClientLatestRoundDataResponseForTxResults2, nil).Once() + + factory := NewTxResultsSourceFactory(ocr2Reader) + source, err := factory.NewSource(chainConfig, feedConfig) + require.NoError(t, err) + // First call identifies no new transactions. + rawTxResults, err := source.Fetch(context.Background()) + require.NoError(t, err) + txResults, ok := rawTxResults.(relayMonitoring.TxResults) + require.True(t, ok) + require.Equal(t, txResults.NumSucceeded, uint64(0)) + require.Equal(t, txResults.NumFailed, uint64(0)) + // Second call identifies new transactions + rawTxResults, err = source.Fetch(context.Background()) + require.NoError(t, err) + txResults, ok = rawTxResults.(relayMonitoring.TxResults) + require.True(t, ok) + require.Equal(t, txResults.NumSucceeded, uint64(1)) + require.Equal(t, txResults.NumFailed, uint64(0)) +} + +var ( + ocr2ClientLatestRoundDataResponseForTxResults1 = ocr2.RoundData{ + RoundID: 100, + } + ocr2ClientLatestRoundDataResponseForTxResults2 = ocr2.RoundData{ + RoundID: 101, + } +) diff --git a/monitoring/pkg/monitoring/testutils.go b/monitoring/pkg/monitoring/testutils.go new file mode 100644 index 000000000..31d04436e --- /dev/null +++ b/monitoring/pkg/monitoring/testutils.go @@ -0,0 +1,79 @@ +package monitoring + +import ( + "fmt" + "math/big" + "math/rand" + "time" + + commonMonitoring "github.com/smartcontractkit/chainlink-common/pkg/monitoring" +) + +func generateNodeConfig() []commonMonitoring.NodeConfig { + starknetNodes := []StarknetNodeConfig{ + { + ID: "node-0", + NodeAddress: []string{generateAddr()}, + }, + { + ID: "node-1", + NodeAddress: []string{generateAddr()}, + }, + } + + nodes := make([]commonMonitoring.NodeConfig, len(starknetNodes)) + for i, starknetNode := range starknetNodes { + nodes[i] = starknetNode + } + return nodes +} + +func generateChainConfig() StarknetConfig { + return StarknetConfig{ + rpcEndpoint: "http://starknet/6969", + networkName: "devnet", + networkID: "1", + chainID: "devnet", + readTimeout: 100 * time.Millisecond, + pollInterval: 1 * time.Second, + linkTokenAddress: generateAddr(), + } +} + +func generateFeedConfig() StarknetFeedConfig { + coins := []string{"btc", "eth", "matic", "link", "avax", "ftt", "srm", "usdc", "sol", "ray"} + coin := coins[rand.Intn(len(coins))] + + return StarknetFeedConfig{ + Name: fmt.Sprintf("%s / usd", coin), + Path: fmt.Sprintf("%s-usd", coin), + Symbol: "$", + HeartbeatSec: 1, + ContractType: "ocr2", + ContractStatus: "live", + + MultiplyRaw: "1000000", + Multiply: big.NewInt(1000000), + + ContractAddress: generateAddr(), + ProxyAddress: generateAddr(), + } +} + +func generateAddr() string { + pool := []string{ + "0x0398eca85a333bc5de78f87d70d26f6e1f2438da6d163424b20f6190d3c38a21", + "0x057605d472e1478b66396d8abec8f6c58348d9278d25049d9d73dafab40cde0c", + "0x18e693006a3dc4db5adf7812c2e4ab8d7729707fcb3c439de0939f39de8d2b", + "0x05c96456a9d58aa45e997182050f07a0649638a8f1d955935b42b6898d99e63d", + "0x0358549759856b585a7b74ce5462e0ec0e56dbcc8fc729255150da2b62b702a6", + "0x025d26785bc488193674b4e504f1ea0fc0bc28b0b92b7ce3e4b63ea5514bc3ab", + } + return pool[rand.Intn(len(pool))] +} + +var ( + _ = generateChainConfig() + _ = generateFeedConfig() + _ = generateAddr() +) diff --git a/nix.conf b/nix.conf new file mode 100644 index 000000000..c7d7291eb --- /dev/null +++ b/nix.conf @@ -0,0 +1 @@ +experimental-features = nix-command flakes diff --git a/ops/README.md b/ops/README.md index cdfeab074..4a7f42a9f 100644 --- a/ops/README.md +++ b/ops/README.md @@ -1,5 +1,11 @@ ## Local k8s environment -You can find setup instructions [here](../docs/kubernetes.md) +## Running via `localenv` simple CLI -See an example of using an environment [here](../docs/integration-tests/testing.md) \ No newline at end of file +- [CLI doc and commands](./localenv/README.md) + +## Manual Instructions + +You can find setup instructions [here](../../docs/kubernetes.md) + +See an example of building new environments [here](../../docs/integration-tests/testing.md) \ No newline at end of file diff --git a/ops/charts/starknet/.helmignore b/ops/charts/devnet/.helmignore similarity index 100% rename from ops/charts/starknet/.helmignore rename to ops/charts/devnet/.helmignore diff --git a/ops/charts/starknet/Chart.yaml b/ops/charts/devnet/Chart.yaml similarity index 100% rename from ops/charts/starknet/Chart.yaml rename to ops/charts/devnet/Chart.yaml diff --git a/ops/charts/starknet/templates/NOTES.txt b/ops/charts/devnet/templates/NOTES.txt similarity index 100% rename from ops/charts/starknet/templates/NOTES.txt rename to ops/charts/devnet/templates/NOTES.txt diff --git a/ops/charts/starknet/templates/_helpers.tpl b/ops/charts/devnet/templates/_helpers.tpl similarity index 100% rename from ops/charts/starknet/templates/_helpers.tpl rename to ops/charts/devnet/templates/_helpers.tpl diff --git a/ops/charts/starknet/templates/deployment.yaml b/ops/charts/devnet/templates/deployment.yaml similarity index 68% rename from ops/charts/starknet/templates/deployment.yaml rename to ops/charts/devnet/templates/deployment.yaml index f5506e0ee..f3c841bb6 100644 --- a/ops/charts/starknet/templates/deployment.yaml +++ b/ops/charts/devnet/templates/deployment.yaml @@ -17,12 +17,20 @@ spec: release: {{ .Release.Name }} app: starknet-dev spec: + volumes: + - name: vol + hostPath: + path: /dumps containers: - name: {{ .Chart.Name }} + volumeMounts: + - name: vol + mountPath: /dumps {{- if eq .Values.real_node true }} image: "{{ .Values.repository | default "eqlabs/pathfinder"}}:{{ .Values.tag | default "v0.1.8-alpha"}}" {{- else }} - image: "{{ .Values.repository | default "shardlabs/starknet-devnet"}}:{{ .Values.tag | default "0.1.23"}}" + image: "{{ .Values.repository | default "shardlabs/starknet-devnet-rs"}}:{{ .Values.tag | default "a147b4cd72f9ce9d1fa665d871231370db0f51c7"}}" + args: ["--port", {{ .Values.service.internalPort | quote}}, "--seed", {{ .Values.seed | quote}}, "--account-class", "cairo1", "--gas-price", "1", "--data-gas-price", "1"] {{- end }} imagePullPolicy: IfNotPresent {{- if eq .Values.real_node true }} @@ -37,6 +45,8 @@ spec: env: - name: PYTHONUNBUFFERED value: "1" + - name: PATHFINDER_ETHEREUM_API_URL + value: {{ .Values.url_http_L1 }} {{- end }} ports: - name: http @@ -45,18 +55,22 @@ spec: httpGet: path: /is_alive port: {{ .Values.service.externalPort }} - initialDelaySeconds: 1 + initialDelaySeconds: 5 periodSeconds: 30 + timeoutSeconds: 300 + failureThreshold: 10 readinessProbe: httpGet: path: /is_alive port: {{ .Values.service.externalPort }} - initialDelaySeconds: 2 - periodSeconds: 1 + initialDelaySeconds: 5 + periodSeconds: 30 + timeoutSeconds: 300 + failureThreshold: 10 resources: requests: memory: {{ .Values.resources.requests.memory }} cpu: {{ .Values.resources.requests.cpu }} limits: memory: {{ .Values.resources.limits.memory }} - cpu: {{ .Values.resources.limits.cpu }} \ No newline at end of file + cpu: {{ .Values.resources.limits.cpu }} diff --git a/ops/charts/starknet/templates/service.yaml b/ops/charts/devnet/templates/service.yaml similarity index 86% rename from ops/charts/starknet/templates/service.yaml rename to ops/charts/devnet/templates/service.yaml index b211d162a..f5763d38b 100644 --- a/ops/charts/starknet/templates/service.yaml +++ b/ops/charts/devnet/templates/service.yaml @@ -1,7 +1,7 @@ apiVersion: v1 kind: Service metadata: - name: starknet-dev-service + name: starknet-dev labels: chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" spec: @@ -13,4 +13,4 @@ spec: protocol: TCP selector: release: {{ .Release.Name }} - app: starknet-dev \ No newline at end of file + app: starknet-dev diff --git a/ops/charts/starknet/values.yaml b/ops/charts/devnet/values.yaml similarity index 63% rename from ops/charts/starknet/values.yaml rename to ops/charts/devnet/values.yaml index 0457035ce..fd2690b33 100644 --- a/ops/charts/starknet/values.yaml +++ b/ops/charts/devnet/values.yaml @@ -1,16 +1,16 @@ # Declare variables to be passed into your templates. replicaCount: 1 service: - name: starknet-service type: ClusterIP externalPort: 5000 internalPort: 5000 resources: limits: - cpu: 1000m - memory: 1024Mi + cpu: 2000m + memory: 2048Mi requests: - cpu: 1000m - memory: 1024Mi + cpu: 2000m + memory: 2048Mi url_http_L1: "" -real_node: false \ No newline at end of file +real_node: false +seed: 0 diff --git a/ops/charts/hardhat/.helmignore b/ops/charts/hardhat/.helmignore new file mode 100644 index 000000000..c13e3c8fb --- /dev/null +++ b/ops/charts/hardhat/.helmignore @@ -0,0 +1,21 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj \ No newline at end of file diff --git a/ops/charts/hardhat/Chart.yaml b/ops/charts/hardhat/Chart.yaml new file mode 100644 index 000000000..bf6532b7f --- /dev/null +++ b/ops/charts/hardhat/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +description: Hardhat deployment +name: hardhat +version: 0.1.0 +keywords: + - hardhat diff --git a/ops/charts/hardhat/templates/NOTES.txt b/ops/charts/hardhat/templates/NOTES.txt new file mode 100644 index 000000000..9d383c654 --- /dev/null +++ b/ops/charts/hardhat/templates/NOTES.txt @@ -0,0 +1 @@ +Hardhat node installed! \ No newline at end of file diff --git a/ops/charts/hardhat/templates/_helpers.tpl b/ops/charts/hardhat/templates/_helpers.tpl new file mode 100644 index 000000000..328fd4639 --- /dev/null +++ b/ops/charts/hardhat/templates/_helpers.tpl @@ -0,0 +1,16 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 24 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 24 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 24 | trimSuffix "-" -}} +{{- end -}} \ No newline at end of file diff --git a/ops/charts/hardhat/templates/deployment.yaml b/ops/charts/hardhat/templates/deployment.yaml new file mode 100644 index 000000000..137443707 --- /dev/null +++ b/ops/charts/hardhat/templates/deployment.yaml @@ -0,0 +1,45 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: hardhat + labels: + release: {{ .Release.Name }} + app: hardhat +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + release: {{ .Release.Name }} + app: hardhat + template: + metadata: + labels: + release: {{ .Release.Name }} + app: hardhat + spec: + containers: + - name: {{ .Chart.Name }} + image: "{{ .Values.repository | default "ethereumoptimism/hardhat-node"}}:{{ .Values.tag | default "nightly"}}" + imagePullPolicy: IfNotPresent + ports: + - name: http + containerPort: {{ .Values.service.internalPort }} + livenessProbe: + httpGet: + path: / + port: {{ .Values.service.externalPort }} + initialDelaySeconds: 1 + periodSeconds: 30 + readinessProbe: + httpGet: + path: / + port: {{ .Values.service.externalPort }} + initialDelaySeconds: 2 + periodSeconds: 1 + resources: + requests: + memory: {{ .Values.resources.requests.memory }} + cpu: {{ .Values.resources.requests.cpu }} + limits: + memory: {{ .Values.resources.limits.memory }} + cpu: {{ .Values.resources.limits.cpu }} \ No newline at end of file diff --git a/ops/charts/hardhat/templates/service.yaml b/ops/charts/hardhat/templates/service.yaml new file mode 100644 index 000000000..fb1364ea3 --- /dev/null +++ b/ops/charts/hardhat/templates/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: hardhat + labels: + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" +spec: + type: {{ .Values.service.type }} + ports: + - name: http + port: {{ .Values.service.externalPort }} + targetPort: {{ .Values.service.internalPort }} + protocol: TCP + selector: + release: {{ .Release.Name }} + app: hardhat \ No newline at end of file diff --git a/ops/charts/hardhat/values.yaml b/ops/charts/hardhat/values.yaml new file mode 100644 index 000000000..c7e2a5e54 --- /dev/null +++ b/ops/charts/hardhat/values.yaml @@ -0,0 +1,14 @@ +# Declare variables to be passed into your templates. +replicaCount: 1 +service: + name: hardhat-service + type: ClusterIP + externalPort: 8545 + internalPort: 8545 +resources: + limits: + cpu: 2000m + memory: 2048Mi + requests: + cpu: 2000m + memory: 2048Mi \ No newline at end of file diff --git a/ops/devnet/environment.go b/ops/devnet/environment.go new file mode 100644 index 000000000..6948a91e2 --- /dev/null +++ b/ops/devnet/environment.go @@ -0,0 +1,108 @@ +package devnet + +import ( + "fmt" + + "github.com/rs/zerolog/log" + + "github.com/smartcontractkit/chainlink-testing-framework/k8s/client" + "github.com/smartcontractkit/chainlink-testing-framework/k8s/config" + "github.com/smartcontractkit/chainlink-testing-framework/k8s/environment" + + "github.com/smartcontractkit/chainlink-starknet/ops/utils" +) + +const NetworkName = "starknet-dev" + +type Chart struct { + HelmProps *HelmProps + Props *Props +} +type Props struct { +} + +type HelmProps struct { + Name string + Path string + Values *map[string]any + Version string +} + +func (m Chart) IsDeploymentNeeded() bool { + return true +} + +func (m Chart) GetProps() any { + return m.Props +} + +func (m Chart) GetName() string { + return m.HelmProps.Name +} + +func (m Chart) GetPath() string { + return m.HelmProps.Path +} + +func (m Chart) GetValues() *map[string]any { + return m.HelmProps.Values +} + +func (m Chart) GetVersion() string { + return m.HelmProps.Version +} + +func (m Chart) ExportData(e *environment.Environment) error { + devnetLocalHTTP, err := e.Fwd.FindPort("starknet-dev:0", "starknetdev", "http").As(client.LocalConnection, client.HTTP) + if err != nil { + return err + } + devnetInternalHTTP, err := e.Fwd.FindPort("starknet-dev:0", "starknetdev", "http").As(client.RemoteConnection, client.HTTP) + if err != nil { + return err + } + e.URLs[NetworkName] = append(e.URLs[NetworkName], devnetLocalHTTP) + e.URLs[NetworkName] = append(e.URLs[NetworkName], devnetInternalHTTP) + log.Info().Str("Name", "Devnet").Str("URLs", devnetLocalHTTP).Msg("Devnet network") + return nil +} + +func defaultProps() map[string]any { + return map[string]any{ + "replicas": "1", + "starknet-dev": map[string]any{ + "image": map[string]any{ + "image": "shardlabs/starknet-devnet-rs", + "version": "a147b4cd72f9ce9d1fa665d871231370db0f51c7", + }, + "resources": map[string]any{ + "requests": map[string]any{ + "cpu": "1000m", + "memory": "1024Mi", + }, + "limits": map[string]any{ + "cpu": "1000m", + "memory": "1024Mi", + }, + }, + "seed": "123", + "real_node": "false", + }, + } +} + +func New(props *Props) environment.ConnectedChart { + dp := defaultProps() + if props != nil { + config.MustMerge(&dp, props) + } + + return Chart{ + HelmProps: &HelmProps{ + Name: NetworkName, + Path: fmt.Sprintf("%s/charts/devnet", utils.OpsRoot), + Values: &dp, + }, + Props: props, + } +} diff --git a/ops/environment.go b/ops/environment.go deleted file mode 100644 index 35162ce54..000000000 --- a/ops/environment.go +++ /dev/null @@ -1,45 +0,0 @@ -package ops - -import ( - "github.com/smartcontractkit/chainlink-testing-framework/config" - "github.com/smartcontractkit/helmenv/environment" -) - -func DefaultStarkNETEnv() *environment.Config { - return &environment.Config{ - NamespacePrefix: "chainlink-starknet", - Charts: environment.Charts{ - "geth": {Index: 1}, - "starknet": { - Index: 1, - Path: "../../ops/charts/starknet", - Values: map[string]interface{}{ - "real_node": false, - }, - }, - "mockserver-config": {Index: 1}, - "mockserver": {Index: 2}, - "chainlink": { - Index: 2, - Values: map[string]interface{}{ - "replicas": 5, - "chainlink": config.ChainlinkVals(), - "env": map[string]interface{}{ - "EVM_ENABLED": "true", - "EVM_RPC_ENABLED": "true", - "eth_url": "ws://geth:8546", - "eth_http_url": "http://geth:8544", - "feature_external_initiators": "true", - "FEATURE_CCIP": "true", - "FEATURE_OFFCHAIN_REPORTING2": "true", - "P2P_NETWORKING_STACK": "V2", - "P2PV2_LISTEN_ADDRESSES": "0.0.0.0:6690", - "P2PV2_DELTA_DIAL": "5s", - "P2PV2_DELTA_RECONCILE": "5s", - "p2p_listen_port": "0", - }, - }, - }, - }, - } -} diff --git a/ops/gauntlet/gauntlet_starknet.go b/ops/gauntlet/gauntlet_starknet.go new file mode 100644 index 000000000..2be7c9292 --- /dev/null +++ b/ops/gauntlet/gauntlet_starknet.go @@ -0,0 +1,215 @@ +package gauntlet + +import ( + "encoding/json" + "fmt" + "os" + + "github.com/smartcontractkit/chainlink-testing-framework/gauntlet" +) + +var ( + sg *StarknetGauntlet +) + +type StarknetGauntlet struct { + dir string + G *gauntlet.Gauntlet + gr *GauntletResponse + options *gauntlet.ExecCommandOptions +} + +// GauntletResponse Default response output for starknet gauntlet commands +type GauntletResponse struct { //nolint:revive + Responses []struct { + Tx struct { + Hash string `json:"hash"` + Address string `json:"address"` + Status string `json:"status"` + + Tx struct { + Address string `json:"address"` + Code string `json:"code"` + Result []string `json:"result"` + TransactionHash string `json:"transaction_hash"` + } `json:"tx"` + } `json:"tx"` + Contract string `json:"contract"` + } `json:"responses"` +} + +// NewStarknetGauntlet Creates a default gauntlet config +func NewStarknetGauntlet(workingDir string) (*StarknetGauntlet, error) { + g, err := gauntlet.NewGauntlet() + g.SetWorkingDir(workingDir) + if err != nil { + return nil, err + } + sg = &StarknetGauntlet{ + dir: workingDir, + G: g, + gr: &GauntletResponse{}, + options: &gauntlet.ExecCommandOptions{ + ErrHandling: []string{}, + CheckErrorsInRead: true, + }, + } + return sg, nil +} + +// FetchGauntletJSONOutput Parse gauntlet json response that is generated after yarn gauntlet command execution +func (sg *StarknetGauntlet) FetchGauntletJSONOutput() (*GauntletResponse, error) { + var payload = &GauntletResponse{} + gauntletOutput, err := os.ReadFile(sg.dir + "report.json") + if err != nil { + return payload, err + } + err = json.Unmarshal(gauntletOutput, &payload) + if err != nil { + return payload, err + } + return payload, nil +} + +// SetupNetwork Sets up a new network and sets the NODE_URL for Devnet / Starknet RPC +func (sg *StarknetGauntlet) SetupNetwork(addr string, account string, privateKey string) error { + sg.G.AddNetworkConfigVar("NODE_URL", addr) + sg.G.AddNetworkConfigVar("ACCOUNT", account) + sg.G.AddNetworkConfigVar("PRIVATE_KEY", privateKey) + err := sg.G.WriteNetworkConfigMap(sg.dir + "packages-ts/starknet-gauntlet-cli/networks/") + if err != nil { + return err + } + + return nil +} + +func (sg *StarknetGauntlet) InstallDependencies() error { + sg.G.Command = "yarn" + _, err := sg.G.ExecCommand([]string{"install"}, *sg.options) + if err != nil { + return err + } + sg.G.Command = "gauntlet" + return nil +} + +func (sg *StarknetGauntlet) DeployAccountContract(salt int64, pubKey string) (string, error) { + _, err := sg.G.ExecCommand([]string{"account:deploy", fmt.Sprintf("--salt=%d", salt), fmt.Sprintf("--publicKey=%s", pubKey)}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} + +func (sg *StarknetGauntlet) DeployLinkTokenContract() (string, error) { + _, err := sg.G.ExecCommand([]string{"token:deploy", "--link"}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} + +func (sg *StarknetGauntlet) MintLinkToken(token, to, amount string) (string, error) { + _, err := sg.G.ExecCommand([]string{"token:mint", fmt.Sprintf("--recipient=%s", to), fmt.Sprintf("--amount=%s", amount), token}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} + +func (sg *StarknetGauntlet) TransferToken(token, to, amount string) (string, error) { + _, err := sg.G.ExecCommand([]string{"token:transfer", fmt.Sprintf("--recipient=%s", to), fmt.Sprintf("--amount=%s", amount), token}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} + +func (sg *StarknetGauntlet) DeployOCR2ControllerContract(minSubmissionValue int64, maxSubmissionValue int64, decimals int, name string, linkTokenAddress string) (string, error) { + _, err := sg.G.ExecCommand([]string{"ocr2:deploy", fmt.Sprintf("--minSubmissionValue=%d", minSubmissionValue), fmt.Sprintf("--maxSubmissionValue=%d", maxSubmissionValue), fmt.Sprintf("--decimals=%d", decimals), fmt.Sprintf("--name=%s", name), fmt.Sprintf("--link=%s", linkTokenAddress)}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} + +func (sg *StarknetGauntlet) DeployAccessControllerContract() (string, error) { + _, err := sg.G.ExecCommand([]string{"access_controller:deploy"}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} + +func (sg *StarknetGauntlet) DeployOCR2ProxyContract(aggregator string) (string, error) { + _, err := sg.G.ExecCommand([]string{"proxy:deploy", fmt.Sprintf("--address=%s", aggregator)}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} + +func (sg *StarknetGauntlet) SetOCRBilling(observationPaymentGjuels int64, transmissionPaymentGjuels int64, ocrAddress string) (string, error) { + _, err := sg.G.ExecCommand([]string{"ocr2:set_billing", fmt.Sprintf("--observationPaymentGjuels=%d", observationPaymentGjuels), fmt.Sprintf("--transmissionPaymentGjuels=%d", transmissionPaymentGjuels), ocrAddress}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} + +func (sg *StarknetGauntlet) SetConfigDetails(cfg string, ocrAddress string) (string, error) { + _, err := sg.G.ExecCommand([]string{"ocr2:set_config", "--input=" + cfg, ocrAddress}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} + +func (sg *StarknetGauntlet) AddAccess(aggregator, address string) (string, error) { + _, err := sg.G.ExecCommand([]string{"ocr2:add_access", fmt.Sprintf("--address=%s", address), aggregator}, *sg.options) + if err != nil { + return "", err + } + sg.gr, err = sg.FetchGauntletJSONOutput() + if err != nil { + return "", err + } + return sg.gr.Responses[0].Contract, nil +} diff --git a/ops/go.mod b/ops/go.mod new file mode 100644 index 000000000..e72fa7436 --- /dev/null +++ b/ops/go.mod @@ -0,0 +1,153 @@ +module github.com/smartcontractkit/chainlink-starknet/ops + +go 1.21.3 + +toolchain go1.21.5 + +require ( + github.com/rs/zerolog v1.30.0 + github.com/smartcontractkit/chainlink-env v0.3.29 + github.com/smartcontractkit/chainlink-testing-framework v1.19.1 +) + +require ( + dario.cat/mergo v1.0.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/MakeNowJust/heredoc v1.0.0 // indirect + github.com/Masterminds/semver/v3 v3.2.1 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect + github.com/avast/retry-go v3.0.0+incompatible // indirect + github.com/aws/constructs-go/constructs/v10 v10.1.255 // indirect + github.com/aws/jsii-runtime-go v1.75.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chai2010/gettext-go v1.0.2 // indirect + github.com/chaos-mesh/chaos-mesh/api/v1alpha1 v0.0.0-20220226050744-799408773657 // indirect + github.com/containerd/containerd v1.7.3 // indirect + github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect + github.com/docker/docker v24.0.5+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/evanphx/json-patch/v5 v5.6.0 // indirect + github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect + github.com/fatih/camelcase v1.0.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fvbommel/sortorder v1.0.2 // indirect + github.com/go-errors/errors v1.4.2 // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-resty/resty/v2 v2.7.0 // indirect + github.com/gogo/protobuf v1.3.3 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/btree v1.1.2 // indirect + github.com/google/gnostic v0.6.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.2 // indirect + github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect + 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.20 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/moby/patternmatcher v0.5.0 // indirect + github.com/moby/spdystream v0.2.0 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo/v2 v2.9.7 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0-rc4 // indirect + github.com/opencontainers/runc v1.1.7 // indirect + github.com/peterbourgon/diskv v2.0.1+incompatible // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.17.0 // 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/robfig/cron/v3 v3.0.1 // indirect + github.com/russross/blackfriday v1.6.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/cobra v1.6.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/testify v1.8.4 // indirect + github.com/testcontainers/testcontainers-go v0.23.0 // indirect + github.com/xlab/treeprint v1.1.0 // indirect + github.com/yuin/goldmark v1.4.13 // indirect + go.starlark.net v0.0.0-20220817180228-f738f5508c12 // indirect + go.uber.org/goleak v1.3.0 // indirect + golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect + golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.15.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.16.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/grpc v1.59.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.27.3 // indirect + k8s.io/apiextensions-apiserver v0.25.3 // indirect + k8s.io/apimachinery v0.27.3 // indirect + k8s.io/cli-runtime v0.25.11 // indirect + k8s.io/client-go v0.27.3 // indirect + k8s.io/component-base v0.26.2 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515 // indirect + k8s.io/kubectl v0.25.11 // indirect + k8s.io/utils v0.0.0-20230711102312-30195339c3c7 // indirect + sigs.k8s.io/controller-runtime v0.13.0 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/kustomize/api v0.12.1 // indirect + sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) + +replace ( + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + + // until merged upstream: https://github.com/hashicorp/go-plugin/pull/257 + github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 + + // until merged upstream: https://github.com/mwitkow/grpc-proxy/pull/69 + github.com/mwitkow/grpc-proxy => github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f + + github.com/smartcontractkit/chainlink-starknet/relayer => ../relayer + + // K8s imports are weird + k8s.io/api => k8s.io/api v0.25.4 + k8s.io/client-go => k8s.io/client-go v0.25.4 +) diff --git a/ops/go.sum b/ops/go.sum new file mode 100644 index 000000000..c537b5a4f --- /dev/null +++ b/ops/go.sum @@ -0,0 +1,510 @@ +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= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0= +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/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +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/Microsoft/hcsshim v0.10.0-rc.8 h1:YSZVvlIIDD1UxQpJp0h+dnpLUw+TrY0cx8obKsp3bek= +github.com/Microsoft/hcsshim v0.10.0-rc.8/go.mod h1:OEthFdQv/AD2RAdzR6Mm1N1KPCztGKDurW1Z8b8VGMM= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= +github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= +github.com/aws/constructs-go/constructs/v10 v10.1.255 h1:5hARfEmhBqHSTQf/C3QLA3sWOxO2Dfja0iA1W7ZcI7g= +github.com/aws/constructs-go/constructs/v10 v10.1.255/go.mod h1:DCdBSjN04Ck2pajCacTD4RKFqSA7Utya8d62XreYctI= +github.com/aws/jsii-runtime-go v1.75.0 h1:NhpUfyiL7/wsRuUekFsz8FFBCYLfPD/l61kKg9kL/a4= +github.com/aws/jsii-runtime-go v1.75.0/go.mod h1:TKCyrtM0pygEPo4rDZzbMSDNCDNTSYSN6/mGyHI6O3I= +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/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA= +github.com/bxcodec/faker v2.0.1+incompatible/go.mod h1:BNzfpVdTwnFJ6GtfYTcQu6l6rHShT+veBxNCnjCx5XM= +github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 h1:rvc39Ol6z3MvaBzXkxFC6Nfsnixq/dRypushKDd7Nc0= +github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5/go.mod h1:R/pdNYDYFQk+tuuOo7QES1kkv6OLmp5ze2XBZQIVffM= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +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/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= +github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= +github.com/chaos-mesh/chaos-mesh/api/v1alpha1 v0.0.0-20220226050744-799408773657 h1:CyuI+igIjadM/GRnE2o0q+WCwipDh0n2cUYFPAvxziM= +github.com/chaos-mesh/chaos-mesh/api/v1alpha1 v0.0.0-20220226050744-799408773657/go.mod h1:JRiumF+RFsH1mrrP8FUsi9tExPylKkO/oSRWeQEUdLE= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/containerd/containerd v1.7.3 h1:cKwYKkP1eTj54bP3wCdXXBymmKRQMrWjkLSWZZJDa8o= +github.com/containerd/containerd v1.7.3/go.mod h1:32FOM4/O0RkNg7AjQj3hDzN9cUGtu+HMvaKUNiqCZB8= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/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.5+incompatible h1:WmgcE4fxyI6EEXxBRxsHnZXrO1pQ3smi0k/jho4HLeY= +github.com/docker/docker v24.0.5+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-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= +github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= +github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/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-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +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/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.3.3/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.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= +github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= +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.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.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +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/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +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.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +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/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +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.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/moby/patternmatcher v0.5.0 h1:YCZgJOeULcxLw1Q+sVR636pmS7sPEn1Qo2iAN6M7DBo= +github.com/moby/patternmatcher v0.5.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss= +github.com/onsi/ginkgo/v2 v2.9.7/go.mod h1:cxrmXWykAwTwhQsJOPfdIDiJ+l2RYq7U8hFU+M/1uw0= +github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= +github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/runc v1.1.7 h1:y2EZDS8sNng4Ksf0GUYNhKbTShZJPJg1FiXJNH/uoCk= +github.com/opencontainers/runc v1.1.7/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +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/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= +github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartcontractkit/chainlink-env v0.3.29 h1:hcIw/BeuB0wKiiE3umAUNBZzWkHO24XF3OW9xSrlMbI= +github.com/smartcontractkit/chainlink-env v0.3.29/go.mod h1:9c0Czq4a6wZKY20BcoAlK29DnejQIiLo/MwKYtSFnHk= +github.com/smartcontractkit/chainlink-testing-framework v1.19.1 h1:MdGM5jIrBi858Cv7qzfl1Qon93YW8InohAlDQqFoIb4= +github.com/smartcontractkit/chainlink-testing-framework v1.19.1/go.mod h1:zScXRqmvbyTFUooyLYrOp4+V/sFPUbFJNRc72YmnuIk= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= +github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +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/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/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/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/testcontainers/testcontainers-go v0.23.0 h1:ERYTSikX01QczBLPZpqsETTBO7lInqEP349phDOVJVs= +github.com/testcontainers/testcontainers-go v0.23.0/go.mod h1:3gzuZfb7T9qfcH2pHpV4RLlWrPjeWNQah6XlYQ32c4I= +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 v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= +github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.starlark.net v0.0.0-20220817180228-f738f5508c12 h1:xOBJXWGEDwU5xSDxH6macxO11Us0AH2fTa9rmsbbF7g= +go.starlark.net v0.0.0-20220817180228-f738f5508c12/go.mod h1:VZcBMdr3cT3PnBoWunTabuSEXwVAH+ZJ5zxfs3AdASk= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +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-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-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-20190620200207-3b0461eec859/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-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +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/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +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-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-20201020160332-67f06af15bc9/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.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.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-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-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-20201119102817-f84b799fce68/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/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.6.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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +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.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +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 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +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= +gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= +gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +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-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +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/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.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.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +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.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.25.4 h1:3YO8J4RtmG7elEgaWMb4HgmpS2CfY1QlaOz9nwB+ZSs= +k8s.io/api v0.25.4/go.mod h1:IG2+RzyPQLllQxnhzD8KQNEu4c4YvyDTpSMztf4A0OQ= +k8s.io/apiextensions-apiserver v0.25.3 h1:bfI4KS31w2f9WM1KLGwnwuVlW3RSRPuIsfNF/3HzR0k= +k8s.io/apiextensions-apiserver v0.25.3/go.mod h1:ZJqwpCkxIx9itilmZek7JgfUAM0dnTsA48I4krPqRmo= +k8s.io/apimachinery v0.27.3 h1:Ubye8oBufD04l9QnNtW05idcOe9Z3GQN8+7PqmuVcUM= +k8s.io/apimachinery v0.27.3/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= +k8s.io/cli-runtime v0.25.11 h1:GE2yNZm1tN+MJtw1SGMOLesLF7Kp7NVAVqRSTbXfu4o= +k8s.io/cli-runtime v0.25.11/go.mod h1:r/nEINuHVEpgGhcd2WamU7hD1t/lMnSz8XM44Autltc= +k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8= +k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw= +k8s.io/component-base v0.26.2 h1:IfWgCGUDzrD6wLLgXEstJKYZKAFS2kO+rBRi0p3LqcI= +k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515 h1:OmK1d0WrkD3IPfkskvroRykOulHVHf0s0ZIFRjyt+UI= +k8s.io/kube-openapi v0.0.0-20230525220651-2546d827e515/go.mod h1:kzo02I3kQ4BTtEfVLaPbjvCkX97YqGve33wzlb3fofQ= +k8s.io/kubectl v0.25.11 h1:6bsft5Gan6BCvQ7cJbDRFjTm4Zfq8GuUYpsWAdVngYE= +k8s.io/kubectl v0.25.11/go.mod h1:8mIfgkFgT+yJ8/TlmPW1qoRh46H2si9q5nW8id7i9iM= +k8s.io/utils v0.0.0-20230711102312-30195339c3c7 h1:ZgnF1KZsYxWIifwSNZFZgNtWE89WI5yiP5WwlfDoIyc= +k8s.io/utils v0.0.0-20230711102312-30195339c3c7/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ= +sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM= +sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= +sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk= +sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/ops/hardhat/environment.go b/ops/hardhat/environment.go new file mode 100644 index 000000000..0b48f3519 --- /dev/null +++ b/ops/hardhat/environment.go @@ -0,0 +1,110 @@ +package hardhat + +import ( + "fmt" + + "github.com/rs/zerolog/log" + + "github.com/smartcontractkit/chainlink-env/client" + "github.com/smartcontractkit/chainlink-env/environment" + + "github.com/smartcontractkit/chainlink-starknet/ops/utils" +) + +type Chart struct { + HelmProps *HelmProps + Props *Props +} +type Props struct { + NetworkName string `envconfig:"network_name"` + Simulated bool `envconfig:"network_simulated"` + HttpURLs []string `envconfig:"http_url"` //nolint:revive + WsURLs []string `envconfig:"ws_url"` + Values map[string]any +} + +type HelmProps struct { + Name string + Path string + Values *map[string]any + Version string +} + +func (m Chart) IsDeploymentNeeded() bool { + return true +} + +func (m Chart) GetVersion() string { + return m.HelmProps.Version +} + +func (m Chart) GetProps() any { + return m.Props +} + +func (m Chart) GetName() string { + return m.HelmProps.Name +} + +func (m Chart) GetPath() string { + return m.HelmProps.Path +} + +func (m Chart) GetValues() *map[string]any { + return m.HelmProps.Values +} + +func (m Chart) ExportData(e *environment.Environment) error { + devnetLocalHTTP, err := e.Fwd.FindPort("hardhat:0", "hardhat", "http").As(client.LocalConnection, client.HTTP) + if err != nil { + return err + } + devnetInternalHTTP, err := e.Fwd.FindPort("hardhat:0", "hardhat", "http").As(client.RemoteConnection, client.HTTP) + if err != nil { + return err + } + e.URLs[m.Props.NetworkName] = append(e.URLs[m.Props.NetworkName], devnetLocalHTTP) + e.URLs[m.Props.NetworkName] = append(e.URLs[m.Props.NetworkName], devnetInternalHTTP) + log.Info().Str("Name", "Devnet").Str("URLs", devnetLocalHTTP).Msg("Devnet network") + return nil +} + +func defaultProps() *Props { + return &Props{ + NetworkName: "hardhat", + Values: map[string]any{ + "replicas": "1", + "starknet-dev": map[string]any{ + "image": map[string]any{ + "image": "ethereumoptimism/hardhat-node", + "version": "nightly", + }, + "resources": map[string]any{ + "requests": map[string]any{ + "cpu": "1000m", + "memory": "1024Mi", + }, + "limits": map[string]any{ + "cpu": "1000m", + "memory": "1024Mi", + }, + }, + }, + }, + } +} + +func New(props *Props) environment.ConnectedChart { + if props == nil { + props = defaultProps() + } + return Chart{ + HelmProps: &HelmProps{ + Name: "hardhat", + Path: fmt.Sprintf("%s/charts/hardhat", utils.OpsRoot), + Values: &props.Values, + Version: "", + }, + Props: props, + } +} diff --git a/ops/localenv/README.md b/ops/localenv/README.md new file mode 100644 index 000000000..3556bffdd --- /dev/null +++ b/ops/localenv/README.md @@ -0,0 +1,49 @@ +# Simple Local Env CLI + +## Prerequisites +``` +k3d - local kubernetes cluster +docker - build local containers +kubectl - interact with kubernetes cluster +``` + +``` +make install +``` + +make sure gauntlet and contract artifacts are properly compiled +``` +yarn +make build-ts-contracts +``` + +## Commands +```bash + +# starts up a k3d environment with a local registry +go run main.go create + +# builds a local chainlink image +# note: assumes a folder structure like Documents/chainlink + Documents/chainlink-starknet +go run main.go build + +# runs the go test environment using the locally compiled image +# note: the namespace is in the first few lines of logging +go run main.go run + +# removes the pods that were spun up during the `run` command +go run main.go stop + +# removes the entire k3d environment & registry +go run main.go delete +``` + +## Useful Commands & Tools +```bash +# pull logs from chainlink node +# example: kubectl logs --namespace chainlink-smoke-ocr-starknet-ci-4553f chainlink-0-d79496974-kzczg -c node +# container is not needed if inspecting pod with single container (like starknet-devnet) +kubectl logs --namespace -c +``` + +Useful kubernetes cluster explorer - [Lens](https://k8slens.dev/) or [k9s](https://k9scli.io/)(lite weight, CLI based) diff --git a/ops/localenv/main.go b/ops/localenv/main.go new file mode 100644 index 000000000..09a971f1d --- /dev/null +++ b/ops/localenv/main.go @@ -0,0 +1,124 @@ +package main + +import ( + "errors" + "fmt" + "io" + "os" + "os/exec" + "strings" + "sync" + + "github.com/smartcontractkit/chainlink-starknet/ops/utils" +) + +// TODO: consider extracting entire file to `chainlink-common/ops` or into a separate CLI tool +// this simply runs underlying functions but does not import them + +// PODMAN: +// ~/.config/containers/registries.conf +// [[registry]] +// location = "localhost:12345" +// insecure = true + +func main() { + if len(os.Args) < 2 { + panic("missing required command") + } + + switch strings.ToLower(os.Args[1]) { + // create k8s cluster + resources + // case "create": + // run("create registry", "k3d", "registry", "create", "registry.localhost", "--port", "127.0.0.1:12345", "--default-network", "chainlink") + // run("create k8s cluster", "k3d", "cluster", "create", "local", "--api-port", "127.0.0.1:12346", "--registry-use", "k3d-registry.localhost:12345") + // run("switch k8s context", "kubectl", "config", "use-context", "k3d-local") + // build and upload image to local registry + case "build": + context := "../../../chainlink" // TODO: make this an arg + run("build image", "docker", "build", "-f", context+"/core/chainlink.Dockerfile", context, "-t", "chainlink:local") + run("tag image", "docker", "tag", "chainlink:local", "localhost:12345/chainlink:local") + run("push image", "docker", "push", "localhost:12345/chainlink:local") + // run ginkgo commands to spin up environment + case "run": + // move to repo root + if err := os.Chdir(utils.IntegrationTestsRoot); err != nil { + panic(err) + } + setEnvIfNotExists("CHAINLINK_ENV_USER", "localenv") + setEnvIfNotExists("CHAINLINK_IMAGE", "k3d-registry.localhost:12345/chainlink") + setEnvIfNotExists("CHAINLINK_VERSION", "local") + setEnvIfNotExists("KEEP_ENVIRONMENTS", "ALWAYS") + setEnvIfNotExists("NODE_COUNT", "4") + setEnvIfNotExists("TTL", "900h") + run("start environment", "go", "test", "-count", "1", "-v", "-timeout", "30m", "--run", "^TestOCRBasic$", "./smoke") + // stop k8s namespace from environment + // case "stop": + // if len(os.Args) < 3 { + // panic("missing namespace argument") + // } + // run("stopping environment", "kubectl", "delete", "namespaces", os.Args[2]) + // delete removes the k8s cluster + // case "delete": + // run("remove k8s cluster", "k3d", "cluster", "delete", "local") + // run("remove registry", "k3d", "registry", "delete", "k3d-registry.localhost") + default: + panic("unrecognized command") + } +} + +func setEnvIfNotExists(key, defaultValue string) { + value := os.Getenv(key) + if value == "" { + os.Setenv(key, defaultValue) + value = defaultValue + } + fmt.Printf("Using %s=%s\n", key, value) +} + +func run(name string, f string, args ...string) { + fmt.Printf("\n-- %s --\n", strings.ToUpper(name)) + cmd := exec.Command(f, args...) + stdout, err := cmd.StdoutPipe() + if err != nil { + panic(err) + } + stderr, err := cmd.StderrPipe() + if err != nil { + panic(err) + } + + // stream output to cmd line + var wg sync.WaitGroup + wg.Add(2) + go func() { + p := make([]byte, 100) + for { + n, err := stdout.Read(p) + if errors.Is(err, io.EOF) { + wg.Done() + break + } + fmt.Print(string(p[:n])) + } + }() + go func() { + p := make([]byte, 100) + for { + n, err := stderr.Read(p) + if errors.Is(err, io.EOF) { + wg.Done() + break + } + fmt.Print(string(p[:n])) + } + }() + + if err := cmd.Start(); err != nil { + panic(err) + } + + wg.Wait() + if err := cmd.Wait(); err != nil { + panic(err) + } +} diff --git a/ops/scripts/devnet-hardhat-down.sh b/ops/scripts/devnet-hardhat-down.sh new file mode 100755 index 000000000..31bd6970d --- /dev/null +++ b/ops/scripts/devnet-hardhat-down.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# TODO: this script needs to be replaced with a predefined K8s enviroment + +echo "Cleaning up Hardhat container..." + +dpid=`docker ps | grep chainlink-starknet.hardhat | awk '{print $1}'`; +echo "Checking for existing 'chainlink-starknet.hardhat' docker container..." +if [ -z "$dpid" ] +then + echo "No docker Hardhat container running."; +else + docker kill $dpid; +fi +docker rm "chainlink-starknet.hardhat"; + +echo "Cleaning up Starknet Devnet container..." + +dpid=`docker ps | grep chainlink-starknet.starknet-devnet | awk '{print $1}'`; +echo "Checking for existing 'chainlink-starknet.starknet-devnet' docker container..." +if [ -z "$dpid" ] +then + echo "No docker Starknet Devnet container running."; +else + docker kill $dpid; +fi +docker rm "chainlink-starknet.starknet-devnet"; + +echo "Cleanup finished." diff --git a/ops/scripts/devnet-hardhat.sh b/ops/scripts/devnet-hardhat.sh new file mode 100755 index 000000000..c56d67880 --- /dev/null +++ b/ops/scripts/devnet-hardhat.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +# TODO: this script needs to be replaced with a predefined K8s enviroment + +set -euo pipefail + +# cpu_struct=`arch`; +# echo $cpu_struct; +cpu_struct="linux" + +# Clean up first +bash "$(dirname -- "$0")/devnet-hardhat-down.sh" + +echo "Checking CPU structure..." +if [[ $cpu_struct == *"arm"* ]]; then + echo "Starting arm devnet container..." + container_version="${CONTAINER_VERSION:-a147b4cd72f9ce9d1fa665d871231370db0f51c7}-arm" +else + echo "Starting i386 devnet container..." + container_version="${CONTAINER_VERSION:-a147b4cd72f9ce9d1fa665d871231370db0f51c7}" +fi + +echo "Starting starknet-devnet" + +# we need to replace the entrypoint because starknet-devnet's docker builds at 0.5.1 don't include cargo or gcc. +docker run \ + -p 127.0.0.1:5050:5050 \ + -p 127.0.0.1:8545:8545 \ + -d \ + -e RUST_LOG=debug \ + --name chainlink-starknet.starknet-devnet \ + "shardlabs/starknet-devnet-rs:${container_version}" \ + --seed 0 \ + --gas-price 1 \ + --data-gas-price 1 \ + --account-class cairo1 + +echo "Starting hardhat..." +docker run --net container:chainlink-starknet.starknet-devnet -d --name chainlink-starknet.hardhat ethereumoptimism/hardhat-node:nightly + +wait_for_container() { + local container_name="$1" + local ready_log="$2" + local start_time=$(date +%s) + local prev_output="" + + echo "Waiting for container $container_name to become ready.." + while true; do + output=$(docker logs "$container_name" 2>&1) + if [[ "${output}" != "${prev_output}" ]]; then + echo -n "${output#$prev_output}" + prev_output="${output}" + fi + + if [[ $output == *"$ready_log"* ]]; then + echo "" + echo "container $container_name is ready." + return + fi + + current_time=$(date +%s) + elapsed_time=$((current_time - start_time)) + if ((elapsed_time > 600)); then + echo "Error: Command did not become ready within 600 seconds" + exit 1 + fi + + sleep 3 + done +} + +# starknet-devnet startup is slow and requires compiling cairo. +wait_for_container "chainlink-starknet.starknet-devnet" "listening" + +# ethereumoptimism/hardhat-node is also slow and should be online before l1-l2 messaging tests are run +wait_for_container "chainlink-starknet.hardhat" "Any funds sent to them on Mainnet or any other live network WILL BE LOST." diff --git a/ops/test_helpers.go b/ops/test_helpers.go new file mode 100644 index 000000000..1264487b8 --- /dev/null +++ b/ops/test_helpers.go @@ -0,0 +1,101 @@ +package ops + +// OCR2Config Default config for OCR2 for starknet +type OCR2Config struct { + F int `json:"f"` + Signers []string `json:"signers"` + Transmitters []string `json:"transmitters"` + OnchainConfig string `json:"onchainConfig"` + OffchainConfig *OffchainConfig `json:"offchainConfig"` + OffchainConfigVersion int `json:"offchainConfigVersion"` + Secret string `json:"secret"` +} + +type OffchainConfig struct { + DeltaProgressNanoseconds int64 `json:"deltaProgressNanoseconds"` + DeltaResendNanoseconds int64 `json:"deltaResendNanoseconds"` + DeltaRoundNanoseconds int64 `json:"deltaRoundNanoseconds"` + DeltaGraceNanoseconds int `json:"deltaGraceNanoseconds"` + DeltaStageNanoseconds int64 `json:"deltaStageNanoseconds"` + RMax int `json:"rMax"` + S []int `json:"s"` + OffchainPublicKeys []string `json:"offchainPublicKeys"` + PeerIDs []string `json:"peerIds"` + ReportingPluginConfig *ReportingPluginConfig `json:"reportingPluginConfig"` + MaxDurationQueryNanoseconds int `json:"maxDurationQueryNanoseconds"` + MaxDurationObservationNanoseconds int `json:"maxDurationObservationNanoseconds"` + MaxDurationReportNanoseconds int `json:"maxDurationReportNanoseconds"` + MaxDurationShouldAcceptFinalizedReportNanoseconds int `json:"maxDurationShouldAcceptFinalizedReportNanoseconds"` + MaxDurationShouldTransmitAcceptedReportNanoseconds int `json:"maxDurationShouldTransmitAcceptedReportNanoseconds"` + ConfigPublicKeys []string `json:"configPublicKeys"` +} + +type ReportingPluginConfig struct { + AlphaReportInfinite bool `json:"alphaReportInfinite"` + AlphaReportPpb int `json:"alphaReportPpb"` + AlphaAcceptInfinite bool `json:"alphaAcceptInfinite"` + AlphaAcceptPpb int `json:"alphaAcceptPpb"` + DeltaCNanoseconds int `json:"deltaCNanoseconds"` +} + +var TestOCR2Config = OCR2Config{ + F: 1, + // Signers: onChainKeys, // user defined + // Transmitters: txKeys, // user defined + OnchainConfig: "", + OffchainConfig: &OffchainConfig{ + // todo: increase delta round but decrease delta stage + DeltaProgressNanoseconds: 150000000000, // 120s + DeltaResendNanoseconds: 150000000000, // 150s + DeltaRoundNanoseconds: 90000000000, // 90s + DeltaGraceNanoseconds: 5000000000, // 5s + DeltaStageNanoseconds: 30000000000, // 20s + RMax: 5, + S: []int{1, 1}, // Needs to array with length of transmitting nodes + // OffchainPublicKeys: offChainKeys, // user defined + // PeerIDs: peerIds, // user defined + ReportingPluginConfig: &ReportingPluginConfig{ + AlphaReportInfinite: false, + AlphaReportPpb: 0, + AlphaAcceptInfinite: false, + AlphaAcceptPpb: 0, + DeltaCNanoseconds: 1000000000, + }, + MaxDurationQueryNanoseconds: 2000000000, + MaxDurationObservationNanoseconds: 1000000000, + MaxDurationReportNanoseconds: 2000000000, + MaxDurationShouldAcceptFinalizedReportNanoseconds: 2000000000, + MaxDurationShouldTransmitAcceptedReportNanoseconds: 2000000000, + // ConfigPublicKeys: cfgKeys, // user defined + }, + OffchainConfigVersion: 2, + Secret: "awe accuse polygon tonic depart acuity onyx inform bound gilbert expire", +} + +var TestOnKeys = []string{ + "0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603730", + "0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603731", + "0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603732", + "0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603733", +} + +var TestTxKeys = []string{ + "0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603734", + "0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603735", + "0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603736", + "0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603737", +} + +var TestOffKeys = []string{ + "af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852090", + "af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852091", + "af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852092", + "af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852093", +} + +var TestCfgKeys = []string{ + "af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852094", + "af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852095", + "af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852096", + "af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852097", +} diff --git a/ops/utils/project_path.go b/ops/utils/project_path.go new file mode 100644 index 000000000..2ba241bc2 --- /dev/null +++ b/ops/utils/project_path.go @@ -0,0 +1,16 @@ +package utils + +import ( + "path/filepath" + "runtime" +) + +var ( + _, b, _, _ = runtime.Caller(0) + // ProjectRoot Root folder of this project + ProjectRoot = filepath.Join(filepath.Dir(b), "/../..") + // SolanaTestsRoot path to starknet e2e tests + IntegrationTestsRoot = filepath.Join(ProjectRoot, "integration-tests") + // OpsRoot path to ops folder + OpsRoot = filepath.Join(ProjectRoot, "ops") +) diff --git a/package.json b/package.json index 95973c691..c049f22c8 100644 --- a/package.json +++ b/package.json @@ -2,24 +2,27 @@ "name": "chainlink-starknet", "private": true, "version": "0.0.1", - "description": "chainlink starknet", + "description": "Chainlink's Starknet integration monorepo", "workspaces": [ + "contracts", + "examples/contracts/*", "packages-ts/*" ], "keywords": [ "typescript", "cli" ], - "main": "packages-ts/gauntlet-starknet-cli/dist/index.js", - "bin": "packages-ts/gauntlet-starknet-cli/dist/index.js", + "main": "packages-ts/starknet-gauntlet-cli/dist/index.js", + "bin": "packages-ts/starknet-gauntlet-cli/dist/index.js", "scripts": { - "gauntlet": "yarn build && node ./packages-ts/gauntlet-starknet-cli/dist/index.js", - "lint": "tsc -b ./tsconfig.json", - "test": "yarn build && SKIP_PROMPTS=true jest --runInBand ./packages", + "gauntlet": "node ./packages-ts/starknet-gauntlet-cli/dist/index.js", + "test": "yarn build && yarn workspaces run test", "test:coverage": "yarn test --collectCoverage", "test:ci": "yarn test --ci", - "lint:format": "yarn prettier --check .", + "eslint": "eslint -f json -o eslint-report.json ./packages-ts || true", + "lint": "tsc -b ./tsconfig.json", "format": "yarn prettier --write .", + "format:check": "yarn prettier --check .", "clean": "tsc -b --clean ./tsconfig.json", "build": "yarn clean && tsc -b ./tsconfig.json", "bundle": "yarn build && pkg . --no-native-build", @@ -27,7 +30,7 @@ }, "pkg": { "scripts": [ - "packages-ts/gauntlet-starknet-cli/dist/index.js" + "packages-ts/starknet-gauntlet-cli/dist/index.js" ], "targets": [ "linux", @@ -35,19 +38,26 @@ ], "outputPath": "bin", "assets": [ + "node_modules/@chainlink-dev", "packages-ts/*/contract_artifacts/**/*", - "packages-ts/gauntlet-starknet-cli/networks/" + "packages-ts/starknet-gauntlet-cli/networks/" ] }, "devDependencies": { - "@types/chai": "^4.2.22", - "@types/jest": "^26.0.15", - "@types/node": "^14.11.2", - "jest": "^26.6.3", + "@changesets/cli": "^2.22.0", + "@types/jest": "^28.1.0", + "@types/node": "^18.7.11", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "eslint": "^8.49.0", + "jest": "^28.1.0", "pkg": "^5.2.1", "prettier": "2.1.1", - "ts-jest": "^26.4.3", - "ts-node": "^8.3.0", - "typescript": "4.3.5" + "ts-jest": "^28.0.7", + "ts-node": "^10.8.0", + "typescript": "4.7.2" + }, + "dependencies": { + "starknet": "6.6.6" } } diff --git a/packages-ts/gauntlet-starknet-argent/src/commands/account/deploy.ts b/packages-ts/gauntlet-starknet-argent/src/commands/account/deploy.ts deleted file mode 100644 index b096992b3..000000000 --- a/packages-ts/gauntlet-starknet-argent/src/commands/account/deploy.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - BeforeExecute, - ExecuteCommandConfig, - ExecutionContext, - makeExecuteCommand, - Validation, -} from '@chainlink/gauntlet-starknet' -import { CATEGORIES } from '../../lib/categories' -import { accountContractLoader } from '../../lib/contracts' - -type UserInput = {} - -type ContractInput = [] - -const makeUserInput = async (flags, args): Promise => ({}) - -const makeContractInput = async (input: UserInput, context: ExecutionContext): Promise => { - return [] -} - -const beforeExecute: BeforeExecute = (context, input, deps) => async () => { - deps.logger.info(`About to deploy an Argent Account Contract`) -} - -const commandConfig: ExecuteCommandConfig = { - ux: { - category: CATEGORIES.ACCOUNT, - function: 'deploy', - examples: [`${CATEGORIES.ACCOUNT}:deploy --network=`], - }, - makeUserInput, - makeContractInput, - validations: [], - loadContract: accountContractLoader, - hooks: { - beforeExecute, - }, -} - -export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/gauntlet-starknet-argent/src/commands/account/index.ts b/packages-ts/gauntlet-starknet-argent/src/commands/account/index.ts deleted file mode 100644 index dc9ac9aa5..000000000 --- a/packages-ts/gauntlet-starknet-argent/src/commands/account/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Deploy from './deploy' -import Initialize from './initialize' - -export default [Deploy, Initialize] diff --git a/packages-ts/gauntlet-starknet-argent/src/index.ts b/packages-ts/gauntlet-starknet-argent/src/index.ts deleted file mode 100644 index 1b382fcdf..000000000 --- a/packages-ts/gauntlet-starknet-argent/src/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' -import { - ExecuteCommandInstance, - CommandCtor, - makeWallet, - makeProvider, - Dependencies, - Env, -} from '@chainlink/gauntlet-starknet' - -import Commands from './commands' - -const registerExecuteCommand = ( - registerCommand: (deps: Dependencies) => CommandCtor>, -) => { - const deps: Dependencies = { - logger: logger, - prompt: prompt, - makeEnv: (flags) => { - const env: Env = { - providerUrl: process.env.NODE_URL || 'https://alpha4.starknet.io', - pk: process.env.PRIVATE_KEY, - account: process.env.ACCOUNT, - } - return env - }, - makeProvider: makeProvider, - makeWallet: makeWallet, - } - return registerCommand(deps) -} - -const registeredCommands = Commands.map(registerExecuteCommand) - -export { Commands } -export default [...registeredCommands] diff --git a/packages-ts/gauntlet-starknet-cli/README.md b/packages-ts/gauntlet-starknet-cli/README.md deleted file mode 100644 index 6d837bd29..000000000 --- a/packages-ts/gauntlet-starknet-cli/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Gauntlet Starknet CLI - -This packages expose the commands to be used as a CLI of the following packages: - -- @chainlink/gauntlet-starknet-example -- @chainlink/gauntlet-starknet-account -- @chainlink/gauntlet-starknet-ocr2 - -## Setup - -Every command accepts the `--network=` flag. The value will load the static environment variables under `./networks/.env.`. Currently 2 network configurations are available: - -1. Local - -```bash -NODE_URL=http://127.0.0.1:5000 -``` - -2. Testnet - -```bash -NODE_URL=https://alpha4.starknet.io -``` diff --git a/packages-ts/gauntlet-starknet-cli/networks/.env.testnet b/packages-ts/gauntlet-starknet-cli/networks/.env.testnet deleted file mode 100644 index c845be4b6..000000000 --- a/packages-ts/gauntlet-starknet-cli/networks/.env.testnet +++ /dev/null @@ -1 +0,0 @@ -NODE_URL=https://alpha4.starknet.io diff --git a/packages-ts/gauntlet-starknet-cli/package.json b/packages-ts/gauntlet-starknet-cli/package.json deleted file mode 100644 index 592df4f36..000000000 --- a/packages-ts/gauntlet-starknet-cli/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@chainlink/gauntlet-starknet-cli", - "version": "0.0.1", - "description": "Gauntlet Starknet CLI", - "keywords": [ - "typescript", - "cli" - ], - "main": "./dist/index.js", - "types": "dist/index.d.ts", - "files": [ - "dist/**/*", - "!dist/**/*.test.js" - ], - "scripts": { - "gauntlet": "ts-node ./src/index.ts", - "lint": "tsc", - "test": "SKIP_PROMPTS=true jest --runInBand", - "test:coverage": "yarn test --collectCoverage", - "test:ci": "yarn test --ci", - "lint:format": "yarn prettier --check ./src", - "format": "yarn prettier --write ./src", - "clean": "rm -rf ./dist/ ./bin/", - "build": "yarn clean && tsc -b", - "bundle": "yarn build && pkg ." - }, - "dependencies": { - "@chainlink/gauntlet-core": "0.3.0", - "@chainlink/gauntlet-starknet-oz": "*", - "@chainlink/gauntlet-starknet-argent": "*", - "@chainlink/gauntlet-starknet-example": "*", - "@chainlink/gauntlet-starknet-ocr2": "*", - "@chainlink/gauntlet-starknet-starkgate": "*" - } -} diff --git a/packages-ts/gauntlet-starknet-cli/src/index.ts b/packages-ts/gauntlet-starknet-cli/src/index.ts deleted file mode 100644 index 4beb9db39..000000000 --- a/packages-ts/gauntlet-starknet-cli/src/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -import OCR2Commands from '@chainlink/gauntlet-starknet-ocr2' -import ExampleCommands from '@chainlink/gauntlet-starknet-example' -import OZCommands from '@chainlink/gauntlet-starknet-oz' -import StarkgateCommands from '@chainlink/gauntlet-starknet-starkgate' -import ArgentCommands from '@chainlink/gauntlet-starknet-argent' - -import { executeCLI } from '@chainlink/gauntlet-core' -import { existsSync } from 'fs' -import path from 'path' -import { io } from '@chainlink/gauntlet-core/dist/utils' - -const commands = { - custom: [...OCR2Commands, ...ExampleCommands, ...OZCommands, ...StarkgateCommands, ...ArgentCommands], - loadDefaultFlags: () => ({}), - abstract: { - findPolymorphic: () => undefined, - makeCommand: () => undefined, - }, -} - -;(async () => { - try { - const networkPossiblePaths = [path.join(process.cwd(), 'networks'), path.join(__dirname, '../networks')] - const networkPath = networkPossiblePaths.filter((networkPath) => existsSync(networkPath))[0] - const result = await executeCLI(commands, networkPath) - if (result) { - io.saveJSON(result, process.env['REPORT_NAME'] ? process.env['REPORT_NAME'] : 'report') - } - process.exit(0) - } catch (e) { - console.log(e) - console.log('Starknet Command execution error', e.message) - process.exitCode = 1 - } -})() diff --git a/packages-ts/gauntlet-starknet-example/src/commands/example/deploy.ts b/packages-ts/gauntlet-starknet-example/src/commands/example/deploy.ts deleted file mode 100644 index 7c4891eb5..000000000 --- a/packages-ts/gauntlet-starknet-example/src/commands/example/deploy.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - ExecuteCommandConfig, - makeExecuteCommand, - Validation, - BeforeExecute, - AfterExecute, -} from '@chainlink/gauntlet-starknet' -import { CATEGORIES } from '../../lib/categories' -import { tokenContractLoader } from '../../lib/contracts' - -type UserInput = { - address: string -} - -type ContractInput = {} - -const makeUserInput = async (flags, args): Promise => { - if (flags.input) return flags.input as UserInput - return { - address: flags.address, - } -} - -const makeContractInput = async (input: UserInput): Promise => { - return {} -} - -const validate: Validation = async (input) => { - return true -} - -// This is a custom beforeExecute hook executed right before the command action is executed -const beforeExecute: BeforeExecute = (context, input, deps) => async () => { - deps.logger.info('About to deploy a Sample Contract') - await deps.prompt('Continue?') -} -// This is a custom afterExecute hook executed right after the command action is executed -const afterExecute: AfterExecute = (context, input, deps) => async (result) => { - deps.logger.info( - `Contract deployed with address: ${result.responses[0].tx.address} at tx hash: ${result.responses[0].tx.hash}`, - ) -} - -const commandConfig: ExecuteCommandConfig = { - ux: { - category: CATEGORIES.EXAMPLE, - function: 'deploy', - examples: [`${CATEGORIES.EXAMPLE}:deploy --network= --address=
`], - }, - makeUserInput, - makeContractInput, - validations: [validate], - loadContract: tokenContractLoader, - hooks: { - beforeExecute, - afterExecute, - }, -} - -export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/gauntlet-starknet-example/src/commands/example/increaseBalance.ts b/packages-ts/gauntlet-starknet-example/src/commands/example/increaseBalance.ts deleted file mode 100644 index 0b2e1d54e..000000000 --- a/packages-ts/gauntlet-starknet-example/src/commands/example/increaseBalance.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ExecuteCommandConfig, makeExecuteCommand, Validation } from '@chainlink/gauntlet-starknet' -import { CATEGORIES } from '../../lib/categories' -import { tokenContractLoader } from '../../lib/contracts' - -type UserInput = { - balance: number -} - -type ContractInput = [number] - -const makeUserInput = async (flags, args): Promise => { - if (flags.input) return flags.input as UserInput - return { - balance: flags.balance, - } -} - -const makeContractInput = async (input: UserInput): Promise => { - return [Number(input.balance)] -} - -const validate: Validation = async (input) => { - return true -} - -const commandConfig: ExecuteCommandConfig = { - ux: { - category: CATEGORIES.EXAMPLE, - function: 'increase_balance', - examples: ['token:deploy --network= --address=
'], - }, - makeUserInput, - makeContractInput, - validations: [validate], - loadContract: tokenContractLoader, -} - -export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/gauntlet-starknet-example/src/commands/index.ts b/packages-ts/gauntlet-starknet-example/src/commands/index.ts deleted file mode 100644 index 645107f79..000000000 --- a/packages-ts/gauntlet-starknet-example/src/commands/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Example from './example' - -export default [...Example] diff --git a/packages-ts/gauntlet-starknet-example/src/index.ts b/packages-ts/gauntlet-starknet-example/src/index.ts deleted file mode 100644 index 081bed2c1..000000000 --- a/packages-ts/gauntlet-starknet-example/src/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' -import { - ExecuteCommandInstance, - CommandCtor, - makeWallet, - makeProvider, - Dependencies, -} from '@chainlink/gauntlet-starknet' - -import Commands from './commands' - -const registerExecuteCommand = ( - registerCommand: (deps: Dependencies) => CommandCtor>, -) => { - const deps: Dependencies = { - logger: logger, - prompt: prompt, - makeEnv: (flags) => { - return { - providerUrl: process.env.NODE_URL || 'https://alpha4.starknet.io', - pk: process.env.PRIVATE_KEY, - account: process.env.ACCOUNT, - } - }, - makeProvider: makeProvider, - makeWallet: makeWallet, - } - return registerCommand(deps) -} - -const registeredCommands = Commands.map(registerExecuteCommand) - -export { Commands } -export default [...registeredCommands] diff --git a/packages-ts/gauntlet-starknet-example/src/lib/contracts.ts b/packages-ts/gauntlet-starknet-example/src/lib/contracts.ts deleted file mode 100644 index fde1a377e..000000000 --- a/packages-ts/gauntlet-starknet-example/src/lib/contracts.ts +++ /dev/null @@ -1,12 +0,0 @@ -import fs from 'fs' -import { CompiledContract, json } from 'starknet' - -export enum CONTRACT_LIST { - EXAMPLE = 'example', -} - -export const loadContract = (name: CONTRACT_LIST): CompiledContract => { - return json.parse(fs.readFileSync(`${__dirname}/../../contract_artifacts/abi/${name}.json`).toString('ascii')) -} - -export const tokenContractLoader = () => loadContract(CONTRACT_LIST.EXAMPLE) diff --git a/packages-ts/gauntlet-starknet-ocr2/README.md b/packages-ts/gauntlet-starknet-ocr2/README.md deleted file mode 100644 index a31a7cccb..000000000 --- a/packages-ts/gauntlet-starknet-ocr2/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Gauntlet Starknet Commands for Chainlink OCR2 Protocol - -[WIP] diff --git a/packages-ts/gauntlet-starknet-ocr2/src/commands/accessController/index.ts b/packages-ts/gauntlet-starknet-ocr2/src/commands/accessController/index.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages-ts/gauntlet-starknet-ocr2/src/commands/index.ts b/packages-ts/gauntlet-starknet-ocr2/src/commands/index.ts deleted file mode 100644 index 6fd9d4f6a..000000000 --- a/packages-ts/gauntlet-starknet-ocr2/src/commands/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// import AccessController from './accessController' - -export default [] diff --git a/packages-ts/gauntlet-starknet-ocr2/src/index.ts b/packages-ts/gauntlet-starknet-ocr2/src/index.ts deleted file mode 100644 index 081bed2c1..000000000 --- a/packages-ts/gauntlet-starknet-ocr2/src/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' -import { - ExecuteCommandInstance, - CommandCtor, - makeWallet, - makeProvider, - Dependencies, -} from '@chainlink/gauntlet-starknet' - -import Commands from './commands' - -const registerExecuteCommand = ( - registerCommand: (deps: Dependencies) => CommandCtor>, -) => { - const deps: Dependencies = { - logger: logger, - prompt: prompt, - makeEnv: (flags) => { - return { - providerUrl: process.env.NODE_URL || 'https://alpha4.starknet.io', - pk: process.env.PRIVATE_KEY, - account: process.env.ACCOUNT, - } - }, - makeProvider: makeProvider, - makeWallet: makeWallet, - } - return registerCommand(deps) -} - -const registeredCommands = Commands.map(registerExecuteCommand) - -export { Commands } -export default [...registeredCommands] diff --git a/packages-ts/gauntlet-starknet-ocr2/src/lib/contracts.ts b/packages-ts/gauntlet-starknet-ocr2/src/lib/contracts.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages-ts/gauntlet-starknet-oz/src/commands/account/deploy.ts b/packages-ts/gauntlet-starknet-oz/src/commands/account/deploy.ts deleted file mode 100644 index e46b06071..000000000 --- a/packages-ts/gauntlet-starknet-oz/src/commands/account/deploy.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { - AfterExecute, - BeforeExecute, - ExecuteCommandConfig, - makeExecuteCommand, - Validation, -} from '@chainlink/gauntlet-starknet' -import { ec } from 'starknet' -import { CATEGORIES } from '../../lib/categories' -import { accountContractLoader } from '../../lib/contracts' - -type UserInput = { - publicKey: string - privateKey?: string -} - -type ContractInput = {} - -const makeUserInput = async (flags, args): Promise => { - if (flags.input) return flags.input as UserInput - - // If public key is not provided, generate a new address - const keypair = ec.genKeyPair() - const generatedPK = '0x' + keypair.getPrivate('hex') - const pubkey = flags.publicKey || ec.getStarkKey(ec.getKeyPair(generatedPK)) - return { - publicKey: pubkey, - privateKey: !flags.publicKey && generatedPK, - } -} - -const makeContractInput = async (input: UserInput): Promise => { - return [input.publicKey] -} - -const validate: Validation = async (input) => { - return true -} - -const beforeExecute: BeforeExecute = (context, input, deps) => async () => { - deps.logger.info(`About to deploy an Account Contract with public key ${input.contract[0]}`) - if (input.user.privateKey) { - await deps.prompt(`The generated private key will be shown next, continue?`) - deps.logger.line() - - deps.logger.info(`To sign future transactions, store the Private Key`) - deps.logger.info(`PRIVATE_KEY: ${input.user.privateKey}`) - - deps.logger.line() - } -} - -const afterExecute: AfterExecute = (context, input, deps) => async (result) => { - deps.logger.success(`Account contract located at ${result.responses[0].tx.address}`) - return { - publicKey: input.user.publicKey, - privateKey: input.user.privateKey, - } -} - -const commandConfig: ExecuteCommandConfig = { - ux: { - category: CATEGORIES.ACCOUNT, - function: 'deploy', - examples: [`${CATEGORIES.ACCOUNT}:deploy --network= --address=
`], - }, - makeUserInput, - makeContractInput, - validations: [validate], - loadContract: accountContractLoader, - hooks: { - beforeExecute, - afterExecute, - }, -} - -export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/gauntlet-starknet-oz/src/commands/account/index.ts b/packages-ts/gauntlet-starknet-oz/src/commands/account/index.ts deleted file mode 100644 index 2a9000aab..000000000 --- a/packages-ts/gauntlet-starknet-oz/src/commands/account/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -import Deploy from './deploy' -export default [Deploy] diff --git a/packages-ts/gauntlet-starknet-oz/src/index.ts b/packages-ts/gauntlet-starknet-oz/src/index.ts deleted file mode 100644 index 1b382fcdf..000000000 --- a/packages-ts/gauntlet-starknet-oz/src/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' -import { - ExecuteCommandInstance, - CommandCtor, - makeWallet, - makeProvider, - Dependencies, - Env, -} from '@chainlink/gauntlet-starknet' - -import Commands from './commands' - -const registerExecuteCommand = ( - registerCommand: (deps: Dependencies) => CommandCtor>, -) => { - const deps: Dependencies = { - logger: logger, - prompt: prompt, - makeEnv: (flags) => { - const env: Env = { - providerUrl: process.env.NODE_URL || 'https://alpha4.starknet.io', - pk: process.env.PRIVATE_KEY, - account: process.env.ACCOUNT, - } - return env - }, - makeProvider: makeProvider, - makeWallet: makeWallet, - } - return registerCommand(deps) -} - -const registeredCommands = Commands.map(registerExecuteCommand) - -export { Commands } -export default [...registeredCommands] diff --git a/packages-ts/gauntlet-starknet-oz/src/lib/categories.ts b/packages-ts/gauntlet-starknet-oz/src/lib/categories.ts deleted file mode 100644 index e9005bb80..000000000 --- a/packages-ts/gauntlet-starknet-oz/src/lib/categories.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { CONTRACT_LIST } from './contracts' - -export const CATEGORIES = { - ACCOUNT: CONTRACT_LIST.ACCOUNT, -} diff --git a/packages-ts/gauntlet-starknet-oz/src/lib/contracts.ts b/packages-ts/gauntlet-starknet-oz/src/lib/contracts.ts deleted file mode 100644 index 33b782a0f..000000000 --- a/packages-ts/gauntlet-starknet-oz/src/lib/contracts.ts +++ /dev/null @@ -1,12 +0,0 @@ -import fs from 'fs' -import { CompiledContract, json } from 'starknet' - -export enum CONTRACT_LIST { - ACCOUNT = 'oz_account', -} - -export const loadContract = (name: CONTRACT_LIST): CompiledContract => { - return json.parse(fs.readFileSync(`${__dirname}/../../artifacts/abi/${name}.json`).toString('ascii')) -} - -export const accountContractLoader = () => loadContract(CONTRACT_LIST.ACCOUNT) diff --git a/packages-ts/gauntlet-starknet-starkgate/README.md b/packages-ts/gauntlet-starknet-starkgate/README.md deleted file mode 100644 index a15de628b..000000000 --- a/packages-ts/gauntlet-starknet-starkgate/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Gauntlet Starknet Commands for Starkgate Contracts - -## ERC20 - -### Deploy the contract - -```bash -yarn gauntlet starkgate_erc20:deploy --network= --name= --symbol= --decimals= "--minter=" -# --minter is optional. If not provided, your default account contract will be used as minter -``` - -If you want to deploy a LINK contract, just include the `--link` flag: - -```bash -yarn gauntlet starkgate_erc20:deploy --network=testnet --link -``` - -### Mint - -```bash -yarn gauntlet starkgate_erc20:mint --network= --recipient= --amount= -``` - -### Transfer - -```bash -yarn gauntlet starkgate_erc20:transfer --network= --recipient= --amount= -``` diff --git a/packages-ts/gauntlet-starknet-starkgate/src/commands/index.ts b/packages-ts/gauntlet-starknet-starkgate/src/commands/index.ts deleted file mode 100644 index a1b522795..000000000 --- a/packages-ts/gauntlet-starknet-starkgate/src/commands/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Token from './token' - -export default [...Token] diff --git a/packages-ts/gauntlet-starknet-starkgate/src/commands/token/deploy.ts b/packages-ts/gauntlet-starknet-starkgate/src/commands/token/deploy.ts deleted file mode 100644 index 02a39ea89..000000000 --- a/packages-ts/gauntlet-starknet-starkgate/src/commands/token/deploy.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { BN } from '@chainlink/gauntlet-core/dist/utils' -import { - AfterExecute, - BeforeExecute, - ExecuteCommandConfig, - ExecutionContext, - makeExecuteCommand, - Validation, -} from '@chainlink/gauntlet-starknet' -import { shortString } from 'starknet' -import { CATEGORIES } from '../../lib/categories' -import { contractLoader } from '../../lib/contracts' - -type UserInput = { - name: string - symbol: string - decimals: string - minter?: string -} - -type ContractInput = [name: string, symbol: string, decimals: string, minter: string] - -const makeUserInput = async (flags, args): Promise => { - if (flags.input) return flags.input as UserInput - - if (flags.link) { - return { - name: 'Chainlink LINK Token', - symbol: 'LINK', - decimals: '18', - } - } - - return { - name: flags.name, - symbol: flags.symbol, - decimals: flags.decimals, - minter: flags.minter, - } -} - -const makeContractInput = async (input: UserInput, context: ExecutionContext): Promise => { - const defaultWallet = context.wallet.getAccountPublicKey() - return [ - shortString.encodeShortString(input.name), - shortString.encodeShortString(input.symbol), - input.decimals, - input.minter || defaultWallet, - ] -} - -const beforeExecute: BeforeExecute = (context, input, deps) => async () => { - deps.logger.info(`About to deploy an ERC20 Token Contract with the following details: - ${input.contract} - `) -} - -const commandConfig: ExecuteCommandConfig = { - ux: { - category: CATEGORIES.TOKEN, - function: 'deploy', - examples: [ - `${CATEGORIES.TOKEN}:deploy --network= --link`, - `${CATEGORIES.TOKEN}:deploy --network= --link`, - ], - }, - makeUserInput, - makeContractInput, - validations: [], - loadContract: contractLoader, - hooks: { - beforeExecute, - }, -} - -export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/gauntlet-starknet-starkgate/src/commands/token/index.ts b/packages-ts/gauntlet-starknet-starkgate/src/commands/token/index.ts deleted file mode 100644 index 96b3b592e..000000000 --- a/packages-ts/gauntlet-starknet-starkgate/src/commands/token/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Deploy from './deploy' -import Mint from './mint' -import Transfer from './transfer' - -export default [Deploy, Mint, Transfer] diff --git a/packages-ts/gauntlet-starknet-starkgate/src/commands/token/mint.ts b/packages-ts/gauntlet-starknet-starkgate/src/commands/token/mint.ts deleted file mode 100644 index 0dbfd84fb..000000000 --- a/packages-ts/gauntlet-starknet-starkgate/src/commands/token/mint.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { BeforeExecute, ExecuteCommandConfig, makeExecuteCommand, Validation } from '@chainlink/gauntlet-starknet' -import { Uint256 } from 'starknet/dist/utils/uint256' -import { bnToUint256 } from 'starknet/dist/utils/uint256' -import { CATEGORIES } from '../../lib/categories' -import { contractLoader } from '../../lib/contracts' - -type UserInput = { - recipient: string - amount: string -} - -type ContractInput = [recipient: string, amount: Uint256] - -const makeUserInput = async (flags, args): Promise => { - if (flags.input) return flags.input as UserInput - - return { - recipient: flags.recipient, - amount: flags.amount, - } -} - -const makeContractInput = async (input: UserInput): Promise => { - return [input.recipient, bnToUint256(input.amount)] -} - -const beforeExecute: BeforeExecute = (context, input, deps) => async () => { - deps.logger.info(`About to mint an ERC20 Token Contract with the following details: - ${input.contract} - `) -} - -const commandConfig: ExecuteCommandConfig = { - ux: { - category: CATEGORIES.TOKEN, - function: 'mint', - examples: [ - `${CATEGORIES.TOKEN}:mint --network= --link`, - `${CATEGORIES.TOKEN}:mint --network= --link`, - ], - }, - internalFunction: 'permissionedMint', - makeUserInput, - makeContractInput, - validations: [], - loadContract: contractLoader, - hooks: { - beforeExecute, - }, -} - -export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/gauntlet-starknet-starkgate/src/index.ts b/packages-ts/gauntlet-starknet-starkgate/src/index.ts deleted file mode 100644 index 1b382fcdf..000000000 --- a/packages-ts/gauntlet-starknet-starkgate/src/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' -import { - ExecuteCommandInstance, - CommandCtor, - makeWallet, - makeProvider, - Dependencies, - Env, -} from '@chainlink/gauntlet-starknet' - -import Commands from './commands' - -const registerExecuteCommand = ( - registerCommand: (deps: Dependencies) => CommandCtor>, -) => { - const deps: Dependencies = { - logger: logger, - prompt: prompt, - makeEnv: (flags) => { - const env: Env = { - providerUrl: process.env.NODE_URL || 'https://alpha4.starknet.io', - pk: process.env.PRIVATE_KEY, - account: process.env.ACCOUNT, - } - return env - }, - makeProvider: makeProvider, - makeWallet: makeWallet, - } - return registerCommand(deps) -} - -const registeredCommands = Commands.map(registerExecuteCommand) - -export { Commands } -export default [...registeredCommands] diff --git a/packages-ts/gauntlet-starknet-starkgate/src/lib/contracts.ts b/packages-ts/gauntlet-starknet-starkgate/src/lib/contracts.ts deleted file mode 100644 index ea584f3ac..000000000 --- a/packages-ts/gauntlet-starknet-starkgate/src/lib/contracts.ts +++ /dev/null @@ -1,12 +0,0 @@ -import fs from 'fs' -import { CompiledContract, json } from 'starknet' - -export enum CONTRACT_LIST { - TOKEN = 'starkgate_erc20', -} - -export const loadContract = (name: CONTRACT_LIST): CompiledContract => { - return json.parse(fs.readFileSync(`${__dirname}/../../artifacts/abi/${name}.json`).toString('ascii')) -} - -export const contractLoader = () => loadContract(CONTRACT_LIST.TOKEN) diff --git a/packages-ts/gauntlet-starknet/README.md b/packages-ts/gauntlet-starknet/README.md deleted file mode 100644 index ad7398343..000000000 --- a/packages-ts/gauntlet-starknet/README.md +++ /dev/null @@ -1 +0,0 @@ -# Gauntlet Starknet diff --git a/packages-ts/gauntlet-starknet/package.json b/packages-ts/gauntlet-starknet/package.json deleted file mode 100644 index 79a2d4f1a..000000000 --- a/packages-ts/gauntlet-starknet/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "@chainlink/gauntlet-starknet", - "version": "0.0.1", - "description": "Gauntlet Starknet", - "keywords": [ - "typescript", - "cli" - ], - "main": "./dist/index.js", - "types": "dist/index.d.ts", - "files": [ - "dist/**/*", - "!dist/**/*.test.js" - ], - "scripts": { - "gauntlet": "ts-node ./src/index.ts", - "lint": "tsc", - "test": "SKIP_PROMPTS=true jest --runInBand", - "test:coverage": "yarn test --collectCoverage", - "test:ci": "yarn test --ci", - "lint:format": "yarn prettier --check ./src", - "format": "yarn prettier --write ./src", - "clean": "rm -rf ./dist/ ./bin/", - "build": "yarn clean && tsc -b", - "bundle": "yarn build && pkg ." - }, - "dependencies": { - "@chainlink/gauntlet-core": "0.3.0", - "starknet": "^3.11.0" - } -} diff --git a/packages-ts/gauntlet-starknet/src/commands/base/executeCommand.ts b/packages-ts/gauntlet-starknet/src/commands/base/executeCommand.ts deleted file mode 100644 index 699928f0c..000000000 --- a/packages-ts/gauntlet-starknet/src/commands/base/executeCommand.ts +++ /dev/null @@ -1,237 +0,0 @@ -import { Result, WriteCommand } from '@chainlink/gauntlet-core' -import { CompiledContract, Contract, Call } from 'starknet' -import { CommandCtor } from '.' -import { Dependencies } from '../../dependencies' -import { IStarknetProvider, wrapResponse } from '../../provider' -import { TransactionResponse } from '../../transaction' -import { IStarknetWallet } from '../../wallet' -import { makeCommandId, Validation, Input } from './command' - -export interface ExecutionContext { - id: string - contract: string - wallet: IStarknetWallet - provider: IStarknetProvider - flags: any -} - -export type BeforeExecute = ( - context: ExecutionContext, - input: Input, - deps: Pick, -) => () => Promise - -export type AfterExecute = ( - context: ExecutionContext, - input: Input, - deps: Pick, -) => (result: Result) => Promise - -export interface ExecuteCommandConfig { - ux: { - category: string - function: string - suffixes?: string[] - examples: string[] - } - hooks?: { - beforeExecute?: BeforeExecute - afterExecute?: AfterExecute - } - internalFunction?: string - makeUserInput: (flags, args) => Promise - makeContractInput: (userInput: UI, context: ExecutionContext) => Promise - validations: Validation[] - loadContract: () => CompiledContract -} - -export interface ExecuteCommandInstance { - wallet: IStarknetWallet - provider: IStarknetProvider - contractAddress: string - account: string - executionContext: ExecutionContext - contract: CompiledContract - - input: Input - - makeMessage: () => Promise - execute: () => Promise> - simulate?: () => boolean -} - -export const makeExecuteCommand = (config: ExecuteCommandConfig) => (deps: Dependencies) => { - const command: CommandCtor> = class ExecuteCommand - extends WriteCommand - implements ExecuteCommandInstance { - wallet: IStarknetWallet - provider: IStarknetProvider - contractAddress: string - account: string - executionContext: ExecutionContext - contract: CompiledContract - - input: Input - - beforeExecute: () => Promise - afterExecute: (response: Result) => Promise - - static id = makeCommandId(config.ux.category, config.ux.function, config.ux.suffixes) - static category = config.ux.category - static examples = config.ux.examples - - static create = async (flags, args) => { - const c = new ExecuteCommand(flags, args) - - const env = deps.makeEnv(flags) - - c.provider = deps.makeProvider(env.providerUrl) - c.wallet = deps.makeWallet(env.pk, env.account) - c.contractAddress = args[0] - c.account = env.account - - c.executionContext = { - provider: c.provider, - wallet: c.wallet, - id: makeCommandId(config.ux.category, config.ux.function, config.ux.suffixes), - contract: c.contractAddress, - flags: flags, - } - - c.input = await c.buildCommandInput(flags, args) - c.contract = config.loadContract() - - c.beforeExecute = config.hooks?.beforeExecute - ? config.hooks.beforeExecute(c.executionContext, c.input, { logger: deps.logger, prompt: deps.prompt }) - : c.defaultBeforeExecute(c.executionContext, c.input) - - c.afterExecute = config.hooks?.afterExecute - ? config.hooks.afterExecute(c.executionContext, c.input, { logger: deps.logger, prompt: deps.prompt }) - : c.defaultAfterExecute() - - return c - } - - runValidations = async (validations: Validation[], input: UI) => { - const result = await Promise.all(validations.map((validation) => validation(input))) - return result - } - - defaultBeforeExecute = ( - context: ExecutionContext, - input: Input, - ) => async () => { - deps.logger.loading(`Executing ${context.id} from contract ${context.contract}`) - deps.logger.log('Contract Input Params:', input.contract) - await deps.prompt('Continue?') - } - - defaultAfterExecute = () => async (response: Result): Promise => { - deps.logger.info(`Execution finished at transaction: ${response.responses[0].tx.hash}`) - } - - buildCommandInput = async (flags, args): Promise> => { - const userInput = await config.makeUserInput(flags, args) - - // Validation - if (config.validations.length > 0) { - await this.runValidations(config.validations, userInput) - } - - const contractInput = await config.makeContractInput(userInput, this.executionContext) - - return { - user: userInput, - contract: contractInput, - } - } - - simulate = () => true - - // TODO: This will be required for Multisig - makeMessage = async (): Promise => { - const contract = new Contract(this.contract.abi, this.contractAddress, this.provider.provider) - const invocation = await contract.populate( - config.internalFunction || config.ux.function, - this.input.contract as any, - ) - - return [invocation] - } - - deployContract = async (): Promise => { - deps.logger.info(`Deploying contract ${config.ux.category}`) - await deps.prompt('Continue?') - deps.logger.loading(`Sending transaction...`) - - const tx = await this.provider.deployContract(this.contract, this.input.contract, false) - deps.logger.loading(`Waiting for tx confirmation at ${tx.hash}...`) - const response = await tx.wait() - if (!response.success) { - deps.logger.error(`Contract was not deployed: ${tx.errorMessage}`) - return tx - } - deps.logger.success(`Contract deployed on ${tx.hash} with address ${tx.address}`) - return tx - } - - executeWithSigner = async (): Promise => { - const messages = await this.makeMessage() - await deps.prompt(`Continue?`) - deps.logger.loading(`Signing and sending transaction...`) - const tx = await this.provider.signAndSend(this.account, this.wallet, messages) - deps.logger.loading(`Waiting for tx confirmation at ${tx.hash}...`) - const response = await tx.wait() - if (!response.success) { - deps.logger.error(`Tx was not successful: ${tx.errorMessage}`) - return tx - } - deps.logger.success(`Tx executed at ${tx.hash}`) - return tx - } - - executeWithoutSigner = async (): Promise => { - const contract = new Contract(this.contract.abi, this.contractAddress, this.provider.provider) - await deps.prompt(`Continue?`) - deps.logger.loading(`Sending transaction...`) - const tx = await contract[config.internalFunction || config.ux.function](...(this.input.contract as any)) - const response = wrapResponse(this.provider, tx, this.contractAddress) - deps.logger.loading(`Waiting for tx confirmation at ${response.hash}...`) - await response.wait() - return response - } - - execute = async () => { - let tx: TransactionResponse - - const pubkey = await this.wallet.getPublicKey() - deps.logger.info(`Using wallet: ${pubkey}`) - - await this.beforeExecute() - - if (config.ux.function === 'deploy') { - tx = await this.deployContract() - } else { - if (this.flags.noWallet) { - tx = await this.executeWithoutSigner() - } else { - tx = await this.executeWithSigner() - } - } - - let result = { - responses: [ - { - tx, - contract: tx.address, - }, - ], - } - const data = await this.afterExecute(result) - - return !!data ? { ...result, data: { ...data } } : result - } - } - - return command -} diff --git a/packages-ts/gauntlet-starknet/src/commands/base/index.ts b/packages-ts/gauntlet-starknet/src/commands/base/index.ts deleted file mode 100644 index cfccbce32..000000000 --- a/packages-ts/gauntlet-starknet/src/commands/base/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './command' -export * from './executeCommand' -export * from './inspectionCommand' diff --git a/packages-ts/gauntlet-starknet/src/dependencies/index.ts b/packages-ts/gauntlet-starknet/src/dependencies/index.ts deleted file mode 100644 index 555867bc8..000000000 --- a/packages-ts/gauntlet-starknet/src/dependencies/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' -import { IStarknetProvider } from '../provider' -import { IStarknetWallet } from '../wallet' - -export interface Env { - providerUrl: string - pk?: string - account?: string -} - -export interface Dependencies { - logger: typeof logger - prompt: typeof prompt - makeProvider: (url: string) => IStarknetProvider - makeWallet: (pk: string, account?: string) => IStarknetWallet - makeEnv: (flags: Record) => Env -} diff --git a/packages-ts/gauntlet-starknet/src/index.ts b/packages-ts/gauntlet-starknet/src/index.ts deleted file mode 100644 index ff88b097f..000000000 --- a/packages-ts/gauntlet-starknet/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './commands/base' -export * from './dependencies' -export * from './provider' -export * from './wallet' -export * from './events' -export * from './utils' diff --git a/packages-ts/gauntlet-starknet/src/provider/index.ts b/packages-ts/gauntlet-starknet/src/provider/index.ts deleted file mode 100644 index 81e5f5525..000000000 --- a/packages-ts/gauntlet-starknet/src/provider/index.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { TransactionResponse } from '../transaction' -import { Provider as StarknetProvider, AddTransactionResponse, CompiledContract, Account, Call } from 'starknet' -import { IStarknetWallet } from '../wallet' - -// TODO: Move to gauntlet-core -interface IProvider

{ - provider: P - send: () => Promise - deployContract: (contract: CompiledContract, input: any, wait?: boolean) => Promise - signAndSend: (accountAddress: string, wallet: IStarknetWallet, calls: Call[]) => Promise -} - -export interface IStarknetProvider extends IProvider {} - -export const makeProvider = (url: string): IProvider => { - return new Provider(url) -} - -export const wrapResponse = ( - provider: IStarknetProvider, - response: AddTransactionResponse, - address?: string, -): TransactionResponse => { - const txResponse: TransactionResponse = { - hash: response.transaction_hash, - address: address || response.address, - wait: async () => { - // Success if does not throw - let success: boolean - try { - success = (await provider.provider.waitForTransaction(response.transaction_hash)) === undefined - txResponse.status = 'ACCEPTED' - } catch (e) { - txResponse.status = 'REJECTED' - txResponse.errorMessage = e.message - success = false - } - const status = await provider.provider.getTransactionStatus(response.transaction_hash) - txResponse.tx.code = status.tx_status as any // For some reason, starknet does not consider any other status than "TRANSACTION_RECEIVED" - return { success } - }, - status: 'PENDING', - tx: response, - } - return txResponse -} - -class Provider implements IStarknetProvider { - provider: StarknetProvider - - constructor(baseUrl: string) { - this.provider = new StarknetProvider({ baseUrl }) - } - - send = async () => { - // Use provider to send tx and wrap it in our type - return {} as TransactionResponse - } - - deployContract = async (contract: CompiledContract, input: any = [], wait = true) => { - const tx = await this.provider.deployContract({ - contract, - ...(!!input && input.length > 0 && { constructorCalldata: input }), - }) - - const response = wrapResponse(this, tx) - - if (!wait) return response - await response.wait() - return response - } - - signAndSend = async (accountAddress: string, wallet: IStarknetWallet, calls: Call[], wait = false) => { - const account = new Account(this.provider, accountAddress, wallet.wallet) - - const tx = await account.execute(calls) - - const response = wrapResponse(this, tx) - if (!wait) return response - - await response.wait() - return response - } -} diff --git a/packages-ts/gauntlet-starknet/src/transaction/index.ts b/packages-ts/gauntlet-starknet/src/transaction/index.ts deleted file mode 100644 index 644713d3c..000000000 --- a/packages-ts/gauntlet-starknet/src/transaction/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { AddTransactionResponse } from 'starknet' - -export type TransactionResponse = { - hash: string - address?: string - wait: () => Promise<{ success: boolean }> - tx?: AddTransactionResponse - status: 'PENDING' | 'ACCEPTED' | 'REJECTED' - errorMessage?: string -} diff --git a/packages-ts/gauntlet-starknet/src/utils/index.ts b/packages-ts/gauntlet-starknet/src/utils/index.ts deleted file mode 100644 index 6f5a55683..000000000 --- a/packages-ts/gauntlet-starknet/src/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './address' diff --git a/packages-ts/gauntlet-starknet/src/wallet/index.ts b/packages-ts/gauntlet-starknet/src/wallet/index.ts deleted file mode 100644 index 624b8be44..000000000 --- a/packages-ts/gauntlet-starknet/src/wallet/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { ec, KeyPair, Signer } from 'starknet' -export interface IWallet { - wallet: W - sign: (message: any) => any - getPublicKey: () => Promise -} - -export interface IStarknetWallet extends IWallet { - getAccountPublicKey: () => string -} - -export const makeWallet = (rawPk?: string, account?: string) => { - return Wallet.create(rawPk, account) -} - -class Wallet implements IStarknetWallet { - wallet: Signer - account: string - - private constructor(keypair: KeyPair, account?: string) { - this.wallet = new Signer(keypair) - this.account = account - } - - static create = (pKey: string, account?: string) => { - const keyPair = ec.getKeyPair(pKey) - return new Wallet(keyPair, account) - } - - sign = () => {} - - getPublicKey = async () => await this.wallet.getPubKey() - getAccountPublicKey = () => this.account -} diff --git a/packages-ts/gauntlet-starknet/test/commands/execute.test.ts b/packages-ts/gauntlet-starknet/test/commands/execute.test.ts deleted file mode 100644 index 1a17ec0fc..000000000 --- a/packages-ts/gauntlet-starknet/test/commands/execute.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' -import { - Dependencies, - CommandCtor, - ExecuteCommandInstance, - makeProvider, - makeWallet, - ExecuteCommandConfig, - makeExecuteCommand, -} from '../../src/index' -import { loadExampleContract, noopLogger, noopPrompt } from '../utils' - -const registerExecuteCommand = ( - registerCommand: (deps: Dependencies) => CommandCtor>, -) => { - const deps: Dependencies = { - logger: logger, - prompt: prompt, - makeEnv: (flags) => { - return { - providerUrl: 'http://127.0.0.1:5000', - pk: '', - account: '', - } - }, - makeProvider: makeProvider, - makeWallet: makeWallet, - } - return registerCommand(deps) -} - -describe('Execute Command', () => { - type UserInput = { - a: string - b: number - } - - type ContractInput = [string, number] - - const makeUserInput = async (flags, args): Promise => { - return { - a: flags.a, - b: Number(flags.b), - } - } - - const makeContractInput = async (userInput: UserInput): Promise => { - return [userInput.a, userInput.b] - } - - const simpleCommandConfig: ExecuteCommandConfig = { - ux: { - category: 'example', - function: 'action', - examples: [], - }, - makeUserInput, - makeContractInput, - validations: [], - loadContract: loadExampleContract, - } - - const commandConfigWithSuffixes = { - ...simpleCommandConfig, - ...{ ux: { category: 'example', function: 'action', suffixes: ['send', 'bob'], examples: [] } }, - } - - const command = registerExecuteCommand(makeExecuteCommand(simpleCommandConfig)) - const commandWithSuffixes = registerExecuteCommand(makeExecuteCommand(commandConfigWithSuffixes)) - - it('Command ID generation', async () => { - expect(command.id).toEqual('example:action') - expect(commandWithSuffixes.id).toEqual('example:action:send:bob') - }) - - it('Command input creation', async () => { - const commandInstance = await command.create({ a: 'a', b: '20' }, []) - expect(commandInstance.input.user).toEqual({ a: 'a', b: 20 }) - expect(commandInstance.input.contract).toEqual(['a', 20]) - }) - - // Deployment succeeds - it('Command deploy execution', async () => { - const commandInstance = await command.create({ a: 'a', b: '20' }, []) - }) - - // Exectition with no wallet succeeds - it('Command no wallet execution', async () => { - const commandInstance = await command.create({ a: 'a', b: '20' }, []) - }) - - // Execution with account wallet succeeds - it('Command account execution', async () => { - const commandInstance = await command.create({ a: 'a', b: '20' }, []) - }) -}) diff --git a/packages-ts/gauntlet-starknet/test/index.test.ts b/packages-ts/gauntlet-starknet/test/index.test.ts deleted file mode 100644 index 246f0d403..000000000 --- a/packages-ts/gauntlet-starknet/test/index.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe('Test', () => { - it('Dummy', async () => { - expect(0).toEqual(0) - }) -}) diff --git a/packages-ts/gauntlet-starknet-argent/LICENSE b/packages-ts/starknet-gauntlet-argent/LICENSE similarity index 100% rename from packages-ts/gauntlet-starknet-argent/LICENSE rename to packages-ts/starknet-gauntlet-argent/LICENSE diff --git a/packages-ts/gauntlet-starknet-argent/README.md b/packages-ts/starknet-gauntlet-argent/README.md similarity index 66% rename from packages-ts/gauntlet-starknet-argent/README.md rename to packages-ts/starknet-gauntlet-argent/README.md index c86409acf..797839713 100644 --- a/packages-ts/gauntlet-starknet-argent/README.md +++ b/packages-ts/starknet-gauntlet-argent/README.md @@ -1,15 +1,33 @@ -# Gauntlet Starknet Commands for Argent Contracts +# Starknet Gauntlet Commands for Argent Contracts ## Account -### Deploy +### Declare + +This declare a new account class hash onto the L2 layer. +```bash +yarn gauntlet argent_account:declare --network=testnet ``` + +Once it has been declared, you can use the class hash for a deployment (see Deploy command below) + +### Deploy + +```bash yarn gauntlet argent_account:deploy --network= ``` +Optionally, you can deploy by referencing a previously deployed class hash + +```bash +yarn gauntlet argent_account:deploy --classHash= --network= +``` + Note the contract address. The contract is not configured yet. A signer needs to be specified in it: + + ### Initialize ```bash diff --git a/packages-ts/starknet-gauntlet-argent/package.json b/packages-ts/starknet-gauntlet-argent/package.json new file mode 100644 index 000000000..ecc08a933 --- /dev/null +++ b/packages-ts/starknet-gauntlet-argent/package.json @@ -0,0 +1,31 @@ +{ + "name": "@chainlink/starknet-gauntlet-argent", + "version": "0.0.1", + "description": "Starknet Gauntlet Argent contracts", + "keywords": [ + "typescript", + "cli" + ], + "main": "./dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist/**/*", + "!dist/**/*.test.js" + ], + "scripts": { + "gauntlet": "ts-node ./src/index.ts", + "lint": "tsc", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet-argent --passWithNoTests", + "test:coverage": "yarn test --collectCoverage", + "test:ci": "yarn test --ci", + "format": "yarn prettier --write ./src", + "format:check": "yarn prettier --check ./src", + "clean": "rm -rf ./dist/ ./bin/", + "build": "yarn clean && tsc -b", + "bundle": "yarn build && pkg ." + }, + "dependencies": { + "@chainlink/gauntlet-core": "0.3.1", + "@chainlink/starknet-gauntlet": "*" + } +} diff --git a/packages-ts/starknet-gauntlet-argent/src/commands/account/declare.ts b/packages-ts/starknet-gauntlet-argent/src/commands/account/declare.ts new file mode 100644 index 000000000..64c1d2bb9 --- /dev/null +++ b/packages-ts/starknet-gauntlet-argent/src/commands/account/declare.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, declareCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { CONTRACT_LIST, accountContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + declareCommandConfig(CONTRACT_LIST.ACCOUNT, CATEGORIES.ACCOUNT, accountContractLoader), +) diff --git a/packages-ts/starknet-gauntlet-argent/src/commands/account/deploy.ts b/packages-ts/starknet-gauntlet-argent/src/commands/account/deploy.ts new file mode 100644 index 000000000..220044077 --- /dev/null +++ b/packages-ts/starknet-gauntlet-argent/src/commands/account/deploy.ts @@ -0,0 +1,64 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + ExecutionContext, + makeExecuteCommand, + Validation, + isValidAddress, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { accountContractLoader, CONTRACT_LIST } from '../../lib/contracts' + +type UserInput = { + classHash?: string +} + +type ContractInput = [] + +const makeUserInput = async (flags, args): Promise => { + if (flags.input) return flags.input as UserInput + return { + classHash: flags.classHash, + } +} + +const validateClassHash = async (input) => { + if (isValidAddress(input.classHash) || input.classHash === undefined) { + return true + } + throw new Error(`Invalid Class Hash: ${input.classHash}`) +} + +const makeContractInput = async ( + input: UserInput, + context: ExecutionContext, +): Promise => { + return [] +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info(`About to deploy an Argent Account Contract`) +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.ACCOUNT, + category: CATEGORIES.ACCOUNT, + action: 'deploy', + ux: { + description: 'Deploys an Argent Labs Account contract', + examples: [`${CATEGORIES.ACCOUNT}:deploy --classHash= --network=`], + }, + makeUserInput, + makeContractInput, + validations: [validateClassHash], + loadContract: accountContractLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-argent/src/commands/account/index.ts b/packages-ts/starknet-gauntlet-argent/src/commands/account/index.ts new file mode 100644 index 000000000..ba3a7ad46 --- /dev/null +++ b/packages-ts/starknet-gauntlet-argent/src/commands/account/index.ts @@ -0,0 +1,5 @@ +import Deploy from './deploy' +import Initialize from './initialize' +import Declare from './declare' + +export default [Deploy, Initialize, Declare] diff --git a/packages-ts/gauntlet-starknet-argent/src/commands/account/initialize.ts b/packages-ts/starknet-gauntlet-argent/src/commands/account/initialize.ts similarity index 64% rename from packages-ts/gauntlet-starknet-argent/src/commands/account/initialize.ts rename to packages-ts/starknet-gauntlet-argent/src/commands/account/initialize.ts index 278d3d2e1..4ebb8f441 100644 --- a/packages-ts/gauntlet-starknet-argent/src/commands/account/initialize.ts +++ b/packages-ts/starknet-gauntlet-argent/src/commands/account/initialize.ts @@ -4,10 +4,10 @@ import { ExecuteCommandConfig, makeExecuteCommand, Validation, -} from '@chainlink/gauntlet-starknet' +} from '@chainlink/starknet-gauntlet' import { ec } from 'starknet' import { CATEGORIES } from '../../lib/categories' -import { accountContractLoader } from '../../lib/contracts' +import { accountContractLoader, CONTRACT_LIST } from '../../lib/contracts' type UserInput = { publicKey: string @@ -20,9 +20,9 @@ const makeUserInput = async (flags, args): Promise => { if (flags.input) return flags.input as UserInput // If public key is not provided, generate a new address - const keypair = ec.genKeyPair() - const generatedPK = '0x' + keypair.getPrivate('hex') - const pubkey = flags.publicKey || ec.getStarkKey(ec.getKeyPair(generatedPK)) + const keypair = ec.starkCurve.utils.randomPrivateKey() + const generatedPK = '0x' + Buffer.from(keypair).toString('hex') + const pubkey = flags.publicKey || ec.starkCurve.getStarkKey(keypair) return { publicKey: pubkey, privateKey: !flags.publicKey && generatedPK, @@ -33,8 +33,14 @@ const makeContractInput = async (input: UserInput): Promise => { return [input.publicKey, 0] } -const beforeExecute: BeforeExecute = (context, input, deps) => async () => { - deps.logger.info(`About to deploy an Account Contract with public key ${input.contract[0]}`) +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info( + `About to deploy an Argent Account Contract with public key ${input.contract[0]}`, + ) if (input.user.privateKey) { await deps.prompt(`The generated private key will be shown next, continue?`) deps.logger.line() @@ -46,7 +52,9 @@ const beforeExecute: BeforeExecute = (context, input, } } -const afterExecute: AfterExecute = (context, input, deps) => async (result) => { +const afterExecute: AfterExecute = (context, input, deps) => async ( + result, +) => { deps.logger.success(`Account contract located at ${result.responses[0].tx.address}`) return { publicKey: input.user.publicKey, @@ -55,10 +63,15 @@ const afterExecute: AfterExecute = (context, input, de } const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.ACCOUNT, + category: CATEGORIES.ACCOUNT, + action: 'initialize', ux: { - category: CATEGORIES.ACCOUNT, - function: 'initialize', - examples: [`${CATEGORIES.ACCOUNT}:initialize --network= --publicKey=

`], + description: + 'Initializes an Argent Account Contract (Generates a public/private key for account)', + examples: [ + `${CATEGORIES.ACCOUNT}:initialize --network= --publicKey=
`, + ], }, makeUserInput, makeContractInput, diff --git a/packages-ts/gauntlet-starknet-argent/src/commands/index.ts b/packages-ts/starknet-gauntlet-argent/src/commands/index.ts similarity index 100% rename from packages-ts/gauntlet-starknet-argent/src/commands/index.ts rename to packages-ts/starknet-gauntlet-argent/src/commands/index.ts diff --git a/packages-ts/starknet-gauntlet-argent/src/index.ts b/packages-ts/starknet-gauntlet-argent/src/index.ts new file mode 100644 index 000000000..66ccd589d --- /dev/null +++ b/packages-ts/starknet-gauntlet-argent/src/index.ts @@ -0,0 +1,3 @@ +import Commands from './commands' + +export { Commands } diff --git a/packages-ts/gauntlet-starknet-argent/src/lib/categories.ts b/packages-ts/starknet-gauntlet-argent/src/lib/categories.ts similarity index 100% rename from packages-ts/gauntlet-starknet-argent/src/lib/categories.ts rename to packages-ts/starknet-gauntlet-argent/src/lib/categories.ts diff --git a/packages-ts/gauntlet-starknet-argent/src/lib/contracts.ts b/packages-ts/starknet-gauntlet-argent/src/lib/contracts.ts similarity index 52% rename from packages-ts/gauntlet-starknet-argent/src/lib/contracts.ts rename to packages-ts/starknet-gauntlet-argent/src/lib/contracts.ts index 1bbdc3042..d16f7137a 100644 --- a/packages-ts/gauntlet-starknet-argent/src/lib/contracts.ts +++ b/packages-ts/starknet-gauntlet-argent/src/lib/contracts.ts @@ -5,8 +5,12 @@ export enum CONTRACT_LIST { ACCOUNT = 'argent_account', } -export const loadContract = (name: CONTRACT_LIST): CompiledContract => { - return json.parse(fs.readFileSync(`${__dirname}/../../artifacts/abi/${name}.json`).toString('ascii')) +export const loadContract = (name: CONTRACT_LIST): any => { + return { + contract: json.parse( + fs.readFileSync(`${__dirname}/../../artifacts/abi/${name}.json`).toString('utf8'), + ), + } } export const accountContractLoader = () => loadContract(CONTRACT_LIST.ACCOUNT) diff --git a/packages-ts/gauntlet-starknet-argent/tsconfig.json b/packages-ts/starknet-gauntlet-argent/tsconfig.json similarity index 100% rename from packages-ts/gauntlet-starknet-argent/tsconfig.json rename to packages-ts/starknet-gauntlet-argent/tsconfig.json diff --git a/packages-ts/gauntlet-starknet-cli/LICENSE b/packages-ts/starknet-gauntlet-cli/LICENSE similarity index 100% rename from packages-ts/gauntlet-starknet-cli/LICENSE rename to packages-ts/starknet-gauntlet-cli/LICENSE diff --git a/packages-ts/starknet-gauntlet-cli/README.md b/packages-ts/starknet-gauntlet-cli/README.md new file mode 100644 index 000000000..bc2bb68a9 --- /dev/null +++ b/packages-ts/starknet-gauntlet-cli/README.md @@ -0,0 +1,39 @@ +# Starknet Gauntlet CLI + +This packages expose the commands to be used as a CLI of the following packages: + +- @chainlink/starknet-gauntlet-example +- @chainlink/starknet-gauntlet-account +- @chainlink/starknet-gauntlet-ocr2 + +## Setup + +Every command accepts the `--network=` flag. The value will load the static environment variables under `./networks/.env.`. Currently 2 network configurations are available: + +1. Local + +```bash +NODE_URL=http://127.0.0.1:5000 +``` + +2. Testnet + +```bash +NODE_URL=https://alpha4.starknet.io +``` + +## Miscellaneous + +- To show available methods for all contracts: + +``` +yarn gauntlet -h +``` + +-To show available methods for a single contract: + +``` +yarn gauntlet ocr2:deploy -h +``` + +It will show details for the specificed function with their needed parameters and their types, if any diff --git a/packages-ts/starknet-gauntlet-cli/networks/.env.goerli b/packages-ts/starknet-gauntlet-cli/networks/.env.goerli new file mode 100644 index 000000000..2840fbad9 --- /dev/null +++ b/packages-ts/starknet-gauntlet-cli/networks/.env.goerli @@ -0,0 +1,7 @@ + +# alternative public endpoints +#NODE_URL=https://goerli.prylabs.net +#NODE_URL=https://rpc.goerli.mudit.blog +#NODE_URL=https://rpc.slock.it/goerli +#NODE_URL=https://www.ethercluster.com/goerli +NODE_URL=https://rpc.ankr.com/eth_goerli diff --git a/packages-ts/gauntlet-starknet-cli/networks/.env.local b/packages-ts/starknet-gauntlet-cli/networks/.env.local similarity index 100% rename from packages-ts/gauntlet-starknet-cli/networks/.env.local rename to packages-ts/starknet-gauntlet-cli/networks/.env.local diff --git a/packages-ts/starknet-gauntlet-cli/networks/.env.testnet b/packages-ts/starknet-gauntlet-cli/networks/.env.testnet new file mode 100644 index 000000000..0ca97eb16 --- /dev/null +++ b/packages-ts/starknet-gauntlet-cli/networks/.env.testnet @@ -0,0 +1 @@ +NODE_URL=https://starknet-sepolia.public.blastapi.io/rpc/v0_6 \ No newline at end of file diff --git a/packages-ts/starknet-gauntlet-cli/package.json b/packages-ts/starknet-gauntlet-cli/package.json new file mode 100644 index 000000000..6ba98e033 --- /dev/null +++ b/packages-ts/starknet-gauntlet-cli/package.json @@ -0,0 +1,38 @@ +{ + "name": "@chainlink/starknet-gauntlet-cli", + "version": "0.0.1", + "description": "Starknet Gauntlet CLI", + "keywords": [ + "typescript", + "cli" + ], + "main": "./dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist/**/*", + "!dist/**/*.test.js" + ], + "scripts": { + "gauntlet": "ts-node ./src/index.ts", + "lint": "tsc", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet-cli --passWithNoTests", + "test:coverage": "yarn test --collectCoverage", + "test:ci": "yarn test --ci", + "format": "yarn prettier --write ./src", + "format:check": "yarn prettier --check ./src", + "clean": "rm -rf ./dist/ ./bin/", + "build": "yarn clean && tsc -b", + "bundle": "yarn build && pkg ." + }, + "dependencies": { + "@chainlink/gauntlet-core": "0.3.1", + "@chainlink/starknet-gauntlet-oz": "*", + "@chainlink/starknet-gauntlet-argent": "*", + "@chainlink/starknet-gauntlet-example": "*", + "@chainlink/starknet-gauntlet-ocr2": "*", + "@chainlink/starknet-gauntlet-token": "*", + "@chainlink/starknet-gauntlet-multisig": "*", + "@chainlink/starknet-gauntlet-emergency-protocol": "*", + "@chainlink/starknet-gauntlet-ledger": "*" + } +} diff --git a/packages-ts/starknet-gauntlet-cli/src/index.ts b/packages-ts/starknet-gauntlet-cli/src/index.ts new file mode 100644 index 000000000..2592d5c34 --- /dev/null +++ b/packages-ts/starknet-gauntlet-cli/src/index.ts @@ -0,0 +1,175 @@ +import { + executeCommands as OCR2ExecuteCommands, + inspectionCommands as OCR2InspectionCommands, +} from '@chainlink/starknet-gauntlet-ocr2' +import { + executeCommands as ExampleExecuteCommands, + inspectionCommands as ExampleInspectionsCommands, +} from '@chainlink/starknet-gauntlet-example' +import { Commands as OZCommands } from '@chainlink/starknet-gauntlet-oz' +import { + L2Commands as L2StarkgateCommands, + InspectionCommands as StarkgateInspectionCommands, +} from '@chainlink/starknet-gauntlet-token' +import { Commands as ArgentCommands } from '@chainlink/starknet-gauntlet-argent' +import { + L1Commands as L1EmergencyProtocolCommands, + L2Commands as L2EmergencyProtocolCommands, + L2InspectionCommands as L2EmergencyProtocolInspectionCommands, +} from '@chainlink/starknet-gauntlet-emergency-protocol' +import { + executeCommands as MultisigExecuteCommands, + inspectionCommands as MultisigInspectionCommands, + wrapCommand as multisigWrapCommand, +} from '@chainlink/starknet-gauntlet-multisig' + +import { executeCLI } from '@chainlink/gauntlet-core' +import { existsSync } from 'fs' +import path from 'path' +import { io, logger, prompt } from '@chainlink/gauntlet-core/dist/utils' +import { + CommandCtor, + Dependencies, + Env, + ExecuteCommandInstance, + InspectCommandInstance, + makeProvider, + makeWallet as makeDefaultWallet, +} from '@chainlink/starknet-gauntlet' +import { + EVMExecuteCommandInstance, + CommandCtor as EVMCommandCtor, + makeWallet as EVMMakeWallet, + makeProvider as EVMMakeProvider, + EVMDependencies, +} from '@chainlink/evm-gauntlet' +import { makeWallet as makeLedgerWallet } from '@chainlink/starknet-gauntlet-ledger' + +export const noopPrompt: typeof prompt = async () => {} + +const registerExecuteCommand = ( + registerCommand: (deps: Dependencies) => CommandCtor>, + emptyPrompt = false, +) => { + const deps: Dependencies | Omit = { + logger: logger, + prompt: emptyPrompt ? noopPrompt : prompt, + makeEnv: (flags) => { + const env: Env = { + providerUrl: process.env.NODE_URL, + pk: process.env.PRIVATE_KEY, + publicKey: process.env.PUBLIC_KEY, + account: process.env.ACCOUNT, + multisig: process.env.MULTISIG, + billingAccessController: process.env.BILLING_ACCESS_CONTROLLER, + link: process.env.LINK, + secret: flags.secret || process.env.SECRET, + randomSecret: flags.randomSecret || process.env.RANDOM_SECRET, + withLedger: !!flags.withLedger || !!process.env.WITH_LEDGER, + ledgerPath: (flags.ledgerPath as string) || process.env.LEDGER_PATH, + } + return env + }, + makeProvider: makeProvider, + makeWallet: async (env: Env) => { + if (env.withLedger) { + return makeLedgerWallet(env) + } + + return makeDefaultWallet(env) + }, + } + return registerCommand(deps) +} + +const registerEVMExecuteCommand = >( + registerCommand: (deps: EVMDependencies) => EVMCommandCtor>, + gauntletConfig, +) => { + const deps: EVMDependencies = { + logger: logger, + prompt: prompt, + makeEnv: (flags) => { + return { + providerUrl: process.env.NODE_URL, + pk: process.env.PRIVATE_KEY, + } + }, + makeProvider: EVMMakeProvider, + makeWallet: EVMMakeWallet, + } + return registerCommand(deps) +} + +const registerInspectionCommand = ( + registerCommand: ( + deps: Omit, + ) => CommandCtor>, +) => { + const deps: Omit = { + logger: logger, + prompt: prompt, + makeEnv: (flags) => { + const env: Env = { + providerUrl: process.env.NODE_URL, + } + return env + }, + makeProvider: makeProvider, + } + return registerCommand(deps) +} + +const L1ExecuteCommands: any[] = [...L1EmergencyProtocolCommands] +const L2ExecuteCommands = [ + ...OCR2ExecuteCommands, + ...ExampleExecuteCommands, + ...OZCommands, + ...L2StarkgateCommands, + ...ArgentCommands, + ...MultisigExecuteCommands, + ...L2EmergencyProtocolCommands, +] + +const msigCommands = L2ExecuteCommands.map((c) => registerExecuteCommand(c, true)).map( + multisigWrapCommand, +) +const unregistedInspectionCommands = [ + ...ExampleInspectionsCommands, + ...MultisigInspectionCommands, + ...OCR2InspectionCommands, + ...L2EmergencyProtocolInspectionCommands, + ...StarkgateInspectionCommands, +] + +const commands = { + custom: [ + ...L2ExecuteCommands.map((c) => registerExecuteCommand(c)), + ...L1ExecuteCommands.map((c) => registerEVMExecuteCommand(c, null)), + ...msigCommands.map((c) => registerExecuteCommand(c)), + ...unregistedInspectionCommands.map(registerInspectionCommand), + ], + loadDefaultFlags: () => ({}), + abstract: { + findPolymorphic: () => undefined, + makeCommand: () => undefined, + }, +} +;(async () => { + try { + const networkPossiblePaths = [ + path.join(process.cwd(), 'networks'), + path.join(__dirname, '../networks'), + ] + const networkPath = networkPossiblePaths.filter((networkPath) => existsSync(networkPath))[0] + const result = await executeCLI(commands, networkPath) + if (result) { + io.saveJSON(result, process.env['REPORT_NAME'] ? process.env['REPORT_NAME'] : 'report') + } + process.exit(0) + } catch (e) { + console.log(e) + console.log('Starknet Command execution error', e.message) + process.exitCode = 1 + } +})() diff --git a/packages-ts/gauntlet-starknet-cli/tsconfig.json b/packages-ts/starknet-gauntlet-cli/tsconfig.json similarity index 100% rename from packages-ts/gauntlet-starknet-cli/tsconfig.json rename to packages-ts/starknet-gauntlet-cli/tsconfig.json diff --git a/packages-ts/gauntlet-starknet-example/LICENSE b/packages-ts/starknet-gauntlet-emergency-protocol/LICENSE similarity index 100% rename from packages-ts/gauntlet-starknet-example/LICENSE rename to packages-ts/starknet-gauntlet-emergency-protocol/LICENSE diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/README.md b/packages-ts/starknet-gauntlet-emergency-protocol/README.md new file mode 100644 index 000000000..e89664aac --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/README.md @@ -0,0 +1,125 @@ +# Starknet Gauntlet Commands to manage the Starknet Emergency Protocol + +This package contains the commands required to manage the contracts related to the Starknet Emergency Protocol + +## Commands + +### StarknetValidator + +- Deploy + +This deploys a new instance of the `StarknetValidator` contract on **L1** + +`` is address of the official Starkware Industries deployed messaging contract (ex: 0xde29d060D45901Fb19ED6C6e959EB22d8626708e on goerli testnet) + +`` is address of access controller which can modify the StarknetValidator config + +`` is adddress of fast gas data feed (ex: 0x169E633A2D1E6c10dD91238Ba11c4A708dfEF37C on mainnet) + +`` is the address of source aggregator. Source aggregator should be added to access control of starknet validator contract to be able to call +`validate` on the starknet validator + +`` is a number that represents l1 gas estimate of the cost of doing l2 work. As of the time of writing, we recommend a value of 17300 on mainnet (for the cairo-1 contract version SequencerUptimeFeed 1.0.0). On devnet or testnet you may choose 1 to save gas. + +`` is the layer 2 feed + +`` is the percentage adjustment made to the gas cost. For example, a value of 110 would equate to 110% of the original gas cost (or equivalently, a 10% bump in price, or equivalently a 1.1 times the original cost). For simplicity sake recommend a value of 130 on mainnet, devnet, or testnet. If you set it below 100, you'll need to pass in the `--unsafe` flag as well. + +`(Optional) --unsafe`: Flag passed in to specify a gas adjustment below 100 + +```bash +yarn gauntlet starknet_validator:deploy --starkNetMessaging= --configAC= --gasPriceL1Feed= --source= --gasEstimate= --l2Feed= --gasAdjustment= --network= +``` + +- Accept Ownership + +Will accept ownership of the contract. This should be done after the current owner transfers ownership. + +```bash +yarn gauntlet starknet_validator:accept_ownership --network= +``` + +- Transfers Ownership + +Will transfer ownership to a new owner. The new owner must accept ownership to take control of the contract. + +```bash +yarn gauntlet starknet_validator:transfer_ownership --to= --network= +``` + +- Add Access + +Allows an address to write to the validator + +```bash +yarn gauntlet starknet_validator:add_access --address=
--network= +``` + +- Validate + +Calls validate on the validator contract + +```bash +yarn gauntlet starknet_validator:validate --previousRoundId= --previousAnswer= --currentRoundId= --currentAnswer= --network= + +``` + +### Sequencer Uptime Feed + +- Declare + +This declare a new `sequencer_uptime_feed` class hash onto the L2 layer. + +```bash +yarn gauntlet SequencerUptimeFeed:declare --network=testnet +``` + +Once it has been declared, you can use the class hash for a deployment (see Deploy command below) + + +- Deploy + +This deploys a new `sequencer_uptime_feed` contract to L2. + +`` can be 0 or 1. 0 means that feed is healthy and up. + +`--owner` flag can be omitted. In such a case, it will default to the account specified in .env + +`--classHash` flag can be omitted. If used, the deployment will be based off an already declared class on starknet rather than the local contract source code. + +```bash +yarn gauntlet sequencer_uptime_feed:deploy --initialStatus= --owner= --network= +``` + +Optionally, you can deploy by referencing a previously deployed class hash + +```bash +yarn gauntlet sequencer_uptime_feed:deploy --initialStatus= --owner= --classHash= --network= +``` + + +- setL1Sender + +This sets the L1 sender address. This is to control, which L1 address can write new statuses to the uptime feed. + +--address is the L1 sender address, which should be the deployed StarknetValidator.sol contract + +```bash +yarn gauntlet sequencer_uptime_feed:set_l1_sender --network= --address=
+``` + +- upgrade + +This upgrades the contract to point to a new class hash. + +```bash +yarn gauntlet SequencerUptimeFeed:upgrade --network=testnet --classHash= +``` + +- Inspect + +Inspect the latest round data + +```bash +yarn gauntlet sequencer_uptime_feed:inspect --network= +``` diff --git a/packages-ts/gauntlet-starknet-example/package.json b/packages-ts/starknet-gauntlet-emergency-protocol/package.json similarity index 60% rename from packages-ts/gauntlet-starknet-example/package.json rename to packages-ts/starknet-gauntlet-emergency-protocol/package.json index 39f78e724..9be1b8032 100644 --- a/packages-ts/gauntlet-starknet-example/package.json +++ b/packages-ts/starknet-gauntlet-emergency-protocol/package.json @@ -1,7 +1,7 @@ { - "name": "@chainlink/gauntlet-starknet-example", + "name": "@chainlink/starknet-gauntlet-emergency-protocol", "version": "0.0.1", - "description": "Gauntlet Starknet Example", + "description": "Starknet Gauntlet Emergency Protocol", "keywords": [ "typescript", "cli" @@ -15,7 +15,7 @@ "scripts": { "gauntlet": "ts-node ./src/index.ts", "lint": "tsc", - "test": "SKIP_PROMPTS=true jest --runInBand", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet-emergency-protocol --passWithNoTests", "test:coverage": "yarn test --collectCoverage", "test:ci": "yarn test --ci", "lint:format": "yarn prettier --check ./src", @@ -25,8 +25,8 @@ "bundle": "yarn build && pkg ." }, "dependencies": { - "@chainlink/gauntlet-core": "0.3.0", - "@chainlink/gauntlet-starknet": "*", - "starknet": "^3.11.0" + "@chainlink/gauntlet-core": "0.3.1", + "@chainlink/evm-gauntlet": "0.1.0", + "@chainlink/starknet-gauntlet": "*" } } diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/index.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/index.ts new file mode 100644 index 000000000..80207ca02 --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/index.ts @@ -0,0 +1,9 @@ +import { + executionCommands as UptimeFeedCommands, + inspectionCommands as UptimeInspectionCommands, +} from './sequencerUptimeFeed' +import StarknetValidatorCommands from './starknetValidator' + +export const L1Commands = [...StarknetValidatorCommands] +export const L2Commands = [...UptimeFeedCommands] +export const L2InspectionCommands = [...UptimeInspectionCommands] diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/declare.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/declare.ts new file mode 100644 index 000000000..8b624fb0c --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/declare.ts @@ -0,0 +1,11 @@ +import { makeExecuteCommand, declareCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { CONTRACT_LIST, uptimeFeedContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + declareCommandConfig( + CONTRACT_LIST.SEQUENCER_UPTIME_FEED, + CATEGORIES.SEQUENCER_UPTIME_FEED, + uptimeFeedContractLoader, + ), +) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/deploy.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/deploy.ts new file mode 100644 index 000000000..c50369bc6 --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/deploy.ts @@ -0,0 +1,69 @@ +import { + ExecuteCommandConfig, + isValidAddress, + makeExecuteCommand, +} from '@chainlink/starknet-gauntlet' +import { CONTRACT_LIST, uptimeFeedContractLoader } from '../../lib/contracts' +import { CATEGORIES } from '../../lib/categories' + +type ContractInput = [initial_status: number, owner_address: string] + +export interface UserInput { + classHash?: string + initialStatus: number + owner?: string +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.initialStatus, input.owner] +} + +const validateOwner = async (input) => { + if (!isValidAddress(input.owner)) { + throw new Error(`Invalid Owner Address: ${input.owner}`) + } + return true +} + +const validateClassHash = async (input) => { + if (isValidAddress(input.classHash) || input.classHash === undefined) { + return true + } + throw new Error(`Invalid Class Hash: ${input.classHash}`) +} + +const validateInitialStatus = async (input) => { + const status = Number(input.initialStatus) + if (status !== 1 && status !== 0) { + throw new Error(`Invalid Initial Status: ${input.initialStatus}`) + } + return true +} + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as UserInput + return { + owner: flags.owner || env.account, + initialStatus: flags.initialStatus, + classHash: flags.classHash, + } +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.SEQUENCER_UPTIME_FEED, + category: CATEGORIES.SEQUENCER_UPTIME_FEED, + action: 'deploy', + ux: { + description: 'Deploys a SequencerUptimeFeed contract', + examples: [ + `${CATEGORIES.SEQUENCER_UPTIME_FEED}:deploy --initialStatus= --network=`, + `${CATEGORIES.SEQUENCER_UPTIME_FEED}:deploy --initialStatus= --owner= --network=`, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateOwner, validateInitialStatus, validateClassHash], + loadContract: uptimeFeedContractLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/index.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/index.ts new file mode 100644 index 000000000..ed37bf06f --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/index.ts @@ -0,0 +1,8 @@ +import Deploy from './deploy' +import SetL1Sender from './setL1Sender' +import Declare from './declare' +import Upgrade from './upgrade' +import Inspection from './inspection' + +export const executionCommands = [Deploy, Declare, SetL1Sender, Upgrade] +export const inspectionCommands = [...Inspection] diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/inspection/index.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/inspection/index.ts new file mode 100644 index 000000000..b99d0d0a8 --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/inspection/index.ts @@ -0,0 +1,3 @@ +import Inspect from './inspection' + +export default [Inspect] diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/inspection/inspection.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/inspection/inspection.ts new file mode 100644 index 000000000..33f46217f --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/inspection/inspection.ts @@ -0,0 +1,56 @@ +import { + InspectCommandConfig, + IStarknetProvider, + makeInspectionCommand, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../../lib/categories' +import { uptimeFeedContractLoader } from '../../../lib/contracts' + +type Round = { + round_id: string + answer: string + block_num: string + started_at: string + updated_at: string +} + +type QueryResult = { + latest_round_data: Round +} + +const makeComparisionData = (provider: IStarknetProvider) => async ( + results: any[], + input: null, + contractAddress: string, +): Promise<{ + toCompare: null + result: QueryResult +}> => { + let [latest_round_data] = results + + for (var key in latest_round_data) { + if (latest_round_data.hasOwnProperty(key)) { + latest_round_data[key] = BigInt(latest_round_data[key]).toString() + } + } + + return { + toCompare: null, + result: { + latest_round_data: latest_round_data, + }, + } +} + +const commandConfig: InspectCommandConfig = { + ux: { + category: CATEGORIES.SEQUENCER_UPTIME_FEED, + function: 'inspect', + examples: [`${CATEGORIES.SEQUENCER_UPTIME_FEED}:inspect --network=`], + }, + queries: ['latest_round_data'], + makeComparisionData, + loadContract: uptimeFeedContractLoader, +} + +export default makeInspectionCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/setL1Sender.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/setL1Sender.ts new file mode 100644 index 000000000..805b8783c --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/setL1Sender.ts @@ -0,0 +1,49 @@ +import { + ExecuteCommandConfig, + isValidAddress, + makeExecuteCommand, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { CONTRACT_LIST, uptimeFeedContractLoader } from '../../lib/contracts' + +type ContractInput = { address: string } + +export interface SetL1SenderInput { + address: string +} + +const validateAddress = async (input) => { + if (!isValidAddress(input.address)) { + throw new Error(`Invalid L1 Sender Address: ${input.address}`) + } + return true +} + +const makeUserInput = async (flags): Promise => { + if (flags.input) return flags.input as SetL1SenderInput + return { + address: flags.address, + } +} + +const makeContractInput = async (input: SetL1SenderInput): Promise => { + return { address: input.address } +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.SEQUENCER_UPTIME_FEED, + category: CATEGORIES.SEQUENCER_UPTIME_FEED, + action: 'set_l1_sender', + ux: { + description: 'Sets the L1 sender address on the SequencerUptimeFeed contract', + examples: [ + `${CATEGORIES.SEQUENCER_UPTIME_FEED}:set_l1_sender --network= --address= `, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateAddress], + loadContract: uptimeFeedContractLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/upgrade.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/upgrade.ts new file mode 100644 index 000000000..bbd18da1d --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/sequencerUptimeFeed/upgrade.ts @@ -0,0 +1,11 @@ +import { makeExecuteCommand, upgradeCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { CONTRACT_LIST, uptimeFeedContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + upgradeCommandConfig( + CONTRACT_LIST.SEQUENCER_UPTIME_FEED, + CATEGORIES.SEQUENCER_UPTIME_FEED, + uptimeFeedContractLoader, + ), +) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/acceptOwnership.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/acceptOwnership.ts new file mode 100644 index 000000000..2e2d1568a --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/acceptOwnership.ts @@ -0,0 +1,34 @@ +import { EVMExecuteCommandConfig, makeEVMExecuteCommand } from '@chainlink/evm-gauntlet' +import { CONTRACT_LIST, starknetValidatorContractLoader } from '../../lib/contracts' +import { CATEGORIES } from '../../lib/categories' + +export type ContractInput = [] + +export interface UserInput {} + +const makeContractInput = async (input: ContractInput): Promise => { + return input +} + +const makeUserInput = async (flags): Promise => { + return {} +} + +const commandConfig: EVMExecuteCommandConfig = { + contractId: CONTRACT_LIST.STARKNET_VALIDATOR, + category: CATEGORIES.STARKNET_VALIDATOR, + action: 'accept_ownership', + internalFunction: 'acceptOwnership', + ux: { + description: 'Accepts ownership of the StarknetValidator contract from the caller address', + examples: [ + `${CATEGORIES.STARKNET_VALIDATOR}:accept_ownership --network=`, + ], + }, + makeUserInput, + makeContractInput, + validations: [], + loadContract: starknetValidatorContractLoader, +} + +export default makeEVMExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/addAccess.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/addAccess.ts new file mode 100644 index 000000000..11cdf95a0 --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/addAccess.ts @@ -0,0 +1,47 @@ +import { EVMExecuteCommandConfig, makeEVMExecuteCommand } from '@chainlink/evm-gauntlet' +import { CONTRACT_LIST, starknetValidatorContractLoader } from '../../lib/contracts' +import { CATEGORIES } from '../../lib/categories' +import { isValidAddress } from '@chainlink/starknet-gauntlet' + +export interface UserInput { + address: string +} + +type ContractInput = [_user: string] + +const makeContractInput = async (input: UserInput): Promise => { + return [input.address] +} + +const validateAddress = async (input) => { + if (!isValidAddress(input.address)) { + throw new Error(`Invalid Address: ${input.address}`) + } + return true +} + +const makeUserInput = async (flags): Promise => { + if (flags.input) return flags.input as UserInput + return { + address: flags.address, + } +} + +const commandConfig: EVMExecuteCommandConfig = { + contractId: CONTRACT_LIST.STARKNET_VALIDATOR, + category: CATEGORIES.STARKNET_VALIDATOR, + action: 'add_access', + internalFunction: 'addAccess', + ux: { + description: 'Allow address to access StarknetValidator', + examples: [ + `${CATEGORIES.STARKNET_VALIDATOR}:add_access --address=
--network= `, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateAddress], + loadContract: starknetValidatorContractLoader, +} + +export default makeEVMExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/deploy.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/deploy.ts new file mode 100644 index 000000000..4a0c67e2b --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/deploy.ts @@ -0,0 +1,135 @@ +import { EVMExecuteCommandConfig, makeEVMExecuteCommand } from '@chainlink/evm-gauntlet' +import { CONTRACT_LIST, starknetValidatorContractLoader } from '../../lib/contracts' +import { CATEGORIES } from '../../lib/categories' +import { isValidAddress } from '@chainlink/starknet-gauntlet' + +export interface UserInput { + starkNetMessaging: number + configAC: string + gasPriceL1Feed: string + source: string + gasEstimate: number + l2Feed: string + gasAdjustment: number + unsafe: boolean +} + +type ContractInput = [ + starkNetMessaging: number, + configAC: string, + gasPriceL1Feed: string, + source: string, + l2Feed: string, + gasEstimate: number, + gasAdjustment: number, +] + +const makeContractInput = async (input: UserInput): Promise => { + return [ + input.starkNetMessaging, + input.configAC, + input.gasPriceL1Feed, + input.source, + input.l2Feed, + input.gasEstimate, + input.gasAdjustment, + ] +} + +const makeUserInput = async (flags): Promise => { + if (flags.input) return flags.input as UserInput + return { + starkNetMessaging: flags.starkNetMessaging, + configAC: flags.configAC, + gasPriceL1Feed: flags.gasPriceL1Feed, + source: flags.source, + gasEstimate: flags.gasEstimate, + l2Feed: flags.l2Feed, + gasAdjustment: flags.gasAdjustment, + unsafe: Boolean(flags.unsafe), + } +} + +const validateStarkNetMessaging = async (input) => { + if (!isValidAddress(input.starkNetMessaging)) { + throw new Error(`Invalid starkNetMessaging Address: ${input.starkNetMessaging}`) + } + return true +} + +const validateConfigAC = async (input) => { + if (!isValidAddress(input.configAC)) { + throw new Error(`Invalid configAC Address: ${input.configAC}`) + } + return true +} + +const validateGasPriceL1Feed = async (input) => { + if (!isValidAddress(input.gasPriceL1Feed)) { + throw new Error(`Invalid gasPriceL1Feed Address: ${input.gasPriceL1Feed}`) + } + return true +} + +const validateSourceAggregator = async (input) => { + if (!isValidAddress(input.source)) { + throw new Error(`Invalid source Address: ${input.source}`) + } + return true +} + +const validateGasEstimate = async (input) => { + const gasEstimate = Number(input.gasEstimate) + if (isNaN(gasEstimate)) { + throw new Error(`Invalid gasEstimate (must be number): ${input.gasEstimate}`) + } else if (gasEstimate < 1) { + throw new Error(`gasEstimate must be at least 1`) + } + return true +} + +const validateL2Feed = async (input) => { + if (!isValidAddress(input.l2Feed)) { + throw new Error(`Invalid l2Feed Address: ${input.l2Feed}`) + } + return true +} + +const validateGasAdjustment = async (input) => { + const gasAdjustment = Number(input.gasAdjustment) + if (isNaN(gasAdjustment)) { + throw new Error(`Invalid gasAdjustment value (must be number): ${input.gasAdjustment}`) + } else if (gasAdjustment < 100 && !input.unsafe) { + throw new Error( + `gasAdjustment should be at least 100 (or 1x the L1 gas price). Use --unsafe flag to disable safety check.`, + ) + } + return true +} + +const commandConfig: EVMExecuteCommandConfig = { + contractId: CONTRACT_LIST.STARKNET_VALIDATOR, + category: CATEGORIES.STARKNET_VALIDATOR, + action: 'deploy', + ux: { + description: + 'Deploys a StarknetValidator contract. Starknet messaging contract is address officially deployed by starkware industries. ', + examples: [ + `${CATEGORIES.STARKNET_VALIDATOR}:deploy --starkNetMessaging=
--configAC=
--gasPriceL1Feed=
--source=
--gasEstimate= --l2Feed=
--gasAdjustment= --network=`, + ], + }, + makeUserInput, + makeContractInput, + validations: [ + validateStarkNetMessaging, + validateConfigAC, + validateGasPriceL1Feed, + validateGasEstimate, + validateSourceAggregator, + validateL2Feed, + validateGasAdjustment, + ], + loadContract: starknetValidatorContractLoader, +} + +export default makeEVMExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/index.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/index.ts new file mode 100644 index 000000000..19117cd6d --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/index.ts @@ -0,0 +1,7 @@ +import Deploy from './deploy' +import AddAccess from './addAccess' +import TransferOwnership from './transferOwnership' +import AcceptOwnership from './acceptOwnership' +import Validate from './validate' + +export default [Deploy, AddAccess, TransferOwnership, AcceptOwnership, Validate] diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/transferOwnership.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/transferOwnership.ts new file mode 100644 index 000000000..9c302c3ba --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/transferOwnership.ts @@ -0,0 +1,40 @@ +import { EVMExecuteCommandConfig, makeEVMExecuteCommand } from '@chainlink/evm-gauntlet' +import { CONTRACT_LIST, starknetValidatorContractLoader } from '../../lib/contracts' +import { CATEGORIES } from '../../lib/categories' + +export interface UserInput { + to: string +} + +type ContractInput = [to: string] + +const makeContractInput = async (input: UserInput): Promise => { + return [input.to] +} + +const makeUserInput = async (flags): Promise => { + if (flags.input) return flags.input as UserInput + return { + to: flags.to, + } +} + +const commandConfig: EVMExecuteCommandConfig = { + contractId: CONTRACT_LIST.STARKNET_VALIDATOR, + category: CATEGORIES.STARKNET_VALIDATOR, + action: 'transfer_ownership', + internalFunction: 'transferOwnership', + ux: { + description: + 'Transfers ownership of the StarknetValidator contract. Should be called by current owner', + examples: [ + `${CATEGORIES.STARKNET_VALIDATOR}:transfer_ownership --to= --network=`, + ], + }, + makeUserInput, + makeContractInput, + validations: [], + loadContract: starknetValidatorContractLoader, +} + +export default makeEVMExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/validate.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/validate.ts new file mode 100644 index 000000000..9ff4c407f --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/commands/starknetValidator/validate.ts @@ -0,0 +1,90 @@ +import { EVMExecuteCommandConfig, makeEVMExecuteCommand } from '@chainlink/evm-gauntlet' +import { CONTRACT_LIST, starknetValidatorContractLoader } from '../../lib/contracts' +import { CATEGORIES } from '../../lib/categories' + +export interface UserInput { + previousRoundId: number + previousAnswer: number + currentRoundId: number + currentAnswer: number +} + +type ContractInput = [ + previousRoundId: number, + previousAnswer: number, + currentRoundId: number, + currentAnswer: number, +] + +const makeContractInput = async ({ + previousRoundId, + previousAnswer, + currentRoundId, + currentAnswer, +}: UserInput): Promise => { + return [previousRoundId, previousAnswer, currentRoundId, currentAnswer] +} + +const validatePreviousRoundId = async (input) => { + if (isNaN(Number(input.previousRoundId))) { + throw new Error(`Invalid previousRoundId: ${input.previousRoundId}`) + } + return true +} + +const validatePreviousAnswer = async (input) => { + if (isNaN(Number(input.previousAnswer))) { + throw new Error(`Invalid previousAnswer: ${input.previousAnswer}`) + } + return true +} + +const validateCurrentRoundId = async (input) => { + if (isNaN(Number(input.currentRoundId))) { + throw new Error(`Invalid currentRoundId: ${input.currentRoundId}`) + } + return true +} + +const validateCurrentAnswer = async (input) => { + if (isNaN(Number(input.currentAnswer))) { + throw new Error(`Invalid currentAnswer: ${input.currentAnswer}`) + } + return true +} + +const makeUserInput = async (flags): Promise => { + if (flags.input) return flags.input as UserInput + const { previousRoundId, previousAnswer, currentRoundId, currentAnswer } = flags + return { + previousRoundId, + previousAnswer, + currentRoundId, + currentAnswer, + } +} + +const commandConfig: EVMExecuteCommandConfig = { + contractId: CONTRACT_LIST.STARKNET_VALIDATOR, + category: CATEGORIES.STARKNET_VALIDATOR, + action: 'validate', + internalFunction: 'validate', + ux: { + description: + 'Validate the status by sending xDomain L2 tx to Starknet UptimeFeed. Caller must have access to validate.', + examples: [ + `${CATEGORIES.STARKNET_VALIDATOR}:validate --previousRoundId=0 --previousAnswer=0 --currentRoundId=1 --currentAnswer=1 --network= `, + ], + }, + makeUserInput, + makeContractInput, + validations: [ + validateCurrentAnswer, + validateCurrentRoundId, + validatePreviousAnswer, + validatePreviousRoundId, + ], + loadContract: starknetValidatorContractLoader, +} + +export default makeEVMExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/index.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/index.ts new file mode 100644 index 000000000..02ec04180 --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/index.ts @@ -0,0 +1 @@ +export { L1Commands, L2Commands, L2InspectionCommands } from './commands' diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/lib/categories.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/lib/categories.ts new file mode 100644 index 000000000..cc53c5007 --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/lib/categories.ts @@ -0,0 +1,6 @@ +import { CONTRACT_LIST } from './contracts' + +export const CATEGORIES = { + SEQUENCER_UPTIME_FEED: CONTRACT_LIST.SEQUENCER_UPTIME_FEED, + STARKNET_VALIDATOR: CONTRACT_LIST.STARKNET_VALIDATOR, +} diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/src/lib/contracts.ts b/packages-ts/starknet-gauntlet-emergency-protocol/src/lib/contracts.ts new file mode 100644 index 000000000..9912b42f9 --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/src/lib/contracts.ts @@ -0,0 +1,22 @@ +import fs from 'fs' +import { ContractFactory } from 'ethers' +import { loadContract } from '@chainlink/starknet-gauntlet' + +export enum CONTRACT_LIST { + SEQUENCER_UPTIME_FEED = 'SequencerUptimeFeed', + STARKNET_VALIDATOR = 'starknet_validator', +} + +export const uptimeFeedContractLoader = () => { + return loadContract(CONTRACT_LIST.SEQUENCER_UPTIME_FEED) +} + +export const starknetValidatorContractLoader = (): ContractFactory => { + const abi = JSON.parse( + fs.readFileSync( + `${__dirname}/../../../../contracts/artifacts/solidity/emergency/StarknetValidator.sol/StarknetValidator.json`, + 'utf-8', + ), + ) + return new ContractFactory(abi?.abi, abi?.bytecode) +} diff --git a/packages-ts/starknet-gauntlet-emergency-protocol/test/commands/sequencerUptimeFeed.test.ts b/packages-ts/starknet-gauntlet-emergency-protocol/test/commands/sequencerUptimeFeed.test.ts new file mode 100644 index 000000000..e565045a3 --- /dev/null +++ b/packages-ts/starknet-gauntlet-emergency-protocol/test/commands/sequencerUptimeFeed.test.ts @@ -0,0 +1,56 @@ +import deployCommand from '../../src/commands/sequencerUptimeFeed/deploy' +import setL1Sender from '../../src/commands/sequencerUptimeFeed/setL1Sender' +import getLatestRoundData from '../../src/commands/sequencerUptimeFeed/inspection/inspection' +import { + registerExecuteCommand, + registerInspectCommand, + TIMEOUT, +} from '@chainlink/starknet-gauntlet/test/utils' + +describe('Sequencer Uptime Feed Contract', () => { + let uptimeFeedAddress: string + + // deploy uptime feed contract + beforeEach(async () => { + const command = await registerExecuteCommand(deployCommand).create( + { + initialStatus: 0, + }, + [], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + uptimeFeedAddress = report.responses[0].contract + }, TIMEOUT) + + describe('setL1Sender', () => { + it( + 'Sets with a non-Zero valid eth address', + async () => { + const command = await registerExecuteCommand(setL1Sender).create( + { + address: '0x0000000000000000000000000000000000000007', + }, + [uptimeFeedAddress], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + }, + TIMEOUT, + ) + }) + + describe('inspect uptime feed status', () => { + it('Retrieves 0', async () => { + const inspectCommand = await registerInspectCommand(getLatestRoundData).create({}, [ + uptimeFeedAddress, + ]) + + const report = await inspectCommand.execute() + expect(report.data.data.latest_round_data.answer).toEqual('0') + }) + }) +}) diff --git a/packages-ts/gauntlet-starknet-example/tsconfig.json b/packages-ts/starknet-gauntlet-emergency-protocol/tsconfig.json similarity index 100% rename from packages-ts/gauntlet-starknet-example/tsconfig.json rename to packages-ts/starknet-gauntlet-emergency-protocol/tsconfig.json diff --git a/packages-ts/gauntlet-starknet-ocr2/LICENSE b/packages-ts/starknet-gauntlet-example/LICENSE similarity index 100% rename from packages-ts/gauntlet-starknet-ocr2/LICENSE rename to packages-ts/starknet-gauntlet-example/LICENSE diff --git a/packages-ts/gauntlet-starknet-example/README.md b/packages-ts/starknet-gauntlet-example/README.md similarity index 87% rename from packages-ts/gauntlet-starknet-example/README.md rename to packages-ts/starknet-gauntlet-example/README.md index 2d037f0af..f1773794c 100644 --- a/packages-ts/gauntlet-starknet-example/README.md +++ b/packages-ts/starknet-gauntlet-example/README.md @@ -1,4 +1,4 @@ -# Gauntlet Starknet Commands for a Sample Contract +# Starknet Gauntlet Commands for a Sample Contract This package contains some commands to serve as an example on how to use Gauntlet with Starknet. The contract can be found on the [Cairo Docs](https://www.cairo-lang.org/docs/hello_starknet/intro.html#your-first-contract) @@ -17,7 +17,7 @@ This will result in a new contract address Will increase the current balance with the amount specified with the `--balance` flag ```bash -yarn gauntlet example:increase_balance --network= --balance= (--noWallet) +yarn gauntlet example:increase_balance --network= --balance= ``` - Inspect the contract diff --git a/packages-ts/gauntlet-starknet/test/__mocks__/example.json b/packages-ts/starknet-gauntlet-example/contract_artifacts/abi/example.json similarity index 53% rename from packages-ts/gauntlet-starknet/test/__mocks__/example.json rename to packages-ts/starknet-gauntlet-example/contract_artifacts/abi/example.json index cf82dc985..36976bc77 100644 --- a/packages-ts/gauntlet-starknet/test/__mocks__/example.json +++ b/packages-ts/starknet-gauntlet-example/contract_artifacts/abi/example.json @@ -44,6 +44,7 @@ "pedersen", "range_check" ], + "compiler_version": "0.10.0", "data": [ "0x480680017fff8000", "0x53746f7261676552656164", @@ -154,23 +155,23 @@ ], "debug_info": { "file_contents": { - "autogen/starknet/arg_processor/1b562308a65653425ce06491fa4b4539466f3251a07e73e099d0afe86a48900e.cairo": "assert [cast(fp + (-4), felt*)] = __calldata_actual_size\n", - "autogen/starknet/arg_processor/5e1cc73f0b484f90bb02da164d88332b40c6f698801aa4d3c603dab22157e902.cairo": "let __calldata_actual_size = __calldata_ptr - cast([cast(fp + (-3), felt**)], felt*)\n", - "autogen/starknet/arg_processor/7a16feca69d1dc1343a49177e1e57103319136de3f2c6fabefae170177a1305e.cairo": "let __calldata_arg_amount = [__calldata_ptr]\nlet __calldata_ptr = __calldata_ptr + 1\n", - "autogen/starknet/arg_processor/fee896b6d05b2e98056b5628baa6fbee0adfb8960f3fee9d79fd2f066956cc42.cairo": "assert [__return_value_ptr] = ret_struct.res\nlet __return_value_ptr = __return_value_ptr + 1\n", - "autogen/starknet/external/get_balance/424b26e79f70343cc02557f1fbd25745138efb26a3dc5c8b593ca765b73138b7.cairo": "let pedersen_ptr = [cast([cast(fp + (-5), felt**)] + 1, starkware.cairo.common.cairo_builtins.HashBuiltin**)]\n", - "autogen/starknet/external/get_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo": "return (syscall_ptr,pedersen_ptr,range_check_ptr,retdata_size,retdata)\n", - "autogen/starknet/external/get_balance/c7060df96cb0acca1380ae43bf758cab727bfdf73cb5d34a93e24a9742817fda.cairo": "let syscall_ptr = [cast([cast(fp + (-5), felt**)] + 0, felt**)]\n", - "autogen/starknet/external/get_balance/e651458745e7cd218121c342e0915890767e2f59ddc2e315b8844ad0f47d582e.cairo": "let range_check_ptr = [cast([cast(fp + (-5), felt**)] + 2, felt*)]\n", - "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo": "let ret_struct = __wrapped_func{syscall_ptr=syscall_ptr, pedersen_ptr=pedersen_ptr, range_check_ptr=range_check_ptr}()\nlet (range_check_ptr, retdata_size, retdata) = get_balance_encode_return(ret_struct, range_check_ptr)\n", - "autogen/starknet/external/increase_balance/424b26e79f70343cc02557f1fbd25745138efb26a3dc5c8b593ca765b73138b7.cairo": "let pedersen_ptr = [cast([cast(fp + (-5), felt**)] + 1, starkware.cairo.common.cairo_builtins.HashBuiltin**)]\n", - "autogen/starknet/external/increase_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo": "return (syscall_ptr,pedersen_ptr,range_check_ptr,retdata_size,retdata)\n", - "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo": "let ret_struct = __wrapped_func{syscall_ptr=syscall_ptr, pedersen_ptr=pedersen_ptr, range_check_ptr=range_check_ptr}(amount=__calldata_arg_amount,)\n%{ memory[ap] = segments.add() %} # Allocate memory for return value.\ntempvar retdata : felt*\nlet retdata_size = 0\n", - "autogen/starknet/external/increase_balance/c7060df96cb0acca1380ae43bf758cab727bfdf73cb5d34a93e24a9742817fda.cairo": "let syscall_ptr = [cast([cast(fp + (-5), felt**)] + 0, felt**)]\n", - "autogen/starknet/external/increase_balance/e651458745e7cd218121c342e0915890767e2f59ddc2e315b8844ad0f47d582e.cairo": "let range_check_ptr = [cast([cast(fp + (-5), felt**)] + 2, felt*)]\n", - "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo": "func get_balance_encode_return(ret_struct : __main__.get_balance.Return, range_check_ptr) -> (\n range_check_ptr, data_len : felt, data : felt*):\n %{ memory[ap] = segments.add() %}\n alloc_locals\n local __return_value_ptr_start : felt*\n let __return_value_ptr = __return_value_ptr_start\n with range_check_ptr:\n end\n return (\n range_check_ptr=range_check_ptr,\n data_len=__return_value_ptr - __return_value_ptr_start,\n data=__return_value_ptr_start)\nend\n", - "autogen/starknet/storage_var/balance/decl.cairo": "namespace balance:\n from starkware.starknet.common.storage import normalize_address\n from starkware.starknet.common.syscalls import storage_read, storage_write\n from starkware.cairo.common.cairo_builtins import HashBuiltin\n from starkware.cairo.common.hash import hash2\n\n func addr{pedersen_ptr : HashBuiltin*, range_check_ptr}() -> (res : felt):\n let res = 0\n call hash2\n call normalize_address\n end\n\n func read{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}() -> (res : felt):\n let storage_addr = 0\n call addr\n call storage_read\n end\n\n func write{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}(value : felt):\n let storage_addr = 0\n call addr\n call storage_write\n end\nend", - "autogen/starknet/storage_var/balance/impl.cairo": "namespace balance:\n from starkware.starknet.common.storage import normalize_address\n from starkware.starknet.common.syscalls import storage_read, storage_write\n from starkware.cairo.common.cairo_builtins import HashBuiltin\n from starkware.cairo.common.hash import hash2\n\n func addr{pedersen_ptr : HashBuiltin*, range_check_ptr}() -> (res : felt):\n let res = 916907772491729262376534102982219947830828984996257231353398618781993312401\n return (res=res)\n end\n\n func read{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}() -> (res : felt):\n let (storage_addr) = addr()\n let (__storage_var_temp0) = storage_read(address=storage_addr + 0)\n\n tempvar syscall_ptr = syscall_ptr\n tempvar pedersen_ptr = pedersen_ptr\n tempvar range_check_ptr = range_check_ptr\n tempvar __storage_var_temp0 : felt = __storage_var_temp0\n return ([cast(&__storage_var_temp0, felt*)])\n end\n\n func write{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}(value : felt):\n let (storage_addr) = addr()\n storage_write(address=storage_addr + 0, value=[cast(&value, felt) + 0])\n return ()\n end\nend" + "autogen/starknet/arg_processor/01cba52f8515996bb9d7070bde81ff39281d096d7024a558efcba6e1fd2402cf.cairo": "assert [cast(fp + (-4), felt*)] = __calldata_actual_size;\n", + "autogen/starknet/arg_processor/293368f3a0e12cfcf22314a31e13b9801e95a5b8b2b71822a2fbbdf5a01ea795.cairo": "assert [__return_value_ptr] = ret_value.res;\nlet __return_value_ptr = __return_value_ptr + 1;\n", + "autogen/starknet/arg_processor/73e68c490b7650388f650e9e1ff9b2b3ced88dabf86213d6a0831077eb1a0800.cairo": "let __calldata_arg_amount = [__calldata_ptr];\nlet __calldata_ptr = __calldata_ptr + 1;\n", + "autogen/starknet/arg_processor/c31620b02d4d706f0542c989b2aadc01b0981d1f6a5933a8fe4937ace3d70d92.cairo": "let __calldata_actual_size = __calldata_ptr - cast([cast(fp + (-3), felt**)], felt*);\n", + "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo": "let ret_value = __wrapped_func{syscall_ptr=syscall_ptr, pedersen_ptr=pedersen_ptr, range_check_ptr=range_check_ptr}();\nlet (range_check_ptr, retdata_size, retdata) = get_balance_encode_return(ret_value, range_check_ptr);\n", + "autogen/starknet/external/get_balance/741ea357d6336b0bed7bf0472425acd0311d543883b803388880e60a232040c7.cairo": "let range_check_ptr = [cast([cast(fp + (-5), felt**)] + 2, felt*)];\n", + "autogen/starknet/external/get_balance/9684a85e93c782014ca14293edea4eb2502039a5a7b6538ecd39c56faaf12529.cairo": "let pedersen_ptr = [cast([cast(fp + (-5), felt**)] + 1, starkware.cairo.common.cairo_builtins.HashBuiltin**)];\n", + "autogen/starknet/external/get_balance/b2c52ca2d2a8fc8791a983086d8716c5eacd0c3d62934914d2286f84b98ff4cb.cairo": "let syscall_ptr = [cast([cast(fp + (-5), felt**)] + 0, felt**)];\n", + "autogen/starknet/external/get_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo": "return (syscall_ptr,pedersen_ptr,range_check_ptr,retdata_size,retdata);\n", + "autogen/starknet/external/increase_balance/741ea357d6336b0bed7bf0472425acd0311d543883b803388880e60a232040c7.cairo": "let range_check_ptr = [cast([cast(fp + (-5), felt**)] + 2, felt*)];\n", + "autogen/starknet/external/increase_balance/9684a85e93c782014ca14293edea4eb2502039a5a7b6538ecd39c56faaf12529.cairo": "let pedersen_ptr = [cast([cast(fp + (-5), felt**)] + 1, starkware.cairo.common.cairo_builtins.HashBuiltin**)];\n", + "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo": "let ret_value = __wrapped_func{syscall_ptr=syscall_ptr, pedersen_ptr=pedersen_ptr, range_check_ptr=range_check_ptr}(amount=__calldata_arg_amount,);\n%{ memory[ap] = segments.add() %} // Allocate memory for return value.\ntempvar retdata: felt*;\nlet retdata_size = 0;\n", + "autogen/starknet/external/increase_balance/b2c52ca2d2a8fc8791a983086d8716c5eacd0c3d62934914d2286f84b98ff4cb.cairo": "let syscall_ptr = [cast([cast(fp + (-5), felt**)] + 0, felt**)];\n", + "autogen/starknet/external/increase_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo": "return (syscall_ptr,pedersen_ptr,range_check_ptr,retdata_size,retdata);\n", + "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo": "func get_balance_encode_return(ret_value: (res: felt), range_check_ptr) -> (\n range_check_ptr: felt, data_len: felt, data: felt*) {\n %{ memory[ap] = segments.add() %}\n alloc_locals;\n local __return_value_ptr_start: felt*;\n let __return_value_ptr = __return_value_ptr_start;\n with range_check_ptr {\n }\n return (\n range_check_ptr=range_check_ptr,\n data_len=__return_value_ptr - __return_value_ptr_start,\n data=__return_value_ptr_start);\n}\n", + "autogen/starknet/storage_var/balance/decl.cairo": "namespace balance {\n from starkware.starknet.common.storage import normalize_address\n from starkware.starknet.common.syscalls import storage_read, storage_write\n from starkware.cairo.common.cairo_builtins import HashBuiltin\n from starkware.cairo.common.hash import hash2\n\n func addr{pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (res: felt) {\n let res = 0;\n call hash2;\n call normalize_address;\n }\n\n func read{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (res: felt) {\n let storage_addr = 0;\n call addr;\n call storage_read;\n }\n\n func write{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(value: felt) {\n let storage_addr = 0;\n call addr;\n call storage_write;\n }\n}", + "autogen/starknet/storage_var/balance/impl.cairo": "namespace balance {\n from starkware.starknet.common.storage import normalize_address\n from starkware.starknet.common.syscalls import storage_read, storage_write\n from starkware.cairo.common.cairo_builtins import HashBuiltin\n from starkware.cairo.common.hash import hash2\n\n func addr{pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (res: felt) {\n let res = 916907772491729262376534102982219947830828984996257231353398618781993312401;\n return (res=res);\n }\n\n func read{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (res: felt) {\n let (storage_addr) = addr();\n let (__storage_var_temp0) = storage_read(address=storage_addr + 0);\n\n tempvar syscall_ptr = syscall_ptr;\n tempvar pedersen_ptr = pedersen_ptr;\n tempvar range_check_ptr = range_check_ptr;\n tempvar __storage_var_temp0: felt = __storage_var_temp0;\n return ([cast(&__storage_var_temp0, felt*)],);\n }\n\n func write{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(value: felt) {\n let (storage_addr) = addr();\n storage_write(address=storage_addr + 0, value=[cast(&value, felt) + 0]);\n return ();\n }\n}" }, "instruction_locations": { "0": { @@ -178,26 +179,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 0, - "offset": 0 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_read.address": 0, - "starkware.starknet.common.syscalls.storage_read.syscall": 2, - "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 1 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 79, - "end_line": 266, + "end_line": 350, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 58, - "start_line": 266 + "start_line": 350 } }, "2": { @@ -205,27 +196,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 0, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_read.__temp0": 3, - "starkware.starknet.common.syscalls.storage_read.address": 0, - "starkware.starknet.common.syscalls.storage_read.syscall": 2, - "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 1 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 97, - "end_line": 266, + "end_col": 98, + "end_line": 350, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 266 + "start_line": 350 } }, "3": { @@ -233,27 +213,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 0, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_read.__temp0": 3, - "starkware.starknet.common.syscalls.storage_read.address": 0, - "starkware.starknet.common.syscalls.storage_read.syscall": 2, - "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 1 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 97, - "end_line": 266, + "end_col": 98, + "end_line": 350, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 266 + "start_line": 350 } }, "4": { @@ -261,65 +230,53 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 0, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_read.__temp0": 3, - "starkware.starknet.common.syscalls.storage_read.address": 0, - "starkware.starknet.common.syscalls.storage_read.response": 4, - "starkware.starknet.common.syscalls.storage_read.syscall": 2, - "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 5 - } - }, + "flow_tracking_data": null, "hints": [ { "location": { "end_col": 87, - "end_line": 267, + "end_line": 351, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 267 + "start_line": 351 }, "n_prefix_newlines": 0 } ], "inst": { "end_col": 53, - "end_line": 269, + "end_line": 353, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "parent_location": [ { - "end_col": 38, - "end_line": 264, + "end_col": 37, + "end_line": 348, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "parent_location": [ { - "end_col": 34, - "end_line": 270, + "end_col": 35, + "end_line": 354, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 270 + "start_line": 354 }, "While trying to retrieve the implicit argument 'syscall_ptr' in:" ], "start_col": 19, - "start_line": 264 + "start_line": 348 }, "While expanding the reference 'syscall_ptr' in:" ], "start_col": 23, - "start_line": 269 + "start_line": 353 } }, "6": { @@ -327,28 +284,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 0, - "offset": 2 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_read.__temp0": 3, - "starkware.starknet.common.syscalls.storage_read.address": 0, - "starkware.starknet.common.syscalls.storage_read.response": 4, - "starkware.starknet.common.syscalls.storage_read.syscall": 2, - "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 5 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 33, - "end_line": 270, + "end_line": 354, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 19, - "start_line": 270 + "start_line": 354 } }, "7": { @@ -356,28 +301,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 0, - "offset": 3 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_read.__temp0": 3, - "starkware.starknet.common.syscalls.storage_read.address": 0, - "starkware.starknet.common.syscalls.storage_read.response": 4, - "starkware.starknet.common.syscalls.storage_read.syscall": 2, - "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 5 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 34, - "end_line": 270, + "end_col": 35, + "end_line": 354, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 270 + "start_line": 354 } }, "8": { @@ -385,26 +318,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 0 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_write.address": 6, - "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 8, - "starkware.starknet.common.syscalls.storage_write.value": 7 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 40, - "end_line": 284, + "end_line": 368, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 18, - "start_line": 284 + "start_line": 368 } }, "10": { @@ -412,27 +335,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_write.__temp1": 9, - "starkware.starknet.common.syscalls.storage_write.address": 6, - "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 8, - "starkware.starknet.common.syscalls.storage_write.value": 7 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 71, - "end_line": 284, + "end_col": 72, + "end_line": 368, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 283 + "start_line": 367 } }, "11": { @@ -440,27 +352,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_write.__temp1": 9, - "starkware.starknet.common.syscalls.storage_write.address": 6, - "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 8, - "starkware.starknet.common.syscalls.storage_write.value": 7 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 71, - "end_line": 284, + "end_col": 72, + "end_line": 368, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 283 + "start_line": 367 } }, "12": { @@ -468,27 +369,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_write.__temp1": 9, - "starkware.starknet.common.syscalls.storage_write.address": 6, - "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 8, - "starkware.starknet.common.syscalls.storage_write.value": 7 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 71, - "end_line": 284, + "end_col": 72, + "end_line": 368, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 283 + "start_line": 367 } }, "13": { @@ -496,64 +386,53 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_write.__temp1": 9, - "starkware.starknet.common.syscalls.storage_write.address": 6, - "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 10, - "starkware.starknet.common.syscalls.storage_write.value": 7 - } - }, + "flow_tracking_data": null, "hints": [ { "location": { "end_col": 88, - "end_line": 285, + "end_line": 369, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 285 + "start_line": 369 }, "n_prefix_newlines": 0 } ], "inst": { "end_col": 54, - "end_line": 286, + "end_line": 370, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "parent_location": [ { - "end_col": 39, - "end_line": 282, + "end_col": 38, + "end_line": 366, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "parent_location": [ { - "end_col": 14, - "end_line": 287, + "end_col": 15, + "end_line": 371, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 287 + "start_line": 371 }, "While trying to retrieve the implicit argument 'syscall_ptr' in:" ], "start_col": 20, - "start_line": 282 + "start_line": 366 }, "While expanding the reference 'syscall_ptr' in:" ], "start_col": 23, - "start_line": 286 + "start_line": 370 } }, "15": { @@ -561,27 +440,16 @@ "starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 2 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_write.__temp1": 9, - "starkware.starknet.common.syscalls.storage_write.address": 6, - "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 10, - "starkware.starknet.common.syscalls.storage_write.value": 7 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 14, - "end_line": 287, + "end_col": 15, + "end_line": 371, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "start_col": 5, - "start_line": 287 + "start_line": 371 } }, "16": { @@ -590,34 +458,24 @@ "__main__.balance", "__main__.balance.addr" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 2, - "offset": 0 - }, - "reference_ids": { - "__main__.balance.addr.pedersen_ptr": 11, - "__main__.balance.addr.range_check_ptr": 12, - "__main__.balance.addr.res": 13 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 42, + "end_col": 41, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" }, "parent_location": [ { - "end_col": 42, + "end_col": 41, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" }, "parent_location": [ { - "end_col": 25, + "end_col": 26, "end_line": 9, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" @@ -642,34 +500,24 @@ "__main__.balance", "__main__.balance.addr" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 2, - "offset": 1 - }, - "reference_ids": { - "__main__.balance.addr.pedersen_ptr": 11, - "__main__.balance.addr.range_check_ptr": 12, - "__main__.balance.addr.res": 13 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 59, + "end_col": 58, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" }, "parent_location": [ { - "end_col": 59, + "end_col": 58, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" }, "parent_location": [ { - "end_col": 25, + "end_col": 26, "end_line": 9, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" @@ -679,12 +527,12 @@ }, "While trying to retrieve the implicit argument 'range_check_ptr' in:" ], - "start_col": 44, + "start_col": 43, "start_line": 7 }, "While expanding the reference 'range_check_ptr' in:" ], - "start_col": 44, + "start_col": 43, "start_line": 7 } }, @@ -694,17 +542,7 @@ "__main__.balance", "__main__.balance.addr" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 2, - "offset": 2 - }, - "reference_ids": { - "__main__.balance.addr.pedersen_ptr": 11, - "__main__.balance.addr.range_check_ptr": 12, - "__main__.balance.addr.res": 13 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 94, @@ -734,20 +572,10 @@ "__main__.balance", "__main__.balance.addr" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 2, - "offset": 3 - }, - "reference_ids": { - "__main__.balance.addr.pedersen_ptr": 11, - "__main__.balance.addr.range_check_ptr": 12, - "__main__.balance.addr.res": 13 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 25, + "end_col": 26, "end_line": 9, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" @@ -762,27 +590,17 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 0 - }, - "reference_ids": { - "__main__.balance.read.pedersen_ptr": 15, - "__main__.balance.read.range_check_ptr": 16, - "__main__.balance.read.syscall_ptr": 14 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 63, + "end_col": 61, "end_line": 12, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" }, "parent_location": [ { - "end_col": 42, + "end_col": 41, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -804,7 +622,7 @@ }, "While expanding the reference 'pedersen_ptr' in:" ], - "start_col": 36, + "start_col": 35, "start_line": 12 } }, @@ -814,27 +632,17 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 1 - }, - "reference_ids": { - "__main__.balance.read.pedersen_ptr": 15, - "__main__.balance.read.range_check_ptr": 16, - "__main__.balance.read.syscall_ptr": 14 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 80, + "end_col": 78, "end_line": 12, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" }, "parent_location": [ { - "end_col": 59, + "end_col": 58, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -851,12 +659,12 @@ }, "While trying to retrieve the implicit argument 'range_check_ptr' in:" ], - "start_col": 44, + "start_col": 43, "start_line": 7 }, "While expanding the reference 'range_check_ptr' in:" ], - "start_col": 65, + "start_col": 63, "start_line": 12 } }, @@ -866,17 +674,7 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 2 - }, - "reference_ids": { - "__main__.balance.read.pedersen_ptr": 15, - "__main__.balance.read.range_check_ptr": 16, - "__main__.balance.read.syscall_ptr": 14 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 36, @@ -894,31 +692,20 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 7 - }, - "reference_ids": { - "__main__.balance.read.pedersen_ptr": 17, - "__main__.balance.read.range_check_ptr": 18, - "__main__.balance.read.storage_addr": 19, - "__main__.balance.read.syscall_ptr": 14 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 34, + "end_col": 33, "end_line": 12, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" }, "parent_location": [ { - "end_col": 38, - "end_line": 264, + "end_col": 37, + "end_line": 348, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "parent_location": [ { @@ -933,7 +720,7 @@ "While trying to retrieve the implicit argument 'syscall_ptr' in:" ], "start_col": 19, - "start_line": 264 + "start_line": 348 }, "While expanding the reference 'syscall_ptr' in:" ], @@ -947,18 +734,7 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 8 - }, - "reference_ids": { - "__main__.balance.read.pedersen_ptr": 17, - "__main__.balance.read.range_check_ptr": 18, - "__main__.balance.read.storage_addr": 19, - "__main__.balance.read.syscall_ptr": 14 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 26, @@ -988,18 +764,7 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 9 - }, - "reference_ids": { - "__main__.balance.read.pedersen_ptr": 17, - "__main__.balance.read.range_check_ptr": 18, - "__main__.balance.read.storage_addr": 19, - "__main__.balance.read.syscall_ptr": 14 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 75, @@ -1017,25 +782,13 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 14 - }, - "reference_ids": { - "__main__.balance.read.__storage_var_temp0": 21, - "__main__.balance.read.pedersen_ptr": 17, - "__main__.balance.read.range_check_ptr": 18, - "__main__.balance.read.storage_addr": 19, - "__main__.balance.read.syscall_ptr": 20 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 38, - "end_line": 264, + "end_col": 37, + "end_line": 348, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "parent_location": [ { @@ -1062,7 +815,7 @@ "While trying to update the implicit return value 'syscall_ptr' in:" ], "start_col": 19, - "start_line": 264 + "start_line": 348 } }, "30": { @@ -1071,22 +824,10 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 15 - }, - "reference_ids": { - "__main__.balance.read.__storage_var_temp0": 21, - "__main__.balance.read.pedersen_ptr": 17, - "__main__.balance.read.range_check_ptr": 18, - "__main__.balance.read.storage_addr": 19, - "__main__.balance.read.syscall_ptr": 22 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 42, + "end_col": 41, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1125,22 +866,10 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 16 - }, - "reference_ids": { - "__main__.balance.read.__storage_var_temp0": 21, - "__main__.balance.read.pedersen_ptr": 23, - "__main__.balance.read.range_check_ptr": 18, - "__main__.balance.read.storage_addr": 19, - "__main__.balance.read.syscall_ptr": 22 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 59, + "end_col": 58, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1169,7 +898,7 @@ }, "While trying to update the implicit return value 'range_check_ptr' in:" ], - "start_col": 44, + "start_col": 43, "start_line": 7 } }, @@ -1179,19 +908,7 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 17 - }, - "reference_ids": { - "__main__.balance.read.__storage_var_temp0": 21, - "__main__.balance.read.pedersen_ptr": 23, - "__main__.balance.read.range_check_ptr": 24, - "__main__.balance.read.storage_addr": 19, - "__main__.balance.read.syscall_ptr": 22 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 33, @@ -1201,12 +918,12 @@ }, "parent_location": [ { - "end_col": 65, + "end_col": 64, "end_line": 19, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" }, - "start_col": 46, + "start_col": 45, "start_line": 19 }, "While expanding the reference '__storage_var_temp0' in:" @@ -1221,22 +938,10 @@ "__main__.balance", "__main__.balance.read" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 18 - }, - "reference_ids": { - "__main__.balance.read.__storage_var_temp0": 25, - "__main__.balance.read.pedersen_ptr": 23, - "__main__.balance.read.range_check_ptr": 24, - "__main__.balance.read.storage_addr": 19, - "__main__.balance.read.syscall_ptr": 22 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 53, + "end_col": 55, "end_line": 20, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" @@ -1251,28 +956,17 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 0 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 28, - "__main__.balance.write.range_check_ptr": 29, - "__main__.balance.write.syscall_ptr": 27, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 64, + "end_col": 62, "end_line": 23, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" }, "parent_location": [ { - "end_col": 42, + "end_col": 41, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1294,7 +988,7 @@ }, "While expanding the reference 'pedersen_ptr' in:" ], - "start_col": 37, + "start_col": 36, "start_line": 23 } }, @@ -1304,28 +998,17 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 1 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 28, - "__main__.balance.write.range_check_ptr": 29, - "__main__.balance.write.syscall_ptr": 27, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 81, + "end_col": 79, "end_line": 23, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" }, "parent_location": [ { - "end_col": 59, + "end_col": 58, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1342,12 +1025,12 @@ }, "While trying to retrieve the implicit argument 'range_check_ptr' in:" ], - "start_col": 44, + "start_col": 43, "start_line": 7 }, "While expanding the reference 'range_check_ptr' in:" ], - "start_col": 66, + "start_col": 64, "start_line": 23 } }, @@ -1357,18 +1040,7 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 2 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 28, - "__main__.balance.write.range_check_ptr": 29, - "__main__.balance.write.syscall_ptr": 27, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 36, @@ -1386,32 +1058,20 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 7 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 30, - "__main__.balance.write.range_check_ptr": 31, - "__main__.balance.write.storage_addr": 32, - "__main__.balance.write.syscall_ptr": 27, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 35, + "end_col": 34, "end_line": 23, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" }, "parent_location": [ { - "end_col": 39, - "end_line": 282, + "end_col": 38, + "end_line": 366, "input_file": { - "filename": "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/starkware/starknet/common/syscalls.cairo" + "filename": "/home/speed/src/golang/chainlink-starknet/.venv/lib/python3.9/site-packages/starkware/starknet/common/syscalls.cairo" }, "parent_location": [ { @@ -1426,7 +1086,7 @@ "While trying to retrieve the implicit argument 'syscall_ptr' in:" ], "start_col": 20, - "start_line": 282 + "start_line": 366 }, "While expanding the reference 'syscall_ptr' in:" ], @@ -1440,19 +1100,7 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 8 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 30, - "__main__.balance.write.range_check_ptr": 31, - "__main__.balance.write.storage_addr": 32, - "__main__.balance.write.syscall_ptr": 27, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 26, @@ -1482,19 +1130,7 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 9 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 30, - "__main__.balance.write.range_check_ptr": 31, - "__main__.balance.write.storage_addr": 32, - "__main__.balance.write.syscall_ptr": 27, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 79, @@ -1512,19 +1148,7 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 10 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 30, - "__main__.balance.write.range_check_ptr": 31, - "__main__.balance.write.storage_addr": 32, - "__main__.balance.write.syscall_ptr": 27, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 80, @@ -1542,22 +1166,10 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 14 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 30, - "__main__.balance.write.range_check_ptr": 31, - "__main__.balance.write.storage_addr": 32, - "__main__.balance.write.syscall_ptr": 33, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 42, + "end_col": 41, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1571,14 +1183,14 @@ }, "parent_location": [ { - "end_col": 64, + "end_col": 62, "end_line": 19, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" }, "parent_location": [ { - "end_col": 18, + "end_col": 19, "end_line": 26, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" @@ -1588,7 +1200,7 @@ }, "While trying to retrieve the implicit argument 'pedersen_ptr' in:" ], - "start_col": 37, + "start_col": 36, "start_line": 19 }, "While expanding the reference 'pedersen_ptr' in:" @@ -1608,22 +1220,10 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 15 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 30, - "__main__.balance.write.range_check_ptr": 31, - "__main__.balance.write.storage_addr": 32, - "__main__.balance.write.syscall_ptr": 33, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 59, + "end_col": 58, "end_line": 7, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1637,14 +1237,14 @@ }, "parent_location": [ { - "end_col": 81, + "end_col": 79, "end_line": 19, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" }, "parent_location": [ { - "end_col": 18, + "end_col": 19, "end_line": 26, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" @@ -1654,7 +1254,7 @@ }, "While trying to retrieve the implicit argument 'range_check_ptr' in:" ], - "start_col": 66, + "start_col": 64, "start_line": 19 }, "While expanding the reference 'range_check_ptr' in:" @@ -1664,7 +1264,7 @@ }, "While trying to update the implicit return value 'range_check_ptr' in:" ], - "start_col": 44, + "start_col": 43, "start_line": 7 } }, @@ -1674,22 +1274,10 @@ "__main__.balance", "__main__.balance.write" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 16 - }, - "reference_ids": { - "__main__.balance.write.pedersen_ptr": 30, - "__main__.balance.write.range_check_ptr": 31, - "__main__.balance.write.storage_addr": 32, - "__main__.balance.write.syscall_ptr": 33, - "__main__.balance.write.value": 26 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 18, + "end_col": 19, "end_line": 26, "input_file": { "filename": "autogen/starknet/storage_var/balance/impl.cairo" @@ -1704,28 +1292,17 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 0 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 36, - "__main__.increase_balance.range_check_ptr": 37, - "__main__.increase_balance.syscall_ptr": 35 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 42, - "end_line": 13, + "end_col": 23, + "end_line": 14, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 34, + "end_col": 33, "end_line": 13, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1733,12 +1310,12 @@ "parent_location": [ { "end_col": 31, - "end_line": 16, + "end_line": 18, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 17, - "start_line": 16 + "start_line": 18 }, "While trying to retrieve the implicit argument 'syscall_ptr' in:" ], @@ -1747,8 +1324,8 @@ }, "While expanding the reference 'syscall_ptr' in:" ], - "start_col": 23, - "start_line": 13 + "start_col": 5, + "start_line": 14 } }, "47": { @@ -1757,28 +1334,17 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 1 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 36, - "__main__.increase_balance.range_check_ptr": 37, - "__main__.increase_balance.syscall_ptr": 35 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 71, - "end_line": 13, + "end_col": 31, + "end_line": 15, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 63, + "end_col": 61, "end_line": 13, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1786,22 +1352,22 @@ "parent_location": [ { "end_col": 31, - "end_line": 16, + "end_line": 18, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 17, - "start_line": 16 + "start_line": 18 }, "While trying to retrieve the implicit argument 'pedersen_ptr' in:" ], - "start_col": 36, + "start_col": 35, "start_line": 13 }, "While expanding the reference 'pedersen_ptr' in:" ], - "start_col": 44, - "start_line": 13 + "start_col": 5, + "start_line": 15 } }, "48": { @@ -1810,28 +1376,17 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 2 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 36, - "__main__.increase_balance.range_check_ptr": 37, - "__main__.increase_balance.syscall_ptr": 35 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 88, - "end_line": 13, + "end_col": 20, + "end_line": 16, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 80, + "end_col": 78, "end_line": 13, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1839,22 +1394,22 @@ "parent_location": [ { "end_col": 31, - "end_line": 16, + "end_line": 18, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 17, - "start_line": 16 + "start_line": 18 }, "While trying to retrieve the implicit argument 'range_check_ptr' in:" ], - "start_col": 65, + "start_col": 63, "start_line": 13 }, "While expanding the reference 'range_check_ptr' in:" ], - "start_col": 73, - "start_line": 13 + "start_col": 5, + "start_line": 16 } }, "49": { @@ -1863,27 +1418,16 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 3 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 36, - "__main__.increase_balance.range_check_ptr": 37, - "__main__.increase_balance.syscall_ptr": 35 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 31, - "end_line": 16, + "end_line": 18, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 17, - "start_line": 16 + "start_line": 18 } }, "51": { @@ -1892,22 +1436,10 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 23 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 39, - "__main__.increase_balance.range_check_ptr": 40, - "__main__.increase_balance.res": 41, - "__main__.increase_balance.syscall_ptr": 38 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 34, + "end_col": 33, "end_line": 13, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1915,13 +1447,13 @@ "parent_location": [ { "end_col": 31, - "end_line": 16, + "end_line": 18, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 35, + "end_col": 34, "end_line": 19, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1929,12 +1461,12 @@ "parent_location": [ { "end_col": 32, - "end_line": 17, + "end_line": 19, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 5, - "start_line": 17 + "start_line": 19 }, "While trying to retrieve the implicit argument 'syscall_ptr' in:" ], @@ -1944,7 +1476,7 @@ "While expanding the reference 'syscall_ptr' in:" ], "start_col": 17, - "start_line": 16 + "start_line": 18 }, "While trying to update the implicit return value 'syscall_ptr' in:" ], @@ -1958,22 +1490,10 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 24 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 39, - "__main__.increase_balance.range_check_ptr": 40, - "__main__.increase_balance.res": 41, - "__main__.increase_balance.syscall_ptr": 38 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 63, + "end_col": 61, "end_line": 13, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1981,13 +1501,13 @@ "parent_location": [ { "end_col": 31, - "end_line": 16, + "end_line": 18, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 64, + "end_col": 62, "end_line": 19, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -1995,26 +1515,26 @@ "parent_location": [ { "end_col": 32, - "end_line": 17, + "end_line": 19, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 5, - "start_line": 17 + "start_line": 19 }, "While trying to retrieve the implicit argument 'pedersen_ptr' in:" ], - "start_col": 37, + "start_col": 36, "start_line": 19 }, "While expanding the reference 'pedersen_ptr' in:" ], "start_col": 17, - "start_line": 16 + "start_line": 18 }, "While trying to update the implicit return value 'pedersen_ptr' in:" ], - "start_col": 36, + "start_col": 35, "start_line": 13 } }, @@ -2024,22 +1544,10 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 25 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 39, - "__main__.increase_balance.range_check_ptr": 40, - "__main__.increase_balance.res": 41, - "__main__.increase_balance.syscall_ptr": 38 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 80, + "end_col": 78, "end_line": 13, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -2047,13 +1555,13 @@ "parent_location": [ { "end_col": 31, - "end_line": 16, + "end_line": 18, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 81, + "end_col": 79, "end_line": 19, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -2061,26 +1569,26 @@ "parent_location": [ { "end_col": 32, - "end_line": 17, + "end_line": 19, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 5, - "start_line": 17 + "start_line": 19 }, "While trying to retrieve the implicit argument 'range_check_ptr' in:" ], - "start_col": 66, + "start_col": 64, "start_line": 19 }, "While expanding the reference 'range_check_ptr' in:" ], "start_col": 17, - "start_line": 16 + "start_line": 18 }, "While trying to update the implicit return value 'range_check_ptr' in:" ], - "start_col": 65, + "start_col": 63, "start_line": 13 } }, @@ -2090,28 +1598,16 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 26 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 39, - "__main__.increase_balance.range_check_ptr": 40, - "__main__.increase_balance.res": 41, - "__main__.increase_balance.syscall_ptr": 38 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 31, - "end_line": 17, + "end_line": 19, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 19, - "start_line": 17 + "start_line": 19 } }, "55": { @@ -2120,28 +1616,16 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 27 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 39, - "__main__.increase_balance.range_check_ptr": 40, - "__main__.increase_balance.res": 41, - "__main__.increase_balance.syscall_ptr": 38 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 32, - "end_line": 17, + "end_line": 19, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 5, - "start_line": 17 + "start_line": 19 } }, "57": { @@ -2150,28 +1634,16 @@ "__main__", "__main__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 45 - }, - "reference_ids": { - "__main__.increase_balance.amount": 34, - "__main__.increase_balance.pedersen_ptr": 43, - "__main__.increase_balance.range_check_ptr": 44, - "__main__.increase_balance.res": 41, - "__main__.increase_balance.syscall_ptr": 42 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 14, - "end_line": 18, + "end_col": 15, + "end_line": 20, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 5, - "start_line": 18 + "start_line": 20 } }, "58": { @@ -2181,61 +1653,48 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 0 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.pedersen_ptr": 46, - "__wrappers__.increase_balance.range_check_ptr": 47, - "__wrappers__.increase_balance.syscall_ptr": 45 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 40, "end_line": 2, "input_file": { - "filename": "autogen/starknet/arg_processor/7a16feca69d1dc1343a49177e1e57103319136de3f2c6fabefae170177a1305e.cairo" + "filename": "autogen/starknet/arg_processor/73e68c490b7650388f650e9e1ff9b2b3ced88dabf86213d6a0831077eb1a0800.cairo" }, "parent_location": [ { - "end_col": 18, - "end_line": 14, + "end_col": 15, + "end_line": 17, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 45, "end_line": 1, "input_file": { - "filename": "autogen/starknet/arg_processor/5e1cc73f0b484f90bb02da164d88332b40c6f698801aa4d3c603dab22157e902.cairo" + "filename": "autogen/starknet/arg_processor/c31620b02d4d706f0542c989b2aadc01b0981d1f6a5933a8fe4937ace3d70d92.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 57, "end_line": 1, "input_file": { - "filename": "autogen/starknet/arg_processor/1b562308a65653425ce06491fa4b4539466f3251a07e73e099d0afe86a48900e.cairo" + "filename": "autogen/starknet/arg_processor/01cba52f8515996bb9d7070bde81ff39281d096d7024a558efcba6e1fd2402cf.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -2257,8 +1716,8 @@ }, "While expanding the reference '__calldata_ptr' in:" ], - "start_col": 5, - "start_line": 14 + "start_col": 3, + "start_line": 17 }, "While handling calldata argument 'amount'" ], @@ -2273,34 +1732,20 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 1 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 46, - "__wrappers__.increase_balance.range_check_ptr": 47, - "__wrappers__.increase_balance.syscall_ptr": 45 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 57, + "end_col": 58, "end_line": 1, "input_file": { - "filename": "autogen/starknet/arg_processor/1b562308a65653425ce06491fa4b4539466f3251a07e73e099d0afe86a48900e.cairo" + "filename": "autogen/starknet/arg_processor/01cba52f8515996bb9d7070bde81ff39281d096d7024a558efcba6e1fd2402cf.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -2318,61 +1763,47 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 1 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 46, - "__wrappers__.increase_balance.range_check_ptr": 47, - "__wrappers__.increase_balance.syscall_ptr": 45 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 64, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/c7060df96cb0acca1380ae43bf758cab727bfdf73cb5d34a93e24a9742817fda.cairo" + "filename": "autogen/starknet/external/increase_balance/b2c52ca2d2a8fc8791a983086d8716c5eacd0c3d62934914d2286f84b98ff4cb.cairo" }, "parent_location": [ { - "end_col": 42, - "end_line": 13, + "end_col": 23, + "end_line": 14, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 56, + "end_col": 55, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 }, "While constructing the external wrapper for:" ], - "start_col": 45, + "start_col": 44, "start_line": 1 }, "While expanding the reference 'syscall_ptr' in:" ], - "start_col": 23, - "start_line": 13 + "start_col": 5, + "start_line": 14 }, "While constructing the external wrapper for:" ], @@ -2387,61 +1818,47 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 2 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 46, - "__wrappers__.increase_balance.range_check_ptr": 47, - "__wrappers__.increase_balance.syscall_ptr": 45 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 110, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/424b26e79f70343cc02557f1fbd25745138efb26a3dc5c8b593ca765b73138b7.cairo" + "filename": "autogen/starknet/external/increase_balance/9684a85e93c782014ca14293edea4eb2502039a5a7b6538ecd39c56faaf12529.cairo" }, "parent_location": [ { - "end_col": 71, - "end_line": 13, + "end_col": 31, + "end_line": 15, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 83, + "end_col": 82, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 }, "While constructing the external wrapper for:" ], - "start_col": 71, + "start_col": 70, "start_line": 1 }, "While expanding the reference 'pedersen_ptr' in:" ], - "start_col": 44, - "start_line": 13 + "start_col": 5, + "start_line": 15 }, "While constructing the external wrapper for:" ], @@ -2456,61 +1873,47 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 3 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 46, - "__wrappers__.increase_balance.range_check_ptr": 47, - "__wrappers__.increase_balance.syscall_ptr": 45 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 67, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/e651458745e7cd218121c342e0915890767e2f59ddc2e315b8844ad0f47d582e.cairo" + "filename": "autogen/starknet/external/increase_balance/741ea357d6336b0bed7bf0472425acd0311d543883b803388880e60a232040c7.cairo" }, "parent_location": [ { - "end_col": 88, - "end_line": 13, + "end_col": 20, + "end_line": 16, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 116, + "end_col": 115, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 }, "While constructing the external wrapper for:" ], - "start_col": 101, + "start_col": 100, "start_line": 1 }, "While expanding the reference 'range_check_ptr' in:" ], - "start_col": 73, - "start_line": 13 + "start_col": 5, + "start_line": 16 }, "While constructing the external wrapper for:" ], @@ -2525,61 +1928,47 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 4 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 46, - "__wrappers__.increase_balance.range_check_ptr": 47, - "__wrappers__.increase_balance.syscall_ptr": 45 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 45, "end_line": 1, "input_file": { - "filename": "autogen/starknet/arg_processor/7a16feca69d1dc1343a49177e1e57103319136de3f2c6fabefae170177a1305e.cairo" + "filename": "autogen/starknet/arg_processor/73e68c490b7650388f650e9e1ff9b2b3ced88dabf86213d6a0831077eb1a0800.cairo" }, "parent_location": [ { - "end_col": 18, - "end_line": 14, + "end_col": 15, + "end_line": 17, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 146, + "end_col": 145, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 }, "While constructing the external wrapper for:" ], - "start_col": 125, + "start_col": 124, "start_line": 1 }, "While expanding the reference '__calldata_arg_amount' in:" ], - "start_col": 5, - "start_line": 14 + "start_col": 3, + "start_line": 17 }, "While handling calldata argument 'amount'" ], @@ -2594,27 +1983,13 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 5 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 46, - "__wrappers__.increase_balance.range_check_ptr": 47, - "__wrappers__.increase_balance.syscall_ptr": 45 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -2627,36 +2002,21 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 52 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 54, - "__wrappers__.increase_balance.range_check_ptr": 55, - "__wrappers__.increase_balance.ret_struct": 56, - "__wrappers__.increase_balance.syscall_ptr": 53 - } - }, + "flow_tracking_data": null, "hints": [ { "location": { "end_col": 34, "end_line": 2, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -2673,14 +2033,14 @@ "end_col": 24, "end_line": 3, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -2698,51 +2058,34 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 53 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 54, - "__wrappers__.increase_balance.range_check_ptr": 55, - "__wrappers__.increase_balance.ret_struct": 56, - "__wrappers__.increase_balance.retdata": 57, - "__wrappers__.increase_balance.retdata_size": 58, - "__wrappers__.increase_balance.syscall_ptr": 53 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 56, + "end_col": 55, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 20, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/increase_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -2759,7 +2102,7 @@ }, "While constructing the external wrapper for:" ], - "start_col": 45, + "start_col": 44, "start_line": 1 } }, @@ -2770,51 +2113,34 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 54 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 54, - "__wrappers__.increase_balance.range_check_ptr": 55, - "__wrappers__.increase_balance.ret_struct": 56, - "__wrappers__.increase_balance.retdata": 57, - "__wrappers__.increase_balance.retdata_size": 58, - "__wrappers__.increase_balance.syscall_ptr": 53 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 83, + "end_col": 82, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 33, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/increase_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -2831,7 +2157,7 @@ }, "While constructing the external wrapper for:" ], - "start_col": 71, + "start_col": 70, "start_line": 1 } }, @@ -2842,51 +2168,34 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 55 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 54, - "__wrappers__.increase_balance.range_check_ptr": 55, - "__wrappers__.increase_balance.ret_struct": 56, - "__wrappers__.increase_balance.retdata": 57, - "__wrappers__.increase_balance.retdata_size": 58, - "__wrappers__.increase_balance.syscall_ptr": 53 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 116, + "end_col": 115, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 49, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/increase_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -2903,7 +2212,7 @@ }, "While constructing the external wrapper for:" ], - "start_col": 101, + "start_col": 100, "start_line": 1 } }, @@ -2914,51 +2223,34 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 56 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 54, - "__wrappers__.increase_balance.range_check_ptr": 55, - "__wrappers__.increase_balance.ret_struct": 56, - "__wrappers__.increase_balance.retdata": 57, - "__wrappers__.increase_balance.retdata_size": 58, - "__wrappers__.increase_balance.syscall_ptr": 53 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 21, "end_line": 4, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 62, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/increase_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -2986,51 +2278,34 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 57 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 54, - "__wrappers__.increase_balance.range_check_ptr": 55, - "__wrappers__.increase_balance.ret_struct": 56, - "__wrappers__.increase_balance.retdata": 57, - "__wrappers__.increase_balance.retdata_size": 58, - "__wrappers__.increase_balance.syscall_ptr": 53 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 16, "end_line": 3, "input_file": { - "filename": "autogen/starknet/external/increase_balance/b659e0b441b52e0e1ab35c834d1991f044fe80d7b0593ebe3e771ee044a7dabb.cairo" + "filename": "autogen/starknet/external/increase_balance/a41d25a92a3a14a71125d51d48dd7398e2839f055f01551b7b1950eafc1187c0.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 70, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/increase_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -3058,37 +2333,20 @@ "__wrappers__", "__wrappers__.increase_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 58 - }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 54, - "__wrappers__.increase_balance.range_check_ptr": 55, - "__wrappers__.increase_balance.ret_struct": 56, - "__wrappers__.increase_balance.retdata": 57, - "__wrappers__.increase_balance.retdata_size": 58, - "__wrappers__.increase_balance.syscall_ptr": 53 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 71, + "end_col": 72, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/increase_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/increase_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 22, "end_line": 13, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, "start_line": 13 @@ -3105,27 +2363,17 @@ "__main__", "__main__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 7, - "offset": 0 - }, - "reference_ids": { - "__main__.get_balance.pedersen_ptr": 60, - "__main__.get_balance.range_check_ptr": 61, - "__main__.get_balance.syscall_ptr": 59 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 37, - "end_line": 23, + "end_col": 23, + "end_line": 26, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 34, + "end_col": 33, "end_line": 13, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -3133,12 +2381,12 @@ "parent_location": [ { "end_col": 31, - "end_line": 26, + "end_line": 30, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 17, - "start_line": 26 + "start_line": 30 }, "While trying to retrieve the implicit argument 'syscall_ptr' in:" ], @@ -3147,8 +2395,8 @@ }, "While expanding the reference 'syscall_ptr' in:" ], - "start_col": 18, - "start_line": 23 + "start_col": 5, + "start_line": 26 } }, "77": { @@ -3157,27 +2405,17 @@ "__main__", "__main__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 7, - "offset": 1 - }, - "reference_ids": { - "__main__.get_balance.pedersen_ptr": 60, - "__main__.get_balance.range_check_ptr": 61, - "__main__.get_balance.syscall_ptr": 59 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 66, - "end_line": 23, + "end_col": 31, + "end_line": 27, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 63, + "end_col": 61, "end_line": 13, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -3185,22 +2423,22 @@ "parent_location": [ { "end_col": 31, - "end_line": 26, + "end_line": 30, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 17, - "start_line": 26 + "start_line": 30 }, "While trying to retrieve the implicit argument 'pedersen_ptr' in:" ], - "start_col": 36, + "start_col": 35, "start_line": 13 }, "While expanding the reference 'pedersen_ptr' in:" ], - "start_col": 39, - "start_line": 23 + "start_col": 5, + "start_line": 27 } }, "78": { @@ -3209,27 +2447,17 @@ "__main__", "__main__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 7, - "offset": 2 - }, - "reference_ids": { - "__main__.get_balance.pedersen_ptr": 60, - "__main__.get_balance.range_check_ptr": 61, - "__main__.get_balance.syscall_ptr": 59 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 83, - "end_line": 23, + "end_col": 20, + "end_line": 28, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 80, + "end_col": 78, "end_line": 13, "input_file": { "filename": "autogen/starknet/storage_var/balance/decl.cairo" @@ -3237,22 +2465,22 @@ "parent_location": [ { "end_col": 31, - "end_line": 26, + "end_line": 30, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 17, - "start_line": 26 + "start_line": 30 }, "While trying to retrieve the implicit argument 'range_check_ptr' in:" ], - "start_col": 65, + "start_col": 63, "start_line": 13 }, "While expanding the reference 'range_check_ptr' in:" ], - "start_col": 68, - "start_line": 23 + "start_col": 5, + "start_line": 28 } }, "79": { @@ -3261,26 +2489,16 @@ "__main__", "__main__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 7, - "offset": 3 - }, - "reference_ids": { - "__main__.get_balance.pedersen_ptr": 60, - "__main__.get_balance.range_check_ptr": 61, - "__main__.get_balance.syscall_ptr": 59 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 31, - "end_line": 26, + "end_line": 30, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 17, - "start_line": 26 + "start_line": 30 } }, "81": { @@ -3289,27 +2507,16 @@ "__main__", "__main__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 7, - "offset": 23 - }, - "reference_ids": { - "__main__.get_balance.pedersen_ptr": 63, - "__main__.get_balance.range_check_ptr": 64, - "__main__.get_balance.res": 65, - "__main__.get_balance.syscall_ptr": 62 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 17, - "end_line": 27, + "end_col": 22, + "end_line": 31, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 5, - "start_line": 27 + "start_line": 31 } }, "82": { @@ -3319,33 +2526,24 @@ "__wrappers__", "__wrappers__.get_balance_encode_return" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 8, - "offset": 0 - }, - "reference_ids": { - "__wrappers__.get_balance_encode_return.range_check_ptr": 67, - "__wrappers__.get_balance_encode_return.ret_struct": 66 - } - }, + "flow_tracking_data": null, "hints": [ { "location": { "end_col": 38, "end_line": 3, "input_file": { - "filename": "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo" + "filename": "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling return value of" ], @@ -3356,20 +2554,20 @@ } ], "inst": { - "end_col": 17, + "end_col": 18, "end_line": 4, "input_file": { - "filename": "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo" + "filename": "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling return value of" ], @@ -3384,34 +2582,23 @@ "__wrappers__", "__wrappers__.get_balance_encode_return" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 8, - "offset": 1 - }, - "reference_ids": { - "__wrappers__.get_balance_encode_return.__return_value_ptr": 69, - "__wrappers__.get_balance_encode_return.__return_value_ptr_start": 68, - "__wrappers__.get_balance_encode_return.range_check_ptr": 67, - "__wrappers__.get_balance_encode_return.ret_struct": 66 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 45, "end_line": 1, "input_file": { - "filename": "autogen/starknet/arg_processor/fee896b6d05b2e98056b5628baa6fbee0adfb8960f3fee9d79fd2f066956cc42.cairo" + "filename": "autogen/starknet/arg_processor/293368f3a0e12cfcf22314a31e13b9801e95a5b8b2b71822a2fbbdf5a01ea795.cairo" }, "parent_location": [ { - "end_col": 15, - "end_line": 24, + "end_col": 18, + "end_line": 29, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, - "start_col": 5, - "start_line": 24 + "start_col": 9, + "start_line": 29 }, "While handling return value 'res'" ], @@ -3426,48 +2613,37 @@ "__wrappers__", "__wrappers__.get_balance_encode_return" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 8, - "offset": 1 - }, - "reference_ids": { - "__wrappers__.get_balance_encode_return.__return_value_ptr": 70, - "__wrappers__.get_balance_encode_return.__return_value_ptr_start": 68, - "__wrappers__.get_balance_encode_return.range_check_ptr": 67, - "__wrappers__.get_balance_encode_return.ret_struct": 66 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 48, "end_line": 2, "input_file": { - "filename": "autogen/starknet/arg_processor/fee896b6d05b2e98056b5628baa6fbee0adfb8960f3fee9d79fd2f066956cc42.cairo" + "filename": "autogen/starknet/arg_processor/293368f3a0e12cfcf22314a31e13b9801e95a5b8b2b71822a2fbbdf5a01ea795.cairo" }, "parent_location": [ { - "end_col": 15, - "end_line": 24, + "end_col": 18, + "end_line": 29, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 36, "end_line": 11, "input_file": { - "filename": "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo" + "filename": "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling return value of" ], @@ -3476,8 +2652,8 @@ }, "While expanding the reference '__return_value_ptr' in:" ], - "start_col": 5, - "start_line": 24 + "start_col": 9, + "start_line": 29 }, "While handling return value 'res'" ], @@ -3492,49 +2668,37 @@ "__wrappers__", "__wrappers__.get_balance_encode_return" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 8, - "offset": 2 - }, - "reference_ids": { - "__wrappers__.get_balance_encode_return.__return_value_ptr": 70, - "__wrappers__.get_balance_encode_return.__return_value_ptr_start": 68, - "__wrappers__.get_balance_encode_return.__temp3": 71, - "__wrappers__.get_balance_encode_return.range_check_ptr": 67, - "__wrappers__.get_balance_encode_return.ret_struct": 66 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 89, + "end_col": 71, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo" + "filename": "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 40, "end_line": 10, "input_file": { - "filename": "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo" + "filename": "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling return value of" ], @@ -3544,11 +2708,11 @@ "While expanding the reference 'range_check_ptr' in:" ], "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling return value of" ], - "start_col": 74, + "start_col": 56, "start_line": 1 } }, @@ -3559,35 +2723,23 @@ "__wrappers__", "__wrappers__.get_balance_encode_return" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 8, - "offset": 3 - }, - "reference_ids": { - "__wrappers__.get_balance_encode_return.__return_value_ptr": 70, - "__wrappers__.get_balance_encode_return.__return_value_ptr_start": 68, - "__wrappers__.get_balance_encode_return.__temp3": 71, - "__wrappers__.get_balance_encode_return.range_check_ptr": 67, - "__wrappers__.get_balance_encode_return.ret_struct": 66 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 63, "end_line": 11, "input_file": { - "filename": "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo" + "filename": "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling return value of" ], @@ -3602,49 +2754,37 @@ "__wrappers__", "__wrappers__.get_balance_encode_return" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 8, - "offset": 4 - }, - "reference_ids": { - "__wrappers__.get_balance_encode_return.__return_value_ptr": 70, - "__wrappers__.get_balance_encode_return.__return_value_ptr_start": 68, - "__wrappers__.get_balance_encode_return.__temp3": 71, - "__wrappers__.get_balance_encode_return.range_check_ptr": 67, - "__wrappers__.get_balance_encode_return.ret_struct": 66 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 35, "end_line": 5, "input_file": { - "filename": "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo" + "filename": "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 38, "end_line": 12, "input_file": { - "filename": "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo" + "filename": "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling return value of" ], @@ -3654,7 +2794,7 @@ "While expanding the reference '__return_value_ptr_start' in:" ], "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling return value of" ], @@ -3669,35 +2809,23 @@ "__wrappers__", "__wrappers__.get_balance_encode_return" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 8, - "offset": 5 - }, - "reference_ids": { - "__wrappers__.get_balance_encode_return.__return_value_ptr": 70, - "__wrappers__.get_balance_encode_return.__return_value_ptr_start": 68, - "__wrappers__.get_balance_encode_return.__temp3": 71, - "__wrappers__.get_balance_encode_return.range_check_ptr": 67, - "__wrappers__.get_balance_encode_return.ret_struct": 66 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 39, + "end_col": 40, "end_line": 12, "input_file": { - "filename": "autogen/starknet/external/return/get_balance/4347b8d39c88b0ad2e8b75ecb28ec6466349f83ba13797a9224bef1cda14278c.cairo" + "filename": "autogen/starknet/external/return/get_balance/9ef0a2b9ad0a2e2b202322d7261fff6dada72892e286df2230a9eb8873880a98.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling return value of" ], @@ -3712,35 +2840,23 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 0 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 73, - "__wrappers__.get_balance.range_check_ptr": 74, - "__wrappers__.get_balance.syscall_ptr": 72 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 57, + "end_col": 58, "end_line": 1, "input_file": { - "filename": "autogen/starknet/arg_processor/1b562308a65653425ce06491fa4b4539466f3251a07e73e099d0afe86a48900e.cairo" + "filename": "autogen/starknet/arg_processor/01cba52f8515996bb9d7070bde81ff39281d096d7024a558efcba6e1fd2402cf.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While handling calldata of" ], @@ -3755,59 +2871,47 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 0 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 73, - "__wrappers__.get_balance.range_check_ptr": 74, - "__wrappers__.get_balance.syscall_ptr": 72 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 64, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/c7060df96cb0acca1380ae43bf758cab727bfdf73cb5d34a93e24a9742817fda.cairo" + "filename": "autogen/starknet/external/get_balance/b2c52ca2d2a8fc8791a983086d8716c5eacd0c3d62934914d2286f84b98ff4cb.cairo" }, "parent_location": [ { - "end_col": 37, - "end_line": 23, + "end_col": 23, + "end_line": 26, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 56, + "end_col": 55, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], - "start_col": 45, + "start_col": 44, "start_line": 1 }, "While expanding the reference 'syscall_ptr' in:" ], - "start_col": 18, - "start_line": 23 + "start_col": 5, + "start_line": 26 }, "While constructing the external wrapper for:" ], @@ -3822,59 +2926,47 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 1 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 73, - "__wrappers__.get_balance.range_check_ptr": 74, - "__wrappers__.get_balance.syscall_ptr": 72 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 110, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/424b26e79f70343cc02557f1fbd25745138efb26a3dc5c8b593ca765b73138b7.cairo" + "filename": "autogen/starknet/external/get_balance/9684a85e93c782014ca14293edea4eb2502039a5a7b6538ecd39c56faaf12529.cairo" }, "parent_location": [ { - "end_col": 66, - "end_line": 23, + "end_col": 31, + "end_line": 27, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 83, + "end_col": 82, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], - "start_col": 71, + "start_col": 70, "start_line": 1 }, "While expanding the reference 'pedersen_ptr' in:" ], - "start_col": 39, - "start_line": 23 + "start_col": 5, + "start_line": 27 }, "While constructing the external wrapper for:" ], @@ -3889,59 +2981,47 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 2 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 73, - "__wrappers__.get_balance.range_check_ptr": 74, - "__wrappers__.get_balance.syscall_ptr": 72 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 67, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/e651458745e7cd218121c342e0915890767e2f59ddc2e315b8844ad0f47d582e.cairo" + "filename": "autogen/starknet/external/get_balance/741ea357d6336b0bed7bf0472425acd0311d543883b803388880e60a232040c7.cairo" }, "parent_location": [ { - "end_col": 83, - "end_line": 23, + "end_col": 20, + "end_line": 28, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 116, + "end_col": 115, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], - "start_col": 101, + "start_col": 100, "start_line": 1 }, "While expanding the reference 'range_check_ptr' in:" ], - "start_col": 68, - "start_line": 23 + "start_col": 5, + "start_line": 28 }, "While constructing the external wrapper for:" ], @@ -3956,28 +3036,16 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 3 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 73, - "__wrappers__.get_balance.range_check_ptr": 74, - "__wrappers__.get_balance.syscall_ptr": 72 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 } }, "97": { @@ -3987,64 +3055,51 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 28 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 78, - "__wrappers__.get_balance.range_check_ptr": 79, - "__wrappers__.get_balance.ret_struct": 80, - "__wrappers__.get_balance.syscall_ptr": 77 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 116, + "end_col": 115, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { - "end_col": 101, + "end_col": 100, "end_line": 2, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], - "start_col": 86, + "start_col": 85, "start_line": 2 }, "While expanding the reference 'range_check_ptr' in:" ], "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], - "start_col": 101, + "start_col": 100, "start_line": 1 } }, @@ -4055,36 +3110,23 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 29 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 78, - "__wrappers__.get_balance.range_check_ptr": 79, - "__wrappers__.get_balance.ret_struct": 80, - "__wrappers__.get_balance.syscall_ptr": 77 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 102, + "end_col": 101, "end_line": 2, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4099,52 +3141,37 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 36 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 78, - "__wrappers__.get_balance.range_check_ptr": 81, - "__wrappers__.get_balance.ret_struct": 80, - "__wrappers__.get_balance.retdata": 83, - "__wrappers__.get_balance.retdata_size": 82, - "__wrappers__.get_balance.syscall_ptr": 77 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 56, + "end_col": 55, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 20, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/get_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4154,11 +3181,11 @@ "While expanding the reference 'syscall_ptr' in:" ], "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], - "start_col": 45, + "start_col": 44, "start_line": 1 } }, @@ -4169,52 +3196,37 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 37 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 78, - "__wrappers__.get_balance.range_check_ptr": 81, - "__wrappers__.get_balance.ret_struct": 80, - "__wrappers__.get_balance.retdata": 83, - "__wrappers__.get_balance.retdata_size": 82, - "__wrappers__.get_balance.syscall_ptr": 77 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 83, + "end_col": 82, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 33, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/get_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4224,11 +3236,11 @@ "While expanding the reference 'pedersen_ptr' in:" ], "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], - "start_col": 71, + "start_col": 70, "start_line": 1 } }, @@ -4239,52 +3251,37 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 38 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 78, - "__wrappers__.get_balance.range_check_ptr": 81, - "__wrappers__.get_balance.ret_struct": 80, - "__wrappers__.get_balance.retdata": 83, - "__wrappers__.get_balance.retdata_size": 82, - "__wrappers__.get_balance.syscall_ptr": 77 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 21, "end_line": 2, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 49, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/get_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4294,7 +3291,7 @@ "While expanding the reference 'range_check_ptr' in:" ], "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4309,52 +3306,37 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 39 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 78, - "__wrappers__.get_balance.range_check_ptr": 81, - "__wrappers__.get_balance.ret_struct": 80, - "__wrappers__.get_balance.retdata": 83, - "__wrappers__.get_balance.retdata_size": 82, - "__wrappers__.get_balance.syscall_ptr": 77 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 35, "end_line": 2, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 62, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/get_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4364,7 +3346,7 @@ "While expanding the reference 'retdata_size' in:" ], "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4379,52 +3361,37 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 40 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 78, - "__wrappers__.get_balance.range_check_ptr": 81, - "__wrappers__.get_balance.ret_struct": 80, - "__wrappers__.get_balance.retdata": 83, - "__wrappers__.get_balance.retdata_size": 82, - "__wrappers__.get_balance.syscall_ptr": 77 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { "end_col": 44, "end_line": 2, "input_file": { - "filename": "autogen/starknet/external/get_balance/fe6bfd058f097fe6019d30e1c6708266c68be305a2d1051d1a94fe208482e3e9.cairo" + "filename": "autogen/starknet/external/get_balance/2c767dabe8478bfafd38f9fb907f9842d03e3c9d2b355e2af5c59b126fcc8f59.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "parent_location": [ { "end_col": 70, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/get_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4434,7 +3401,7 @@ "While expanding the reference 'retdata' in:" ], "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4449,38 +3416,23 @@ "__wrappers__", "__wrappers__.get_balance" ], - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 41 - }, - "reference_ids": { - "__wrappers__.get_balance.__calldata_actual_size": 76, - "__wrappers__.get_balance.__calldata_ptr": 75, - "__wrappers__.get_balance.pedersen_ptr": 78, - "__wrappers__.get_balance.range_check_ptr": 81, - "__wrappers__.get_balance.ret_struct": 80, - "__wrappers__.get_balance.retdata": 83, - "__wrappers__.get_balance.retdata_size": 82, - "__wrappers__.get_balance.syscall_ptr": 77 - } - }, + "flow_tracking_data": null, "hints": [], "inst": { - "end_col": 71, + "end_col": 72, "end_line": 1, "input_file": { - "filename": "autogen/starknet/external/get_balance/4ba2b119ceb30fe10f4cca3c9d73ef620c0fb5eece91b99a99d71217bba1001c.cairo" + "filename": "autogen/starknet/external/get_balance/da17921a4e81c09e730800bbf23bfdbe5e9e6bfaedc59d80fbf62087fa43c27d.cairo" }, "parent_location": [ { "end_col": 17, - "end_line": 23, + "end_line": 25, "input_file": { - "filename": "contract.cairo" + "filename": "example.cairo" }, "start_col": 6, - "start_line": 23 + "start_line": 25 }, "While constructing the external wrapper for:" ], @@ -4504,10 +3456,7 @@ "offset": 1 }, "reference_ids": { - "starkware.starknet.common.syscalls.storage_read.__temp0": 3, - "starkware.starknet.common.syscalls.storage_read.address": 0, - "starkware.starknet.common.syscalls.storage_read.syscall": 2, - "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 1 + "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 0 } } } @@ -4525,10 +3474,7 @@ "offset": 1 }, "reference_ids": { - "starkware.starknet.common.syscalls.storage_write.__temp1": 9, - "starkware.starknet.common.syscalls.storage_write.address": 6, - "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 8, - "starkware.starknet.common.syscalls.storage_write.value": 7 + "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 1 } } } @@ -4547,16 +3493,7 @@ "group": 6, "offset": 52 }, - "reference_ids": { - "__wrappers__.increase_balance.__calldata_actual_size": 51, - "__wrappers__.increase_balance.__calldata_arg_amount": 49, - "__wrappers__.increase_balance.__calldata_ptr": 50, - "__wrappers__.increase_balance.__temp2": 52, - "__wrappers__.increase_balance.pedersen_ptr": 54, - "__wrappers__.increase_balance.range_check_ptr": 55, - "__wrappers__.increase_balance.ret_struct": 56, - "__wrappers__.increase_balance.syscall_ptr": 53 - } + "reference_ids": {} } } ], @@ -4574,10 +3511,7 @@ "group": 8, "offset": 0 }, - "reference_ids": { - "__wrappers__.get_balance_encode_return.range_check_ptr": 67, - "__wrappers__.get_balance_encode_return.ret_struct": 66 - } + "reference_ids": {} } } ] @@ -4607,10 +3541,8 @@ "type": "struct" }, "__main__.balance.Return": { - "full_name": "__main__.balance.Return", - "members": {}, - "size": 0, - "type": "struct" + "cairo_type": "()", + "type": "type_definition" }, "__main__.balance.SIZEOF_LOCALS": { "type": "const", @@ -4643,65 +3575,13 @@ "type": "struct" }, "__main__.balance.addr.Return": { - "full_name": "__main__.balance.addr.Return", - "members": { - "res": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" + "cairo_type": "(res: felt)", + "type": "type_definition" }, "__main__.balance.addr.SIZEOF_LOCALS": { "type": "const", "value": 0 }, - "__main__.balance.addr.pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "full_name": "__main__.balance.addr.pedersen_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 16, - "value": "[cast(fp + (-4), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - } - ], - "type": "reference" - }, - "__main__.balance.addr.range_check_ptr": { - "cairo_type": "felt", - "full_name": "__main__.balance.addr.range_check_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 16, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" - }, - "__main__.balance.addr.res": { - "cairo_type": "felt", - "full_name": "__main__.balance.addr.res", - "references": [ - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 16, - "value": "cast(916907772491729262376534102982219947830828984996257231353398618781993312401, felt)" - } - ], - "type": "reference" - }, "__main__.balance.hash2": { "destination": "starkware.cairo.common.hash.hash2", "type": "alias" @@ -4741,151 +3621,13 @@ "type": "struct" }, "__main__.balance.read.Return": { - "full_name": "__main__.balance.read.Return", - "members": { - "res": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" + "cairo_type": "(res: felt)", + "type": "type_definition" }, "__main__.balance.read.SIZEOF_LOCALS": { "type": "const", "value": 0 }, - "__main__.balance.read.__storage_var_temp0": { - "cairo_type": "felt", - "full_name": "__main__.balance.read.__storage_var_temp0", - "references": [ - { - "ap_tracking_data": { - "group": 3, - "offset": 14 - }, - "pc": 29, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 18 - }, - "pc": 33, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "__main__.balance.read.pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "full_name": "__main__.balance.read.pedersen_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 21, - "value": "[cast(fp + (-4), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 7 - }, - "pc": 25, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 16 - }, - "pc": 31, - "value": "[cast(ap + (-1), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - } - ], - "type": "reference" - }, - "__main__.balance.read.range_check_ptr": { - "cairo_type": "felt", - "full_name": "__main__.balance.read.range_check_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 21, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 7 - }, - "pc": 25, - "value": "[cast(ap + (-2), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 17 - }, - "pc": 32, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "__main__.balance.read.storage_addr": { - "cairo_type": "felt", - "full_name": "__main__.balance.read.storage_addr", - "references": [ - { - "ap_tracking_data": { - "group": 3, - "offset": 7 - }, - "pc": 25, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "__main__.balance.read.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "__main__.balance.read.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 21, - "value": "[cast(fp + (-5), felt**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 14 - }, - "pc": 29, - "value": "[cast(ap + (-2), felt**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 15 - }, - "pc": 30, - "value": "[cast(ap + (-1), felt**)]" - } - ], - "type": "reference" - }, "__main__.balance.storage_read": { "destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias" @@ -4930,114 +3672,13 @@ "type": "struct" }, "__main__.balance.write.Return": { - "full_name": "__main__.balance.write.Return", - "members": {}, - "size": 0, - "type": "struct" + "cairo_type": "()", + "type": "type_definition" }, "__main__.balance.write.SIZEOF_LOCALS": { "type": "const", "value": 0 }, - "__main__.balance.write.pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "full_name": "__main__.balance.write.pedersen_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 34, - "value": "[cast(fp + (-5), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 7 - }, - "pc": 38, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - } - ], - "type": "reference" - }, - "__main__.balance.write.range_check_ptr": { - "cairo_type": "felt", - "full_name": "__main__.balance.write.range_check_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 34, - "value": "[cast(fp + (-4), felt*)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 7 - }, - "pc": 38, - "value": "[cast(ap + (-2), felt*)]" - } - ], - "type": "reference" - }, - "__main__.balance.write.storage_addr": { - "cairo_type": "felt", - "full_name": "__main__.balance.write.storage_addr", - "references": [ - { - "ap_tracking_data": { - "group": 4, - "offset": 7 - }, - "pc": 38, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "__main__.balance.write.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "__main__.balance.write.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 34, - "value": "[cast(fp + (-6), felt**)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 14 - }, - "pc": 43, - "value": "[cast(ap + (-1), felt**)]" - } - ], - "type": "reference" - }, - "__main__.balance.write.value": { - "cairo_type": "felt", - "full_name": "__main__.balance.write.value", - "references": [ - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 34, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" - }, "__main__.get_balance": { "decorators": [ "view" @@ -5071,104 +3712,13 @@ "type": "struct" }, "__main__.get_balance.Return": { - "full_name": "__main__.get_balance.Return", - "members": { - "res": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" + "cairo_type": "(res: felt)", + "type": "type_definition" }, "__main__.get_balance.SIZEOF_LOCALS": { "type": "const", "value": 0 }, - "__main__.get_balance.pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "full_name": "__main__.get_balance.pedersen_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 7, - "offset": 0 - }, - "pc": 76, - "value": "[cast(fp + (-4), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 23 - }, - "pc": 81, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - } - ], - "type": "reference" - }, - "__main__.get_balance.range_check_ptr": { - "cairo_type": "felt", - "full_name": "__main__.get_balance.range_check_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 7, - "offset": 0 - }, - "pc": 76, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 23 - }, - "pc": 81, - "value": "[cast(ap + (-2), felt*)]" - } - ], - "type": "reference" - }, - "__main__.get_balance.res": { - "cairo_type": "felt", - "full_name": "__main__.get_balance.res", - "references": [ - { - "ap_tracking_data": { - "group": 7, - "offset": 23 - }, - "pc": 81, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "__main__.get_balance.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "__main__.get_balance.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 7, - "offset": 0 - }, - "pc": 76, - "value": "[cast(fp + (-5), felt**)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 23 - }, - "pc": 81, - "value": "[cast(ap + (-4), felt**)]" - } - ], - "type": "reference" - }, "__main__.increase_balance": { "decorators": [ "external" @@ -5207,144 +3757,19 @@ "type": "struct" }, "__main__.increase_balance.Return": { - "full_name": "__main__.increase_balance.Return", - "members": {}, - "size": 0, - "type": "struct" + "cairo_type": "()", + "type": "type_definition" }, "__main__.increase_balance.SIZEOF_LOCALS": { "type": "const", "value": 0 }, - "__main__.increase_balance.amount": { - "cairo_type": "felt", - "full_name": "__main__.increase_balance.amount", - "references": [ - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 46, - "value": "[cast(fp + (-3), felt*)]" - } + "__wrappers__.get_balance": { + "decorators": [ + "view" ], - "type": "reference" - }, - "__main__.increase_balance.pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "full_name": "__main__.increase_balance.pedersen_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 46, - "value": "[cast(fp + (-5), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 23 - }, - "pc": 51, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 45 - }, - "pc": 57, - "value": "[cast(ap + (-2), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - } - ], - "type": "reference" - }, - "__main__.increase_balance.range_check_ptr": { - "cairo_type": "felt", - "full_name": "__main__.increase_balance.range_check_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 46, - "value": "[cast(fp + (-4), felt*)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 23 - }, - "pc": 51, - "value": "[cast(ap + (-2), felt*)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 45 - }, - "pc": 57, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "__main__.increase_balance.res": { - "cairo_type": "felt", - "full_name": "__main__.increase_balance.res", - "references": [ - { - "ap_tracking_data": { - "group": 5, - "offset": 23 - }, - "pc": 51, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "__main__.increase_balance.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "__main__.increase_balance.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 46, - "value": "[cast(fp + (-6), felt**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 23 - }, - "pc": 51, - "value": "[cast(ap + (-4), felt**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 45 - }, - "pc": 57, - "value": "[cast(ap + (-3), felt**)]" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance": { - "decorators": [ - "view" - ], - "pc": 91, - "type": "function" + "pc": 91, + "type": "function" }, "__wrappers__.get_balance.Args": { "full_name": "__wrappers__.get_balance.Args", @@ -5359,192 +3784,17 @@ "type": "struct" }, "__wrappers__.get_balance.Return": { - "full_name": "__wrappers__.get_balance.Return", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "retdata": { - "cairo_type": "felt*", - "offset": 4 - }, - "size": { - "cairo_type": "felt", - "offset": 3 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 5, - "type": "struct" + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", + "type": "type_definition" }, "__wrappers__.get_balance.SIZEOF_LOCALS": { "type": "const", "value": 0 }, - "__wrappers__.get_balance.__calldata_actual_size": { - "cairo_type": "felt", - "full_name": "__wrappers__.get_balance.__calldata_actual_size", - "references": [ - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "cast([fp + (-3)] - [fp + (-3)], felt)" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance.__calldata_ptr": { - "cairo_type": "felt*", - "full_name": "__wrappers__.get_balance.__calldata_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "[cast(fp + (-3), felt**)]" - } - ], - "type": "reference" - }, "__wrappers__.get_balance.__wrapped_func": { "destination": "__main__.get_balance", "type": "alias" }, - "__wrappers__.get_balance.pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "full_name": "__wrappers__.get_balance.pedersen_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "[cast([fp + (-5)] + 1, starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 28 - }, - "pc": 97, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance.range_check_ptr": { - "cairo_type": "felt", - "full_name": "__wrappers__.get_balance.range_check_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "[cast([fp + (-5)] + 2, felt*)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 28 - }, - "pc": 97, - "value": "[cast(ap + (-2), felt*)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 36 - }, - "pc": 100, - "value": "[cast(ap + (-3), felt*)]" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance.ret_struct": { - "cairo_type": "__main__.get_balance.Return", - "full_name": "__wrappers__.get_balance.ret_struct", - "references": [ - { - "ap_tracking_data": { - "group": 9, - "offset": 28 - }, - "pc": 97, - "value": "[cast(ap + (-1), __main__.get_balance.Return*)]" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance.retdata": { - "cairo_type": "felt*", - "full_name": "__wrappers__.get_balance.retdata", - "references": [ - { - "ap_tracking_data": { - "group": 9, - "offset": 36 - }, - "pc": 100, - "value": "[cast(ap + (-1), felt**)]" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance.retdata_size": { - "cairo_type": "felt", - "full_name": "__wrappers__.get_balance.retdata_size", - "references": [ - { - "ap_tracking_data": { - "group": 9, - "offset": 36 - }, - "pc": 100, - "value": "[cast(ap + (-2), felt*)]" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "__wrappers__.get_balance.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "[cast([fp + (-5)], felt**)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 28 - }, - "pc": 97, - "value": "[cast(ap + (-4), felt**)]" - } - ], - "type": "reference" - }, "__wrappers__.get_balance_encode_return": { "decorators": [], "pc": 82, @@ -5557,8 +3807,8 @@ "cairo_type": "felt", "offset": 1 }, - "ret_struct": { - "cairo_type": "__main__.get_balance.Return", + "ret_value": { + "cairo_type": "(res: felt)", "offset": 0 } }, @@ -5572,115 +3822,17 @@ "type": "struct" }, "__wrappers__.get_balance_encode_return.Return": { - "full_name": "__wrappers__.get_balance_encode_return.Return", - "members": { - "data": { - "cairo_type": "felt*", - "offset": 2 - }, - "data_len": { - "cairo_type": "felt", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 3, - "type": "struct" + "cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", + "type": "type_definition" }, "__wrappers__.get_balance_encode_return.SIZEOF_LOCALS": { "type": "const", "value": 1 }, - "__wrappers__.get_balance_encode_return.__return_value_ptr": { - "cairo_type": "felt*", - "full_name": "__wrappers__.get_balance_encode_return.__return_value_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 8, - "offset": 1 - }, - "pc": 84, - "value": "[cast(fp, felt**)]" - }, - { - "ap_tracking_data": { - "group": 8, - "offset": 1 - }, - "pc": 85, - "value": "cast([fp] + 1, felt*)" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance_encode_return.__return_value_ptr_start": { - "cairo_type": "felt*", - "full_name": "__wrappers__.get_balance_encode_return.__return_value_ptr_start", - "references": [ - { - "ap_tracking_data": { - "group": 8, - "offset": 1 - }, - "pc": 84, - "value": "[cast(fp, felt**)]" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance_encode_return.__temp3": { - "cairo_type": "felt", - "full_name": "__wrappers__.get_balance_encode_return.__temp3", - "references": [ - { - "ap_tracking_data": { - "group": 8, - "offset": 2 - }, - "pc": 87, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, "__wrappers__.get_balance_encode_return.memcpy": { "destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias" }, - "__wrappers__.get_balance_encode_return.range_check_ptr": { - "cairo_type": "felt", - "full_name": "__wrappers__.get_balance_encode_return.range_check_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 8, - "offset": 0 - }, - "pc": 82, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" - }, - "__wrappers__.get_balance_encode_return.ret_struct": { - "cairo_type": "__main__.get_balance.Return", - "full_name": "__wrappers__.get_balance_encode_return.ret_struct", - "references": [ - { - "ap_tracking_data": { - "group": 8, - "offset": 0 - }, - "pc": 82, - "value": "[cast(fp + (-4), __main__.get_balance.Return*)]" - } - ], - "type": "reference" - }, "__wrappers__.increase_balance": { "decorators": [ "external" @@ -5701,226 +3853,29 @@ "type": "struct" }, "__wrappers__.increase_balance.Return": { - "full_name": "__wrappers__.increase_balance.Return", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "retdata": { - "cairo_type": "felt*", - "offset": 4 - }, - "size": { - "cairo_type": "felt", - "offset": 3 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 5, - "type": "struct" + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", + "type": "type_definition" }, "__wrappers__.increase_balance.SIZEOF_LOCALS": { "type": "const", "value": 0 }, - "__wrappers__.increase_balance.__calldata_actual_size": { - "cairo_type": "felt", - "full_name": "__wrappers__.increase_balance.__calldata_actual_size", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "cast([fp + (-3)] + 1 - [fp + (-3)], felt)" - } - ], - "type": "reference" - }, - "__wrappers__.increase_balance.__calldata_arg_amount": { - "cairo_type": "felt", - "full_name": "__wrappers__.increase_balance.__calldata_arg_amount", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast([fp + (-3)], felt*)]" - } - ], - "type": "reference" - }, - "__wrappers__.increase_balance.__calldata_ptr": { - "cairo_type": "felt*", - "full_name": "__wrappers__.increase_balance.__calldata_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "cast([fp + (-3)] + 1, felt*)" - } - ], - "type": "reference" - }, - "__wrappers__.increase_balance.__temp2": { - "cairo_type": "felt", - "full_name": "__wrappers__.increase_balance.__temp2", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 1 - }, - "pc": 60, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, "__wrappers__.increase_balance.__wrapped_func": { "destination": "__main__.increase_balance", "type": "alias" }, - "__wrappers__.increase_balance.pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "full_name": "__wrappers__.increase_balance.pedersen_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast([fp + (-5)] + 1, starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 52 - }, - "pc": 67, - "value": "[cast(ap + (-2), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - } - ], - "type": "reference" - }, - "__wrappers__.increase_balance.range_check_ptr": { - "cairo_type": "felt", - "full_name": "__wrappers__.increase_balance.range_check_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast([fp + (-5)] + 2, felt*)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 52 - }, - "pc": 67, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "__wrappers__.increase_balance.ret_struct": { - "cairo_type": "__main__.increase_balance.Return", - "full_name": "__wrappers__.increase_balance.ret_struct", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 52 - }, - "pc": 67, - "value": "[cast(ap + 0, __main__.increase_balance.Return*)]" - } - ], - "type": "reference" - }, - "__wrappers__.increase_balance.retdata": { - "cairo_type": "felt*", - "full_name": "__wrappers__.increase_balance.retdata", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 53 - }, - "pc": 69, - "value": "[cast(ap + (-1), felt**)]" - } - ], - "type": "reference" - }, - "__wrappers__.increase_balance.retdata_size": { - "cairo_type": "felt", - "full_name": "__wrappers__.increase_balance.retdata_size", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 53 - }, - "pc": 69, - "value": "cast(0, felt)" - } - ], - "type": "reference" - }, - "__wrappers__.increase_balance.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "__wrappers__.increase_balance.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast([fp + (-5)], felt**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 52 - }, - "pc": 67, - "value": "[cast(ap + (-3), felt**)]" - } - ], - "type": "reference" - }, "__wrappers__.increase_balance_encode_return.memcpy": { "destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias" }, + "starkware.cairo.common.bool.FALSE": { + "type": "const", + "value": 0 + }, + "starkware.cairo.common.bool.TRUE": { + "type": "const", + "value": 1 + }, "starkware.cairo.common.cairo_builtins.BitwiseBuiltin": { "full_name": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "members": { @@ -5994,6 +3949,25 @@ "size": 3, "type": "struct" }, + "starkware.cairo.common.cairo_builtins.KeccakBuiltin": { + "full_name": "starkware.cairo.common.cairo_builtins.KeccakBuiltin", + "members": { + "input": { + "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", + "offset": 0 + }, + "output": { + "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", + "offset": 8 + } + }, + "size": 16, + "type": "struct" + }, + "starkware.cairo.common.cairo_builtins.KeccakBuiltinState": { + "destination": "starkware.cairo.common.keccak_state.KeccakBuiltinState", + "type": "alias" + }, "starkware.cairo.common.cairo_builtins.SignatureBuiltin": { "full_name": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "members": { @@ -6047,6 +4021,53 @@ "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias" }, + "starkware.cairo.common.keccak_state.KeccakBuiltinState": { + "full_name": "starkware.cairo.common.keccak_state.KeccakBuiltinState", + "members": { + "s0": { + "cairo_type": "felt", + "offset": 0 + }, + "s1": { + "cairo_type": "felt", + "offset": 1 + }, + "s2": { + "cairo_type": "felt", + "offset": 2 + }, + "s3": { + "cairo_type": "felt", + "offset": 3 + }, + "s4": { + "cairo_type": "felt", + "offset": 4 + }, + "s5": { + "cairo_type": "felt", + "offset": 5 + }, + "s6": { + "cairo_type": "felt", + "offset": 6 + }, + "s7": { + "cairo_type": "felt", + "offset": 7 + } + }, + "size": 8, + "type": "struct" + }, + "starkware.cairo.common.math.FALSE": { + "destination": "starkware.cairo.common.bool.FALSE", + "type": "alias" + }, + "starkware.cairo.common.math.TRUE": { + "destination": "starkware.cairo.common.bool.TRUE", + "type": "alias" + }, "starkware.starknet.common.storage.ADDR_BOUND": { "type": "const", "value": -106710729501573572985208420194530329073740042555888586719489 @@ -6128,6 +4149,75 @@ "type": "const", "value": 23274015802972845247556842986379118667122 }, + "starkware.starknet.common.syscalls.DEPLOY_SELECTOR": { + "type": "const", + "value": 75202468540281 + }, + "starkware.starknet.common.syscalls.Deploy": { + "full_name": "starkware.starknet.common.syscalls.Deploy", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.DeployRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.DeployResponse", + "offset": 6 + } + }, + "size": 9, + "type": "struct" + }, + "starkware.starknet.common.syscalls.DeployRequest": { + "full_name": "starkware.starknet.common.syscalls.DeployRequest", + "members": { + "class_hash": { + "cairo_type": "felt", + "offset": 1 + }, + "constructor_calldata": { + "cairo_type": "felt*", + "offset": 4 + }, + "constructor_calldata_size": { + "cairo_type": "felt", + "offset": 3 + }, + "contract_address_salt": { + "cairo_type": "felt", + "offset": 2 + }, + "deploy_from_zero": { + "cairo_type": "felt", + "offset": 5 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 6, + "type": "struct" + }, + "starkware.starknet.common.syscalls.DeployResponse": { + "full_name": "starkware.starknet.common.syscalls.DeployResponse", + "members": { + "constructor_retdata": { + "cairo_type": "felt*", + "offset": 2 + }, + "constructor_retdata_size": { + "cairo_type": "felt", + "offset": 1 + }, + "contract_address": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 3, + "type": "struct" + }, "starkware.starknet.common.syscalls.DictAccess": { "destination": "starkware.cairo.common.dict_access.DictAccess", "type": "alias" @@ -6454,28 +4544,78 @@ "size": 2, "type": "struct" }, - "starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR": { - "type": "const", - "value": 433017908768303439907196859243777073 - }, - "starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR": { + "starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR": { "type": "const", - "value": 100890693370601760042082660 + "value": 436233452754198157705746250789557519228244616562 }, - "starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR": { + "starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR": { "type": "const", - "value": 25828017502874050592466629733 + "value": 92376026794327011772951660 }, - "starkware.starknet.common.syscalls.SendMessageToL1SysCall": { - "full_name": "starkware.starknet.common.syscalls.SendMessageToL1SysCall", + "starkware.starknet.common.syscalls.LibraryCall": { + "full_name": "starkware.starknet.common.syscalls.LibraryCall", "members": { - "payload_ptr": { - "cairo_type": "felt*", - "offset": 3 - }, - "payload_size": { - "cairo_type": "felt", - "offset": 2 + "request": { + "cairo_type": "starkware.starknet.common.syscalls.LibraryCallRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", + "offset": 5 + } + }, + "size": 7, + "type": "struct" + }, + "starkware.starknet.common.syscalls.LibraryCallRequest": { + "full_name": "starkware.starknet.common.syscalls.LibraryCallRequest", + "members": { + "calldata": { + "cairo_type": "felt*", + "offset": 4 + }, + "calldata_size": { + "cairo_type": "felt", + "offset": 3 + }, + "class_hash": { + "cairo_type": "felt", + "offset": 1 + }, + "function_selector": { + "cairo_type": "felt", + "offset": 2 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 5, + "type": "struct" + }, + "starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR": { + "type": "const", + "value": 433017908768303439907196859243777073 + }, + "starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR": { + "type": "const", + "value": 100890693370601760042082660 + }, + "starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR": { + "type": "const", + "value": 25828017502874050592466629733 + }, + "starkware.starknet.common.syscalls.SendMessageToL1SysCall": { + "full_name": "starkware.starknet.common.syscalls.SendMessageToL1SysCall", + "members": { + "payload_ptr": { + "cairo_type": "felt*", + "offset": 3 + }, + "payload_size": { + "cairo_type": "felt", + "offset": 2 }, "selector": { "cairo_type": "felt", @@ -6564,6 +4704,10 @@ "cairo_type": "felt", "offset": 2 }, + "nonce": { + "cairo_type": "felt", + "offset": 7 + }, "signature": { "cairo_type": "felt*", "offset": 4 @@ -6581,7 +4725,7 @@ "offset": 0 } }, - "size": 7, + "size": 8, "type": "struct" }, "starkware.starknet.common.syscalls.storage_read": { @@ -6612,80 +4756,13 @@ "type": "struct" }, "starkware.starknet.common.syscalls.storage_read.Return": { - "full_name": "starkware.starknet.common.syscalls.storage_read.Return", - "members": { - "value": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" + "cairo_type": "(value: felt)", + "type": "type_definition" }, "starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS": { "type": "const", "value": 0 }, - "starkware.starknet.common.syscalls.storage_read.__temp0": { - "cairo_type": "felt", - "full_name": "starkware.starknet.common.syscalls.storage_read.__temp0", - "references": [ - { - "ap_tracking_data": { - "group": 0, - "offset": 1 - }, - "pc": 2, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.storage_read.address": { - "cairo_type": "felt", - "full_name": "starkware.starknet.common.syscalls.storage_read.address", - "references": [ - { - "ap_tracking_data": { - "group": 0, - "offset": 0 - }, - "pc": 0, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.storage_read.response": { - "cairo_type": "starkware.starknet.common.syscalls.StorageReadResponse", - "full_name": "starkware.starknet.common.syscalls.storage_read.response", - "references": [ - { - "ap_tracking_data": { - "group": 0, - "offset": 1 - }, - "pc": 4, - "value": "[cast([fp + (-4)] + 2, starkware.starknet.common.syscalls.StorageReadResponse*)]" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.storage_read.syscall": { - "cairo_type": "starkware.starknet.common.syscalls.StorageRead", - "full_name": "starkware.starknet.common.syscalls.storage_read.syscall", - "references": [ - { - "ap_tracking_data": { - "group": 0, - "offset": 0 - }, - "pc": 0, - "value": "[cast([fp + (-4)], starkware.starknet.common.syscalls.StorageRead*)]" - } - ], - "type": "reference" - }, "starkware.starknet.common.syscalls.storage_read.syscall_ptr": { "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.storage_read.syscall_ptr", @@ -6741,45 +4818,13 @@ "type": "struct" }, "starkware.starknet.common.syscalls.storage_write.Return": { - "full_name": "starkware.starknet.common.syscalls.storage_write.Return", - "members": {}, - "size": 0, - "type": "struct" + "cairo_type": "()", + "type": "type_definition" }, "starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS": { "type": "const", "value": 0 }, - "starkware.starknet.common.syscalls.storage_write.__temp1": { - "cairo_type": "felt", - "full_name": "starkware.starknet.common.syscalls.storage_write.__temp1", - "references": [ - { - "ap_tracking_data": { - "group": 1, - "offset": 1 - }, - "pc": 10, - "value": "[cast(ap + (-1), felt*)]" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.storage_write.address": { - "cairo_type": "felt", - "full_name": "starkware.starknet.common.syscalls.storage_write.address", - "references": [ - { - "ap_tracking_data": { - "group": 1, - "offset": 0 - }, - "pc": 8, - "value": "[cast(fp + (-4), felt*)]" - } - ], - "type": "reference" - }, "starkware.starknet.common.syscalls.storage_write.syscall_ptr": { "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.storage_write.syscall_ptr", @@ -6802,35 +4847,12 @@ } ], "type": "reference" - }, - "starkware.starknet.common.syscalls.storage_write.value": { - "cairo_type": "felt", - "full_name": "starkware.starknet.common.syscalls.storage_write.value", - "references": [ - { - "ap_tracking_data": { - "group": 1, - "offset": 0 - }, - "pc": 8, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" } }, "main_scope": "__main__", "prime": "0x800000000000011000000000000000000000000000000000000000000000001", "reference_manager": { "references": [ - { - "ap_tracking_data": { - "group": 0, - "offset": 0 - }, - "pc": 0, - "value": "[cast(fp + (-3), felt*)]" - }, { "ap_tracking_data": { "group": 0, @@ -6839,661 +4861,13 @@ "pc": 0, "value": "[cast(fp + (-4), felt**)]" }, - { - "ap_tracking_data": { - "group": 0, - "offset": 0 - }, - "pc": 0, - "value": "[cast([fp + (-4)], starkware.starknet.common.syscalls.StorageRead*)]" - }, - { - "ap_tracking_data": { - "group": 0, - "offset": 1 - }, - "pc": 2, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 0, - "offset": 1 - }, - "pc": 4, - "value": "[cast([fp + (-4)] + 2, starkware.starknet.common.syscalls.StorageReadResponse*)]" - }, - { - "ap_tracking_data": { - "group": 0, - "offset": 1 - }, - "pc": 4, - "value": "cast([fp + (-4)] + 3, felt*)" - }, - { - "ap_tracking_data": { - "group": 1, - "offset": 0 - }, - "pc": 8, - "value": "[cast(fp + (-4), felt*)]" - }, { "ap_tracking_data": { "group": 1, "offset": 0 }, "pc": 8, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 1, - "offset": 0 - }, - "pc": 8, - "value": "[cast(fp + (-5), felt**)]" - }, - { - "ap_tracking_data": { - "group": 1, - "offset": 1 - }, - "pc": 10, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 1, - "offset": 1 - }, - "pc": 13, - "value": "cast([fp + (-5)] + 3, felt*)" - }, - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 16, - "value": "[cast(fp + (-4), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 16, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 16, - "value": "cast(916907772491729262376534102982219947830828984996257231353398618781993312401, felt)" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 21, "value": "[cast(fp + (-5), felt**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 21, - "value": "[cast(fp + (-4), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 21, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 7 - }, - "pc": 25, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 7 - }, - "pc": 25, - "value": "[cast(ap + (-2), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 7 - }, - "pc": 25, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 14 - }, - "pc": 29, - "value": "[cast(ap + (-2), felt**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 14 - }, - "pc": 29, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 15 - }, - "pc": 30, - "value": "[cast(ap + (-1), felt**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 16 - }, - "pc": 31, - "value": "[cast(ap + (-1), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 17 - }, - "pc": 32, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 18 - }, - "pc": 33, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 34, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 34, - "value": "[cast(fp + (-6), felt**)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 34, - "value": "[cast(fp + (-5), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 34, - "value": "[cast(fp + (-4), felt*)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 7 - }, - "pc": 38, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 7 - }, - "pc": 38, - "value": "[cast(ap + (-2), felt*)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 7 - }, - "pc": 38, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 14 - }, - "pc": 43, - "value": "[cast(ap + (-1), felt**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 46, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 46, - "value": "[cast(fp + (-6), felt**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 46, - "value": "[cast(fp + (-5), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 46, - "value": "[cast(fp + (-4), felt*)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 23 - }, - "pc": 51, - "value": "[cast(ap + (-4), felt**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 23 - }, - "pc": 51, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 23 - }, - "pc": 51, - "value": "[cast(ap + (-2), felt*)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 23 - }, - "pc": 51, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 45 - }, - "pc": 57, - "value": "[cast(ap + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 45 - }, - "pc": 57, - "value": "[cast(ap + (-2), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 45 - }, - "pc": 57, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast([fp + (-5)], felt**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast([fp + (-5)] + 1, starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast([fp + (-5)] + 2, felt*)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "[cast([fp + (-3)], felt*)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "cast([fp + (-3)] + 1, felt*)" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 58, - "value": "cast([fp + (-3)] + 1 - [fp + (-3)], felt)" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 1 - }, - "pc": 60, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 52 - }, - "pc": 67, - "value": "[cast(ap + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 52 - }, - "pc": 67, - "value": "[cast(ap + (-2), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 52 - }, - "pc": 67, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 52 - }, - "pc": 67, - "value": "[cast(ap + 0, __main__.increase_balance.Return*)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 53 - }, - "pc": 69, - "value": "[cast(ap + (-1), felt**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 53 - }, - "pc": 69, - "value": "cast(0, felt)" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 0 - }, - "pc": 76, - "value": "[cast(fp + (-5), felt**)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 0 - }, - "pc": 76, - "value": "[cast(fp + (-4), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 0 - }, - "pc": 76, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 23 - }, - "pc": 81, - "value": "[cast(ap + (-4), felt**)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 23 - }, - "pc": 81, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 23 - }, - "pc": 81, - "value": "[cast(ap + (-2), felt*)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 23 - }, - "pc": 81, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 8, - "offset": 0 - }, - "pc": 82, - "value": "[cast(fp + (-4), __main__.get_balance.Return*)]" - }, - { - "ap_tracking_data": { - "group": 8, - "offset": 0 - }, - "pc": 82, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 8, - "offset": 1 - }, - "pc": 84, - "value": "[cast(fp, felt**)]" - }, - { - "ap_tracking_data": { - "group": 8, - "offset": 1 - }, - "pc": 84, - "value": "[cast(fp, felt**)]" - }, - { - "ap_tracking_data": { - "group": 8, - "offset": 1 - }, - "pc": 85, - "value": "cast([fp] + 1, felt*)" - }, - { - "ap_tracking_data": { - "group": 8, - "offset": 2 - }, - "pc": 87, - "value": "[cast(ap + (-1), felt*)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "[cast([fp + (-5)], felt**)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "[cast([fp + (-5)] + 1, starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "[cast([fp + (-5)] + 2, felt*)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 91, - "value": "cast([fp + (-3)] - [fp + (-3)], felt)" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 28 - }, - "pc": 97, - "value": "[cast(ap + (-4), felt**)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 28 - }, - "pc": 97, - "value": "[cast(ap + (-3), starkware.cairo.common.cairo_builtins.HashBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 28 - }, - "pc": 97, - "value": "[cast(ap + (-2), felt*)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 28 - }, - "pc": 97, - "value": "[cast(ap + (-1), __main__.get_balance.Return*)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 36 - }, - "pc": 100, - "value": "[cast(ap + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 36 - }, - "pc": 100, - "value": "[cast(ap + (-2), felt*)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 36 - }, - "pc": 100, - "value": "[cast(ap + (-1), felt**)]" } ] } diff --git a/packages-ts/starknet-gauntlet-example/example.cairo b/packages-ts/starknet-gauntlet-example/example.cairo new file mode 100644 index 000000000..eb7331f86 --- /dev/null +++ b/packages-ts/starknet-gauntlet-example/example.cairo @@ -0,0 +1,32 @@ +// Declare this file as a Starknet contract. +%lang starknet + +from starkware.cairo.common.cairo_builtins import HashBuiltin + +// Define a storage variable. +@storage_var +func balance() -> (res: felt) { +} + +// Increases the balance by the given amount. +@external +func increase_balance{ + syscall_ptr: felt*, + pedersen_ptr: HashBuiltin*, + range_check_ptr, +}(amount: felt) { + let (res) = balance.read(); + balance.write(res + amount); + return (); +} + +// Returns the current balance. +@view +func get_balance{ + syscall_ptr: felt*, + pedersen_ptr: HashBuiltin*, + range_check_ptr, +}() -> (res: felt) { + let (res) = balance.read(); + return (res=res); +} \ No newline at end of file diff --git a/packages-ts/starknet-gauntlet-example/package.json b/packages-ts/starknet-gauntlet-example/package.json new file mode 100644 index 000000000..db5419da5 --- /dev/null +++ b/packages-ts/starknet-gauntlet-example/package.json @@ -0,0 +1,32 @@ +{ + "name": "@chainlink/starknet-gauntlet-example", + "version": "0.0.1", + "description": "Starknet Gauntlet Example", + "keywords": [ + "typescript", + "cli" + ], + "main": "./dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist/**/*", + "!dist/**/*.test.js" + ], + "scripts": { + "gauntlet": "ts-node ./src/index.ts", + "lint": "tsc", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet-example --passWithNoTests", + "test:coverage": "yarn test --collectCoverage", + "test:ci": "yarn test --ci", + "format": "yarn prettier --write ./src", + "format:check": "yarn prettier --check ./src", + "clean": "rm -rf ./dist/ ./bin/", + "build": "yarn clean && tsc -b", + "bundle": "yarn build && pkg ." + }, + "dependencies": { + "@chainlink/gauntlet-contracts-example": "0.1.1", + "@chainlink/gauntlet-core": "0.3.1", + "@chainlink/starknet-gauntlet": "*" + } +} diff --git a/packages-ts/starknet-gauntlet-example/src/commands/example/deploy.ts b/packages-ts/starknet-gauntlet-example/src/commands/example/deploy.ts new file mode 100644 index 000000000..7ad491150 --- /dev/null +++ b/packages-ts/starknet-gauntlet-example/src/commands/example/deploy.ts @@ -0,0 +1,45 @@ +import { + ExecuteCommandConfig, + makeExecuteCommand, + BeforeExecute, + AfterExecute, +} from '@chainlink/starknet-gauntlet' +import { DeployExampleBaseConfig, DeployExampleInput } from '@chainlink/gauntlet-contracts-example' +import { tokenContractLoader } from '../../lib/contracts' + +type ContractInput = {} + +const makeContractInput = async (input: DeployExampleInput): Promise => { + return {} +} + +// This is a custom beforeExecute hook executed right before the command action is executed +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info('About to deploy a Sample Contract') +} +// This is a custom afterExecute hook executed right after the command action is executed +const afterExecute: AfterExecute = ( + context, + input, + deps, +) => async (result) => { + deps.logger.info( + `Contract deployed with address: ${result.responses[0].tx.address} at tx hash: ${result.responses[0].tx.hash}`, + ) +} + +const commandConfig: ExecuteCommandConfig = { + ...DeployExampleBaseConfig, + makeContractInput: makeContractInput, + loadContract: tokenContractLoader, + hooks: { + beforeExecute, + afterExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-example/src/commands/example/increaseBalance.ts b/packages-ts/starknet-gauntlet-example/src/commands/example/increaseBalance.ts new file mode 100644 index 000000000..b99d3f0e5 --- /dev/null +++ b/packages-ts/starknet-gauntlet-example/src/commands/example/increaseBalance.ts @@ -0,0 +1,21 @@ +import { ExecuteCommandConfig, makeExecuteCommand, Validation } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { tokenContractLoader } from '../../lib/contracts' +import { + IncreaseBalanceBaseConfig, + IncreaseBalanceInput, +} from '@chainlink/gauntlet-contracts-example' + +type ContractInput = [number] + +const makeContractInput = async (input: IncreaseBalanceInput): Promise => { + return [Number(input.balance)] +} + +const commandConfig: ExecuteCommandConfig = { + ...IncreaseBalanceBaseConfig, + makeContractInput: makeContractInput, + loadContract: tokenContractLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/gauntlet-starknet-example/src/commands/example/index.ts b/packages-ts/starknet-gauntlet-example/src/commands/example/index.ts similarity index 52% rename from packages-ts/gauntlet-starknet-example/src/commands/example/index.ts rename to packages-ts/starknet-gauntlet-example/src/commands/example/index.ts index 8055950c8..88c948b7a 100644 --- a/packages-ts/gauntlet-starknet-example/src/commands/example/index.ts +++ b/packages-ts/starknet-gauntlet-example/src/commands/example/index.ts @@ -1,4 +1,5 @@ import Deploy from './deploy' import IncreaseBalance from './increaseBalance' import Inspection from './inspection' -export default [Deploy, IncreaseBalance, ...Inspection] +export const executeCommands = [Deploy, IncreaseBalance] +export const inspectionCommands = [...Inspection] diff --git a/packages-ts/gauntlet-starknet-example/src/commands/example/inspection/index.ts b/packages-ts/starknet-gauntlet-example/src/commands/example/inspection/index.ts similarity index 100% rename from packages-ts/gauntlet-starknet-example/src/commands/example/inspection/index.ts rename to packages-ts/starknet-gauntlet-example/src/commands/example/inspection/index.ts diff --git a/packages-ts/gauntlet-starknet-example/src/commands/example/inspection/inspect.ts b/packages-ts/starknet-gauntlet-example/src/commands/example/inspection/inspect.ts similarity index 78% rename from packages-ts/gauntlet-starknet-example/src/commands/example/inspection/inspect.ts rename to packages-ts/starknet-gauntlet-example/src/commands/example/inspection/inspect.ts index 15fc2bf13..ff4d9bbda 100644 --- a/packages-ts/gauntlet-starknet-example/src/commands/example/inspection/inspect.ts +++ b/packages-ts/starknet-gauntlet-example/src/commands/example/inspection/inspect.ts @@ -1,5 +1,8 @@ -import { BN } from '@chainlink/gauntlet-core/dist/utils' -import { InspectCommandConfig, IStarknetProvider, makeInspectionCommand } from '@chainlink/gauntlet-starknet' +import { + InspectCommandConfig, + IStarknetProvider, + makeInspectionCommand, +} from '@chainlink/starknet-gauntlet' import { CATEGORIES } from '../../../lib/categories' import { tokenContractLoader } from '../../../lib/contracts' @@ -19,7 +22,7 @@ const makeComparisionData = (provider: IStarknetProvider) => async ( return { toCompare: null, result: { - balance: new BN(balance.res).toString(), + balance: BigInt(balance.res).toString(), }, } } diff --git a/packages-ts/starknet-gauntlet-example/src/commands/index.ts b/packages-ts/starknet-gauntlet-example/src/commands/index.ts new file mode 100644 index 000000000..b458e9269 --- /dev/null +++ b/packages-ts/starknet-gauntlet-example/src/commands/index.ts @@ -0,0 +1,7 @@ +import { + executeCommands as executeExampleCommands, + inspectionCommands as inspectionExampleCommands, +} from './example' + +export const executeCommands = [...executeExampleCommands] +export const inspectionCommands = [...inspectionExampleCommands] diff --git a/packages-ts/starknet-gauntlet-example/src/index.ts b/packages-ts/starknet-gauntlet-example/src/index.ts new file mode 100644 index 000000000..8c2064b92 --- /dev/null +++ b/packages-ts/starknet-gauntlet-example/src/index.ts @@ -0,0 +1,3 @@ +import { executeCommands, inspectionCommands } from './commands' + +export { executeCommands, inspectionCommands } diff --git a/packages-ts/gauntlet-starknet-example/src/lib/categories.ts b/packages-ts/starknet-gauntlet-example/src/lib/categories.ts similarity index 100% rename from packages-ts/gauntlet-starknet-example/src/lib/categories.ts rename to packages-ts/starknet-gauntlet-example/src/lib/categories.ts diff --git a/packages-ts/starknet-gauntlet-example/src/lib/contracts.ts b/packages-ts/starknet-gauntlet-example/src/lib/contracts.ts new file mode 100644 index 000000000..4abc39032 --- /dev/null +++ b/packages-ts/starknet-gauntlet-example/src/lib/contracts.ts @@ -0,0 +1,7 @@ +import { loadContract } from '@chainlink/starknet-gauntlet' + +export enum CONTRACT_LIST { + EXAMPLE = 'example', +} + +export const tokenContractLoader = () => loadContract(CONTRACT_LIST.EXAMPLE) diff --git a/packages-ts/starknet-gauntlet-example/test/commands/example.test.ts b/packages-ts/starknet-gauntlet-example/test/commands/example.test.ts new file mode 100644 index 000000000..8f7686e07 --- /dev/null +++ b/packages-ts/starknet-gauntlet-example/test/commands/example.test.ts @@ -0,0 +1,90 @@ +import { makeProvider } from '@chainlink/starknet-gauntlet' +import { Contract } from 'starknet' +import deployCommand from '../../src/commands/example/deploy' +import increaseBalanceCommand from '../../src/commands/example/increaseBalance' +import inspectionCommand from '../../src/commands/example/inspection/inspect' +import { + LOCAL_URL, + registerExecuteCommand, + TIMEOUT, + registerInspectCommand, +} from '@chainlink/starknet-gauntlet/test/utils' +import { loadExampleContract } from '../utils' + +const getBalance = async (address: string) => { + const contract = new Contract( + loadExampleContract().abi, + address, + makeProvider(LOCAL_URL).provider, + ) + const balance = await contract.get_balance() + + return BigInt(balance.res).toString() +} + +describe('Example Contract', () => { + let contractAddress: string + + it( + 'Deployment with default input', + async () => { + const command = await registerExecuteCommand(deployCommand).create({}, []) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + contractAddress = report.responses[0].contract + }, + TIMEOUT, + ) + + it( + 'Increase balance with input flag', + async () => { + const command = await registerExecuteCommand(increaseBalanceCommand).create( + { + input: { balance: '100' }, + }, + [contractAddress], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + const balance = await getBalance(contractAddress) + expect(balance).toEqual('100') + }, + TIMEOUT, + ) + + it( + 'Increase balance with custom flags', + async () => { + const command = await registerExecuteCommand(increaseBalanceCommand).create( + { + balance: '100', + }, + [contractAddress], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + const balance = await getBalance(contractAddress) + expect(balance).toEqual('200') + }, + TIMEOUT, + ) + + it('Inspection of state with no account', async () => { + const command = await registerInspectCommand(inspectionCommand).create({}, [contractAddress]) + + const expectedResult = { + balance: '200', + } + const report = await command.execute() + expect(report.data.data).toEqual(expectedResult) + }, 3000) + + // TODO: Include tests with account contract. Pending on devnet to support predeployed accounts and fee token +}) diff --git a/packages-ts/gauntlet-starknet/test/utils/index.ts b/packages-ts/starknet-gauntlet-example/test/utils/index.ts similarity index 78% rename from packages-ts/gauntlet-starknet/test/utils/index.ts rename to packages-ts/starknet-gauntlet-example/test/utils/index.ts index 4d70b1d41..9325ce165 100644 --- a/packages-ts/gauntlet-starknet/test/utils/index.ts +++ b/packages-ts/starknet-gauntlet-example/test/utils/index.ts @@ -3,12 +3,14 @@ import fs from 'fs' import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' export const loadContract = (name: string): CompiledContract => { - return json.parse(fs.readFileSync(`${__dirname}/../__mocks__/${name}.json`).toString('ascii')) + return json.parse( + fs.readFileSync(`${__dirname}/../../contract_artifacts/abi/${name}.json`).toString('ascii'), + ) } export const loadExampleContract = () => loadContract('example') -const noop = () => {} +export const noop = () => {} export const noopLogger: typeof logger = { table: noop, diff --git a/packages-ts/gauntlet-starknet-ocr2/tsconfig.json b/packages-ts/starknet-gauntlet-example/tsconfig.json similarity index 100% rename from packages-ts/gauntlet-starknet-ocr2/tsconfig.json rename to packages-ts/starknet-gauntlet-example/tsconfig.json diff --git a/packages-ts/gauntlet-starknet-oz/LICENSE b/packages-ts/starknet-gauntlet-ledger/LICENSE similarity index 100% rename from packages-ts/gauntlet-starknet-oz/LICENSE rename to packages-ts/starknet-gauntlet-ledger/LICENSE diff --git a/packages-ts/starknet-gauntlet-ledger/package.json b/packages-ts/starknet-gauntlet-ledger/package.json new file mode 100644 index 000000000..72dcd74a2 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ledger/package.json @@ -0,0 +1,31 @@ +{ + "name": "@chainlink/starknet-gauntlet-ledger", + "version": "0.0.1", + "description": "Gauntlet Starknet Ledger Signer", + "keywords": [ + "typescript", + "ledger", + "cli" + ], + "main": "./dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist/**/*", + "!dist/**/*.test.js" + ], + "scripts": { + "lint": "tsc", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet-ledger --passWithNoTests", + "test:ci": "yarn test --ci", + "format": "yarn prettier --write ./src", + "format:check": "yarn prettier --check ./src", + "clean": "rm -rf ./dist/ ./bin/", + "build": "yarn clean && tsc -b", + "bundle": "yarn build && pkg ." + }, + "dependencies": { + "@chainlink/starknet-gauntlet": "*", + "@ledgerhq/hw-app-starknet": "^2.1.0", + "@ledgerhq/hw-transport-node-hid": "^6.27.6" + } +} diff --git a/packages-ts/starknet-gauntlet-ledger/src/index.ts b/packages-ts/starknet-gauntlet-ledger/src/index.ts new file mode 100644 index 000000000..4d4dabba7 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ledger/src/index.ts @@ -0,0 +1,97 @@ +import { IStarknetWallet, Env } from '@chainlink/starknet-gauntlet' +import { encode, Signature, ec, Signer } from 'starknet' +import { StarknetClient as LedgerClient, LedgerError } from '@ledgerhq/hw-app-starknet' + +// EIP-2645 path +// 2645 - EIP number +// 579218131 - layer - 31 lowest bits of sha256("starkex") +// 894929996 - application - 31 lowest bits of sha256("chainlink") +// export const DEFAULT_LEDGER_PATH = "m/2645'/579218131'/0'/0'" +export const DEFAULT_LEDGER_PATH = "m/2645'/1195502025'/1148870696'/0'/0'/0" +export const LEDGER_PATH_REGEX = /^\s*m\s*\/\s*2645\s*\'\s*\/\s*579218131\s*\'\s*\/\s*(\d+)\s*\'\s*\/\s*(\d+)\s*\'$/ + +export class LedgerSigner extends Signer { + client: LedgerClient + path: string + publicKey: string + + private constructor(client: LedgerClient, path: string) { + super() + this.client = client + this.path = path + } + + static create = async (path?: string): Promise => { + if (!path) { + path = DEFAULT_LEDGER_PATH + } else { + const match = LEDGER_PATH_REGEX.exec(path) + if (!match) { + throw new Error( + "Provided ledger path doesn't correspond the expected format m/2645'/579218131'/'/'", + ) + } + } + + // work around jest reimporting the package + // package is only allowed to be imported once + const Transport = (await import('@ledgerhq/hw-transport-node-hid')).default + const transport = await Transport.create() + const ledgerConnector = new LedgerClient(transport) + + const signer = new LedgerSigner(ledgerConnector, path) + + return signer + } + + public async getPubKey(): Promise { + // memoize to avoid redundant calls + if (this.publicKey) return this.publicKey + + const response = await this.client.getStarkKey(this.path, false) + if (response.returnCode != LedgerError.NoErrors) { + throw new Error(`Unable to get public key: ${response.errorMessage}. Is Ledger app active?`) + } + + this.publicKey = encode.buf2hex(response.starkKey) + + return this.publicKey + } + + async signRaw(hash: string): Promise { + const response = await this.client.signHash(this.path, hash, false) + if (response.returnCode != LedgerError.NoErrors) { + throw new Error(`Unable to sign the message: ${response.errorMessage}`) + } + + // TODO: console log the hash so user can verify on ledger + + return ec.starkCurve.Signature.fromCompact(new Uint8Array([...response.r, ...response.s])) + // return new ec.starkCurve.Signature( + // BigInt(encode.addHexPrefix(encode.buf2hex(response.r))), + // BigInt(encode.addHexPrefix(encode.buf2hex(response.s))), + // ) + } +} + +export class Wallet implements IStarknetWallet { + signer: LedgerSigner + account: string + + private constructor(signer: LedgerSigner, account?: string) { + this.signer = signer + this.account = account + } + + static create = async (ledgerPath?: string, account?: string): Promise => { + const ledgerSigner: LedgerSigner = await LedgerSigner.create(ledgerPath) + return new Wallet(ledgerSigner, account) + } + + getPublicKey = async (): Promise => await this.signer.getPubKey() + getAccountAddress = (): string => this.account +} + +export const makeWallet = async (env: Env): Promise => { + return Wallet.create(env.ledgerPath, env.account) +} diff --git a/packages-ts/starknet-gauntlet-ledger/test.ts b/packages-ts/starknet-gauntlet-ledger/test.ts new file mode 100644 index 000000000..f9cc6216c --- /dev/null +++ b/packages-ts/starknet-gauntlet-ledger/test.ts @@ -0,0 +1,27 @@ +import { LedgerSigner } from './src/index' +import { encode, Signature, ec, Signer, WeierstrassSignatureType } from 'starknet' + +async function main() { + const privateKey = '0x1234567890987654321' + const starknetPublicKey = ec.starkCurve.getStarkKey(privateKey) + const fullPublicKey = encode.addHexPrefix( + encode.buf2hex(ec.starkCurve.getPublicKey(privateKey, false)), + ) + console.log(fullPublicKey) + + console.log('Initializing ledger client') + const signer = await LedgerSigner.create() + const pubkey = await signer.getPubKey() + console.log(`Public key: ${pubkey}`) + + const hash = 'c465dd6b1bbffdb05442eb17f5ca38ad1aa78a6f56bf4415bdee219114a47' + console.log(`Signing hash ${hash} via ledger...`) + const sig = await signer.signRaw(hash) + const signature = sig as WeierstrassSignatureType + console.log(`Signature: ${signature.toCompactHex()} r=${signature.r} s=${signature.s}`) + + const matches = ec.starkCurve.verify(signature, hash, `0x${pubkey}`) + console.log(`Signature verifies: ${matches}`) +} + +main() diff --git a/packages-ts/starknet-gauntlet-ledger/test/ledger-path-regex.test.ts b/packages-ts/starknet-gauntlet-ledger/test/ledger-path-regex.test.ts new file mode 100644 index 000000000..bfbb0e9a6 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ledger/test/ledger-path-regex.test.ts @@ -0,0 +1,35 @@ +import { LEDGER_PATH_REGEX, DEFAULT_LEDGER_PATH } from '../src/' + +describe('Ledger Input Path', () => { + const wrongPathFormat1 = 'hola!' + const wrongPathFormat2 = "m/2645'/579218131'/0'/16'/67'/123'" + const wrongPathStartWith1 = "m/4417'/667845903'/894929996'/0'" + const wrongPathStartWith2 = " path 2645'/579218131'/894929996'/0'" + const pathWithSpaces = "m / 2645'/ 579218131' / 0 '/0 '" + + it("Doesn't validate wrong format", async () => { + let res = LEDGER_PATH_REGEX.exec(wrongPathFormat1) + expect(res).toBeFalsy() + + res = LEDGER_PATH_REGEX.exec(wrongPathFormat2) + expect(res).toBeFalsy() + }) + + it("Doesn't validate not starting with m/2645'/579218131'/", async () => { + let res = LEDGER_PATH_REGEX.exec(wrongPathStartWith1) + expect(res).toBeFalsy() + + res = LEDGER_PATH_REGEX.exec(wrongPathStartWith2) + expect(res).toBeFalsy() + }) + + it('Validates path with spaces', async () => { + const res = LEDGER_PATH_REGEX.exec(pathWithSpaces) + expect(res).toBeTruthy() + }) + + it('Validates default path', async () => { + const res = LEDGER_PATH_REGEX.exec(DEFAULT_LEDGER_PATH) + expect(res).toBeTruthy() + }) +}) diff --git a/packages-ts/gauntlet-starknet-oz/tsconfig.json b/packages-ts/starknet-gauntlet-ledger/tsconfig.json similarity index 100% rename from packages-ts/gauntlet-starknet-oz/tsconfig.json rename to packages-ts/starknet-gauntlet-ledger/tsconfig.json diff --git a/packages-ts/gauntlet-starknet-starkgate/LICENSE b/packages-ts/starknet-gauntlet-multisig/LICENSE similarity index 100% rename from packages-ts/gauntlet-starknet-starkgate/LICENSE rename to packages-ts/starknet-gauntlet-multisig/LICENSE diff --git a/packages-ts/starknet-gauntlet-multisig/README.md b/packages-ts/starknet-gauntlet-multisig/README.md new file mode 100644 index 000000000..6e23f8eee --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/README.md @@ -0,0 +1,81 @@ +# Starknet Gauntlet Commands for Multisig Contract + +## Multisig + +### Deploy the contract + +```bash +yarn gauntlet multisig:deploy --network= --threshold= --signers=<[SIGNERS_LIST]> +``` + +Note that threshold must be equal or higher than the amount of signers + +Examples: + +```bash +yarn gauntlet multisig:deploy --network=local --threshold=2 --signers="[0x26e10005e67c478b373658755749a60f2f31bc955a6a2311eb456b20b8913e9, 0x56bfff7e282d1e023c6268e72dba551a22c1bf816a30334ae43b5c491c99bb8]" +# Or +yarn gauntlet multisig:deploy --network=local --input='{"threshold":2, "signers": ["0x26e10005e67c478b373658755749a60f2f31bc955a6a2311eb456b20b8913e9", "0x56bfff7e282d1e023c6268e72dba551a22c1bf816a30334ae43b5c491c99bb8"]}' +``` + +### Set signers + +Signers can only be updated through a transaction executed from the multisig itself + +```bash +yarn gauntlet multisig:set_signers:multisig --network= --signers=<[SIGNERS_LIST]> +``` + +### Set threshold + +Threshold can only be updated through a transaction executed from the multisig itself. + +```bash +yarn gauntlet multisig:set_thresold:multisig --network= --threshold= +``` + +### Upgrade + +Upgrade can only be updated through a transaction executed from the multisig itself. + +```bash +yarn gauntlet multisig:upgrade:multisig --network= --classHash= +``` + + +## Wrapping Gauntlet commands + +A [wrap function](./src/wrapper/index.ts#L30) is exposed from this package. It allows to wrap any Gauntlet command and make its functionality available to be executed from a multisig wallet. The process is the same for every command: + +1. Create proposal + +```bash +yarn gauntlet ::multisig --network= (...) +``` + +This will create a proposal in the multisig contract, that needs to be approved and executed. +The proposal index will be prompted. + +2. Approve proposal + +`T` (threshold) signers need to run this command + +```bash +yarn gauntlet ::multisig --network= (...) --multisigProposal= +``` + +3. Execute proposal + +Once approvals have reached the threshold, the proposal can be executed. + +```bash +yarn gauntlet ::multisig --network= (...) --multisigProposal= +``` + +If you are running these commands from the `starknet-gauntlet-cli`, you'll want to add to your environment the Multisig address: + +```bash +# .env +... +MULTISIG= +``` diff --git a/packages-ts/gauntlet-starknet-oz/package.json b/packages-ts/starknet-gauntlet-multisig/package.json similarity index 59% rename from packages-ts/gauntlet-starknet-oz/package.json rename to packages-ts/starknet-gauntlet-multisig/package.json index 96bae2ba9..f3f129aaf 100644 --- a/packages-ts/gauntlet-starknet-oz/package.json +++ b/packages-ts/starknet-gauntlet-multisig/package.json @@ -1,7 +1,7 @@ { - "name": "@chainlink/gauntlet-starknet-oz", + "name": "@chainlink/starknet-gauntlet-multisig", "version": "0.0.1", - "description": "Gauntlet Starknet Open Zeppelin Contracts", + "description": "Starknet Gauntlet Multisig", "keywords": [ "typescript", "cli" @@ -15,18 +15,17 @@ "scripts": { "gauntlet": "ts-node ./src/index.ts", "lint": "tsc", - "test": "SKIP_PROMPTS=true jest --runInBand", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet-multisig --passWithNoTests", "test:coverage": "yarn test --collectCoverage", "test:ci": "yarn test --ci", - "lint:format": "yarn prettier --check ./src", "format": "yarn prettier --write ./src", + "format:check": "yarn prettier --check ./src", "clean": "rm -rf ./dist/ ./bin/", "build": "yarn clean && tsc -b", "bundle": "yarn build && pkg ." }, "dependencies": { - "@chainlink/gauntlet-core": "0.3.0", - "@chainlink/gauntlet-starknet": "*", - "starknet": "^3.11.0" + "@chainlink/gauntlet-core": "0.3.1", + "@chainlink/starknet-gauntlet": "*" } } diff --git a/packages-ts/starknet-gauntlet-multisig/src/commands/index.ts b/packages-ts/starknet-gauntlet-multisig/src/commands/index.ts new file mode 100644 index 000000000..4c417c57d --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/commands/index.ts @@ -0,0 +1 @@ +export { executeCommands, inspectionCommands } from './multisig' diff --git a/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/declare.ts b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/declare.ts new file mode 100644 index 000000000..266546e1a --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/declare.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, declareCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { CONTRACT_LIST, contractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + declareCommandConfig(CONTRACT_LIST.MULTISIG, CATEGORIES.MULTISIG, contractLoader), +) diff --git a/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/deploy.ts b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/deploy.ts new file mode 100644 index 000000000..192e68ef5 --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/deploy.ts @@ -0,0 +1,91 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + ExecutionContext, + isValidAddress, + makeExecuteCommand, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { contractLoader } from '../../lib/contracts' + +type UserInput = { + signers: string[] + threshold: string + classHash?: string +} + +type ContractInput = [signersLen: number, ...signers: string[], threshold: number] + +const makeUserInput = async (flags, args): Promise => { + if (flags.input) return flags.input as UserInput + + return { + signers: flags.signers, + threshold: flags.threshold, + classHash: flags.classHash, + } +} + +export const validateThreshold = async (input: UserInput) => { + const threshold = Number(input.threshold) + if (isNaN(threshold)) throw new Error('Threshold is not a number') + if (threshold > input.signers.length) + throw new Error( + `Threshold is higher than signers length: ${threshold} > ${input.signers.length}`, + ) + return true +} + +const validateClassHash = async (input) => { + if (isValidAddress(input.classHash) || input.classHash === undefined) { + return true + } + throw new Error(`Invalid Class Hash: ${input.classHash}`) +} + +export const validateSigners = async (input) => { + const areValid = input.signers.every(isValidAddress) + if (!areValid) throw new Error('Signers are not valid accounts') + if (new Set(input.signers).size !== input.signers.length) + throw new Error('Signers are not unique') + return true +} + +const makeContractInput = async ( + input: UserInput, + context: ExecutionContext, +): Promise => { + return [input.signers.length, ...input.signers, parseInt(input.threshold)] +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info(`About to deploy an Multisig Contract with the following details: + - Signers: ${input.user.signers} + - Threshold: ${input.user.threshold} + `) +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CATEGORIES.MULTISIG, + category: CATEGORIES.MULTISIG, + action: 'deploy', + ux: { + description: 'Deploys Multisig Wallet', + examples: [ + `${CATEGORIES.MULTISIG}:deploy --network= --threshold= --signers=[SIGNERS_LIST]`, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateSigners, validateThreshold, validateClassHash], + loadContract: contractLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/index.ts b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/index.ts new file mode 100644 index 000000000..726b4416a --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/index.ts @@ -0,0 +1,10 @@ +import Deploy from './deploy' +import Declare from './declare' +import SetSigners from './setSigners' +import SetThreshold from './setThreshold' +import Upgrade from './upgrade' + +import Inspection from './inspection' + +export const executeCommands = [Deploy, Declare, SetSigners, SetThreshold, Upgrade] +export const inspectionCommands = [...Inspection] diff --git a/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/inspection/index.ts b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/inspection/index.ts new file mode 100644 index 000000000..b99d0d0a8 --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/inspection/index.ts @@ -0,0 +1,3 @@ +import Inspect from './inspection' + +export default [Inspect] diff --git a/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/inspection/inspection.ts b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/inspection/inspection.ts new file mode 100644 index 000000000..b9594b8ca --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/inspection/inspection.ts @@ -0,0 +1,44 @@ +import { + InspectCommandConfig, + IStarknetProvider, + makeInspectionCommand, +} from '@chainlink/starknet-gauntlet' +import { num } from 'starknet' +import { CATEGORIES } from '../../../lib/categories' +import { contractLoader } from '../../../lib/contracts' + +type QueryResult = { + signers: string[] + threshold: string +} + +const makeComparisionData = (provider: IStarknetProvider) => async ( + results: [Array, bigint], + input: null, + contractAddress: string, +): Promise<{ + toCompare: null + result: QueryResult +}> => { + const [signers, threshold] = results + return { + toCompare: null, + result: { + signers: signers.map((o) => num.toHex(o)), + threshold: threshold.toString(), + }, + } +} + +const commandConfig: InspectCommandConfig = { + ux: { + category: CATEGORIES.MULTISIG, + function: 'inspect', + examples: [`${CATEGORIES.MULTISIG}:inspect --network=`], + }, + queries: ['get_signers', 'get_threshold'], + makeComparisionData, + loadContract: contractLoader, +} + +export default makeInspectionCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/setSigners.ts b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/setSigners.ts new file mode 100644 index 000000000..ffa0da26b --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/setSigners.ts @@ -0,0 +1,57 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + ExecutionContext, + makeExecuteCommand, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { contractLoader } from '../../lib/contracts' +import { validateSigners } from './deploy' + +type UserInput = { + signers: string[] +} + +type ContractInput = [signers: string[]] + +const makeUserInput = async (flags, args): Promise => { + if (flags.input) return flags.input as UserInput + + return { + signers: flags.signers, + } +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.signers] +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger + .info(`About to set signers on the Multisig Contract (${context.contractAddress}) with the following details: + - New Signers: ${input.user.signers} + `) +} + +const commandConfig: ExecuteCommandConfig = { + ux: { + description: 'Set signers of the multisig account', + examples: [`${CATEGORIES.MULTISIG}:set_signers --network= --signers=[SIGNERS_LIST]`], + }, + category: CATEGORIES.MULTISIG, + action: 'set_signers', + contractId: CATEGORIES.MULTISIG, + makeUserInput, + makeContractInput, + validations: [validateSigners], + loadContract: contractLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/setThreshold.ts b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/setThreshold.ts new file mode 100644 index 000000000..f9e1888b8 --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/setThreshold.ts @@ -0,0 +1,65 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + ExecutionContext, + makeExecuteCommand, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { contractLoader } from '../../lib/contracts' +import { validateThreshold as validateThresholdWithSigners } from './deploy' + +type UserInput = { + threshold: string +} + +type ContractInput = [threshold: string] + +const makeUserInput = async (flags, args): Promise => { + if (flags.input) return flags.input as UserInput + + return { + threshold: flags.threshold, + } +} + +const validateThreshold = async (input: UserInput, context: ExecutionContext) => { + const signers = await context.contract.get_signers() + return validateThresholdWithSigners({ ...input, signers }) +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.threshold] +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger + .info(`About to set a new threshold on the Multisig Contract (${context.contractAddress}) with the following details: + - New Threshold: ${input.user.threshold} + `) +} + +const commandConfig: ExecuteCommandConfig = { + ux: { + description: 'Set threshold of the multisig account', + examples: [ + `${CATEGORIES.MULTISIG}:set_threshold --network= --threshold= `, + ], + }, + category: CATEGORIES.MULTISIG, + contractId: CATEGORIES.MULTISIG, + action: 'set_threshold', + internalFunction: 'set_threshold', + makeUserInput, + makeContractInput, + validations: [validateThreshold], + loadContract: contractLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/upgrade.ts b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/upgrade.ts new file mode 100644 index 000000000..d0a65a20a --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/commands/multisig/upgrade.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, upgradeCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { contractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + upgradeCommandConfig(CATEGORIES.MULTISIG, CATEGORIES.MULTISIG, contractLoader), +) diff --git a/packages-ts/starknet-gauntlet-multisig/src/index.ts b/packages-ts/starknet-gauntlet-multisig/src/index.ts new file mode 100644 index 000000000..938a5fd1f --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/index.ts @@ -0,0 +1,4 @@ +import { executeCommands, inspectionCommands } from './commands' +import { wrapCommand } from './wrapper' + +export { executeCommands, inspectionCommands, wrapCommand } diff --git a/packages-ts/starknet-gauntlet-multisig/src/lib/categories.ts b/packages-ts/starknet-gauntlet-multisig/src/lib/categories.ts new file mode 100644 index 000000000..5eaa872f0 --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/lib/categories.ts @@ -0,0 +1,3 @@ +export const CATEGORIES = { + MULTISIG: 'multisig', +} diff --git a/packages-ts/starknet-gauntlet-multisig/src/lib/contracts.ts b/packages-ts/starknet-gauntlet-multisig/src/lib/contracts.ts new file mode 100644 index 000000000..80454fc4d --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/lib/contracts.ts @@ -0,0 +1,7 @@ +import { loadContract } from '@chainlink/starknet-gauntlet' + +export enum CONTRACT_LIST { + MULTISIG = 'Multisig', +} + +export const contractLoader = () => loadContract(CONTRACT_LIST.MULTISIG) diff --git a/packages-ts/starknet-gauntlet-multisig/src/lib/utils.ts b/packages-ts/starknet-gauntlet-multisig/src/lib/utils.ts new file mode 100644 index 000000000..074010855 --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/lib/utils.ts @@ -0,0 +1,13 @@ +import assert from 'assert' + +export const isDeepEqual = (a: any, b: any) => { + try { + assert.deepStrictEqual(a, b) + } catch (error) { + if (error.name === 'AssertionError') { + return false + } + throw error + } + return true +} diff --git a/packages-ts/starknet-gauntlet-multisig/src/wrapper/index.ts b/packages-ts/starknet-gauntlet-multisig/src/wrapper/index.ts new file mode 100644 index 000000000..629909e7b --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/wrapper/index.ts @@ -0,0 +1,338 @@ +import { Result, WriteCommand } from '@chainlink/gauntlet-core' +import { isDeepEqual } from '@chainlink/gauntlet-core/dist/utils/assertions' +import { + CommandCtor, + Dependencies, + ExecuteCommandInstance, + ExecutionContext, + Input, + IStarknetProvider, + IStarknetWallet, + tryToWriteLastConfigDigestToRDD, +} from '@chainlink/starknet-gauntlet' +import { TransactionResponse } from '@chainlink/starknet-gauntlet/dist/transaction' +import { + Call, + CompiledContract, + CompiledSierraCasm, + Contract, + addAddressPadding, + num, + encode, + hash, + validateAndParseAddress, + InvokeTransactionReceiptResponse, +} from 'starknet' +import { contractLoader } from '../lib/contracts' +import { Action, State } from './types' + +type UserInput = { + proposalId: number +} + +type ContractInput = {} + +type UnregisteredCommand = ( + deps: Dependencies, +) => CommandCtor> + +type ProposalAction = (message: Call, proposalId?: number) => Call + +export const wrapCommand = ( + registeredCommand: CommandCtor>, +): UnregisteredCommand => ( + deps: Dependencies, +): CommandCtor> => { + const id = `${registeredCommand.id}:multisig` + + const msigCommand: CommandCtor> = class MsigCommand + extends WriteCommand + implements ExecuteCommandInstance { + wallet: IStarknetWallet + provider: IStarknetProvider + contractAddress: string + account: string + executionContext: ExecutionContext + contract: CompiledContract + compiledContractHash?: string + + input: Input + + command: ExecuteCommandInstance + multisigAddress: string + initialState: State + + static id = id + static category = registeredCommand.category + static examples = registeredCommand.examples + + constructor(flags, args) { + super(flags, args) + } + + static create = async (flags, args) => { + const c = new MsigCommand(flags, args) + + const env = await deps.makeEnv(flags) + c.account = env.account + c.multisigAddress = env.multisig + + // NOTE: all multisig commands require the multisig address as an argument. + // + // There's two ways to provide this: + // - set the MULTISIG environment variable to the address of the multisig contract + // - explicitly pass the address to the command (this will override the MULTISIG env var) + // + c.contractAddress = args[0] ?? c.multisigAddress + + const cmd = await registeredCommand.create(flags, [c.contractAddress]) + c.command = cmd + c.wallet = cmd.wallet + c.provider = cmd.provider + c.account = cmd.account + + const loadResult = contractLoader() + c.contract = loadResult.contract + if (loadResult.casm) { + c.compiledContractHash = hash.computeCompiledClassHash(loadResult.casm) + } + + c.executionContext = { + provider: c.provider, + wallet: c.wallet, + category: registeredCommand.id, + action: 'multisig', + id, + contractAddress: c.contractAddress, + flags: flags, + contract: new Contract(c.contract.abi, c.multisigAddress, c.provider.provider), + } + + c.input = { + user: flags.input || { + proposalId: Number(flags.proposalId || flags.multisigProposal), + }, + contract: {}, + } + + c.initialState = await c.fetchMultisigState(c.multisigAddress, c.input.user.proposalId) + + return c + } + + fetchMultisigState = async (address: string, proposalId?: number): Promise => { + const [signers, threshold] = await Promise.all( + ['get_signers', 'get_threshold'].map((func) => { + return this.executionContext.contract[func]() + }), + ) + const multisig = { + address, + threshold, + signers: signers.map((o) => num.toHex(o)), + } + + if (isNaN(proposalId)) return { multisig } + const { 0: tx, 1: calldata } = await this.executionContext.contract.get_transaction( + proposalId, + ) + return { + multisig, + proposal: { + id: proposalId, + confirmations: tx.confirmations, + data: { + contractAddress: addAddressPadding(tx.to), + entrypoint: encode.addHexPrefix(num.toHex(num.toBigInt(tx.function_selector))), + calldata: calldata.map((v) => num.toBigInt(v).toString()), + }, + nextAction: + Number(num.toBigInt(tx.executed)) !== 0 + ? Action.NONE + : tx.confirmations >= multisig.threshold + ? Action.EXECUTE + : Action.APPROVE, + }, + } + } + + isSameProposal = (local: Call, onchain: Call): boolean => { + const localAddress = validateAndParseAddress(local.contractAddress) + const onchainAddress = validateAndParseAddress(onchain.contractAddress) + if (localAddress !== onchainAddress) return false + if (hash.getSelectorFromName(local.entrypoint) !== onchain.entrypoint) return false + if (!isDeepEqual(local.calldata, onchain.calldata)) return false + return true + } + + makeProposeMessage: ProposalAction = (message, proposalId) => { + const invocation = this.executionContext.contract.populate('submit_transaction', [ + this.contractAddress, + hash.getSelectorFromName(message.entrypoint), + message.calldata, + proposalId, + ]) + return invocation + } + + makeAcceptMessage: ProposalAction = (_, proposalId) => { + const invocation = this.executionContext.contract.populate('confirm_transaction', [ + proposalId, + ]) + return invocation + } + + makeExecuteMessage: ProposalAction = (_, proposalId) => { + const invocation = this.executionContext.contract.populate('execute_transaction', [ + proposalId, + ]) + return invocation + } + + makeMessage = async () => { + const operations = { + [Action.APPROVE]: this.makeAcceptMessage, + [Action.EXECUTE]: this.makeExecuteMessage, + [Action.NONE]: () => { + throw new Error('No action needed') + }, + } + const message = await this.command.makeMessage() + if (!this.initialState.proposal) { + const nonce = await this.executionContext.contract.get_transactions_len() + return [this.makeProposeMessage(message[0], nonce)] + } + + if (!this.isSameProposal(message[0], this.initialState.proposal.data)) { + throw new Error('The transaction generated is different from the proposal provided') + } + + deps.logger.success('Generated proposal matches with the one provided') + + return [ + operations[this.initialState.proposal.nextAction]( + message[0], + this.initialState.proposal.id, + ), + ] + } + + beforeExecute = async () => { + if (!this.initialState.proposal) deps.logger.info('About to CREATE a new multisig proposal') + else + deps.logger.info( + `About to ${ + this.initialState.proposal.nextAction === Action.APPROVE ? 'APPROVE' : 'EXECUTE' + } the multisig proposal with ID: ${this.initialState.proposal.id}`, + ) + await deps.prompt('Continue?') + } + + afterExecute = async (result: Result, proposalId?: number) => { + if (proposalId === undefined) deps.logger.warn('Proposal ID not found') + deps.logger.loading('Fetching latest multisig and proposal state...') + const state = await this.fetchMultisigState(this.multisigAddress, proposalId) + if (!state.proposal) { + deps.logger.error(`Multisig proposal ${proposalId} not found`) + return + } + const approvalsLeft = state.multisig.threshold - state.proposal.confirmations + const messages = { + [Action.EXECUTE]: `The multisig proposal reached the threshold and can be executed. Run the same command with the flag --multisigProposal=${state.proposal.id}`, + [Action.APPROVE]: `The multisig proposal needs ${approvalsLeft} more approvals. Run the same command with the flag --multisigProposal=${state.proposal.id}`, + [Action.NONE]: `The multisig proposal has been executed. No more actions needed on-chain`, + } + deps.logger.line() + deps.logger.info(`${messages[state.proposal.nextAction]}`) + deps.logger.line() + + if (state.proposal.nextAction === Action.NONE) { + // check if the proposal has the config set event + + const txHash = result.responses[0].tx.hash + const txInfo = await this.executionContext.provider.provider.getTransactionReceipt(txHash) + + if (txInfo.isSuccess()) { + const contractEvents = this.command.executionContext.contract.parseEvents(txInfo) + const event = contractEvents[contractEvents.length - 1]['ConfigSet'] + + // this was a set config multisig command + if (event) { + // write lastConfigDigest back to RDD + const hexLastConfigDigest = `${(event.latest_config_digest as bigint).toString(16)}` + // config digest string must be exactly 32 bytes + const paddedHexLastConfigDigest = hexLastConfigDigest.padStart(64, '0') + const configDigest = `0x${paddedHexLastConfigDigest}` + + await tryToWriteLastConfigDigestToRDD( + deps, + this.executionContext.flags.rdd, + this.contractAddress, + configDigest, + ) + } + } + } + + return { proposalId } + } + + execute = async () => { + deps.logger.info(`Multisig State: + - Address: ${this.initialState.multisig.address} + - Signers: ${this.initialState.multisig.signers} + - Threshold: ${this.initialState.multisig.threshold} + `) + if (this.initialState.proposal) { + deps.logger.info(`Proposal State: + - ID: ${this.initialState.proposal.id} + - Approvals: ${this.initialState.proposal.confirmations} + - Next action: ${this.initialState.proposal.nextAction} + `) + } + const message = await this.makeMessage() + + // Underlying logger could have different style and probably a disabled prompt + await this.command.beforeExecute() + await this.beforeExecute() + + deps.logger.loading(`Signing and sending transaction...`) + const tx = await this.provider.signAndSend(message) + deps.logger.loading(`Waiting for tx confirmation at ${tx.hash}...`) + const response = await tx.wait() + + if (!response.success) { + deps.logger.error(`Tx was not successful: ${tx.errorMessage}`) + } else { + deps.logger.success(`Tx executed at ${tx.hash}`) + } + + const result = { + responses: [ + { + tx, + contract: tx.address, + }, + ], + } + + let proposalId = this.input.user.proposalId + if (!this.initialState.proposal) { + const txInfo = (await this.provider.provider.getTransactionReceipt( + tx.hash, + )) as InvokeTransactionReceiptResponse + // TODO: use contract.parseEvents? + proposalId = Number(num.hexToDecimalString((txInfo.events[0] as any).keys[2])) // 0 == event_id, 1 == executor, 2 == nonce/proposal_id + } + + const data = await this.afterExecute(result, proposalId) + + return data ? { ...result, data: { ...data } } : result + } + } + + return msigCommand +} diff --git a/packages-ts/starknet-gauntlet-multisig/src/wrapper/types.ts b/packages-ts/starknet-gauntlet-multisig/src/wrapper/types.ts new file mode 100644 index 000000000..6a12ad042 --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/src/wrapper/types.ts @@ -0,0 +1,21 @@ +import { Call } from 'starknet' + +export enum Action { + APPROVE = 'approve', + EXECUTE = 'execute', + NONE = 'none', +} + +export type State = { + multisig: { + address: string + threshold: number + signers: string[] + } + proposal?: { + id: number + nextAction: Action + data: Call + confirmations: number + } +} diff --git a/packages-ts/starknet-gauntlet-multisig/test/multisig/multisig.test.ts b/packages-ts/starknet-gauntlet-multisig/test/multisig/multisig.test.ts new file mode 100644 index 000000000..9c74734e0 --- /dev/null +++ b/packages-ts/starknet-gauntlet-multisig/test/multisig/multisig.test.ts @@ -0,0 +1,220 @@ +import { makeProvider, makeWallet, Dependencies } from '@chainlink/starknet-gauntlet' +import deployCommand from '../../src/commands/multisig/deploy' +import setSigners from '../../src/commands/multisig/setSigners' +import setThreshold from '../../src/commands/multisig/setThreshold' +import { wrapCommand } from '../../src/wrapper' +import { registerExecuteCommand, TIMEOUT, LOCAL_URL } from '@chainlink/starknet-gauntlet/test/utils' +import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' +import { loadContract } from '@chainlink/starknet-gauntlet' +import { CONTRACT_LIST } from '../../src/lib/contracts' +import { Contract } from 'starknet' + +describe('Multisig', () => { + let multisigContractAddress: string + const SEED: number = 10 + const accounts: string[] = [ + '0x78662e7352d062084b0010068b99288486c2d8b914f6e2a55ce945f8792c8b1', + '0x49dfb8ce986e21d354ac93ea65e6a11f639c1934ea253e5ff14ca62eca0f38e', + '0x4f348398f859a55a0c80b1446c5fdc37edb3a8478a32f10764659fc241027d3', + ] + const publicKeys: string[] = [ + '0x7a1bb2744a7dd29bffd44341dbd78008adb4bc11733601e7eddff322ada9cb', + '0xb8fd4ddd415902d96f61b7ad201022d495997c2dff8eb9e0eb86253e30fabc', + '0x5e05d2510c6110bde03df9c1c126a1f592207d78cd9e481ac98540d5336d23c', + ] + const privateKeys: string[] = [ + '0xe1406455b7d66b1690803be066cbe5e', + '0xa20a02f0ac53692d144b20cb371a60d7', + '0xa641611c17d4d92bd0790074e34beeb7', + ] + + const newSignerAccount = { + account: '0xd513de92c16aa42418cf7e5b60f8022dbee1b4dfd81bcf03ebee079cfb5cb5', + publicKey: '0x4708e28e2424381659ea6b7dded2b3aff4b99debfcf6080160a9d098ac2214d', + privateKey: '0x5b4ac23628a5749277bcabbf4726b025', + } + + it( + 'Deployment', + async () => { + const command = await registerExecuteCommand(deployCommand).create( + { + signers: accounts, + threshold: 1, + pk: privateKeys[0], + publicKey: publicKeys[0], + account: accounts[0], + }, + [], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + multisigContractAddress = report.responses[0].contract + console.log(multisigContractAddress) + }, + TIMEOUT, + ) + + it( + 'Set Threshold with multisig', + async () => { + const myFlags = { + providerUrl: LOCAL_URL, + pk: privateKeys[0], + publicKey: publicKeys[0], + account: accounts[0], + multisig: multisigContractAddress, + } + const deps: Dependencies = { + logger: logger, + prompt: prompt, + makeEnv: (flags) => { + return myFlags + }, + makeProvider: makeProvider, + makeWallet: makeWallet, + } + + // Create Multisig Proposal + const command = await wrapCommand(registerExecuteCommand(setThreshold))(deps).create( + { + threshold: 2, + ...myFlags, + }, + [multisigContractAddress], + ) + + let report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + const multisigProposalId = report.data.proposalId + + // Approve Multisig Proposal + const approveCommand = await wrapCommand(registerExecuteCommand(setThreshold))(deps).create( + { + threshold: 2, + multisigProposal: multisigProposalId, + ...myFlags, + }, + [multisigContractAddress], + ) + + report = await approveCommand.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + // Execute Multisig Proposal + const executeCommand = await wrapCommand(registerExecuteCommand(setThreshold))(deps).create( + { + threshold: 2, + multisigProposal: multisigProposalId, + ...myFlags, + }, + [multisigContractAddress], + ) + + report = await executeCommand.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + const { contract } = loadContract(CONTRACT_LIST.MULTISIG) + const multisigContract = new Contract( + contract.abi, + multisigContractAddress, + makeProvider(LOCAL_URL).provider, + ) + const threshold = await multisigContract.get_threshold() + expect(Number(threshold)).toEqual(2) + }, + TIMEOUT, + ) + + it( + 'Set Signers with multisig', + async () => { + const myFlags = (index) => { + return { + providerUrl: LOCAL_URL, + pk: privateKeys[index], + publicKey: publicKeys[index], + account: accounts[index], + multisig: multisigContractAddress, + } + } + const deps = (index: number): Dependencies => { + return { + logger: logger, + prompt: prompt, + makeEnv: (flags) => { + return myFlags(index) + }, + makeProvider: makeProvider, + makeWallet: makeWallet, + } + } + + accounts.push(newSignerAccount.account) + + // Create Multisig Proposal + const command = await wrapCommand(registerExecuteCommand(setSigners))(deps(0)).create( + { + signers: accounts, + ...myFlags(0), + }, + [multisigContractAddress], + ) + + let report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + const multisigProposalId = report.data.proposalId + + // Approve Multisig Proposal (with account 0) + let approveCommand = await wrapCommand(registerExecuteCommand(setSigners))(deps(0)).create( + { + signers: accounts, + multisigProposal: multisigProposalId, + ...myFlags(0), + }, + [multisigContractAddress], + ) + + report = await approveCommand.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + // Approve Multisig Proposal (with account 1) + approveCommand = await wrapCommand(registerExecuteCommand(setSigners))(deps(1)).create( + { + signers: accounts, + multisigProposal: multisigProposalId, + ...myFlags(1), + }, + [multisigContractAddress], + ) + + report = await approveCommand.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + // Execute Multisig Proposal + const executeCommand = await wrapCommand(registerExecuteCommand(setSigners))(deps(0)).create( + { + signers: accounts, + multisigProposal: multisigProposalId, + ...myFlags(0), + }, + [multisigContractAddress], + ) + + report = await executeCommand.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + const { contract } = loadContract(CONTRACT_LIST.MULTISIG) + const multisigContract = new Contract( + contract.abi, + multisigContractAddress, + makeProvider(LOCAL_URL).provider, + ) + const signers = await multisigContract.get_signers() + expect(signers).toHaveLength(4) + }, + TIMEOUT, + ) +}) diff --git a/packages-ts/gauntlet-starknet-starkgate/tsconfig.json b/packages-ts/starknet-gauntlet-multisig/tsconfig.json similarity index 100% rename from packages-ts/gauntlet-starknet-starkgate/tsconfig.json rename to packages-ts/starknet-gauntlet-multisig/tsconfig.json diff --git a/packages-ts/gauntlet-starknet/LICENSE b/packages-ts/starknet-gauntlet-ocr2/LICENSE similarity index 100% rename from packages-ts/gauntlet-starknet/LICENSE rename to packages-ts/starknet-gauntlet-ocr2/LICENSE diff --git a/packages-ts/starknet-gauntlet-ocr2/README.md b/packages-ts/starknet-gauntlet-ocr2/README.md new file mode 100644 index 000000000..01aab2c8d --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/README.md @@ -0,0 +1,91 @@ +# Starknet Gauntlet Commands for Chainlink OCR2 Protocol + +## Set up + +Make sure you have your account details set up in your `.env` file + +```bash +# .env +PRIVATE_KEY=0x... +ACCOUNT=0x... +LINK=0x... +``` + +Note: The [token contract](https://github.com/smartcontractkit/chainlink-starknet/tree/develop/packages-ts/starknet-gauntlet-token) should only be deployed once and the same contract should be used for very aggregator + + +## Deploying Contracts via Class Hash + +If you already know the class hash for a declared contract, all of the deploy commands in this module (ocr2, access_controller, proxy, Example) all have an optional --classHash flag which can be passed in to deploy a contract via the class hash rather than the local contract source code. + +e.g +```bash +yarn gauntlet access_controller:deploy --classHash= --network= +``` + +```bash +yarn gauntlet ocr2:deploy --network= --billingAccessController= --minSubmissionValue= --maxSubmissionValue= --decimals= --name= --link= --classHash= +``` + + +## Deploy an Access Controller Contract + +Run the following command: + +```bash +yarn gauntlet access_controller:deploy --network= +``` + +This command will generate a new Access Controller address and will give the details during the deployment. You can then add this contract address in your `.env` files as `BILLING_ACCESS_CONTROLLER`, or pass it into the command directly (as shown below) + +## Deploy an OCR2 Contract + +Run the following command substituting the following attributes: + +1. with the [deployed token contract](https://github.com/smartcontractkit/chainlink-starknet/tree/develop/packages-ts/starknet-gauntlet-token) +2. with the access controller contract you deployed in the previous section + +```bash +yarn gauntlet ocr2:deploy --network= --billingAccessController= --minSubmissionValue= --maxSubmissionValue= --decimals= --name= --link= +``` + +This command will generate a new OCR2 address and will give the details during the deployment + +## Set the Billing Details on OCR2 Contract + +Run the following command substituting with the OCR2 contract address you received in the deploy step: + +``` +yarn gauntlet ocr2:set_billing --observationPaymentGjuels= --transmissionPaymentGjuels= --gasBase= --gasPerSignature= +``` + +This Should set the billing details for this feed on contract address + +## Set the Config Details on OCR2 Contract + +Run the following command substituting with the OCR2 contract address you received in the deploy step: + +``` +yarn gauntlet ocr2:set_config --network= --address=
--secret= --f= --signers=[] --transmitters=[] --onchainConfig= --offchainConfig= --offchainConfigVersion= +``` + +Note: You must include the same random secret to deterministically run the set config multiple times (ex: for multisig proposals among different signers signing the same transaction). This can be achieved by setting a flag or environment variable ``--randomSecret`` or ``RANDOM_SECRET`` respectiviely. + +This Should set the config for this feed on contract address. + + +## Upgrading + +All of the contracts (besides example) can be upgraded by supplying a classHash flag + +e.g. + +```bash +yarn gautnlet access_controller:upgrade --network= --classHash= `, +``` + +or + +```bash +yarn gautnlet ocr2:upgrade --network= --classHash= `, +``` diff --git a/packages-ts/starknet-gauntlet-ocr2/package.json b/packages-ts/starknet-gauntlet-ocr2/package.json new file mode 100644 index 000000000..e078f613d --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/package.json @@ -0,0 +1,33 @@ +{ + "name": "@chainlink/starknet-gauntlet-ocr2", + "version": "0.0.1", + "description": "Starknet Gauntlet OCR2", + "keywords": [ + "typescript", + "cli" + ], + "main": "./dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist/**/*", + "!dist/**/*.test.js" + ], + "scripts": { + "gauntlet": "ts-node ./src/index.ts", + "lint": "tsc", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet-ocr2 --passWithNoTests", + "test:coverage": "yarn test --collectCoverage", + "test:ci": "yarn test --ci", + "format": "yarn prettier --write ./src", + "format:check": "yarn prettier --check ./src", + "clean": "rm -rf ./dist/ ./bin/", + "build": "yarn clean && tsc -b", + "bundle": "yarn build && pkg ." + }, + "dependencies": { + "@chainlink/gauntlet-contracts-ocr2": "0.2.2", + "@chainlink/gauntlet-core": "0.3.1", + "@chainlink/starknet-gauntlet": "*", + "@chainlink/starknet-gauntlet-oz": "*" + } +} diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/acceptOwnership.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/acceptOwnership.ts new file mode 100644 index 000000000..8c6e0ab92 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/acceptOwnership.ts @@ -0,0 +1,11 @@ +import { makeExecuteCommand, acceptOwnershipCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { accessControllerContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + acceptOwnershipCommandConfig( + CATEGORIES.ACCESS_CONTROLLER, + CATEGORIES.ACCESS_CONTROLLER, + accessControllerContractLoader, + ), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/declare.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/declare.ts new file mode 100644 index 000000000..75792da3d --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/declare.ts @@ -0,0 +1,11 @@ +import { makeExecuteCommand, declareCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { accessControllerContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + declareCommandConfig( + CATEGORIES.ACCESS_CONTROLLER, + CATEGORIES.ACCESS_CONTROLLER, + accessControllerContractLoader, + ), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/deploy.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/deploy.ts new file mode 100644 index 000000000..5fba2b54c --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/deploy.ts @@ -0,0 +1,41 @@ +import { ExecuteCommandConfig, makeExecuteCommand } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { accessControllerContractLoader, CONTRACT_LIST } from '../../lib/contracts' +import { validateClassHash } from '../../lib/utils' + +type UserInput = { + owner: string + classHash?: string +} + +type ContractInput = [owner: string] + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as UserInput + return { + owner: flags.owner || env.account, + classHash: flags.classHash, + } +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.owner] +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.ACCESS_CONTROLLER, + category: CATEGORIES.ACCESS_CONTROLLER, + action: 'deploy', + ux: { + description: 'Deploys an Access Controller Contract', + examples: [ + `${CATEGORIES.ACCESS_CONTROLLER}:deploy --network= --classHash=`, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateClassHash], + loadContract: accessControllerContractLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/index.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/index.ts new file mode 100644 index 000000000..24dbb9c13 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/index.ts @@ -0,0 +1,7 @@ +import Deploy from './deploy' +import Declare from './declare' +import Upgrade from './upgrade' +import TransferOwnership from './transferOwnership' +import AcceptOwnership from './acceptOwnership' + +export const executeCommands = [Declare, Deploy, Upgrade, TransferOwnership, AcceptOwnership] diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/transferOwnership.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/transferOwnership.ts new file mode 100644 index 000000000..bffa51016 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/transferOwnership.ts @@ -0,0 +1,11 @@ +import { makeExecuteCommand, transferOwnershipCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { accessControllerContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + transferOwnershipCommandConfig( + CATEGORIES.ACCESS_CONTROLLER, + CATEGORIES.ACCESS_CONTROLLER, + accessControllerContractLoader, + ), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/upgrade.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/upgrade.ts new file mode 100644 index 000000000..8c86a6a9c --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/accessController/upgrade.ts @@ -0,0 +1,11 @@ +import { makeExecuteCommand, upgradeCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { accessControllerContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + upgradeCommandConfig( + CATEGORIES.ACCESS_CONTROLLER, + CATEGORIES.ACCESS_CONTROLLER, + accessControllerContractLoader, + ), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/index.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/index.ts new file mode 100644 index 000000000..5f7344a13 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/index.ts @@ -0,0 +1,18 @@ +// import AccessController from './accessController' + +import { executeCommands as acExecuteCommands } from './accessController' +import { + executeCommands as ocr2ExecuteCommands, + inspectionCommands as ocr2InspectionCommands, +} from './ocr2' +import { + executeCommands as proxyExecuteCommands, + inspectionCommands as proxyInspectionCommands, +} from './proxy' + +export const executeCommands = [ + ...acExecuteCommands, + ...ocr2ExecuteCommands, + ...proxyExecuteCommands, +] +export const inspectionCommands = [...ocr2InspectionCommands, ...proxyInspectionCommands] diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/acceptOwnership.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/acceptOwnership.ts new file mode 100644 index 000000000..be9a06f76 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/acceptOwnership.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, acceptOwnershipCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + acceptOwnershipCommandConfig(CATEGORIES.OCR2, CATEGORIES.OCR2, ocr2ContractLoader), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/addAccess.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/addAccess.ts new file mode 100644 index 000000000..02d49c193 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/addAccess.ts @@ -0,0 +1,62 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + makeExecuteCommand, + isValidAddress, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ContractLoader, CONTRACT_LIST } from '../../lib/contracts' + +type UserInput = { + address: string +} + +type ContractInput = [address: string] + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as UserInput + return { + address: flags.address, + } +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.address] +} + +const validateAddresses = async (input) => { + if (!isValidAddress(input.address)) throw new Error(`Invalid address: ${input.address}`) + + return true +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info( + `About to add access to ${input.user.address} for aggregator at ${input.contract.join(', ')}`, + ) +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.OCR2, + category: CATEGORIES.OCR2, + action: 'add_access', + ux: { + description: 'Add read access to aggregator', + examples: [ + `${CATEGORIES.PROXY}:add_access --network= --address=
`, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateAddresses], + loadContract: ocr2ContractLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/declare.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/declare.ts new file mode 100644 index 000000000..cc3d52dcd --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/declare.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, declareCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + declareCommandConfig(CATEGORIES.OCR2, CATEGORIES.OCR2, ocr2ContractLoader), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/deploy.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/deploy.ts new file mode 100644 index 000000000..d91def109 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/deploy.ts @@ -0,0 +1,92 @@ +import { + CONTRACT_TYPES, + ExecuteCommandConfig, + makeExecuteCommand, + ExecutionContext, + getRDD, +} from '@chainlink/starknet-gauntlet' +import { ocr2ContractLoader } from '../../lib/contracts' +import { shortString } from 'starknet' +import { DeployOCR2, DeployOCR2Input } from '@chainlink/gauntlet-contracts-ocr2' +import { validateClassHash } from '../../lib/utils' + +export interface UserInput extends DeployOCR2Input { + owner?: string + classHash?: string +} + +type ContractInput = [ + owner: string, + link: string, + min_answer: number, + max_answer: number, + billing_access_controller: string, + decimals: number, + description: string, +] + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as UserInput + + if (flags.rdd) { + const rdd = getRDD(flags.rdd) + const contractAddr = args[0] + const aggregator = rdd[CONTRACT_TYPES.AGGREGATOR][contractAddr] + return { + maxAnswer: aggregator.maxSubmissionValue, + minAnswer: aggregator.minSubmissionValue, + decimals: aggregator.decimals, + description: aggregator.name, + billingAccessController: flags.billingAccessController || env.billingAccessController || '', + linkToken: flags.link || env.link || '', + owner: flags.owner || env.account || '', + } + } + + flags.min_answer = parseInt(flags.min_answer) + flags.max_answer = parseInt(flags.max_answer) + flags.decimals = parseInt(flags.decimals) + + const classHash = flags.classHash + const input = { + ...DeployOCR2.makeUserInput(flags, args, env), + owner: flags.owner || env.account, + } as UserInput + // DeployOCR2.validations does not allow input keys to be "false-y" so we only add classHash key if it is !== undefined + if (classHash !== undefined) { + input['classHash'] = classHash + } + return input +} + +const makeContractInput = async ( + input: UserInput, + ctx: ExecutionContext, +): Promise => { + return [ + input.owner, + input.linkToken, + input.minAnswer, + input.maxAnswer, + input.billingAccessController, + input.decimals, + shortString.encodeShortString(input.description), + ] +} + +const commandConfig: ExecuteCommandConfig = { + ...DeployOCR2, + validations: [...DeployOCR2.validations, validateClassHash], + ux: { + description: 'Deploys OCR2 contract', + examples: [ + `yarn gauntlet ocr2:deploy --network= --billingAccessController= --minSubmissionValue= --maxSubmissionValue= --decimals= --name= --link= --owner=`, + `yarn gauntlet ocr2:deploy --network= --rdd= --billingAccessController= --link= --owner= `, + ], + }, + makeUserInput: makeUserInput, + makeContractInput: makeContractInput, + loadContract: ocr2ContractLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/disableAccessCheck.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/disableAccessCheck.ts new file mode 100644 index 000000000..c915f551a --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/disableAccessCheck.ts @@ -0,0 +1,32 @@ +import { ExecuteCommandConfig, makeExecuteCommand } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ContractLoader, CONTRACT_LIST } from '../../lib/contracts' + +type UserInput = {} + +type ContractInput = [] + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as UserInput + return {} +} + +const makeContractInput = async (input: UserInput): Promise => { + return [] +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.OCR2, + category: CATEGORIES.OCR2, + action: 'disable_access_check', + ux: { + description: 'Disable access check at aggregator', + examples: [`${CATEGORIES.OCR2}:disable_access_check --network= `], + }, + makeUserInput, + makeContractInput, + validations: [], + loadContract: ocr2ContractLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/index.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/index.ts new file mode 100644 index 000000000..05c0d2d9e --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/index.ts @@ -0,0 +1,25 @@ +import Deploy from './deploy' +import Declare from './declare' +import Upgrade from './upgrade' +import inspect from './inspection/inspect' +import SetBilling from './setBilling' +import SetConfig from './setConfig' +import SetPayees from './setPayees' +import AddAccess from './addAccess' +import DisableAccessCheck from './disableAccessCheck' +import TransferOwnership from './transferOwnership' +import AcceptOwnership from './acceptOwnership' + +export const executeCommands = [ + Deploy, + Declare, + Upgrade, + AddAccess, + DisableAccessCheck, + SetBilling, + SetConfig, + SetPayees, + TransferOwnership, + AcceptOwnership, +] +export const inspectionCommands = [inspect] diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/inspection/configEvent.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/inspection/configEvent.ts new file mode 100644 index 000000000..4b43d0b75 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/inspection/configEvent.ts @@ -0,0 +1,31 @@ +import { IStarknetProvider } from '@chainlink/starknet-gauntlet' +import { hash } from 'starknet' + +export const getLatestOCRConfigEvent = async ( + provider: IStarknetProvider, + contractAddress: string, +) => { + // get block number in which the latest config was set + const res = await provider.provider.callContract({ + contractAddress, + entrypoint: 'latest_config_details', + calldata: [], + }) + const latestConfigDetails = { + configCount: parseInt(res[0]), + blockNumber: parseInt(res[1]), + configDigest: res[2], + } + // if no config has been set yet, return empty config + if (latestConfigDetails.configCount === 0) return [] + + const keyFilter = [hash.getSelectorFromName('ConfigSet')] + const chunk = await provider.provider.getEvents({ + address: contractAddress, + from_block: { block_number: latestConfigDetails.blockNumber }, + to_block: { block_number: latestConfigDetails.blockNumber }, + keys: [keyFilter], + chunk_size: 10, + }) + return chunk.events +} diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/inspection/inspect.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/inspection/inspect.ts new file mode 100644 index 000000000..9e6434759 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/inspection/inspect.ts @@ -0,0 +1,111 @@ +import { + InspectCommandConfig, + IStarknetProvider, + makeInspectionCommand, +} from '@chainlink/starknet-gauntlet' +import { shortString, validateAndParseAddress } from 'starknet' +import { CATEGORIES } from '../../../lib/categories' +import { ocr2ContractLoader } from '../../../lib/contracts' + +type QueryResult = { + typeAndVersion: string + description: string + owner: string + decimals: number + latestConfigDetails: { + configCount: number + blockNumber: number + configDigest: string + } + transmitterInfo: { + transmitter: string + owedPayment: string + }[] + billing: { + observationPaymentGjuels: string + transmissionPaymentGjuels: string + gasBase: string + gasPerSignature: string + } + linkAvailableForPayment: { + isNegative: boolean + absoluteDifference: string + } +} + +const makeComparisionData = (provider: IStarknetProvider) => async ( + results: any[], + input: null, + contractAddress: string, +): Promise<{ + toCompare: null + result: QueryResult +}> => { + const typeAndVersion = shortString.decodeShortString(results[0]) + const description = shortString.decodeShortString(results[1]) + const owner = validateAndParseAddress(results[2]) + const decimals = parseInt(results[3]) + const latestConfigDetails = { + configCount: parseInt(results[4][0]), + blockNumber: parseInt(results[4][1]), + configDigest: '0x' + results[4][2].toString(16), + } + const transmitters = results[5].map((address) => validateAndParseAddress(address)) + let transmitterInfo = [] + for (const transmitter of transmitters) { + const owedPayment = await provider.provider.callContract({ + contractAddress, + entrypoint: 'owed_payment', + calldata: [transmitter], + }) + transmitterInfo.push({ + transmitter, + owedPayment: parseInt(owedPayment[0]).toString(), + }) + } + const billing = { + observationPaymentGjuels: parseInt(results[6].observation_payment_gjuels).toString(), + transmissionPaymentGjuels: parseInt(results[6].transmission_payment_gjuels).toString(), + gasBase: parseInt(results[6].gas_base).toString(), + gasPerSignature: parseInt(results[6].gas_per_signature).toString(), + } + const linkAvailableForPayment = { + isNegative: results[7][0], + absoluteDifference: parseInt(results[7][1]).toString(), + } + return { + toCompare: null, + result: { + typeAndVersion, + description, + owner, + decimals, + latestConfigDetails, + transmitterInfo, + billing, + linkAvailableForPayment, + }, + } +} + +const commandConfig: InspectCommandConfig = { + ux: { + category: CATEGORIES.OCR2, + function: 'inspect', + examples: ['yarn gauntlet ocr2:inspect --network= '], + }, + queries: [ + 'type_and_version', + 'description', + 'owner', + 'decimals', + 'latest_config_details', + 'transmitters', + 'billing', + 'link_available_for_payment', + ], + makeComparisionData, + loadContract: ocr2ContractLoader, +} + +export default makeInspectionCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/setBilling.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/setBilling.ts new file mode 100644 index 000000000..fdb5b8571 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/setBilling.ts @@ -0,0 +1,58 @@ +import { + CONTRACT_TYPES, + ExecuteCommandConfig, + ExecutionContext, + makeExecuteCommand, +} from '@chainlink/starknet-gauntlet' +import { ocr2ContractLoader } from '../../lib/contracts' +import { SetBilling, SetBillingInput } from '@chainlink/gauntlet-contracts-ocr2' +import { getRDD } from '@chainlink/starknet-gauntlet' + +type StarknetSetBillingInput = SetBillingInput & { gasBase: number; gasPerSignature: number } + +type ContractInput = [ + { + observation_payment_gjuels: number + transmission_payment_gjuels: number + gas_base: number + gas_per_signature: number + }, +] + +const makeContractInput = async ( + input: StarknetSetBillingInput, + ctx: ExecutionContext, +): Promise => { + return [ + { + observation_payment_gjuels: input.observationPaymentGjuels, + transmission_payment_gjuels: input.transmissionPaymentGjuels, + gas_base: input.gasBase || 0, + gas_per_signature: input.gasPerSignature || 0, + }, + ] +} + +const commandConfig: ExecuteCommandConfig = { + ...SetBilling, + makeUserInput: (flags: any, args: any): StarknetSetBillingInput => { + if (flags.input) return flags.input as StarknetSetBillingInput + if (flags.rdd) { + const rdd = getRDD(flags.rdd) + const contractAddr = args[0] + const contract = rdd[CONTRACT_TYPES.AGGREGATOR][contractAddr] + return contract.billing + } + + return { + observationPaymentGjuels: parseInt(flags.observationPaymentGjuels), + transmissionPaymentGjuels: parseInt(flags.transmissionPaymentGjuels), + gasBase: parseInt(flags.gasBase || '0'), // optional + gasPerSignature: parseInt(flags.gasPerSignature || '0'), //optional + } + }, + makeContractInput: makeContractInput, + loadContract: ocr2ContractLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/setConfig.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/setConfig.ts new file mode 100644 index 000000000..8ee960375 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/setConfig.ts @@ -0,0 +1,229 @@ +import fs from 'fs' +import { + CONTRACT_TYPES, + AfterExecute, + ExecuteCommandConfig, + ExecutionContext, + makeExecuteCommand, + bytesToFelts, + BeforeExecute, + getRDD, + tryToWriteLastConfigDigestToRDD, +} from '@chainlink/starknet-gauntlet' +import { time, diff } from '@chainlink/gauntlet-core/dist/utils' +import { ocr2ContractLoader } from '../../lib/contracts' +import { SetConfig, encoding, SetConfigInput } from '@chainlink/gauntlet-contracts-ocr2' +import { decodeOffchainConfigFromEventData } from '../../lib/encoding' +import assert from 'assert' +import { getLatestOCRConfigEvent } from './inspection/configEvent' +import { BigNumberish, GetTransactionReceiptResponse } from 'starknet' + +type Oracle = { + signer: string + transmitter: string +} + +type ContractInput = [ + oracles: Oracle[], + f: number, + onchain_config: string[], + offchain_config_version: number, + offchain_config: string[], +] + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as SetConfigInput + if (flags.rdd) { + const rdd = getRDD(flags.rdd) + const contractAddr = args[0] + const contract = rdd[CONTRACT_TYPES.AGGREGATOR][contractAddr] + const config = contract.config + const operators = contract.oracles.map((oracle) => rdd.operators[oracle.operator]) + const peerIds = operators.map((o) => o.peerId[0]) + const offchainConfig: encoding.OffchainConfig = { + deltaProgressNanoseconds: time.durationToNanoseconds(config.deltaProgress).toNumber(), + deltaResendNanoseconds: time.durationToNanoseconds(config.deltaResend).toNumber(), + deltaRoundNanoseconds: time.durationToNanoseconds(config.deltaRound).toNumber(), + deltaGraceNanoseconds: time.durationToNanoseconds(config.deltaGrace).toNumber(), + deltaStageNanoseconds: time.durationToNanoseconds(config.deltaStage).toNumber(), + rMax: config.rMax, + s: config.s, + offchainPublicKeys: operators.map((o) => o.ocr2OffchainPublicKey[0]), + peerIds: peerIds, + reportingPluginConfig: { + alphaReportInfinite: config.reportingPluginConfig.alphaReportInfinite, + alphaReportPpb: Number(config.reportingPluginConfig.alphaReportPpb), + alphaAcceptInfinite: config.reportingPluginConfig.alphaAcceptInfinite, + alphaAcceptPpb: Number(config.reportingPluginConfig.alphaAcceptPpb), + deltaCNanoseconds: time + .durationToNanoseconds(config.reportingPluginConfig.deltaC) + .toNumber(), + }, + maxDurationQueryNanoseconds: time.durationToNanoseconds(config.maxDurationQuery).toNumber(), + maxDurationObservationNanoseconds: time + .durationToNanoseconds(config.maxDurationObservation) + .toNumber(), + maxDurationReportNanoseconds: time.durationToNanoseconds(config.maxDurationReport).toNumber(), + maxDurationShouldAcceptFinalizedReportNanoseconds: time + .durationToNanoseconds(config.maxDurationShouldAcceptFinalizedReport) + .toNumber(), + maxDurationShouldTransmitAcceptedReportNanoseconds: time + .durationToNanoseconds(config.maxDurationShouldTransmitAcceptedReport) + .toNumber(), + configPublicKeys: operators.map((o) => o.ocr2ConfigPublicKey[0]), + } + + return { + f: config.f, + signers: operators.map((o) => o.ocr2OnchainPublicKey[0]), + transmitters: operators.map((o) => o.ocrNodeAddress[0]), + onchainConfig: [], + offchainConfig, + offchainConfigVersion: 2, + secret: flags.secret || env.secret, + randomSecret: flags.randomSecret || env.randomSecret, + } + } + + return { + f: parseInt(flags.f), + signers: flags.signers, + transmitters: flags.transmitters, + onchainConfig: flags.onchainConfig, + offchainConfig: flags.offchainConfig, + offchainConfigVersion: parseInt(flags.offchainConfigVersion), + secret: flags.secret || env.secret, + randomSecret: flags.randomSecret || env.randomSecret, + } +} + +export const validateSecretsNotEmpty = async (input) => { + if (input.secret === undefined) { + throw new Error(`A secret must be provided (--secret flag or SECRET environment variable)`) + } + + return true +} + +const makeContractInput = async ( + input: SetConfigInput, + ctx: ExecutionContext, +): Promise => { + const oracles: Oracle[] = input.signers.map((o, i) => { + // standard format from chainlink node ocr2on_starknet_ (no 0x prefix) + let signer = input.signers[i].replace('ocr2on_starknet_', '') // replace prefix if present + signer = signer.startsWith('0x') ? signer : '0x' + signer // prepend 0x if missing + + return { + signer, + transmitter: input.transmitters[i], + } + }) + + // remove prefix if present on offchain key + input.offchainConfig.offchainPublicKeys = input.offchainConfig.offchainPublicKeys.map((k) => + k.replace('ocr2off_starknet_', ''), + ) + input.offchainConfig.configPublicKeys = input.offchainConfig.configPublicKeys.map((k) => + k.replace('ocr2cfg_starknet_', ''), + ) + + const { offchainConfig } = await encoding.serializeOffchainConfig( + input.offchainConfig, + input.secret, + input.randomSecret, + ) + const onchainConfig = [] // onchain config should be empty array for input (generate onchain) + return [oracles, input.f, onchainConfig, 2, bytesToFelts(offchainConfig)] +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.loading(`Executing ${context.id} from contract ${context.contractAddress}`) + + const { offchainConfig } = await encoding.serializeOffchainConfig( + input.user.offchainConfig, + input.user.secret, + ) + + const newOffchainConfig = encoding.deserializeConfig(offchainConfig) + + const rawEvents = await getLatestOCRConfigEvent(context.provider, context.contractAddress) + if (rawEvents.length === 0) { + // if no config set events found in the given block, throw error + // this should not happen if block number in latestConfigDetails is set correctly + deps.logger.info('No previous config found, review the offchain config below:') + deps.logger.log(newOffchainConfig) + return + } + // assume last event found is the latest config, in the event that multiple + // set_config transactions ended up in the same block + const events = context.contract.parseEvents({ + events: rawEvents, + } as GetTransactionReceiptResponse) + const event = events[events.length - 1]['ConfigSet'] + const currOffchainConfig = decodeOffchainConfigFromEventData( + event.offchain_config as BigNumberish[], + ) + + deps.logger.info( + 'Review the proposed offchain config changes below: green - added, red - deleted.', + ) + diff.printDiff(currOffchainConfig, newOffchainConfig) +} + +const afterExecute: AfterExecute = (context, input, deps) => async ( + result, +) => { + const txHash = result.responses[0].tx.hash + const txInfo = await context.provider.provider.getTransactionReceipt(txHash) + if (!txInfo.isSuccess()) { + return { successfulConfiguration: false } + } + const events = context.contract.parseEvents(txInfo) + const event = events[events.length - 1]['ConfigSet'] + const offchainConfig = decodeOffchainConfigFromEventData(event.offchain_config as BigNumberish[]) + + try { + // remove cfg keys from user input + delete input.user.offchainConfig.configPublicKeys + assert.deepStrictEqual(offchainConfig, input.user.offchainConfig) + deps.logger.success('Configuration was successfully set') + + // write lastConfigDigest back to RDD + const hexLastConfigDigest = `${(event.latest_config_digest as bigint).toString(16)}` + // config digest string must be exactly 32 bytes + const paddedHexLastConfigDigest = hexLastConfigDigest.padStart(64, '0') + const configDigest = `0x${paddedHexLastConfigDigest}` + + await tryToWriteLastConfigDigestToRDD( + deps, + context.flags.rdd, + context.contract.address, + configDigest, + ) + + return { successfulConfiguration: true } + } catch (e) { + deps.logger.error('Configuration set is different than provided') + deps.logger.log(offchainConfig) + return { successfulConfiguration: false } + } +} + +const commandConfig: ExecuteCommandConfig = { + ...SetConfig, + validations: [...SetConfig.validations, validateSecretsNotEmpty], + makeUserInput: makeUserInput, + makeContractInput: makeContractInput, + loadContract: ocr2ContractLoader, + hooks: { + beforeExecute, + afterExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/setPayees.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/setPayees.ts new file mode 100644 index 000000000..dd59729e8 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/setPayees.ts @@ -0,0 +1,124 @@ +import { + CONTRACT_TYPES, + ExecuteCommandConfig, + makeExecuteCommand, + getRDD, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { CONTRACT_LIST, ocr2ContractLoader } from '../../lib/contracts' + +type Payee = { + transmitter: string + payee: string +} + +type PayeeConfig = { + payees: Payee[] +} + +type UserInput = Payee[] + +type ContractInput = PayeeConfig + +const makeUserInput = async (flags, args): Promise => { + if (flags.input) return flags.input as UserInput + + if (flags.rdd) { + // Read inputs + const contractAddress = args[0] + const rdd = getRDD(flags.rdd) + + // Get the "operators" section of the RDD file + const operators = rdd.operators + if (operators == null || typeof operators !== 'object') { + throw new Error(`expected rdd["operators"] to be an object but got: ${operators}`) + } + + // Get the config that corresponds to the input contract address + const contract = rdd?.[CONTRACT_TYPES.AGGREGATOR]?.[contractAddress] + if (contract == null || typeof contract !== 'object') { + throw new Error( + `expected rdd["${CONTRACT_TYPES.AGGREGATOR}"]["${contractAddress}"] to be an object but got: ${contract}`, + ) + } + + // Get the contract's oracles + const oracles = contract.oracles + if (!Array.isArray(oracles)) { + throw new Error( + `expected rdd["${CONTRACT_TYPES.AGGREGATOR}"]["${contractAddress}"]["oracles"] to be an array but got: ${oracles}`, + ) + } + + // Iterate over the contract's oracles + return oracles.map((oracle, i) => { + // Get the operator name from the oracle + const operatorName = oracle.operator + if (typeof operatorName !== 'string') { + throw new Error( + `expected rdd["${CONTRACT_TYPES.AGGREGATOR}"]["${contractAddress}"]["oracles"][${i}]["operator"] to be a string but got: ${operatorName}`, + ) + } + + // Use the operator name to get the transmitter and payee info from the "operators" section of the RDD file + const operator = operators[operatorName] + if (operator == null || typeof operator !== 'object') { + throw new Error( + `expected rdd["operators"]["${operatorName}"] to be an object but got: ${operator}`, + ) + } + + // Validate the transmitter address + const nodeAddress = operator.ocrNodeAddress + if (!Array.isArray(nodeAddress)) { + throw new Error( + `expected rdd["operators"]["${operatorName}"]["ocrNodeAddress"] to be an array but got: ${nodeAddress}`, + ) + } + + // Return the transmitter and payee info + return { + transmitter: nodeAddress[0], + payee: operator.payeeAddress, + } as Payee + }) + } + + const transmitters = flags.transmitters.split(',') + const payees = flags.payees.split(',') + if (transmitters.length != payees.length) + throw new Error('Invalid input for payee config: number of transmitters and payees must match') + + return transmitters.map((transmitter, i) => ({ + transmitter, + payee: payees[i], + })) as UserInput +} + +const makeContractInput = async (input: UserInput): Promise => { + return { + payees: input.map((payee: Payee) => ({ + transmitter: payee.transmitter, + payee: payee.payee, + })), + } as ContractInput +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.OCR2, + action: 'set_payees', + category: CATEGORIES.OCR2, + ux: { + description: 'Set payees of OCR2 contract', + examples: [ + `yarn gauntlet ocr2:set_payees --network= --transmitters=[] --payees=[] `, + `yarn gauntlet ocr2:set_payees --network= --rdd= `, + ], + }, + validations: [], + makeUserInput: makeUserInput, + makeContractInput: makeContractInput, + loadContract: ocr2ContractLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/transferOwnership.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/transferOwnership.ts new file mode 100644 index 000000000..2a70d4aac --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/transferOwnership.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, transferOwnershipCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + transferOwnershipCommandConfig(CATEGORIES.OCR2, CATEGORIES.OCR2, ocr2ContractLoader), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/upgrade.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/upgrade.ts new file mode 100644 index 000000000..9fb915cba --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/ocr2/upgrade.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, upgradeCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + upgradeCommandConfig(CATEGORIES.OCR2, CATEGORIES.OCR2, ocr2ContractLoader), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/acceptOwnership.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/acceptOwnership.ts new file mode 100644 index 000000000..df7b74b32 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/acceptOwnership.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, acceptOwnershipCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ProxyLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + acceptOwnershipCommandConfig(CATEGORIES.PROXY, CATEGORIES.PROXY, ocr2ProxyLoader), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/confirmAggregator.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/confirmAggregator.ts new file mode 100644 index 000000000..7607a4d93 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/confirmAggregator.ts @@ -0,0 +1,63 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + makeExecuteCommand, + isValidAddress, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ProxyLoader, CONTRACT_LIST } from '../../lib/contracts' + +type UserInput = { + address: string +} + +type ContractInput = [address: string] + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as UserInput + return { + address: flags.address, + } +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.address] +} + +const validateAddresses = async (input) => { + if (!isValidAddress(input.address)) + throw new Error(`Invalid aggregator address: ${input.address}`) + + return true +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info( + `About to confirm aggregator ${input.user.address} for proxy at ${input.contract.join(', ')}`, + ) +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.PROXY, + category: CATEGORIES.PROXY, + action: 'confirm_aggregator', + ux: { + description: 'Confirm new aggregator for OCR2 proxy', + examples: [ + `${CATEGORIES.PROXY}:confirm_aggregator --network= --address= `, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateAddresses], + loadContract: ocr2ProxyLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/declare.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/declare.ts new file mode 100644 index 000000000..2cefd282e --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/declare.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, declareCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ProxyLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + declareCommandConfig(CATEGORIES.PROXY, CATEGORIES.PROXY, ocr2ProxyLoader), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/deploy.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/deploy.ts new file mode 100644 index 000000000..0dc911030 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/deploy.ts @@ -0,0 +1,70 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + makeExecuteCommand, + isValidAddress, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ProxyLoader, CONTRACT_LIST } from '../../lib/contracts' +import { validateClassHash } from '../../lib/utils' + +type UserInput = { + owner: string + address: string + classHash?: string +} + +type ContractInput = [owner: string, address: string] + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as UserInput + return { + owner: flags.owner || env.account, + address: flags.address, + classHash: flags.classHash, + } +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.owner, input.address] +} + +const validateAddresses = async (input) => { + if (!isValidAddress(input.owner)) throw new Error(`Invalid owner address: ${input.owner}`) + + if (!isValidAddress(input.address)) + throw new Error(`Invalid aggregator address: ${input.address}`) + + return true +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info( + `About to deploy proxy for aggregator at ${input.user.address} with owner ${input.user.owner}`, + ) +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.PROXY, + category: CATEGORIES.PROXY, + action: 'deploy', + ux: { + description: 'Deploys an OCR2 aggregator proxy', + examples: [ + `${CATEGORIES.PROXY}:deploy --network= --address= --classHash=`, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateAddresses, validateClassHash], + loadContract: ocr2ProxyLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/disableAccessCheck.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/disableAccessCheck.ts new file mode 100644 index 000000000..36eaeaf32 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/disableAccessCheck.ts @@ -0,0 +1,32 @@ +import { ExecuteCommandConfig, makeExecuteCommand } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ProxyLoader, CONTRACT_LIST } from '../../lib/contracts' + +type UserInput = {} + +type ContractInput = [] + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as UserInput + return {} +} + +const makeContractInput = async (input: UserInput): Promise => { + return [] +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.PROXY, + category: CATEGORIES.PROXY, + action: 'disable_access_check', + ux: { + description: 'Disable access check at aggregator proxy', + examples: [`${CATEGORIES.PROXY}:disable_access_check --network= `], + }, + makeUserInput, + makeContractInput, + validations: [], + loadContract: ocr2ProxyLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/index.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/index.ts new file mode 100644 index 000000000..60b5fe19d --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/index.ts @@ -0,0 +1,21 @@ +import Deploy from './deploy' +import Declare from './declare' +import Upgrade from './upgrade' +import Inspect from './inspection/inspect' +import ProposeAggregator from './proposeAggregator' +import ConfirmAggregator from './confirmAggregator' +import TransferOwnership from './transferOwnership' +import AcceptOwnership from './acceptOwnership' +import DisableAccessCheck from './disableAccessCheck' + +export const executeCommands = [ + Deploy, + Declare, + Upgrade, + ProposeAggregator, + ConfirmAggregator, + TransferOwnership, + AcceptOwnership, + DisableAccessCheck, +] +export const inspectionCommands = [Inspect] diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/inspection/inspect.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/inspection/inspect.ts new file mode 100644 index 000000000..7b3ab48c4 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/inspection/inspect.ts @@ -0,0 +1,61 @@ +import { + InspectCommandConfig, + IStarknetProvider, + makeInspectionCommand, +} from '@chainlink/starknet-gauntlet' +import { validateAndParseAddress, shortString } from 'starknet' +import { CATEGORIES } from '../../../lib/categories' +import { ocr2ProxyLoader } from '../../../lib/contracts' + +type QueryResult = { + round: any + aggregator: string + phaseId: string + description: string + decimals: number + typeAndVersion: string +} + +const makeComparisionData = (provider: IStarknetProvider) => async ( + results: any[], + input: null, + contractAddress: string, +): Promise<{ + toCompare: null + result: QueryResult +}> => { + return { + toCompare: null, + result: { + round: results[0][0], + aggregator: validateAndParseAddress(results[1][0]), + phaseId: results[2][0].toString(10), + description: shortString.decodeShortString(results[3][0].toJSON()), + decimals: results[4][0].toNumber(), + typeAndVersion: shortString.decodeShortString(results[5][0].toJSON()), + }, + } +} + +// TODO: make inspection for proposed aggregator +// causes sequencer to throw 500 error and whole inspection to fail if proposed aggregator not set + +const commandConfig: InspectCommandConfig = { + ux: { + category: CATEGORIES.PROXY, + function: 'inspect', + examples: ['yarn gauntlet proxy:inspect --network= '], + }, + queries: [ + 'latest_round_data', + 'aggregator', + 'phase_id', + 'description', + 'decimals', + 'type_and_version', + ], + makeComparisionData, + loadContract: ocr2ProxyLoader, +} + +export default makeInspectionCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/proposeAggregator.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/proposeAggregator.ts new file mode 100644 index 000000000..856523852 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/proposeAggregator.ts @@ -0,0 +1,63 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + makeExecuteCommand, + isValidAddress, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ProxyLoader, CONTRACT_LIST } from '../../lib/contracts' + +type UserInput = { + address: string +} + +type ContractInput = [address: string] + +const makeUserInput = async (flags, args, env): Promise => { + if (flags.input) return flags.input as UserInput + return { + address: flags.address, + } +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.address] +} + +const validateAddresses = async (input) => { + if (!isValidAddress(input.address)) + throw new Error(`Invalid aggregator address: ${input.address}`) + + return true +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info( + `About to propose aggregator ${input.user.address} for proxy at ${input.contract.join(', ')}`, + ) +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.PROXY, + category: CATEGORIES.PROXY, + action: 'propose_aggregator', + ux: { + description: 'Propose new aggregator for OCR2 proxy', + examples: [ + `${CATEGORIES.PROXY}:propose_aggregator --network= --address= `, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateAddresses], + loadContract: ocr2ProxyLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/transferOwnership.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/transferOwnership.ts new file mode 100644 index 000000000..9c270c37c --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/transferOwnership.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, transferOwnershipCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ProxyLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + transferOwnershipCommandConfig(CATEGORIES.PROXY, CATEGORIES.PROXY, ocr2ProxyLoader), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/upgrade.ts b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/upgrade.ts new file mode 100644 index 000000000..046c4ac2c --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/commands/proxy/upgrade.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, upgradeCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { ocr2ProxyLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + upgradeCommandConfig(CATEGORIES.PROXY, CATEGORIES.PROXY, ocr2ProxyLoader), +) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/index.ts b/packages-ts/starknet-gauntlet-ocr2/src/index.ts new file mode 100644 index 000000000..8c2064b92 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/index.ts @@ -0,0 +1,3 @@ +import { executeCommands, inspectionCommands } from './commands' + +export { executeCommands, inspectionCommands } diff --git a/packages-ts/gauntlet-starknet-ocr2/src/lib/categories.ts b/packages-ts/starknet-gauntlet-ocr2/src/lib/categories.ts similarity index 83% rename from packages-ts/gauntlet-starknet-ocr2/src/lib/categories.ts rename to packages-ts/starknet-gauntlet-ocr2/src/lib/categories.ts index de1c023f3..600189100 100644 --- a/packages-ts/gauntlet-starknet-ocr2/src/lib/categories.ts +++ b/packages-ts/starknet-gauntlet-ocr2/src/lib/categories.ts @@ -1,4 +1,5 @@ export const CATEGORIES = { ACCESS_CONTROLLER: 'access_controller', OCR2: 'ocr2', + PROXY: 'proxy', } diff --git a/packages-ts/starknet-gauntlet-ocr2/src/lib/contracts.ts b/packages-ts/starknet-gauntlet-ocr2/src/lib/contracts.ts new file mode 100644 index 000000000..350807796 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/lib/contracts.ts @@ -0,0 +1,13 @@ +import { loadContract } from '@chainlink/starknet-gauntlet' + +export enum CONTRACT_LIST { + OCR2 = 'Aggregator', + ACCESS_CONTROLLER = 'AccessController', + PROXY = 'AggregatorProxy', + AGGREGATOR_CONSUMER = 'AggregatorConsumer', +} + +export const ocr2ContractLoader = () => loadContract(CONTRACT_LIST.OCR2) +export const ocr2ProxyLoader = () => loadContract(CONTRACT_LIST.PROXY) +export const aggregatorConsumerLoader = () => loadContract(CONTRACT_LIST.AGGREGATOR_CONSUMER) +export const accessControllerContractLoader = () => loadContract(CONTRACT_LIST.ACCESS_CONTROLLER) diff --git a/packages-ts/starknet-gauntlet-ocr2/src/lib/encoding.ts b/packages-ts/starknet-gauntlet-ocr2/src/lib/encoding.ts new file mode 100644 index 000000000..e33ac54db --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/lib/encoding.ts @@ -0,0 +1,9 @@ +import { encoding } from '@chainlink/gauntlet-contracts-ocr2' +import { feltsToBytes } from '@chainlink/starknet-gauntlet' +import { BigNumberish } from 'starknet' + +export const decodeOffchainConfigFromEventData = ( + data: BigNumberish[], +): encoding.OffchainConfig => { + return encoding.deserializeConfig(feltsToBytes(data)) +} diff --git a/packages-ts/starknet-gauntlet-ocr2/src/lib/utils.ts b/packages-ts/starknet-gauntlet-ocr2/src/lib/utils.ts new file mode 100644 index 000000000..d52a440a7 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/src/lib/utils.ts @@ -0,0 +1,8 @@ +import { isValidAddress } from '@chainlink/starknet-gauntlet' + +export const validateClassHash = async (input) => { + if (isValidAddress(input.classHash) || input.classHash === undefined) { + return true + } + throw new Error(`Invalid Class Hash: ${input.classHash}`) +} diff --git a/packages-ts/starknet-gauntlet-ocr2/test/commands/access_controller.test.ts b/packages-ts/starknet-gauntlet-ocr2/test/commands/access_controller.test.ts new file mode 100644 index 000000000..aabf4b5b0 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/test/commands/access_controller.test.ts @@ -0,0 +1,15 @@ +import deployCommand from '../../src/commands/accessController/deploy' +import { registerExecuteCommand, TIMEOUT } from '@chainlink/starknet-gauntlet/test/utils' + +describe('Access Controller Contract', () => { + it( + 'Deployment', + async () => { + const command = await registerExecuteCommand(deployCommand).create({}, []) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + }, + TIMEOUT, + ) +}) diff --git a/packages-ts/starknet-gauntlet-ocr2/test/commands/ocr2.test.ts b/packages-ts/starknet-gauntlet-ocr2/test/commands/ocr2.test.ts new file mode 100644 index 000000000..d10763672 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/test/commands/ocr2.test.ts @@ -0,0 +1,390 @@ +import { makeProvider } from '@chainlink/starknet-gauntlet' +import deployCommand from '../../src/commands/ocr2/deploy' +import setBillingCommand from '../../src/commands/ocr2/setBilling' +import setConfigCommand from '../../src/commands/ocr2/setConfig' +import transferOwnershipCommand from '../../src/commands/ocr2/transferOwnership' +import acceptOwnershipCommand from '../../src/commands/ocr2/acceptOwnership' +import deployACCommand from '../../src/commands/accessController/deploy' +import { + registerExecuteCommand, + TIMEOUT, + LOCAL_URL, + StarknetAccount, + fetchAccount, +} from '@chainlink/starknet-gauntlet/test/utils' +import { loadContract } from '@chainlink/starknet-gauntlet' +import { CONTRACT_LIST } from '../../src/lib/contracts' +import { Contract, InvokeTransactionReceiptResponse, RpcProvider } from 'starknet' +import { RDDTempFile } from './utils' +import path from 'path' + +const signers = [ + 'ocr2on_starknet_04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603730', // ocr2on_starknet_ + 'ocr2on_starknet_0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603731', // ocr2on_starknet_0x + '0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603732', // 0x + '04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603733', // +] + +const transmitters = [ + '0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603734', + '0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603735', + '0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603736', + '0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603737', +] + +const validInput = { + f: 1, + signers, + transmitters, + onchainConfig: '', + offchainConfig: { + deltaProgressNanoseconds: 8000000000, + deltaResendNanoseconds: 30000000000, + deltaRoundNanoseconds: 3000000000, + deltaGraceNanoseconds: 500000000, + deltaStageNanoseconds: 20000000000, + rMax: 5, + s: [1, 2], + offchainPublicKeys: [ + 'af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852090', + 'af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852091', + 'af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852092', + 'af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852093', + ], + peerIds: signers, + reportingPluginConfig: { + alphaReportInfinite: false, + alphaReportPpb: 0, + alphaAcceptInfinite: false, + alphaAcceptPpb: 0, + deltaCNanoseconds: 0, + }, + maxDurationQueryNanoseconds: 2000000000, + maxDurationObservationNanoseconds: 1000000000, + maxDurationReportNanoseconds: 200000000, + maxDurationShouldAcceptFinalizedReportNanoseconds: 200000000, + maxDurationShouldTransmitAcceptedReportNanoseconds: 200000000, + configPublicKeys: [ + 'af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852094', + 'af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852095', + 'af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852096', + 'af400004fa5d02cd5170b5261032e71f2847ead36159cf8dee68affc3c852097', + ], + }, + offchainConfigVersion: 2, + secret: 'awe accuse polygon tonic depart acuity onyx inform bound gilbert expire', + randomSecret: 'awe accuse polygon tonic depart acuity onyx inform bound gilbert expire', +} + +const getNumCallsPerAddress = (txReceipt: InvokeTransactionReceiptResponse) => { + const counter = new Map() + txReceipt.events.forEach((ev) => { + const count = counter.get(ev.from_address) + if (count == null) { + counter.set(ev.from_address, 1) + } else { + counter.set(ev.from_address, count + 1) + } + }) + return counter +} + +describe('OCR2 Contract', () => { + const rddTempFilePath = path.join(__dirname, 'tmp', 'rdd.json') + const rddTempFile = new RDDTempFile(rddTempFilePath) + const feedAddresses = new Array() + const numFeeds = 3 + + let owner: StarknetAccount + + beforeAll(async () => { + // Fetches a prefunded account from the local starknet devnet node + owner = await fetchAccount() + + // Deploys an access controller + // TODO: owner can't be 0 anymore + const deployAccessControllerCmd = await registerExecuteCommand(deployACCommand).create({}, []) + const deployAccessControllerReport = await deployAccessControllerCmd.execute() + expect(deployAccessControllerReport.responses[0].tx.status).toEqual('ACCEPTED') + const accessController = deployAccessControllerReport.responses[0].contract + + // Deploys one feed at a time (if we try to do this in parallel using + // `Promise.all` / `Promise.allSettled`, then transaction nonce errors + // will occur) + for (let i = 0; i < numFeeds; i++) { + const deployCmd = await registerExecuteCommand(deployCommand).create( + { + input: { + owner: owner.address, + maxAnswer: 10000, + minAnswer: 1, + decimals: 18, + description: `Test Feed ${i}`, + billingAccessController: accessController, + linkToken: '0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603730', + }, + }, + [], + ) + const deployReport = await deployCmd.execute() + expect(deployReport.responses[0].tx.status).toEqual('ACCEPTED') + feedAddresses.push(deployReport.responses[0].contract) + } + + // Adds dummy billing configs to the temp RDD file + feedAddresses.forEach((addr, i) => { + rddTempFile.setBilling(addr, { + observationPaymentGjuels: String(i), + transmissionPaymentGjuels: String(i), + gasBase: String(i), + gasPerSignature: String(i), + }) + }) + + // Writes the RDD file to disk + await rddTempFile.writeFile() + }, TIMEOUT) + + afterAll(async () => { + await rddTempFile.removeFile() + }) + + it( + 'Set billing', + async () => { + // transfer overflow on set billing + const command = await registerExecuteCommand(setBillingCommand).create( + { + input: { + observationPaymentGjuels: 1, + transmissionPaymentGjuels: 1, + gasBase: 14951, + gasPerSignature: 13, + }, + }, + feedAddresses, + ) + + // Execute the command + const report = await command.execute() + const maybeRes = report.responses.at(0) + expect(maybeRes).not.toBeFalsy() + + // Validate the response + const res = maybeRes! + expect(res.tx.status).toEqual('ACCEPTED') + expect(res.tx.hash).not.toBeNull() + + // Checks that the transaction was successful + const provider: RpcProvider = makeProvider(LOCAL_URL).provider + const receipt = await provider.waitForTransaction(res.tx.hash) + expect(receipt.isSuccess()).toBeTruthy() + const txReceipt = receipt as InvokeTransactionReceiptResponse + + // Loads the contract + const { contract } = loadContract(CONTRACT_LIST.OCR2) + + // Creates a map where each key is an address and each corresponding value is + // the number of times the address is seen in the transaction receipt events + const counter = getNumCallsPerAddress(txReceipt) + + // Iterate over the feeds + for (const feedAddress of feedAddresses) { + // Checks that the feed was updated + const ocr2Contract = new Contract(contract.abi, feedAddress, provider) + const billing = await ocr2Contract.billing() + expect(billing.observation_payment_gjuels).toEqual(BigInt(1)) + expect(billing.transmission_payment_gjuels).toEqual(BigInt(1)) + + // Checks that the correct number of batch calls were made + expect(counter.get(feedAddress) ?? 0).toEqual(1) + } + }, + TIMEOUT, + ) + + it( + 'Set billing using --rdd', + async () => { + // transfer overflow on set billing + const command = await registerExecuteCommand(setBillingCommand).create( + { + rdd: rddTempFile.filepath, + }, + feedAddresses, + ) + + // Execute the command + const report = await command.execute() + const maybeRes = report.responses.at(0) + expect(maybeRes).not.toBeFalsy() + + // Validate the response + const res = maybeRes! + expect(res.tx.status).toEqual('ACCEPTED') + expect(res.tx.hash).not.toBeNull() + + // Checks that the transaction was successful + const provider: RpcProvider = makeProvider(LOCAL_URL).provider + const receipt = await provider.waitForTransaction(res.tx.hash) + expect(receipt.isSuccess()).toBeTruthy() + const txReceipt = receipt as InvokeTransactionReceiptResponse + + // Loads the contract + const { contract } = loadContract(CONTRACT_LIST.OCR2) + + // Creates a map where each key is an address and each corresponding value is + // the number of times the address is seen in the transaction receipt events + const counter = getNumCallsPerAddress(txReceipt) + + // Iterates over the feeds and checks that the values were updated and that the + // number of batch calls is correct + await Promise.all( + feedAddresses.map(async (feedAddress, i) => { + const ocr2Contract = new Contract(contract.abi, feedAddress, provider) + const billing = await ocr2Contract.billing() + expect(billing.observation_payment_gjuels).toEqual(BigInt(i)) + expect(billing.transmission_payment_gjuels).toEqual(BigInt(i)) + expect(counter.get(feedAddress) ?? 0).toEqual(1) + }), + ) + }, + TIMEOUT, + ) + + it( + 'Set config using --input', + async () => { + const command = await registerExecuteCommand(setConfigCommand).create( + { + input: validInput, + }, + feedAddresses, + ) + + // Execute the command + const report = await command.execute() + const maybeRes = report.responses.at(0) + expect(maybeRes).not.toBeFalsy() + + // Validate the response + const res = maybeRes! + expect(res.tx.status).toEqual('ACCEPTED') + expect(res.tx.hash).not.toBeNull() + + // Checks that the transaction was successful + const provider: RpcProvider = makeProvider(LOCAL_URL).provider + const receipt = await provider.waitForTransaction(res.tx.hash) + expect(receipt.isSuccess()).toBeTruthy() + const txReceipt = receipt as InvokeTransactionReceiptResponse + + // Loads the contract + const { contract } = loadContract(CONTRACT_LIST.OCR2) + + // Creates a map where each key is an address and each corresponding value is + // the number of times the address is seen in the transaction receipt events + const counter = getNumCallsPerAddress(txReceipt) + + // Iterate over the feeds + for (const feedAddress of feedAddresses) { + // Get a reference to the contract + const ocr2Contract = new Contract(contract.abi, feedAddress, provider) + const resultTransmitters = await ocr2Contract.transmitters() + + // retrieve signer keys from transaction event + // based on event struct: https://github.com/smartcontractkit/chainlink-starknet/blob/develop/contracts/src/chainlink/ocr2/aggregator.cairo#L260 + // TODO: use StarknetContract decodeEvents from starknet-hardhat-plugin instead + const eventData = txReceipt.events[0].data + // reconstruct signers array from event + const eventSigners: bigint[] = [] + for (let i = 0; i < signers.length; i++) { + const signer = BigInt(eventData[2 + 2 * i]) // split according to event structure + eventSigners.push(signer) + } + + // Checks that the feed was updated + expect(eventSigners).toEqual( + // eaiser to remove prefix and 0x and then add 0x back + signers.map((s) => BigInt(`0x${s.replace('ocr2on_starknet_', '').replace('0x', '')}`)), + ) // remove all prefixes + expect(resultTransmitters).toEqual(transmitters.map((transmitter) => BigInt(transmitter))) + + // Checks that the correct number of batch calls were made + expect(counter.get(feedAddress) ?? 0).toEqual(1) + } + }, + TIMEOUT, + ) + + it( + 'Transfer ownership', + async () => { + const command = await registerExecuteCommand(transferOwnershipCommand).create( + { + // Trivially transfer ownership to the same address + newOwner: owner.address, + }, + feedAddresses, + ) + + // Execute the command + const report = await command.execute() + const maybeRes = report.responses.at(0) + expect(maybeRes).not.toBeFalsy() + + // Validate the response + const res = maybeRes! + expect(res.tx.status).toEqual('ACCEPTED') + expect(res.tx.hash).not.toBeNull() + + // Checks that the transaction was successful + const provider: RpcProvider = makeProvider(LOCAL_URL).provider + const receipt = await provider.waitForTransaction(res.tx.hash) + expect(receipt.isSuccess()).toBeTruthy() + const txReceipt = receipt as InvokeTransactionReceiptResponse + + // Creates a map where each key is an address and each corresponding value is + // the number of times the address is seen in the transaction receipt events + const counter = getNumCallsPerAddress(txReceipt) + + // Checks that the correct number of batch calls were made + for (const feedAddress of feedAddresses) { + expect(counter.get(feedAddress) ?? 0).toEqual(1) + } + }, + TIMEOUT, + ) + + it( + 'Accept ownership', + async () => { + const command = await registerExecuteCommand(acceptOwnershipCommand).create({}, feedAddresses) + + // Execute the command + const report = await command.execute() + const maybeRes = report.responses.at(0) + expect(maybeRes).not.toBeFalsy() + + // Validate the response + const res = maybeRes! + expect(res.tx.status).toEqual('ACCEPTED') + expect(res.tx.hash).not.toBeNull() + + // Checks that the transaction was successful + const provider: RpcProvider = makeProvider(LOCAL_URL).provider + const receipt = await provider.waitForTransaction(res.tx.hash) + expect(receipt.isSuccess()).toBeTruthy() + const txReceipt = receipt as InvokeTransactionReceiptResponse + + // Creates a map where each key is an address and each corresponding value is + // the number of times the address is seen in the transaction receipt events + const counter = getNumCallsPerAddress(txReceipt) + + // Checks that the correct number of batch calls were made + for (const feedAddress of feedAddresses) { + expect(counter.get(feedAddress) ?? 0).toEqual(1) + } + }, + TIMEOUT, + ) +}) diff --git a/packages-ts/starknet-gauntlet-ocr2/test/commands/proxy.test.ts b/packages-ts/starknet-gauntlet-ocr2/test/commands/proxy.test.ts new file mode 100644 index 000000000..ffc6506e1 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/test/commands/proxy.test.ts @@ -0,0 +1,118 @@ +import deployOCR2Command from '../../src/commands/ocr2/deploy' +import deployACCommand from '../../src/commands/accessController/deploy' +import deployProxyCommand from '../../src/commands/proxy/deploy' +import proposeAggregatorCommand from '../../src/commands/proxy/proposeAggregator' +import confirmAggregatorCommand from '../../src/commands/proxy/confirmAggregator' +import { + StarknetAccount, + fetchAccount, + registerExecuteCommand, + TIMEOUT, +} from '@chainlink/starknet-gauntlet/test/utils' + +describe('Proxy Contract', () => { + let account: StarknetAccount + let contractAddress: string + let accessController: string + let proxy: string + + beforeAll(async () => { + account = await fetchAccount() + }) + + it( + 'Deploy AC', + async () => { + // TODO: owner can't be 0 anymore + const command = await registerExecuteCommand(deployACCommand).create({}, []) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + accessController = report.responses[0].contract + }, + TIMEOUT, + ) + + it( + 'Deploy OCR2', + async () => { + const command = await registerExecuteCommand(deployOCR2Command).create( + { + input: { + owner: account.address, + maxAnswer: 10000, + minAnswer: 1, + decimals: 18, + description: 'Test Feed', + billingAccessController: accessController, + linkToken: '0x04cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603730', + }, + }, + [], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + contractAddress = report.responses[0].contract + }, + TIMEOUT, + ) + + it( + 'Deploy Proxy', + async () => { + const command = await registerExecuteCommand(deployProxyCommand).create( + { + input: { + owner: account.address, + address: contractAddress, + }, + }, + [], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + proxy = report.responses[0].contract + }, + TIMEOUT, + ) + + it( + 'Propose Proxy Aggregator', + async () => { + const command = await registerExecuteCommand(proposeAggregatorCommand).create( + { + input: { + owner: account.address, + address: contractAddress, + }, + }, + [proxy], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + }, + TIMEOUT, + ) + + it( + 'Confirm Proxy Aggregator', + async () => { + const command = await registerExecuteCommand(confirmAggregatorCommand).create( + { + input: { + owner: account.address, + address: contractAddress, + }, + }, + [proxy], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + }, + TIMEOUT, + ) +}) diff --git a/packages-ts/starknet-gauntlet-ocr2/test/commands/utils.ts b/packages-ts/starknet-gauntlet-ocr2/test/commands/utils.ts new file mode 100644 index 000000000..07b246bb3 --- /dev/null +++ b/packages-ts/starknet-gauntlet-ocr2/test/commands/utils.ts @@ -0,0 +1,51 @@ +import * as fsp from 'fs/promises' +import * as fs from 'fs' +import path from 'path' + +export interface BillingConfig { + gasBase: string + gasPerSignature: string + observationPaymentGjuels: string + transmissionPaymentGjuels: string +} + +export class RDDTempFile { + private readonly contracts = new Map< + string, + { + billing: BillingConfig + } + >() + + constructor(public readonly filepath: string) { + if (path.extname(filepath) !== '.json') { + throw new Error(`filepath must point to a json file: ${filepath}`) + } + } + + getConfig() { + return { + contracts: Object.fromEntries(this.contracts.entries()), + } + } + + setBilling(addr: string, data: BillingConfig) { + const contract = this.contracts.get(addr) + if (contract == null) { + this.contracts.set(addr, { billing: data }) + } else { + this.contracts.set(addr, { ...contract, billing: data }) + } + } + + async writeFile() { + await fsp.mkdir(path.dirname(this.filepath), { recursive: true }) + return await fsp.writeFile(this.filepath, JSON.stringify(this.getConfig(), null, 2)) + } + + async removeFile() { + if (fs.existsSync(this.filepath)) { + return await fsp.rm(this.filepath) + } + } +} diff --git a/packages-ts/gauntlet-starknet/tsconfig.json b/packages-ts/starknet-gauntlet-ocr2/tsconfig.json similarity index 100% rename from packages-ts/gauntlet-starknet/tsconfig.json rename to packages-ts/starknet-gauntlet-ocr2/tsconfig.json diff --git a/packages-ts/starknet-gauntlet-oz/LICENSE b/packages-ts/starknet-gauntlet-oz/LICENSE new file mode 100644 index 000000000..1ad4f08b3 --- /dev/null +++ b/packages-ts/starknet-gauntlet-oz/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 SmartContract ChainLink, Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages-ts/gauntlet-starknet-oz/README.md b/packages-ts/starknet-gauntlet-oz/README.md similarity index 65% rename from packages-ts/gauntlet-starknet-oz/README.md rename to packages-ts/starknet-gauntlet-oz/README.md index 5a7399488..7daa7e64c 100644 --- a/packages-ts/gauntlet-starknet-oz/README.md +++ b/packages-ts/starknet-gauntlet-oz/README.md @@ -1,4 +1,4 @@ -# Gauntlet Starknet Commands for the Open Zeppelin Contracts +# Starknet Gauntlet Commands for the Open Zeppelin Contracts ## Account @@ -14,6 +14,12 @@ This command will generate a new Keypair and will give the details during the ex yarn gauntlet account:deploy --network= --publicKey= ``` +Additionally, if the contract has already been declared, you can deploy by just referencing the class hash. + +```bash +yarn gauntlet account:deploy --classHash= --network= --publicKey= +``` + After the execution is finished, you will want to include the account contract and the private key to your `.env` configuration file. ```bash diff --git a/packages-ts/gauntlet-starknet-ocr2/package.json b/packages-ts/starknet-gauntlet-oz/package.json similarity index 59% rename from packages-ts/gauntlet-starknet-ocr2/package.json rename to packages-ts/starknet-gauntlet-oz/package.json index bc79245e8..b827224f1 100644 --- a/packages-ts/gauntlet-starknet-ocr2/package.json +++ b/packages-ts/starknet-gauntlet-oz/package.json @@ -1,7 +1,7 @@ { - "name": "@chainlink/gauntlet-starknet-ocr2", + "name": "@chainlink/starknet-gauntlet-oz", "version": "0.0.1", - "description": "Gauntlet Starknet OCR2", + "description": "Starknet Gauntlet Open Zeppelin Contracts", "keywords": [ "typescript", "cli" @@ -15,18 +15,17 @@ "scripts": { "gauntlet": "ts-node ./src/index.ts", "lint": "tsc", - "test": "SKIP_PROMPTS=true jest --runInBand", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet-oz --passWithNoTests", "test:coverage": "yarn test --collectCoverage", "test:ci": "yarn test --ci", - "lint:format": "yarn prettier --check ./src", "format": "yarn prettier --write ./src", + "format:check": "yarn prettier --check ./src", "clean": "rm -rf ./dist/ ./bin/", "build": "yarn clean && tsc -b", "bundle": "yarn build && pkg ." }, "dependencies": { - "@chainlink/gauntlet-core": "0.3.0", - "@chainlink/gauntlet-starknet": "*", - "starknet": "^3.11.0" + "@chainlink/gauntlet-core": "0.3.1", + "@chainlink/starknet-gauntlet": "*" } } diff --git a/packages-ts/starknet-gauntlet-oz/src/commands/account/declare.ts b/packages-ts/starknet-gauntlet-oz/src/commands/account/declare.ts new file mode 100644 index 000000000..64c1d2bb9 --- /dev/null +++ b/packages-ts/starknet-gauntlet-oz/src/commands/account/declare.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, declareCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { CONTRACT_LIST, accountContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + declareCommandConfig(CONTRACT_LIST.ACCOUNT, CATEGORIES.ACCOUNT, accountContractLoader), +) diff --git a/packages-ts/starknet-gauntlet-oz/src/commands/account/deploy.ts b/packages-ts/starknet-gauntlet-oz/src/commands/account/deploy.ts new file mode 100644 index 000000000..d650c0a46 --- /dev/null +++ b/packages-ts/starknet-gauntlet-oz/src/commands/account/deploy.ts @@ -0,0 +1,131 @@ +import { + AfterExecute, + BeforeExecute, + ExecuteCommandConfig, + makeExecuteCommand, + isValidAddress, +} from '@chainlink/starknet-gauntlet' +import { ec } from 'starknet' +import { CATEGORIES } from '../../lib/categories' +import { accountContractLoader, CONTRACT_LIST } from '../../lib/contracts' + +type UserInput = { + publicKey: string + privateKey?: string + salt?: number + classHash?: string +} + +type ContractInput = [publicKey: string] + +const makeUserInput = async (flags, _, env): Promise => { + if (flags.input) return flags.input as UserInput + + // If public key is not provided, generate a new address + const keypair = ec.starkCurve.utils.randomPrivateKey() + const generatedPK = '0x' + Buffer.from(keypair).toString('hex') + const pubkey = flags.publicKey || env.publicKey || ec.starkCurve.getStarkKey(keypair) + const salt: number = !isNaN(flags.salt) ? +flags.salt : undefined + return { + publicKey: pubkey, + privateKey: (!flags.publicKey || !env.account) && generatedPK, + salt, + classHash: flags.classHash, + } +} + +const validateClassHash = async (input, executionContext) => { + if (isValidAddress(input.classHash)) { + return true + } + + if (input.classHash === undefined) { + // declaring the contract will happen automatically as part of our regular deploy action, but + // deploying account contracts for a new account require an already declared account contract, + // which has to be done from a funded account. + // ref: https://book.starknet.io/ch04-03-deploy-hello-account.html#declaring-the-account-contract + if (executionContext.action === 'deploy-account') { + throw new Error('Account contract has to be declared for a DEPLOY_ACCOUNT action') + } + return true + } + + throw new Error(`Invalid Class Hash: ${input.classHash}`) +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.publicKey] +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info(`About to deploy an OZ 0.x Account Contract with: + public key: ${input.contract[0]} + salt: ${!isNaN(input.user.salt) ? input.user.salt : 'randomly generated'} + action: ${context.action}`) + if (input.user.privateKey) { + await deps.prompt(`The generated private key will be shown next, continue?`) + deps.logger.line() + + deps.logger.info(`To sign future transactions, store the Private Key`) + deps.logger.info(`PRIVATE_KEY: ${input.user.privateKey}`) + + deps.logger.line() + } +} + +const afterExecute: AfterExecute = (context, input, deps) => async ( + result, +) => { + const contract = result.responses[0].tx.address + contract + ? deps.logger.success(`Account contract located at ${contract}`) + : deps.logger.error('Account contract deployment failed') + + return { + publicKey: input.user.publicKey, + privateKey: input.user.privateKey, + } +} + +const deployCommandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.ACCOUNT, + category: CATEGORIES.ACCOUNT, + action: 'deploy', + ux: { + description: 'Deploys an OpenZeppelin Account contract from an existing account', + examples: [ + `${CATEGORIES.ACCOUNT}:deploy --network= --address=
--classHash= `, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateClassHash], + loadContract: accountContractLoader, + hooks: { + beforeExecute, + afterExecute, + }, +} + +const deployAccountCommandConfig: ExecuteCommandConfig = Object.assign( + {}, + deployCommandConfig, + { + action: 'deploy-account', + ux: { + description: 'Deploys an OpenZeppelin Account contract using DEPLOY_ACCOUNT', + examples: [ + `${CATEGORIES.ACCOUNT}:deploy-account --network= --address=
--classHash= `, + ], + }, + }, +) + +const Deploy = makeExecuteCommand(deployCommandConfig) +const DeployAccount = makeExecuteCommand(deployAccountCommandConfig) + +export { Deploy, DeployAccount } diff --git a/packages-ts/starknet-gauntlet-oz/src/commands/account/index.ts b/packages-ts/starknet-gauntlet-oz/src/commands/account/index.ts new file mode 100644 index 000000000..7a6e223f6 --- /dev/null +++ b/packages-ts/starknet-gauntlet-oz/src/commands/account/index.ts @@ -0,0 +1,3 @@ +import { Deploy, DeployAccount } from './deploy' +import Declare from './declare' +export default [Deploy, DeployAccount, Declare] diff --git a/packages-ts/gauntlet-starknet-oz/src/commands/index.ts b/packages-ts/starknet-gauntlet-oz/src/commands/index.ts similarity index 100% rename from packages-ts/gauntlet-starknet-oz/src/commands/index.ts rename to packages-ts/starknet-gauntlet-oz/src/commands/index.ts diff --git a/packages-ts/starknet-gauntlet-oz/src/index.ts b/packages-ts/starknet-gauntlet-oz/src/index.ts new file mode 100644 index 000000000..66ccd589d --- /dev/null +++ b/packages-ts/starknet-gauntlet-oz/src/index.ts @@ -0,0 +1,3 @@ +import Commands from './commands' + +export { Commands } diff --git a/packages-ts/starknet-gauntlet-oz/src/lib/categories.ts b/packages-ts/starknet-gauntlet-oz/src/lib/categories.ts new file mode 100644 index 000000000..db5f263bb --- /dev/null +++ b/packages-ts/starknet-gauntlet-oz/src/lib/categories.ts @@ -0,0 +1,3 @@ +export const CATEGORIES = { + ACCOUNT: 'account', +} diff --git a/packages-ts/starknet-gauntlet-oz/src/lib/contracts.ts b/packages-ts/starknet-gauntlet-oz/src/lib/contracts.ts new file mode 100644 index 000000000..b311ed2c1 --- /dev/null +++ b/packages-ts/starknet-gauntlet-oz/src/lib/contracts.ts @@ -0,0 +1,23 @@ +import fs from 'fs' +import { json } from 'starknet' + +export enum CONTRACT_LIST { + ACCOUNT = 'Account', +} + +export const accountContractLoader = () => { + return { + contract: json.parse( + fs.readFileSync( + `${__dirname}/../../../../contracts/target/release/chainlink_Account.contract_class.json`, + 'utf-8', + ), + ), + casm: json.parse( + fs.readFileSync( + `${__dirname}/../../../../contracts/target/release/chainlink_Account.compiled_contract_class.json`, + 'utf-8', + ), + ), + } +} diff --git a/packages-ts/starknet-gauntlet-oz/test/commands/account.test.ts b/packages-ts/starknet-gauntlet-oz/test/commands/account.test.ts new file mode 100644 index 000000000..15e1a08ca --- /dev/null +++ b/packages-ts/starknet-gauntlet-oz/test/commands/account.test.ts @@ -0,0 +1,29 @@ +import { makeProvider } from '@chainlink/starknet-gauntlet' +import { Deploy } from '../../src/commands/account/deploy' +import { registerExecuteCommand, TIMEOUT, LOCAL_URL } from '@chainlink/starknet-gauntlet/test/utils' +import { accountContractLoader } from '../../src/lib/contracts' +import { Contract } from 'starknet' + +describe('OZ Account Contract', () => { + let publicKey: string + let contractAddress: string + + it( + 'Deployment', + async () => { + const command = await registerExecuteCommand(Deploy).create({}, []) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + contractAddress = report.responses[0].contract + publicKey = report.data.publicKey + + const { contract: oz } = accountContractLoader() + const ozContract = new Contract(oz.abi, contractAddress, makeProvider(LOCAL_URL).provider) + const onChainPubKey = await ozContract.getPublicKey() + expect(onChainPubKey).toEqual(BigInt(publicKey)) + }, + TIMEOUT, + ) +}) diff --git a/packages-ts/starknet-gauntlet-oz/tsconfig.json b/packages-ts/starknet-gauntlet-oz/tsconfig.json new file mode 100644 index 000000000..2c84c1fcb --- /dev/null +++ b/packages-ts/starknet-gauntlet-oz/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**/*"], + "exclude": ["dist", "**/*.spec.ts", "**/*.test.ts"] +} diff --git a/packages-ts/starknet-gauntlet-token/LICENSE b/packages-ts/starknet-gauntlet-token/LICENSE new file mode 100644 index 000000000..1ad4f08b3 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 SmartContract ChainLink, Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages-ts/starknet-gauntlet-token/README.md b/packages-ts/starknet-gauntlet-token/README.md new file mode 100644 index 000000000..a62b270dc --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/README.md @@ -0,0 +1,53 @@ +# Gauntlet Starknet Commands for LINK Token + +## Token + +### Declare + +To delcare the class hash of a contract: + +```bash +yarn gauntlet token:declare --network= +``` + +### Deploy + +The contract is pre-configured to be the LINK token contract. + +```bash +yarn gauntlet token:deploy --network= --owner= +``` + +To deploy by referencing an existing class hash: + +```bash +yarn gauntlet token:deploy --classHash= --network= --owner= +``` + + +IMPORTANT: For the token contract to be used in L1<>L2 bridging the `owner` must be the L2 Bridge address. + +### Mint + +```bash +yarn gauntlet token:mint --network= --recipient= --amount= +``` + +### Transfer + +```bash +yarn gauntlet token:transfer --network= --recipient= --amount= +``` + +### Check balance + +```bash +yarn gauntlet token:balance_of --network= --address= +``` + +### Upgrade + +```bash +yarn gauntlet token:upgrade --network= --classHash= +``` + diff --git a/packages-ts/gauntlet-starknet-starkgate/package.json b/packages-ts/starknet-gauntlet-token/package.json similarity index 58% rename from packages-ts/gauntlet-starknet-starkgate/package.json rename to packages-ts/starknet-gauntlet-token/package.json index a15f7cea0..2b2c4598e 100644 --- a/packages-ts/gauntlet-starknet-starkgate/package.json +++ b/packages-ts/starknet-gauntlet-token/package.json @@ -1,5 +1,5 @@ { - "name": "@chainlink/gauntlet-starknet-starkgate", + "name": "@chainlink/starknet-gauntlet-token", "version": "0.0.1", "description": "Gauntlet Starknet Starkgate contracts", "keywords": [ @@ -15,18 +15,20 @@ "scripts": { "gauntlet": "ts-node ./src/index.ts", "lint": "tsc", - "test": "SKIP_PROMPTS=true jest --runInBand", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet-token --passWithNoTests", "test:coverage": "yarn test --collectCoverage", "test:ci": "yarn test --ci", - "lint:format": "yarn prettier --check ./src", "format": "yarn prettier --write ./src", + "format:check": "yarn prettier --check ./src", "clean": "rm -rf ./dist/ ./bin/", "build": "yarn clean && tsc -b", "bundle": "yarn build && pkg ." }, "dependencies": { - "@chainlink/gauntlet-core": "0.3.0", - "@chainlink/gauntlet-starknet": "*", - "starknet": "^3.11.0" + "@chainlink/evm-gauntlet": "^0.4.0", + "@chainlink/gauntlet-core": "0.3.1", + "@chainlink/starknet-gauntlet": "*", + "@chainlink/starknet-gauntlet-oz": "*", + "ethers": "^5.6.9" } } diff --git a/packages-ts/starknet-gauntlet-token/src/commands/index.ts b/packages-ts/starknet-gauntlet-token/src/commands/index.ts new file mode 100644 index 000000000..a42b7c65a --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/commands/index.ts @@ -0,0 +1,5 @@ +import Token from './token' +import Inspection from './inspection' + +export const L2Commands = [...Token] +export const InspectionCommands = [...Inspection] diff --git a/packages-ts/starknet-gauntlet-token/src/commands/inspection/balanceOf.ts b/packages-ts/starknet-gauntlet-token/src/commands/inspection/balanceOf.ts new file mode 100644 index 000000000..2fd15dcf8 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/commands/inspection/balanceOf.ts @@ -0,0 +1,70 @@ +import { + InspectCommandConfig, + IStarknetProvider, + makeInspectionCommand, + InspectUserInput, + isValidAddress, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { tokenContractLoader } from '../../lib/contracts' + +type UserInput = { + address: string +} + +type ContractInput = string + +type QueryResult = { + balance: string +} + +const makeUserInput = async (flags, args): Promise> => { + if (flags.input) return flags.input as InspectUserInput + + return { + input: { + address: flags.address, + }, + } +} + +const makeContractInput = async (input: UserInput): Promise => { + if (!isValidAddress(input.address)) throw new Error(`Invalid account address: ${input.address}`) + return [input.address] +} + +const makeComparisionData = (provider: IStarknetProvider) => async ( + results: any[], + input: null, + contractAddress: string, +): Promise<{ + toCompare: null + result: QueryResult +}> => { + const [queryRes] = results + const balance = queryRes + + return { + toCompare: null, + result: { + balance: balance.toString(), + }, + } +} + +const commandConfig: InspectCommandConfig = { + ux: { + category: CATEGORIES.TOKEN, + function: 'balance_of', + examples: [ + `${CATEGORIES.TOKEN}:balance_of --network= --address= `, + ], + }, + queries: ['balance_of'], + makeUserInput, + makeContractInput, + makeComparisionData, + loadContract: tokenContractLoader, +} + +export default makeInspectionCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-token/src/commands/inspection/index.ts b/packages-ts/starknet-gauntlet-token/src/commands/inspection/index.ts new file mode 100644 index 000000000..1d2cde353 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/commands/inspection/index.ts @@ -0,0 +1,3 @@ +import BalanceOf from './balanceOf' + +export default [BalanceOf] diff --git a/packages-ts/starknet-gauntlet-token/src/commands/token/declare.ts b/packages-ts/starknet-gauntlet-token/src/commands/token/declare.ts new file mode 100644 index 000000000..f43f5d6a6 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/commands/token/declare.ts @@ -0,0 +1,29 @@ +import { ExecuteCommandConfig, makeExecuteCommand } from '@chainlink/starknet-gauntlet' +import { tokenContractLoader } from '../../lib/contracts' +import { CATEGORIES } from '../../lib/categories' + +type UserInput = {} + +type ContractInput = [] + +const makeContractInput = async (input: UserInput): Promise => { + return [] +} + +const makeUserInput = async (flags, args): Promise => ({}) + +const commandConfig: ExecuteCommandConfig = { + contractId: CATEGORIES.TOKEN, + category: CATEGORIES.TOKEN, + action: 'declare', + ux: { + description: `Declares an ${CATEGORIES.TOKEN} contract`, + examples: [`${CATEGORIES.TOKEN}:declare --network=`], + }, + makeUserInput, + makeContractInput, + validations: [], + loadContract: tokenContractLoader, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-token/src/commands/token/deploy.ts b/packages-ts/starknet-gauntlet-token/src/commands/token/deploy.ts new file mode 100644 index 000000000..7f1b49c31 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/commands/token/deploy.ts @@ -0,0 +1,75 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + ExecutionContext, + makeExecuteCommand, + isValidAddress, +} from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { tokenContractLoader, CONTRACT_LIST } from '../../lib/contracts' + +type UserInput = { + minter?: string + owner?: string + classHash?: string +} + +type ContractInput = [minter: string, owner: string] + +const makeUserInput = async (flags, args): Promise => { + if (flags.input) return flags.input as UserInput + + return { + minter: flags.minter, + owner: flags.owner, + classHash: flags.classHash, + } +} + +const validateClassHash = async (input) => { + if (isValidAddress(input.classHash) || input.classHash === undefined) { + return true + } + throw new Error(`Invalid Class Hash: ${input.classHash}`) +} + +const makeContractInput = async ( + input: UserInput, + context: ExecutionContext, +): Promise => { + const defaultWallet = context.wallet.getAccountAddress() + return [input.minter || defaultWallet, input.owner || defaultWallet] +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info(`About to deploy the LINK Token Contract with the following details: + ${input.contract} + `) +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.TOKEN, + category: CATEGORIES.TOKEN, + action: 'deploy', + ux: { + description: 'Deploys the LINK Token contract', + examples: [ + `${CATEGORIES.TOKEN}:deploy --network=`, + `${CATEGORIES.TOKEN}:deploy --network= --owner=`, + `${CATEGORIES.TOKEN}:deploy --network= --owner= --classHash=`, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateClassHash], + loadContract: tokenContractLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/starknet-gauntlet-token/src/commands/token/index.ts b/packages-ts/starknet-gauntlet-token/src/commands/token/index.ts new file mode 100644 index 000000000..62fc370f5 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/commands/token/index.ts @@ -0,0 +1,7 @@ +import Deploy from './deploy' +import Declare from './declare' +import Upgrade from './upgrade' +import Mint from './mint' +import Transfer from './transfer' + +export default [Deploy, Declare, Mint, Transfer, Upgrade] diff --git a/packages-ts/starknet-gauntlet-token/src/commands/token/mint.ts b/packages-ts/starknet-gauntlet-token/src/commands/token/mint.ts new file mode 100644 index 000000000..12b0a17f6 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/commands/token/mint.ts @@ -0,0 +1,72 @@ +import { + BeforeExecute, + ExecuteCommandConfig, + makeExecuteCommand, + isValidAddress, +} from '@chainlink/starknet-gauntlet' +import { uint256 } from 'starknet' +import { CATEGORIES } from '../../lib/categories' +import { tokenContractLoader, CONTRACT_LIST } from '../../lib/contracts' + +type UserInput = { + recipient: string + amount: string +} + +type ContractInput = [recipient: string, amount: any] + +const makeUserInput = async (flags, args): Promise => { + if (flags.input) return flags.input as UserInput + + return { + recipient: flags.recipient, + amount: flags.amount, + } +} + +const validateRecipient = async (input) => { + if (!isValidAddress(input.recipient)) + throw new Error(`Invalid recipient address: ${input.recipient}`) + return true +} + +const validateAmount = async (input) => { + if (isNaN(Number(input.amount))) throw new Error(`Invalid amount: ${input.amount}`) + return true +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.recipient, uint256.bnToUint256(input.amount)] +} + +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { + deps.logger.info(`About to mint an ERC20 Token Contract with the following details: + ${input.contract} + `) +} + +const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.TOKEN, + category: CATEGORIES.TOKEN, + action: 'mint', + ux: { + description: 'Mints a set amount of tokens from contract to recipient', + examples: [ + `${CATEGORIES.TOKEN}:mint --network= --recipient= --amount= `, + ], + }, + internalFunction: 'permissioned_mint', + makeUserInput, + makeContractInput, + validations: [validateRecipient, validateAmount], + loadContract: tokenContractLoader, + hooks: { + beforeExecute, + }, +} + +export default makeExecuteCommand(commandConfig) diff --git a/packages-ts/gauntlet-starknet-starkgate/src/commands/token/transfer.ts b/packages-ts/starknet-gauntlet-token/src/commands/token/transfer.ts similarity index 62% rename from packages-ts/gauntlet-starknet-starkgate/src/commands/token/transfer.ts rename to packages-ts/starknet-gauntlet-token/src/commands/token/transfer.ts index 3819b95e8..c2c6c3e8c 100644 --- a/packages-ts/gauntlet-starknet-starkgate/src/commands/token/transfer.ts +++ b/packages-ts/starknet-gauntlet-token/src/commands/token/transfer.ts @@ -2,20 +2,18 @@ import { BeforeExecute, ExecuteCommandConfig, makeExecuteCommand, - Validation, isValidAddress, -} from '@chainlink/gauntlet-starknet' -import { Uint256 } from 'starknet/dist/utils/uint256' -import { bnToUint256 } from 'starknet/dist/utils/uint256' +} from '@chainlink/starknet-gauntlet' +import { uint256 } from 'starknet' import { CATEGORIES } from '../../lib/categories' -import { contractLoader } from '../../lib/contracts' +import { tokenContractLoader, CONTRACT_LIST } from '../../lib/contracts' type UserInput = { recipient: string amount: string } -type ContractInput = [recipient: string, amount: Uint256] +type ContractInput = [recipient: string, amount: any] const makeUserInput = async (flags, args): Promise => { if (flags.input) return flags.input as UserInput @@ -27,27 +25,34 @@ const makeUserInput = async (flags, args): Promise => { } const makeContractInput = async (input: UserInput): Promise => { - return [input.recipient, bnToUint256(input.amount)] + return [input.recipient, uint256.bnToUint256(input.amount)] } -const validateRecipient: Validation = async (input) => { - if (!isValidAddress(input.recipient)) throw new Error(`Invalid recipient address: ${input.recipient}`) +const validateRecipient = async (input) => { + if (!isValidAddress(input.recipient)) + throw new Error(`Invalid recipient address: ${input.recipient}`) return true } -const validateAmount: Validation = async (input) => { +const validateAmount = async (input) => { if (isNaN(Number(input.amount))) throw new Error(`Invalid amount: ${input.amount}`) return true } -const beforeExecute: BeforeExecute = (context, input, deps) => async () => { +const beforeExecute: BeforeExecute = ( + context, + input, + deps, +) => async () => { deps.logger.info(`About to tranfer ${input.user.amount} ERC20 tokens to ${input.user.recipient}`) } const commandConfig: ExecuteCommandConfig = { + contractId: CONTRACT_LIST.TOKEN, + category: CATEGORIES.TOKEN, + action: 'transfer', ux: { - category: CATEGORIES.TOKEN, - function: 'transfer', + description: 'Transfers a set amount of tokens from caller to recipient', examples: [ `${CATEGORIES.TOKEN}:transfer --network= --recipient= --amount= `, ], @@ -55,7 +60,7 @@ const commandConfig: ExecuteCommandConfig = { makeUserInput, makeContractInput, validations: [validateRecipient, validateAmount], - loadContract: contractLoader, + loadContract: tokenContractLoader, hooks: { beforeExecute, }, diff --git a/packages-ts/starknet-gauntlet-token/src/commands/token/upgrade.ts b/packages-ts/starknet-gauntlet-token/src/commands/token/upgrade.ts new file mode 100644 index 000000000..728e14096 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/commands/token/upgrade.ts @@ -0,0 +1,7 @@ +import { makeExecuteCommand, upgradeCommandConfig } from '@chainlink/starknet-gauntlet' +import { CATEGORIES } from '../../lib/categories' +import { tokenContractLoader } from '../../lib/contracts' + +export default makeExecuteCommand( + upgradeCommandConfig(CATEGORIES.TOKEN, CATEGORIES.TOKEN, tokenContractLoader), +) diff --git a/packages-ts/starknet-gauntlet-token/src/index.ts b/packages-ts/starknet-gauntlet-token/src/index.ts new file mode 100644 index 000000000..680f5a6d1 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/index.ts @@ -0,0 +1,3 @@ +import { L2Commands, InspectionCommands } from './commands' + +export { L2Commands, InspectionCommands } diff --git a/packages-ts/gauntlet-starknet-starkgate/src/lib/categories.ts b/packages-ts/starknet-gauntlet-token/src/lib/categories.ts similarity index 100% rename from packages-ts/gauntlet-starknet-starkgate/src/lib/categories.ts rename to packages-ts/starknet-gauntlet-token/src/lib/categories.ts diff --git a/packages-ts/starknet-gauntlet-token/src/lib/contracts.ts b/packages-ts/starknet-gauntlet-token/src/lib/contracts.ts new file mode 100644 index 000000000..ea3da82a0 --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/src/lib/contracts.ts @@ -0,0 +1,7 @@ +import { loadContract } from '@chainlink/starknet-gauntlet' + +export enum CONTRACT_LIST { + TOKEN = 'token', +} + +export const tokenContractLoader = () => loadContract('LinkToken') diff --git a/packages-ts/starknet-gauntlet-token/test/commands/token.test.ts b/packages-ts/starknet-gauntlet-token/test/commands/token.test.ts new file mode 100644 index 000000000..151c9501c --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/test/commands/token.test.ts @@ -0,0 +1,120 @@ +import { Deploy as deployOZCommand } from '@chainlink/starknet-gauntlet-oz/src/commands/account/deploy' +import deployTokenCommand from '../../src/commands/token/deploy' +import mintTokensCommand from '../../src/commands/token/mint' +import transferTokensCommand from '../../src/commands/token/transfer' +import balanceOfCommand from '../../src/commands/inspection/balanceOf' +import { + StarknetAccount, + fetchAccount, + registerExecuteCommand, + registerInspectCommand, + TIMEOUT, +} from '@chainlink/starknet-gauntlet/test/utils' + +describe('Token Contract', () => { + let defaultAccount: StarknetAccount + + let ozAccount: string + let ozBalance: number + + let tokenContractAddress: string + + beforeAll(async () => { + // account #0 with seed 0 + defaultAccount = await fetchAccount() + }, TIMEOUT) + + it( + 'Deploy OZ Account', + async () => { + const command = await registerExecuteCommand(deployOZCommand).create({}, []) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + ozAccount = report.responses[0].contract + ozBalance = 0 + }, + TIMEOUT, + ) + + it( + 'Deploy Token', + async () => { + const command = await registerExecuteCommand(deployTokenCommand).create( + { + account: defaultAccount.address, + pk: defaultAccount.privateKey, + link: true, + }, + [], + ) + + const report = await command.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + + tokenContractAddress = report.responses[0].contract + }, + TIMEOUT, + ) + + it( + 'Mint tokens for Default account', + async () => { + const amount = 10000000 + + const executeCommand = await registerExecuteCommand(mintTokensCommand).create( + { + account: defaultAccount.address, + pk: defaultAccount.privateKey, + recipient: defaultAccount.address, + amount, + }, + [tokenContractAddress], + ) + let report = await executeCommand.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + defaultAccount.balance = amount + + const inspectCommand = await registerInspectCommand(balanceOfCommand).create( + { + address: defaultAccount.address, + }, + [tokenContractAddress], + ) + report = await inspectCommand.execute() + expect(report.data?.data?.balance).toEqual(defaultAccount.balance.toString()) + }, + TIMEOUT, + ) + + it( + 'Transfer tokens to OZ account', + async () => { + const amount = 50 + + const executeCommand = await registerExecuteCommand(transferTokensCommand).create( + { + account: defaultAccount.address, + pk: defaultAccount.privateKey, + recipient: ozAccount, + amount, + }, + [tokenContractAddress], + ) + let report = await executeCommand.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + ozBalance = amount + + const inspectCommand = await registerInspectCommand(balanceOfCommand).create( + { + address: ozAccount, + }, + [tokenContractAddress], + ) + report = await inspectCommand.execute() + expect(report.data?.data?.balance).toEqual(ozBalance.toString()) + }, + TIMEOUT, + ) +}) diff --git a/packages-ts/starknet-gauntlet-token/tsconfig.json b/packages-ts/starknet-gauntlet-token/tsconfig.json new file mode 100644 index 000000000..2c84c1fcb --- /dev/null +++ b/packages-ts/starknet-gauntlet-token/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**/*"], + "exclude": ["dist", "**/*.spec.ts", "**/*.test.ts"] +} diff --git a/packages-ts/starknet-gauntlet/LICENSE b/packages-ts/starknet-gauntlet/LICENSE new file mode 100644 index 000000000..1ad4f08b3 --- /dev/null +++ b/packages-ts/starknet-gauntlet/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 SmartContract ChainLink, Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages-ts/starknet-gauntlet/README.md b/packages-ts/starknet-gauntlet/README.md new file mode 100644 index 000000000..1f32368b5 --- /dev/null +++ b/packages-ts/starknet-gauntlet/README.md @@ -0,0 +1,116 @@ +# Starknet Gauntlet + +## Overview + +In the following guide, we'll provide a walk through on how to setup your environment to run Gauntlet. + +## Prerequisites + +First, you'll need to install the following software on your machine (please refer to the `.tool-versions` file in the repo's root directory for more info on the specific versions you should install): + +- [Node.js](https://nodejs.org/en/download/package-manager) and [yarn](https://classic.yarnpkg.com/lang/en/docs/install) +- [Scarb](https://docs.swmansion.com/scarb/download.html) + +## Getting Started + +Once the necessary software has been installed, navigate to the root directory of the repo. From there, we can use the following command to build Gauntlet and compile both the Cairo and Solidity Starknet smart contracts: + +```sh +make build-ts +``` + +Once everything has been built, you should be able to run Gauntlet: + +```sh +yarn gauntlet +``` + +This should output a list of commands that come with Gauntlet: + +```sh +yarn run v1.22.21 +$ node ./packages-ts/starknet-gauntlet-cli/dist/index.js +.env not found +🧤 gauntlet 0.3.1 +.env not found +ℹ️ Available gauntlet commands: + +access_controller: + access_controller:declare + access_controller:deploy + access_controller:upgrade + access_controller:transfer_ownership + access_controller:accept_ownership + access_controller:declare:multisig + access_controller:deploy:multisig + +ocr2: + ocr2:deploy +... +``` + +## Selecting an RPC URL + +Before executing a Gauntlet command, you'll need a Starknet RPC v7 URL. You can find a list of common ones [here](https://www.starknetjs.com/docs/next/guides/connect_network/). Take note of one of these URLs and save it for later - we'll need it when we move onto configuring environment variables for Gauntlet. + +## Setting up a Wallet + +Gauntlet commands that send transactions to the chain require a funded Starknet wallet to cover transaction fees. If you're using testnet or mainnet, you can create a Starknet wallet by following the guide in the official documentation [here](https://docs.starknet.io/documentation/quick_start/set_up_an_account/). If you're using a docker container hosting a local Starknet node (i.e. see `./scripts/devnet.sh`), then you can use one of the predeployed accounts from the container logs. + +## Funding your Wallet + +If you're using testnet, you can fund your wallet using a Starknet faucet - a popular option is [this](https://starknet-faucet.vercel.app/) one. You can also reach out on Slack (#team-blockchain-integrations) to have the team send some funds directly to your account. + +If you're using mainnet, please reach out on Slack for help funding your account. + +If you're using a docker container hosting a local Starknet node (i.e. see `./scripts/devnet.sh`), all the predeployed accounts are funded by default - you can find the account details in the container logs): + +``` +| Account address | 0x64b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691 +| Private key | 0x71d7bb07b9a64f6f78ac4c816aff4da9 +| Public key | 0x39d9e6ce352ad4530a0ef5d5a18fd3303c3606a7fa6ac5b620020ad681cc33b +``` + +## Populating Environment Variables + +Now that we have an RPC v7 URL and a funded Starknet account, we'll need to provide them to Gauntlet via environment variables. Let's create a `.env` file in the repo's root directory: + +```sh +touch .env +``` + +Once the file has been created, let's populate it with the values from the previous steps: + +```env +# .env +NODE_URL= +ACCOUNT= +PRIVATE_KEY= +``` + +Once these have been provided, we can start running commands. For example, to deploy the LINK token contract, we can use the following command: + +```sh +yarn gauntlet token:deploy --link +``` + +This should produce the following logs: + +```sh +yarn run v1.22.21 +$ node ./packages-ts/starknet-gauntlet-cli/dist/index.js token:deploy --link +🧤 gauntlet 0.3.1 +ℹ️ About to deploy the LINK Token Contract with the following details: + 0x64b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691,0x64b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691 + +ℹ️ Deploying contract token +🤔 Continue? (Y / N)Y +⏳ Sending transaction... +⏳ Waiting for tx confirmation at 0x15df49a78815ae44743f8a99ca7f3f9a7529594a76dc46853787b55ee4236b7... +✅ Contract deployed on 0x15df49a78815ae44743f8a99ca7f3f9a7529594a76dc46853787b55ee4236b7 with address 0x653d0d4c6969233b0f03095b7995793dbe7c7a7660e7cf426ecfc51aa42209f +ℹ️ If using RDD, change the RDD ID with the new contract address: 0x653d0d4c6969233b0f03095b7995793dbe7c7a7660e7cf426ecfc51aa42209f +ℹ️ Execution finished at transaction: 0x15df49a78815ae44743f8a99ca7f3f9a7529594a76dc46853787b55ee4236b7 +✨ Done in 34.32s. +``` + +At this point, your environment should be fully configured to run Gauntlet commands. diff --git a/packages-ts/gauntlet-starknet-argent/package.json b/packages-ts/starknet-gauntlet/package.json similarity index 59% rename from packages-ts/gauntlet-starknet-argent/package.json rename to packages-ts/starknet-gauntlet/package.json index 6a48b9d03..270ad6d4a 100644 --- a/packages-ts/gauntlet-starknet-argent/package.json +++ b/packages-ts/starknet-gauntlet/package.json @@ -1,7 +1,7 @@ { - "name": "@chainlink/gauntlet-starknet-argent", + "name": "@chainlink/starknet-gauntlet", "version": "0.0.1", - "description": "Gauntlet Starknet Argent contracts", + "description": "Starknet Gauntlet", "keywords": [ "typescript", "cli" @@ -15,18 +15,18 @@ "scripts": { "gauntlet": "ts-node ./src/index.ts", "lint": "tsc", - "test": "SKIP_PROMPTS=true jest --runInBand", + "test": "SKIP_PROMPTS=true jest --runInBand --config ../../jest.config.ts --selectProjects starknet-gauntlet --passWithNoTests", "test:coverage": "yarn test --collectCoverage", "test:ci": "yarn test --ci", - "lint:format": "yarn prettier --check ./src", "format": "yarn prettier --write ./src", + "format:check": "yarn prettier --check ./src", "clean": "rm -rf ./dist/ ./bin/", "build": "yarn clean && tsc -b", "bundle": "yarn build && pkg ." }, "dependencies": { - "@chainlink/gauntlet-core": "0.3.0", - "@chainlink/gauntlet-starknet": "*", - "starknet": "^3.11.0" + "@chainlink/evm-gauntlet": "^0.0.2", + "@chainlink/gauntlet-core": "0.3.1", + "cross-fetch": "^3.1.5" } } diff --git a/packages-ts/starknet-gauntlet/src/commands/base/acceptOwnershipCommandConfig.ts b/packages-ts/starknet-gauntlet/src/commands/base/acceptOwnershipCommandConfig.ts new file mode 100644 index 000000000..0ab6f28ba --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/commands/base/acceptOwnershipCommandConfig.ts @@ -0,0 +1,29 @@ +import { ExecuteCommandConfig } from '.' + +type UserInput = {} + +type ContractInput = [] + +const makeContractInput = async (input: UserInput): Promise => { + return [] +} + +const makeUserInput = async (flags, args): Promise => ({}) + +export const acceptOwnershipCommandConfig = ( + contractId: string, + category: string, + contractLoader: any, +): ExecuteCommandConfig => ({ + contractId, + category: contractId, + action: 'accept_ownership', + ux: { + description: 'End two-step ownership transfer process by accepting ownership', + examples: [`${contractId}:accept_ownership --network= `], + }, + makeUserInput, + makeContractInput, + validations: [], + loadContract: contractLoader, +}) diff --git a/packages-ts/gauntlet-starknet/src/commands/base/command.ts b/packages-ts/starknet-gauntlet/src/commands/base/command.ts similarity index 81% rename from packages-ts/gauntlet-starknet/src/commands/base/command.ts rename to packages-ts/starknet-gauntlet/src/commands/base/command.ts index 30130c5ce..5dec7068d 100644 --- a/packages-ts/gauntlet-starknet/src/commands/base/command.ts +++ b/packages-ts/starknet-gauntlet/src/commands/base/command.ts @@ -5,7 +5,10 @@ export interface CommandCtor { create: (flags, args) => Promise } -export type Validation = (input: UI) => Promise +export type Validation = ( + input: UI, + executionContext: ExecutionContext, +) => Promise export interface CommandUX { category: string diff --git a/packages-ts/starknet-gauntlet/src/commands/base/declareCommandConfig.ts b/packages-ts/starknet-gauntlet/src/commands/base/declareCommandConfig.ts new file mode 100644 index 000000000..148bd8054 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/commands/base/declareCommandConfig.ts @@ -0,0 +1,29 @@ +import { ExecuteCommandConfig } from '.' + +type UserInput = {} + +type ContractInput = [] + +const makeContractInput = async (input: UserInput): Promise => { + return [] +} + +const makeUserInput = async (flags, args): Promise => ({}) + +export const declareCommandConfig = ( + contractId: string, + category: string, + contractLoader: any, +): ExecuteCommandConfig => ({ + contractId, + category, + action: 'declare', + ux: { + description: 'Declares the contract', + examples: [`${contractId}:declare --network=`], + }, + makeUserInput, + makeContractInput, + validations: [], + loadContract: contractLoader, +}) diff --git a/packages-ts/starknet-gauntlet/src/commands/base/executeCommand.ts b/packages-ts/starknet-gauntlet/src/commands/base/executeCommand.ts new file mode 100644 index 000000000..35c12e2c2 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/commands/base/executeCommand.ts @@ -0,0 +1,451 @@ +import { Result, WriteCommand, BaseConfig } from '@chainlink/gauntlet-core' +import { + CompiledContract, + CompiledSierraCasm, + Contract, + Call, + hash, + DeclareContractResponse, +} from 'starknet' +import { CommandCtor } from '.' +import { Dependencies } from '../../dependencies' +import { IStarknetProvider } from '../../provider' +import { getRDD } from '../../rdd' +import { TransactionResponse } from '../../transaction' +import { IStarknetWallet } from '../../wallet' +import { makeCommandId, Validation, Input } from './command' + +export interface ExecutionContext { + category: string + action: string + id: string + contractAddress: string + wallet: IStarknetWallet + provider: IStarknetProvider + flags: any + contract: Contract + rdd?: any +} + +export type BeforeExecute = ( + context: ExecutionContext, + input: Input, + deps: Pick, +) => () => Promise + +export type AfterExecute = ( + context: ExecutionContext, + input: Input, + deps: Pick, +) => (result: Result) => Promise + +export interface LoadContractResult { + contract: CompiledContract + // for cairo 1.0, `contract` is a sierra artifact and the casm artifact needs to be provided. + casm?: CompiledSierraCasm +} + +export interface ExecuteCommandConfig extends BaseConfig { + hooks?: { + beforeExecute?: BeforeExecute + afterExecute?: AfterExecute + } + internalFunction?: string + makeContractInput: (userInput: UI, context: ExecutionContext) => Promise + loadContract: () => LoadContractResult +} + +export interface ExecuteCommandInstance { + wallet: IStarknetWallet + provider: IStarknetProvider + contractAddress: string + account: string + executionContext: ExecutionContext + contract: CompiledContract + compiledContractHash?: string + input: Input + batchInput?: Array<[string, Input]> + + makeMessage: () => Promise + execute: () => Promise> + simulate?: () => boolean + + beforeExecute: () => Promise + afterExecute: (response: Result) => Promise +} + +export const makeExecuteCommand = (config: ExecuteCommandConfig) => ( + deps: Dependencies, +) => { + const command: CommandCtor> = class ExecuteCommand + extends WriteCommand + implements ExecuteCommandInstance { + wallet: IStarknetWallet + provider: IStarknetProvider + contractAddress: string + account: string + executionContext: ExecutionContext + contract: CompiledContract + compiledContractHash?: string + input: Input + batchInput?: Array<[string, Input]> + + beforeExecute: () => Promise + afterExecute: (response: Result) => Promise + + static id = makeCommandId(config.category, config.action, config.suffixes) + static category = config.category + static examples = config.ux.examples + + static create = async (flags, args) => { + const c = new ExecuteCommand(flags, args) + + const env = await deps.makeEnv(flags) + + c.wallet = await deps.makeWallet(env) + c.provider = deps.makeProvider(env.providerUrl, c.wallet) + c.account = env.account + + // NOTE: If more than one argument is passed in, then the following assumptions will be made: + // - All `args` are valid Starknet contract addresses + // - All contract addresses reference contracts with the same ABI + // + c.contractAddress = args[0] + + const loadResult = config.loadContract() + c.contract = loadResult.contract + if (loadResult.casm) { + c.compiledContractHash = hash.computeCompiledClassHash(loadResult.casm) + } + + c.executionContext = { + category: config.category, + action: config.action, + provider: c.provider, + wallet: c.wallet, + id: makeCommandId(config.category, config.action, config.suffixes), + contractAddress: c.contractAddress, + flags: flags, + contract: new Contract(c.contract.abi, c.contractAddress ?? '', c.provider.provider), + } + + const overrideExecutionContext = (contractAddress: string): ExecutionContext => { + return { + ...c.executionContext, + contract: new Contract(c.contract.abi, contractAddress, c.provider.provider), + contractAddress, + } + } + + const rdd = flags.rdd || process.env.RDD + if (rdd) { + deps.logger.info(`Using RDD from ${rdd}`) + c.executionContext.rdd = getRDD(rdd) + + // If more than one argument / address is passed to the command, then we'll assume that we + // want to perform a batch operation where we execute multiple calls from one transaction. + // If the RDD flag is also specified, then we gain the flexibility to vary the inputs of each + // call. Instead of forwarding all args to `buildCommandInput`, we can pass each arg to the + // function individually: + // + // makeBuildInput(..., [args[0]], ..., ) + // makeBuildInput(..., [args[1]], ..., ) + // makeBuildInput(..., [args[2]], ..., ) + // ... + // + // Under the hood, each call will access the RDD JSON config file at key `args[i]` which will + // return a different set of config values. These values can be used to populate the transaction + // calls. + // + if (args.length > 1) { + // Maps each address to its corresponding input while preserving + // the order in which the addresses were passed to the command + c.batchInput = await Promise.all( + args.map(async (addr: string) => { + const execCtx = overrideExecutionContext(addr) + const cmdInpt = await c.buildCommandInput(flags, [addr], env, execCtx) + return [addr, cmdInpt] as const + }), + ) + } + } + + c.input = await c.buildCommandInput(flags, args, env) + + // Map each address to its corresponding input using an array of pairs + const addressToInputPairs = c.batchInput ?? ([[c.contractAddress, c.input]] as const) + + c.beforeExecute = async () => { + const funcs = addressToInputPairs.map(([addr, inpt]) => { + const ctx = overrideExecutionContext(addr) + return config.hooks?.beforeExecute == null + ? c.defaultBeforeExecute(ctx, inpt) + : config.hooks.beforeExecute(ctx, inpt, { + logger: deps.logger, + prompt: deps.prompt, + }) + }) + for (const func of funcs) { + await func() + } + } + + c.afterExecute = async (result) => { + const funcs = addressToInputPairs.map(([addr, inpt]) => { + const ctx = overrideExecutionContext(addr) + return config.hooks?.afterExecute == null + ? c.defaultAfterExecute() + : config.hooks.afterExecute(ctx, inpt, { + logger: deps.logger, + prompt: deps.prompt, + }) + }) + + // If there's only one function to call (bc only one address was provided to + // the command), then we will NOT wrap the result in an array. Instead we'll + // return the result as-is to maintain backwards compatibility. + const firstFunc = funcs.at(0) + if (firstFunc != null && funcs.length === 1) { + return await firstFunc(result) + } + + // If we need to execute multiple functions (bc multiple addresses were provided), + // then we will call each of them in serial and in the order in which the input + // addresses were provided. The outputs of each function are stored in an array. + const outputs = [] + for (const func of funcs) { + outputs.push(await func(result)) + } + return outputs + } + + return c + } + + runValidations = async (validations: Validation[], input: UI) => { + const result = await Promise.all( + validations.map((validation) => validation(input, this.executionContext)), + ) + return result + } + + defaultBeforeExecute = ( + context: ExecutionContext, + input: Input, + ) => async () => { + deps.logger.loading(`Executing ${context.id} from contract ${context.contractAddress}`) + deps.logger.log('Contract Input Params:', input.contract) + } + + defaultAfterExecute = () => async (response: Result): Promise => { + deps.logger.info(`Execution finished at transaction: ${response.responses[0].tx.hash}`) + } + + buildCommandInput = async (flags, args, env, ctx?): Promise> => { + const userInput = await config.makeUserInput(flags, args, env) + + // Validation + if (config.validations.length > 0) { + await this.runValidations(config.validations, userInput) + } + + const contractInput = await config.makeContractInput(userInput, ctx ?? this.executionContext) + + return { + user: userInput, + contract: contractInput, + } + } + + simulate = () => true + + // TODO: This will be required for Multisig + makeMessage = async (): Promise => { + const makeInvocation = (addr: string, input: any) => { + const contract = new Contract(this.contract.abi, addr, this.provider.provider) + return contract.populate(config.internalFunction || config.action, input) + } + + if (this.args.length === 0) { + return [] + } + + if (this.args.length === 1) { + return [makeInvocation(this.contractAddress, this.input.contract)] + } + + // If we have more than one argument / address and the RDD flag is set, then we'll build + // one transaction with multiple calls where each call has potentially different inputs. + const inputs = this.batchInput + if (inputs != null) { + return inputs.map(([addr, inpt]) => makeInvocation(addr, inpt.contract)) + } + + // If more than one argument / address is passed to the command, but the RDD flag is NOT + // specified, then we cannot vary the inputs of each call. Instead, all calls must have + // the same arguments. However, they will still be bundled into one transaction. + return this.args.map((addr) => makeInvocation(addr, this.input.contract)) + } + + deployContract = async (): Promise => { + deps.logger.info(`Deploying contract ${config.category}`) + await deps.prompt('Continue?') + deps.logger.loading(`Sending transaction...`) + + // if "--classHash" is not included, declare before deploying + const classHash: string | undefined = this.input?.user?.['classHash'] + + let tx: TransactionResponse + + if (classHash === undefined) { + tx = await this.provider.declareAndDeployContract( + this.contract, + this.compiledContractHash, + this.input.contract, + false, + this.input?.user?.['salt'], + ) + } else { + tx = await this.provider.deployContract( + classHash, + this.input.contract, + false, + this.input?.user?.['salt'], + ) + } + + if (tx.hash === undefined) { + deps.logger.error(`No tx hash found:\n${JSON.stringify(tx, null, 2)}`) + return tx + } + + deps.logger.loading(`Waiting for tx confirmation at ${tx.hash}...`) + const response = await tx.wait() + if (!response.success) { + deps.logger.error(`Contract was not deployed: ${tx.errorMessage}`) + return tx + } + deps.logger.success(`Contract deployed on ${tx.hash} with address ${tx.address}`) + deps.logger.info( + `If using RDD, change the RDD ID with the new contract address: ${tx.address}`, + ) + return tx + } + + declareContract = async (): Promise => { + deps.logger.info(`Declaring contract ${config.category}`) + await deps.prompt('Continue?') + deps.logger.loading(`Sending transaction...`) + + const tx = await this.provider.declareContract( + this.contract, + this.compiledContractHash, + false, + ) + + deps.logger.loading(`Waiting for tx confirmation at ${tx.hash}...`) + const response = await tx.wait() + + if (!response.success) { + deps.logger.error(`Contract was not declared: ${tx.errorMessage}`) + return tx + } + + deps.logger.success(`Contract declared at ${this.compiledContractHash}`) + return tx + } + + deployAccountContract = async (): Promise => { + deps.logger.info(`Deploying account contract ${config.category}`) + await deps.prompt('Continue?') + deps.logger.loading(`Sending transaction...`) + + // classHash has to be provided, we can't declare on new accounts. + const classHash: string = this.input?.user?.['classHash'] + const salt = this.input?.user?.['salt'] + const contractInput = this.input.contract as any + + const newAccountAddress = hash.calculateContractAddressFromHash( + salt, + classHash, + contractInput, + 0, + ) + deps.logger.info( + `Add funds to pay for deploy fees to the account address: ${newAccountAddress}`, + ) + await deps.prompt('Funded?') + + const tx: TransactionResponse = await this.provider.deployAccountContract( + classHash, + this.input.contract, + false, + salt, + ) + + if (tx.hash === undefined) { + deps.logger.error(`No tx hash found: \n${JSON.stringify(tx, null, 2)}`) + return tx + } + + deps.logger.loading(`Waiting for tx confirmation at ${tx.hash}...`) + const response = await tx.wait() + if (!response.success) { + deps.logger.error(`Contract was not deployed: ${tx.errorMessage}`) + return tx + } + deps.logger.success(`Contract deployed on ${tx.hash} with address ${tx.address}`) + deps.logger.info( + `If using RDD, change the RDD ID with the new contract address: ${tx.address}`, + ) + return tx + } + + executeWithSigner = async (): Promise => { + const pubkey = await this.wallet.getPublicKey() + deps.logger.info(`Using wallet: ${pubkey}`) + const messages = await this.makeMessage() + await deps.prompt(`Continue?`) + deps.logger.loading(`Signing and sending transaction...`) + const tx = await this.provider.signAndSend(messages) + deps.logger.loading(`Waiting for tx confirmation at ${tx.hash}...`) + const response = await tx.wait() + if (!response.success) { + deps.logger.error(`Tx was not successful: ${tx.errorMessage}`) + return tx + } + deps.logger.success(`Tx executed at ${tx.hash}`) + return tx + } + + execute = async () => { + let tx: TransactionResponse + + await this.beforeExecute() + + if (config.action === 'deploy') { + tx = await this.deployContract() + } else if (config.action === 'declare') { + tx = await this.declareContract() + } else if (config.action === 'deploy-account') { + tx = await this.deployAccountContract() + } else { + tx = await this.executeWithSigner() + } + + const result = { + responses: [ + { + tx, + contract: tx.address, + }, + ], + } + const data = await this.afterExecute(result) + + return data ? { ...result, data: { ...data } } : result + } + } + + return command +} diff --git a/packages-ts/starknet-gauntlet/src/commands/base/index.ts b/packages-ts/starknet-gauntlet/src/commands/base/index.ts new file mode 100644 index 000000000..c455f9c73 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/commands/base/index.ts @@ -0,0 +1,7 @@ +export * from './command' +export * from './executeCommand' +export * from './inspectionCommand' +export * from './upgradeCommandConfig' +export * from './declareCommandConfig' +export * from './acceptOwnershipCommandConfig' +export * from './transferOwnershipCommandConfig' diff --git a/packages-ts/gauntlet-starknet/src/commands/base/inspectionCommand.ts b/packages-ts/starknet-gauntlet/src/commands/base/inspectionCommand.ts similarity index 77% rename from packages-ts/gauntlet-starknet/src/commands/base/inspectionCommand.ts rename to packages-ts/starknet-gauntlet/src/commands/base/inspectionCommand.ts index a16a8f244..1ef8998fb 100644 --- a/packages-ts/gauntlet-starknet/src/commands/base/inspectionCommand.ts +++ b/packages-ts/starknet-gauntlet/src/commands/base/inspectionCommand.ts @@ -1,11 +1,12 @@ import BaseCommand from '@chainlink/gauntlet-core/dist/commands/internal/base' -import { CompiledContract, Contract } from 'starknet' +import { CompiledContract, CompiledSierraCasm, Contract, hash } from 'starknet' import { CommandCtor, Input } from '.' -import { Dependencies } from '../../dependencies' +import { InspectionDependencies } from '../../dependencies' import { IStarknetProvider } from '../../provider' import { CommandUX, makeCommandId } from './command' +import { LoadContractResult } from './executeCommand' -interface InspectUserInput { +export interface InspectUserInput { input: UI toCompare?: CompareInput } @@ -54,16 +55,19 @@ export interface InspectCommandConfig { message: string resultType: 'success' | 'failed' }[] - loadContract: () => CompiledContract + loadContract: () => LoadContractResult } export interface InspectCommandInstance { - execute: () => Promise<{ data: InspectionReport; responses: any[] }> + execute: () => Promise<{ + data: InspectionReport + responses: any[] + }> } export const makeInspectionCommand = ( config: InspectCommandConfig, -) => (deps: Omit) => { +) => (deps: InspectionDependencies) => { const command: CommandCtor> = class InspectionCommand extends BaseCommand implements InspectCommandInstance { @@ -74,6 +78,7 @@ export const makeInspectionCommand = ( input: Input, CI> contract: CompiledContract + compiledContractHash?: string // UX static id = makeCommandId(config.ux.category, config.ux.function, config.ux.suffixes) @@ -83,20 +88,28 @@ export const makeInspectionCommand = ( static create = async (flags, args) => { const c = new InspectionCommand(flags, args) - const env = deps.makeEnv(flags) + const env = await deps.makeEnv(flags) c.provider = deps.makeProvider(env.providerUrl) c.contractAddress = args[0] c.input = await c.buildCommandInput(flags, args) - c.contract = config.loadContract() + const loadResult = config.loadContract() + c.contract = loadResult.contract + if (loadResult.casm) { + c.compiledContractHash = hash.computeCompiledClassHash(loadResult.casm) + } return c } - buildCommandInput = async (flags, args): Promise, CI>> => { + buildCommandInput = async ( + flags, + args, + ): Promise, CI>> => { const userInput = config.makeUserInput && (await config.makeUserInput(flags, args)) - const contractInput = config.makeContractInput && (await config.makeContractInput(userInput.input)) + const contractInput = + config.makeContractInput && (await config.makeContractInput(userInput.input)) return { user: userInput || { @@ -113,6 +126,9 @@ export const makeInspectionCommand = ( const results = await Promise.all( functions.map((func, i) => { deps.logger.loading(`Fetching ${func} of contract ${this.contractAddress}...`) + if (!inputs[i]) { + return contract[func]() // workaround undefined argument inputs[i] + } return contract[func](inputs[i]) }), ) @@ -121,7 +137,11 @@ export const makeInspectionCommand = ( execute = async () => { const results = await this.runQueries(config.queries, this.input.contract) - const data = await config.makeComparisionData(this.provider)(results, this.input.user.input, this.contractAddress) + const data = await config.makeComparisionData(this.provider)( + results, + this.input.user.input, + this.contractAddress, + ) const inspectionResults = config.inspect ? config.inspect(this.input.user, data) : [] deps.logger.info('Inspection Results:') diff --git a/packages-ts/starknet-gauntlet/src/commands/base/transferOwnershipCommandConfig.ts b/packages-ts/starknet-gauntlet/src/commands/base/transferOwnershipCommandConfig.ts new file mode 100644 index 000000000..15aec2154 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/commands/base/transferOwnershipCommandConfig.ts @@ -0,0 +1,46 @@ +import { isValidAddress } from '../../utils' +import { ExecuteCommandConfig } from '.' + +type ContractInput = [newOwner: string] + +export interface TransferOwnershipUserInput { + newOwner: string +} + +const validateNewOwner = async (input) => { + if (isValidAddress(input.newOwner)) { + return true + } + throw new Error(`Invalid New Owner Address: ${input.newOwner}`) +} + +const makeUserInput = async (flags): Promise => { + if (flags.input) return flags.input as TransferOwnershipUserInput + return { + newOwner: flags.newOwner, + } +} + +const makeContractInput = async (input: TransferOwnershipUserInput): Promise => { + return [input.newOwner] +} + +export const transferOwnershipCommandConfig = ( + contractId: string, + category: string, + contractLoader: any, +): ExecuteCommandConfig => ({ + contractId, + category: contractId, + action: 'transfer_ownership', + ux: { + description: 'Begin two-step ownership transfer process by proposing pending owner', + examples: [ + `${contractId}:transfer_ownership --network= --newOwner= `, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateNewOwner], + loadContract: contractLoader, +}) diff --git a/packages-ts/starknet-gauntlet/src/commands/base/upgradeCommandConfig.ts b/packages-ts/starknet-gauntlet/src/commands/base/upgradeCommandConfig.ts new file mode 100644 index 000000000..f0a0d2b2e --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/commands/base/upgradeCommandConfig.ts @@ -0,0 +1,46 @@ +import { isValidAddress } from '../../utils' +import { ExecuteCommandConfig } from '.' + +type ContractInput = [classHash: string] + +export interface UserInput { + classHash: string +} + +const validateClassHash = async (input) => { + if (isValidAddress(input.classHash)) { + return true + } + throw new Error(`Invalid Class Hash: ${input.classHash}`) +} + +const makeUserInput = async (flags): Promise => { + if (flags.input) return flags.input as UserInput + return { + classHash: flags.classHash, + } +} + +const makeContractInput = async (input: UserInput): Promise => { + return [input.classHash] +} + +export const upgradeCommandConfig = ( + contractId: string, + category: string, + contractLoader: any, +): ExecuteCommandConfig => ({ + contractId, + category: contractId, + action: 'upgrade', + ux: { + description: 'Upgrades contract to new class hash', + examples: [ + `${contractId}:upgrade --network= --classHash= `, + ], + }, + makeUserInput, + makeContractInput, + validations: [validateClassHash], + loadContract: contractLoader, +}) diff --git a/packages-ts/starknet-gauntlet/src/contract/index.ts b/packages-ts/starknet-gauntlet/src/contract/index.ts new file mode 100644 index 000000000..b61b94838 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/contract/index.ts @@ -0,0 +1,20 @@ +import fs from 'fs' +import { json } from 'starknet' +import { LoadContractResult } from '../commands/base/executeCommand' + +export const loadContract = (name: string): LoadContractResult => { + return { + contract: json.parse( + fs.readFileSync( + `${__dirname}/../../../../contracts/target/release/chainlink_${name}.contract_class.json`, + 'utf-8', + ), + ), + casm: json.parse( + fs.readFileSync( + `${__dirname}/../../../../contracts/target/release/chainlink_${name}.compiled_contract_class.json`, + 'utf-8', + ), + ), + } +} diff --git a/packages-ts/starknet-gauntlet/src/dependencies/index.ts b/packages-ts/starknet-gauntlet/src/dependencies/index.ts new file mode 100644 index 000000000..bddc4edfd --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/dependencies/index.ts @@ -0,0 +1,23 @@ +import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' +import { IStarknetProvider } from '../provider' +import { IStarknetWallet } from '../wallet' + +export interface Env { + providerUrl: string + pk?: string + account?: string + withLedger?: boolean + ledgerPath?: string + multisig?: string + [key: string]: string | boolean // Custom env +} + +export interface Dependencies { + logger: typeof logger + prompt: typeof prompt + makeEnv: (flags: Record) => Promise | Env + makeProvider: (url: string, wallet?: IStarknetWallet) => IStarknetProvider + makeWallet: (env: Env) => Promise +} + +export type InspectionDependencies = Omit diff --git a/packages-ts/starknet-gauntlet/src/encoding/index.ts b/packages-ts/starknet-gauntlet/src/encoding/index.ts new file mode 100644 index 000000000..b05ae7795 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/encoding/index.ts @@ -0,0 +1,63 @@ +import { BigNumberish, cairo } from 'starknet' + +const CHUNK_SIZE = 31 + +function packUint8Array(data: Uint8Array | Buffer): bigint { + let result: bigint = BigInt(0) + for (let i = 0; i < data.length; i++) { + result = (result << BigInt(8)) | BigInt(data[i]) + } + return result +} + +export function bytesToFelts(data: Uint8Array | Buffer): string[] { + const felts: string[] = [] + + // prefix with data length + felts.push(cairo.felt(data.byteLength)) + + // chunk every 31 bytes + for (let i = 0; i < data.length; i += CHUNK_SIZE) { + const chunk = data.slice(i, i + CHUNK_SIZE) + // cairo.felt() does not support packing a Uint8Array natively. + const packedValue = packUint8Array(chunk) + felts.push(cairo.felt(packedValue)) + } + return felts +} + +const MAX_LEN: bigint = (BigInt(1) << BigInt(54)) - BigInt(1) + +export function feltsToBytes(felts: BigNumberish[]): Buffer { + const data: number[] = [] + + if (!felts.length) { + throw new Error('Felt string is empty') + } + + const remainingLengthBigInt = BigInt(felts.shift()) + if (remainingLengthBigInt > MAX_LEN) { + throw new Error('Length does not fit in 54 bits') + } + + let remainingLength = Number(remainingLengthBigInt) + for (let felt of felts) { + if (remainingLength <= 0) { + throw new Error( + `Too many felts (${felts.length}) for length ${remainingLengthBigInt.toString()}`, + ) + } + const chunkSize = Math.min(CHUNK_SIZE, remainingLength) + let packedValue: bigint = BigInt(felt) + const unpackedValues: number[] = [] + for (let i = 0; i < chunkSize; i++) { + unpackedValues.push(Number(packedValue & BigInt(0xff))) + packedValue = packedValue >> BigInt(8) + } + unpackedValues.reverse() + data.push(...unpackedValues) + remainingLength -= chunkSize + } + + return Buffer.from(data) +} diff --git a/packages-ts/gauntlet-starknet/src/events/index.ts b/packages-ts/starknet-gauntlet/src/events/index.ts similarity index 100% rename from packages-ts/gauntlet-starknet/src/events/index.ts rename to packages-ts/starknet-gauntlet/src/events/index.ts diff --git a/packages-ts/gauntlet-starknet/src/events/subscription.ts b/packages-ts/starknet-gauntlet/src/events/subscription.ts similarity index 100% rename from packages-ts/gauntlet-starknet/src/events/subscription.ts rename to packages-ts/starknet-gauntlet/src/events/subscription.ts diff --git a/packages-ts/starknet-gauntlet/src/index.ts b/packages-ts/starknet-gauntlet/src/index.ts new file mode 100644 index 000000000..7a6081683 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/index.ts @@ -0,0 +1,16 @@ +// Node.js 18 + Jest 28 are supposed to support fetch but I can't get it working. +// Copying starknet.js workaround: https://github.com/0xs34n/starknet.js/commit/83be37a9e3328a44abd9583b8167c3cb8d882790 +import fetch from 'cross-fetch' +if (!global.fetch) { + global.fetch = fetch +} + +export * from './commands/base' +export * from './dependencies' +export * from './provider' +export * from './wallet' +export * from './events' +export * from './utils' +export * from './encoding' +export * from './contract' +export * from './rdd' diff --git a/packages-ts/starknet-gauntlet/src/provider/index.ts b/packages-ts/starknet-gauntlet/src/provider/index.ts new file mode 100644 index 000000000..ddb2a965d --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/provider/index.ts @@ -0,0 +1,200 @@ +import { TransactionResponse } from '../transaction' +import { + RpcProvider as StarknetProvider, + DeclareContractResponse, + InvokeFunctionResponse, + DeployContractResponse, + CompiledContract, + Account, + Call, + constants, +} from 'starknet' +import { IStarknetWallet } from '../wallet' + +// TODO: Move to gauntlet-core +interface IProvider

{ + provider: P + send: () => Promise + declareAndDeployContract: ( + contract: CompiledContract, + compiledClassHash: string, + input: any, + wait?: boolean, + salt?: number, + ) => Promise + deployContract: ( + classHash: string, + input: any, + wait?: boolean, + salt?: number, + ) => Promise + deployAccountContract: ( + classHash: string, + input: any, + wait?: boolean, + salt?: number, + ) => Promise + declareContract: ( + contract: CompiledContract, + compiledClassHash?: string, + wait?: boolean, + ) => Promise + signAndSend: (calls: Call[], wait?: boolean) => Promise +} + +export interface IStarknetProvider extends IProvider {} +export const makeProvider = ( + url: string, + wallet?: IStarknetWallet, +): IProvider => { + return new Provider(url, wallet) +} + +export const wrapResponse = ( + provider: IStarknetProvider, + response: InvokeFunctionResponse | DeployContractResponse | DeclareContractResponse, + address?: string, +): TransactionResponse => { + const txResponse: TransactionResponse = { + hash: response.transaction_hash, + // HACK: Work around the response being either AddTransactionResponse or DeployContractResponse + address: address || (response as any).address || (response as any).contract_address, + wait: async () => { + // Success if does not throw + let success: boolean + try { + await provider.provider.waitForTransaction(response.transaction_hash) + txResponse.status = 'ACCEPTED' + success = true + } catch (e) { + txResponse.status = 'REJECTED' + txResponse.errorMessage = e.message + success = false + } + const status = await provider.provider.getTransactionStatus(response.transaction_hash) + txResponse.code = status.finality_status // For some reason, starknet does not consider any other status than "TRANSACTION_RECEIVED" + return { success } + }, + status: 'PENDING', + tx: response, + } + return txResponse +} + +class Provider implements IStarknetProvider { + provider: StarknetProvider + account: Account + + constructor(nodeUrl: string, wallet?: IStarknetWallet) { + this.provider = new StarknetProvider({ nodeUrl }) + if (wallet) { + this.account = new Account( + this.provider, + wallet.getAccountAddress(), + wallet.signer, + /* cairoVersion= */ null, // don't set cairo version so that it's automatically detected from the contract + /* transactionVersion= */ constants.TRANSACTION_VERSION.V3, + ) + } + } + + setAccount(wallet: IStarknetWallet) { + this.account = new Account( + this.provider, + wallet.getAccountAddress(), + wallet.signer, + /* cairoVersion= */ null, + /* transactionVersion= */ constants.TRANSACTION_VERSION.V3, + ) + } + + send = async () => { + // Use provider to send tx and wrap it in our type + return {} as TransactionResponse + } + + /** + * Compiles the contract and declares it using the generated ABI. + * Then deploys an instance of the declared contract. + * If contract has already been declared it will only be deployed. + */ + declareAndDeployContract = async ( + contract: CompiledContract, + compiledClassHash?: string, + input: any = [], + wait = true, + salt = undefined, + ) => { + const tx = await this.account.declareAndDeploy({ + contract, + compiledClassHash, + salt: !isNaN(salt) ? '0x' + salt.toString(16) : salt, // convert number to hex or leave undefined + // unique: false, + ...(!!input && input.length > 0 && { constructorCalldata: input }), + }) + + const response = wrapResponse(this, tx.deploy) + + if (!wait) return response + await response.wait() + return response + } + + /** + * Compiles the contract and declares it using the generated ABI. + */ + declareContract = async (contract: CompiledContract, compiledClassHash?: string, wait = true) => { + const tx = await this.account.declare({ + contract, + compiledClassHash, + }) + + const response = wrapResponse(this, tx, 'not applicable for declares') + + if (!wait) return response + await response.wait() + return response + } + + /** + * Deploys a contract given a class hash + */ + deployContract = async (classHash: string, input: any = [], wait = true, salt = undefined) => { + const tx = await this.account.deployContract({ + classHash: classHash, + salt: !isNaN(salt) ? '0x' + salt.toString(16) : salt, + ...(!!input && input.length > 0 && { constructorCalldata: input }), + }) + const response = wrapResponse(this, tx) + + if (!wait) return response + await response.wait() + return response + } + + /** + * Deploys an account contract using DEPLOY_ACCOUNT given a class hash + */ + + deployAccountContract = async (classHash: string, input: any = [], wait = true, salt = 0) => { + const tx = await this.account.deployAccount({ + classHash: classHash, + constructorCalldata: input, + addressSalt: '0x' + salt.toString(16), + }) + const response = wrapResponse(this, tx) + + if (!wait) return response + await response.wait() + return response + } + + signAndSend = async (calls: Call[], wait = false) => { + const tx = await this.account.execute(calls) + const response = wrapResponse(this, tx) + if (!wait) return response + + await response.wait() + return response + } +} diff --git a/packages-ts/starknet-gauntlet/src/rdd.ts b/packages-ts/starknet-gauntlet/src/rdd.ts new file mode 100644 index 000000000..dc1868eb9 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/rdd.ts @@ -0,0 +1,21 @@ +import { existsSync, readFileSync } from 'fs' + +export enum CONTRACT_TYPES { + PROXY = 'proxies', + ACCESS_CONTROLLER = 'accessControllers', + AGGREGATOR = 'contracts', + VALIDATOR = 'validators', +} + +export const getRDD = (path: string): any => { + // test whether the file exists as a relative path or an absolute path + if (!existsSync(path)) { + throw new Error(`Could not find the RDD. Make sure you provided a valid $path`) + } + + try { + return JSON.parse(readFileSync(path, 'utf8')) + } catch (e) { + throw new Error(`An error ocurred while parsing the RDD. Make sure you provided a valid path`) + } +} diff --git a/packages-ts/starknet-gauntlet/src/transaction/index.ts b/packages-ts/starknet-gauntlet/src/transaction/index.ts new file mode 100644 index 000000000..2f6bc39ea --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/transaction/index.ts @@ -0,0 +1,16 @@ +import { + InvokeFunctionResponse, + DeclareContractResponse, + DeployContractResponse, + RPC, +} from 'starknet' + +export type TransactionResponse = { + hash: string + address?: string + wait: () => Promise<{ success: boolean }> + tx?: InvokeFunctionResponse | DeclareContractResponse | DeployContractResponse + code?: RPC.SPEC.TXN_STATUS + status: 'PENDING' | 'ACCEPTED' | 'REJECTED' + errorMessage?: string +} diff --git a/packages-ts/gauntlet-starknet/src/utils/address.ts b/packages-ts/starknet-gauntlet/src/utils/address.ts similarity index 77% rename from packages-ts/gauntlet-starknet/src/utils/address.ts rename to packages-ts/starknet-gauntlet/src/utils/address.ts index 62062f4ab..69ea54818 100644 --- a/packages-ts/gauntlet-starknet/src/utils/address.ts +++ b/packages-ts/starknet-gauntlet/src/utils/address.ts @@ -4,7 +4,7 @@ import { validateAndParseAddress } from 'starknet' export const isValidAddress = (address: string): boolean => { try { validateAndParseAddress(address) - return true + return !!address // check value is not falsy (undefined, "", etc) } catch (e) {} return false } diff --git a/packages-ts/starknet-gauntlet/src/utils/configDigest.ts b/packages-ts/starknet-gauntlet/src/utils/configDigest.ts new file mode 100644 index 000000000..9d3274b08 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/utils/configDigest.ts @@ -0,0 +1,25 @@ +import fs from 'fs' +import { CONTRACT_TYPES, getRDD } from '../rdd' +import { Dependencies } from '../dependencies' + +export const tryToWriteLastConfigDigestToRDD = async ( + deps: Pick, + rddPath: string, + contractAddr: string, + configDigest: string, +) => { + deps.logger.info(`lastConfigDigest to save in RDD: ${configDigest}`) + if (rddPath) { + const rdd = getRDD(rddPath) + // set updated lastConfigDigest + rdd[CONTRACT_TYPES.AGGREGATOR][contractAddr]['config']['lastConfigDigest'] = configDigest + fs.writeFileSync(rddPath, JSON.stringify(rdd, null, 2)) + deps.logger.success( + `RDD file ${rddPath} has been updated! You must reformat RDD by running ./bin/degenerate and ./bin/generate in that exact order`, + ) + } else { + deps.logger.warn( + `No RDD file was inputted, you must manually update lastConfigDigest in RDD yourself`, + ) + } +} diff --git a/packages-ts/starknet-gauntlet/src/utils/index.ts b/packages-ts/starknet-gauntlet/src/utils/index.ts new file mode 100644 index 000000000..4dce8b032 --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './address' +export * from './configDigest' diff --git a/packages-ts/starknet-gauntlet/src/wallet/defaultWallet.ts b/packages-ts/starknet-gauntlet/src/wallet/defaultWallet.ts new file mode 100644 index 000000000..0ac4a47dd --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/wallet/defaultWallet.ts @@ -0,0 +1,24 @@ +import { Signer } from 'starknet' +import { IStarknetWallet } from './' +import { Env } from '../dependencies' + +export class Wallet implements IStarknetWallet { + signer: Signer + account: string + + private constructor(keypair: string, account?: string) { + this.signer = new Signer(keypair) + this.account = account + } + + static create = (pKey: string, account?: string) => { + return new Wallet(pKey, account) + } + + getPublicKey = async () => await this.signer.getPubKey() + getAccountAddress = () => this.account +} + +export const makeWallet = async (env: Env): Promise => { + return Wallet.create(env.pk, env.account) +} diff --git a/packages-ts/starknet-gauntlet/src/wallet/index.ts b/packages-ts/starknet-gauntlet/src/wallet/index.ts new file mode 100644 index 000000000..f728b777b --- /dev/null +++ b/packages-ts/starknet-gauntlet/src/wallet/index.ts @@ -0,0 +1,13 @@ +import { SignerInterface } from 'starknet' +import { makeWallet } from './defaultWallet' + +export interface IWallet { + signer: W + getPublicKey: () => Promise +} + +export interface IStarknetWallet extends IWallet { + getAccountAddress: () => string +} + +export { makeWallet } diff --git a/packages-ts/gauntlet-starknet-example/contract_artifacts/abi/example.json b/packages-ts/starknet-gauntlet/test/__mocks__/example.json similarity index 100% rename from packages-ts/gauntlet-starknet-example/contract_artifacts/abi/example.json rename to packages-ts/starknet-gauntlet/test/__mocks__/example.json diff --git a/packages-ts/starknet-gauntlet/test/commands/execute.test.ts b/packages-ts/starknet-gauntlet/test/commands/execute.test.ts new file mode 100644 index 000000000..cb319a45e --- /dev/null +++ b/packages-ts/starknet-gauntlet/test/commands/execute.test.ts @@ -0,0 +1,91 @@ +import { loadExampleContract, registerExecuteCommand, TIMEOUT } from '../utils' +import { ExecuteCommandConfig, makeExecuteCommand } from '../../src/index' + +describe('Execute Command', () => { + type UserInput = { + a: string + b: number + } + + type ContractInput = [string, number] + + const makeUserInput = async (flags): Promise => { + return { + a: flags.a, + b: Number(flags.b), + } + } + + const makeContractInput = async (userInput: UserInput): Promise => { + return [userInput.a, userInput.b] + } + + const simpleCommandConfig: ExecuteCommandConfig = { + contractId: '', + category: 'example', + action: 'action', + ux: { + description: '', + examples: [], + }, + makeUserInput, + makeContractInput, + validations: [], + loadContract: loadExampleContract, + } + + const commandConfigWithSuffixes = { + ...simpleCommandConfig, + ...{ suffixes: ['send', 'bob'] }, + } + + const command = registerExecuteCommand(makeExecuteCommand(simpleCommandConfig)) + const commandWithSuffixes = registerExecuteCommand(makeExecuteCommand(commandConfigWithSuffixes)) + + it('Command ID generation', async () => { + expect(command.id).toEqual('example:action') + expect(commandWithSuffixes.id).toEqual('example:action:send:bob') + }) + + it('Command input creation', async () => { + const commandInstance = await command.create({ a: 'a', b: '20' }, []) + expect(commandInstance.input.user).toEqual({ a: 'a', b: 20 }) + expect(commandInstance.input.contract).toEqual(['a', 20]) + }) +}) + +describe('Execute with network', () => { + it( + 'Command deploy execution', + async () => { + const makeUserInput = async () => { + return + } + + const makeContractInput = async () => { + return {} + } + + const deployCommandConfig: ExecuteCommandConfig = { + contractId: '', + category: 'example', + action: 'deploy', + ux: { + description: '', + examples: [], + }, + makeUserInput, + makeContractInput, + validations: [], + loadContract: loadExampleContract, + } + + const command = registerExecuteCommand(makeExecuteCommand(deployCommandConfig)) + + const commandInstance = await command.create({}, []) + const report = await commandInstance.execute() + expect(report.responses[0].tx.status).toEqual('ACCEPTED') + }, + TIMEOUT, + ) +}) diff --git a/packages-ts/starknet-gauntlet/test/encoding/encoding.test.ts b/packages-ts/starknet-gauntlet/test/encoding/encoding.test.ts new file mode 100644 index 000000000..cd2730edc --- /dev/null +++ b/packages-ts/starknet-gauntlet/test/encoding/encoding.test.ts @@ -0,0 +1,49 @@ +import { num } from 'starknet' +import { bytesToFelts, feltsToBytes } from '../../src/encoding' + +const CHUNK_SIZE = 31 + +export function bytesToFeltsDeprecated(data: Uint8Array): string[] { + let felts: string[] = [] + // prefix with len + let len = data.byteLength + felts.push(num.toBigInt(len).toString()) + // chunk every 31 bytes + for (let i = 0; i < data.length; i += CHUNK_SIZE) { + const chunk = data.slice(i, i + CHUNK_SIZE) + // convert big int to int (decimal) string + felts.push(bytesToBigInt(chunk).toString()) + } + return felts +} + +function bytesToBigInt(data: Uint8Array): bigint { + // convert byte array to hexadecimal string (pad by 2 so each byte is represented by 2 hex characters) + const feltHex = `0x${Array.from(data, (byte) => byte.toString(16).padStart(2, '0')).join('')}` + // convert hexadecimal string to bigint + return BigInt(feltHex) +} + +function createUint8Array(len: number): Uint8Array { + const ret: Uint8Array = new Uint8Array(len) + for (let i = 1; i <= len; i++) { + ret[i - 1] = i + } + return ret +} + +describe('bytesToFelts', () => { + it('matches the deprecated BN function', async () => { + for (let testLength = 0; testLength < 256; testLength++) { + const testArray = createUint8Array(testLength) + expect(bytesToFelts(testArray)).toEqual(bytesToFeltsDeprecated(testArray)) + } + }) + + it('converts to felts and back successfully', async () => { + for (let testLength = 0; testLength < 256; testLength++) { + const testArray = createUint8Array(testLength) + expect(new Uint8Array(feltsToBytes(bytesToFelts(testArray)))).toEqual(testArray) + } + }) +}) diff --git a/packages-ts/starknet-gauntlet/test/utils/index.ts b/packages-ts/starknet-gauntlet/test/utils/index.ts new file mode 100644 index 000000000..7406d368c --- /dev/null +++ b/packages-ts/starknet-gauntlet/test/utils/index.ts @@ -0,0 +1,108 @@ +import { CompiledContract, json } from 'starknet' +import fs from 'fs' +import { logger, prompt } from '@chainlink/gauntlet-core/dist/utils' +import { + CommandCtor, + Dependencies, + ExecuteCommandInstance, + InspectCommandInstance, + makeProvider, + makeWallet, +} from '../../src/index' + +export const loadContract = (name: string): CompiledContract => { + return json.parse(fs.readFileSync(`${__dirname}/../__mocks__/${name}.json`).toString('ascii')) +} + +export const loadExampleContract = () => { + return { contract: loadContract('example') } +} + +export const noop = () => {} + +export const noopLogger: typeof logger = { + table: noop, + log: noop, + info: noop, + warn: noop, + success: noop, + error: noop, + loading: noop, + line: noop, + style: () => '', + debug: noop, + time: noop, +} + +export const noopPrompt: typeof prompt = async () => {} + +export const TIMEOUT = 900000 +export const LOCAL_URL = 'http://127.0.0.1:5050/' + +export type StarknetAccount = Awaited> +export const fetchAccount = async (accountIndex = 0) => { + const response = await fetch(`${LOCAL_URL}predeployed_accounts`) + const accounts = await response.json() + + const account = accounts.at(accountIndex) + if (account == null) { + throw new Error('no accounts available') + } + + return { + address: account.address as string, + privateKey: account.private_key as string, + balance: parseInt(account.initial_balance, 10), + } +} + +export const registerExecuteCommand = ( + registerCommand: (deps: Dependencies) => CommandCtor>, +) => { + const deps: Dependencies = { + logger: noopLogger, + prompt: noopPrompt, + makeEnv: async (flags) => { + if (flags.pk == null || flags.account == null) { + const acct = await fetchAccount() + flags.account = flags.account ?? acct.address + flags.pk = flags.pk ?? acct.privateKey + } + + return { + providerUrl: LOCAL_URL, + pk: flags.pk as string, + account: flags.account as string, + } + }, + makeProvider: makeProvider, + makeWallet: makeWallet, + } + return registerCommand(deps) +} + +export const registerInspectCommand = ( + registerCommand: ( + deps: Omit, + ) => CommandCtor>, +) => { + const deps: Omit = { + logger: noopLogger, + prompt: noopPrompt, + makeEnv: async (flags) => { + if (flags.pk == null || flags.account == null) { + const acct = await fetchAccount() + flags.account = flags.accout ?? acct.address + flags.pk = flags.pk ?? acct.privateKey + } + + return { + providerUrl: LOCAL_URL, + pk: flags.pk as string, + account: flags.account as string, + } + }, + makeProvider: makeProvider, + } + return registerCommand(deps) +} diff --git a/packages-ts/starknet-gauntlet/tsconfig.json b/packages-ts/starknet-gauntlet/tsconfig.json new file mode 100644 index 000000000..2c84c1fcb --- /dev/null +++ b/packages-ts/starknet-gauntlet/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**/*"], + "exclude": ["dist", "**/*.spec.ts", "**/*.test.ts"] +} diff --git a/relayer/go.mod b/relayer/go.mod new file mode 100644 index 000000000..ea7b13a10 --- /dev/null +++ b/relayer/go.mod @@ -0,0 +1,136 @@ +module github.com/smartcontractkit/chainlink-starknet/relayer + +go 1.21.3 + +toolchain go1.21.5 + +require ( + github.com/NethermindEth/juno v0.3.1 + github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb + github.com/ethereum/go-ethereum v1.13.8 + github.com/hashicorp/go-plugin v1.6.0 + github.com/pelletier/go-toml/v2 v2.1.1 + github.com/smartcontractkit/chainlink-common v0.1.7-0.20240625074419-c278d083facf + github.com/smartcontractkit/libocr v0.0.0-20240419185742-fd3cab206b2c + github.com/stretchr/testify v1.9.0 + go.uber.org/zap v1.26.0 + golang.org/x/exp v0.0.0-20231127185646-65229373498e +) + +require ( + cloud.google.com/go/compute v1.23.3 // indirect + github.com/DataDog/zstd v1.5.2 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 // indirect + github.com/buger/jsonparser v1.1.1 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect + github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set/v2 v2.3.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/ethereum/c-kzg-4844 v0.4.0 // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fxamacker/cbor/v2 v2.5.0 // indirect + github.com/getsentry/sentry-go v0.19.0 // indirect + github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-logr/logr v1.3.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/gogo/protobuf v1.3.3 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/invopop/jsonschema v0.12.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/klauspost/compress v1.17.2 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // 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.20 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/mwitkow/grpc-proxy v0.0.0-20230212185441-f345521cb9c9 // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.17.0 // 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/rivo/uniseg v0.4.4 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.2.0 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shopspring/decimal v1.3.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/test-go/testify v1.1.4 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/oauth2 v0.15.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.16.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/grpc v1.59.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) + +replace ( + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + + // until merged upstream: https://github.com/hashicorp/go-plugin/pull/257 + github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 + + // until merged upstream: https://github.com/mwitkow/grpc-proxy/pull/69 + github.com/mwitkow/grpc-proxy => github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f + +) diff --git a/relayer/go.sum b/relayer/go.sum new file mode 100644 index 000000000..896be704d --- /dev/null +++ b/relayer/go.sum @@ -0,0 +1,935 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= +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/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/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/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +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/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +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/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= +github.com/NethermindEth/juno v0.3.1/go.mod h1:SGbTpgGaCsxhFsKOid7Ylnz//WZ8swtILk+NbHGsk/Q= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb h1:Mv8SscePPyw2ju4igIJAjFgcq5zCQfjgbz53DwYu5mc= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb/go.mod h1:gQkhWpAs9/QR6reZU2xoi1UIYlMS64FLTlh9CrgHH/Y= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= +github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= +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/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 h1:SDlJ7bAm4ewvrmZtR0DaiYbQGdKPeaaIm7bM+qRhFeU= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +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/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= +github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= +github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +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/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/deckarep/golang-set/v2 v2.3.0 h1:qs18EKUfHm2X9fA50Mr/M5hccg2tNnVqsiBImnyDs0g= +github.com/deckarep/golang-set/v2 v2.3.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +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/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.13.8 h1:1od+thJel3tM52ZUNQwvpYOeRHlbkVFZ5S8fhi0Lgsg= +github.com/ethereum/go-ethereum v1.13.8/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fxamacker/cbor/v2 v2.5.0 h1:oHsG0V/Q6E/wqTS2O1Cozzsy69nqCiguo5Q1a1ADivE= +github.com/fxamacker/cbor/v2 v2.5.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= +github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= +github.com/getsentry/sentry-go v0.19.0 h1:BcCH3CN5tXt5aML+gwmbFwVptLLQA+eT866fCO9wVOM= +github.com/getsentry/sentry-go v0.19.0/go.mod h1:y3+lGEFEFexZtpbG1GUE2WD/f9zGyKYwpEqryTOC/nE= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-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-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= +github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.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/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +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/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-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0 h1:f4tggROQKKcnh4eItay6z/HbHLqghBxS8g7pyMhmDio= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0/go.mod h1:hKAkSgNkL0FII46ZkJcpVEAai4KV+swlIWCKfekd1pA= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3 h1:o95KDiV/b1xdkumY5YbLR0/n2+wBxUpgf3HgfKgTyLI= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3/go.mod h1:hTxjzRcX49ogbTGVJ1sM5mz5s+SSgiGIyL3jjPxl32E= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= +github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +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/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +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/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= +github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +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.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +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/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= +github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= +github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= +github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= +github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= +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.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +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/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/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.10-0.20210127095200-9abe2343507a h1:dHCfT5W7gghzPtfsW488uPmEOm85wewI+ypUwibyTdU= +github.com/leanovate/gopter v0.2.10-0.20210127095200-9abe2343507a/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.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.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +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/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/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/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +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/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249 h1:NHrXEjTNQY7P0Zfx1aMrNhpgxHmow66XQtm0aQLY0AE= +github.com/nsf/jsondiff v0.0.0-20210926074059-1e845ec5d249/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +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/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +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/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= +github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/santhosh-tekuri/jsonschema/v5 v5.2.0 h1:WCcC4vZDS1tYNxjWlwRJZQy28r8CMoggKnxNzxsVDMQ= +github.com/santhosh-tekuri/jsonschema/v5 v5.2.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240625074419-c278d083facf h1:d9AS/K8RSVG64USb20N/U7RaPOsYPcmuLGJq7iE+caM= +github.com/smartcontractkit/chainlink-common v0.1.7-0.20240625074419-c278d083facf/go.mod h1:L32xvCpk84Nglit64OhySPMP1tM3TTBK7Tw0qZl7Sd4= +github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 h1:ko88+ZznniNJZbZPWAvHQU8SwKAdHngdDZ+pvVgB5ss= +github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4= +github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJif132UCdjo8u43i7iPN1/MFnu49hv7lFGFftCHKU= +github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0= +github.com/smartcontractkit/libocr v0.0.0-20240419185742-fd3cab206b2c h1:lIyMbTaF2H0Q71vkwZHX/Ew4KF2BxiKhqEXwF8rn+KI= +github.com/smartcontractkit/libocr v0.0.0-20240419185742-fd3cab206b2c/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +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.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= +github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +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 v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +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.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +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-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/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.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +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-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-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +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-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/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-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +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/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +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-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-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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-20190813064441-fde4db37ae7a/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-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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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-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-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/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-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/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-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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +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.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-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +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= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/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.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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/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-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 h1:I6WNifs6pF9tNdSob2W24JtyxIYjzFB9qDlpUC76q+U= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/grpc v1.12.0/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.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +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/examples v0.0.0-20210424002626-9572fd6faeae/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= +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.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/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-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +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= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/relayer/package.json b/relayer/package.json new file mode 100644 index 000000000..b9568612e --- /dev/null +++ b/relayer/package.json @@ -0,0 +1,7 @@ +{ + "name": "@chainlink/starknet-relayer", + "version": "0.0.1", + "license": "MIT", + "dependencies": {}, + "devDependencies": {} +} diff --git a/relayer/pkg/chainlink/chain/chain.go b/relayer/pkg/chainlink/chain/chain.go new file mode 100644 index 000000000..36516eeef --- /dev/null +++ b/relayer/pkg/chainlink/chain/chain.go @@ -0,0 +1,244 @@ +package starknet + +import ( + "context" + "errors" + "fmt" + "math/big" + "math/rand" + + "github.com/pelletier/go-toml/v2" + + "github.com/smartcontractkit/chainlink-common/pkg/chains" + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/loop" + "github.com/smartcontractkit/chainlink-common/pkg/services" + "github.com/smartcontractkit/chainlink-common/pkg/types" + "github.com/smartcontractkit/chainlink-common/pkg/utils" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/config" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/db" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/txm" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +type Chain interface { + types.ChainService + + ID() string + Config() config.Config + + TxManager() txm.TxManager + Reader() (starknet.Reader, error) +} + +type ChainOpts struct { + Logger logger.Logger + // the implementation used here needs to be co-ordinated with the starknet transaction manager keystore adapter + KeyStore loop.Keystore +} + +func (o *ChainOpts) Name() string { + return o.Logger.Name() +} + +func (o *ChainOpts) Validate() (err error) { + required := func(s string) error { + return fmt.Errorf("%s is required", s) + } + if o.Logger == nil { + err = errors.Join(err, required("Logger")) + } + if o.KeyStore == nil { + err = errors.Join(err, required("KeyStore")) + } + return +} + +var _ Chain = (*chain)(nil) + +type chain struct { + utils.StartStopOnce + id string + cfg *config.TOMLConfig + lggr logger.Logger + txm txm.StarkTXM +} + +func NewChain(cfg *config.TOMLConfig, opts ChainOpts) (Chain, error) { + if !cfg.IsEnabled() { + return nil, fmt.Errorf("cannot create new chain with ID %s: chain is disabled", *cfg.ChainID) + } + c, err := newChain(*cfg.ChainID, cfg, opts.KeyStore, opts.Logger) + if err != nil { + return nil, err + } + return c, nil +} + +func newChain(id string, cfg *config.TOMLConfig, loopKs loop.Keystore, lggr logger.Logger) (*chain, error) { + lggr = logger.With(lggr, "starknetChainID", id) + ch := &chain{ + id: id, + cfg: cfg, + lggr: logger.Named(lggr, "Chain"), + } + + getClient := func() (*starknet.Client, error) { + return ch.getClient() + } + + getFeederClient := func() (*starknet.FeederClient, error) { + return ch.getFeederClient(), nil + } + + var err error + ch.txm, err = txm.New(lggr, loopKs, cfg, getClient, getFeederClient) + if err != nil { + return nil, err + } + + return ch, nil +} + +func (c *chain) Name() string { + return c.lggr.Name() +} + +func (c *chain) Config() config.Config { + return c.cfg +} + +func (c *chain) TxManager() txm.TxManager { + return c.txm +} + +func (c *chain) Reader() (starknet.Reader, error) { + return c.getClient() +} + +func (c *chain) ChainID() string { + return c.id +} + +func (c *chain) getFeederClient() *starknet.FeederClient { + return starknet.NewFeederClient(c.cfg.FeederURL.String()) +} + +// getClient returns a client, randomly selecting one from available and valid nodes +func (c *chain) getClient() (*starknet.Client, error) { + var node db.Node + var client *starknet.Client + nodes, err := c.cfg.ListNodes() + if err != nil { + return nil, fmt.Errorf("failed to get nodes: %w", err) + } + if len(nodes) == 0 { + return nil, errors.New("no nodes available") + } + // #nosec + index := rand.Perm(len(nodes)) // list of node indexes to try + timeout := c.cfg.RequestTimeout() + for _, i := range index { + node = nodes[i] + // create client and check + client, err = starknet.NewClient(node.ChainID, node.URL, node.APIKey, c.lggr, &timeout) + // if error, try another node + if err != nil { + c.lggr.Warnw("failed to create node", "name", node.Name, "starknet-url", node.URL, "err", err.Error()) + continue + } + // if all checks passed, mark found and break loop + break + } + // if no valid node found, exit with error + if client == nil { + return nil, errors.New("no node valid nodes available") + } + c.lggr.Debugw("Created client", "name", node.Name, "starknet-url", node.URL) + return client, nil +} + +func (c *chain) Start(ctx context.Context) error { + return c.StartOnce("Chain", func() error { + return c.txm.Start(ctx) + }) +} + +func (c *chain) Close() error { + return c.StopOnce("Chain", func() error { + return c.txm.Close() + }) +} + +func (c *chain) Ready() error { + return c.StartStopOnce.Ready() +} + +func (c *chain) HealthReport() map[string]error { + report := map[string]error{c.Name(): c.Healthy()} + services.CopyHealth(report, c.txm.HealthReport()) + return report +} + +func (c *chain) ID() string { + return c.id +} + +// ChainService interface +func (c *chain) GetChainStatus(ctx context.Context) (types.ChainStatus, error) { + toml, err := c.cfg.TOMLString() + if err != nil { + return types.ChainStatus{}, err + } + return types.ChainStatus{ + ID: c.id, + Enabled: c.cfg.IsEnabled(), + Config: toml, + }, nil +} + +func (c *chain) ListNodeStatuses(ctx context.Context, pageSize int32, pageToken string) (stats []types.NodeStatus, nextPageToken string, total int, err error) { + return chains.ListNodeStatuses(int(pageSize), pageToken, c.listNodeStatuses) +} + +func (c *chain) Transact(ctx context.Context, from, to string, amount *big.Int, balanceCheck bool) error { + return errors.ErrUnsupported +} + +func (c *chain) SendTx(ctx context.Context, from, to string, amount *big.Int, balanceCheck bool) error { + return c.Transact(ctx, from, to, amount, balanceCheck) +} + +// TODO BCF-2602 statuses are static for non-evm chain and should be dynamic +func (c *chain) listNodeStatuses(start, end int) ([]types.NodeStatus, int, error) { + stats := make([]types.NodeStatus, 0) + total := len(c.cfg.Nodes) + if start >= total { + return stats, total, chains.ErrOutOfRange + } + if end <= 0 || end > total { + end = total + } + nodes := c.cfg.Nodes[start:end] + for _, node := range nodes { + stat, err := nodeStatus(node, c.ChainID()) + if err != nil { + return stats, total, err + } + stats = append(stats, stat) + } + return stats, total, nil +} + +func nodeStatus(n *config.Node, id string) (types.NodeStatus, error) { + var s types.NodeStatus + s.ChainID = id + s.Name = *n.Name + b, err := toml.Marshal(n) + if err != nil { + return types.NodeStatus{}, err + } + s.Config = string(b) + return s, nil +} diff --git a/relayer/pkg/chainlink/cmd/chainlink-starknet/main.go b/relayer/pkg/chainlink/cmd/chainlink-starknet/main.go new file mode 100644 index 000000000..7cf6dc706 --- /dev/null +++ b/relayer/pkg/chainlink/cmd/chainlink-starknet/main.go @@ -0,0 +1,83 @@ +package main + +import ( + "context" + "fmt" + "strings" + + "github.com/hashicorp/go-plugin" + "github.com/pelletier/go-toml/v2" + + "github.com/smartcontractkit/chainlink-common/pkg/loop" + "github.com/smartcontractkit/chainlink-common/pkg/types/core" + + pkgstarknet "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink" + starkchain "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/chain" + stkcfg "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/config" +) + +const ( + loggerName = "PluginStarknet" +) + +func main() { + s := loop.MustNewStartedServer(loggerName) + defer s.Stop() + + p := &pluginRelayer{Plugin: loop.Plugin{Logger: s.Logger}} + defer s.Logger.ErrorIfFn(p.Close, "Failed to close") + + s.MustRegister(p) + + stopCh := make(chan struct{}) + defer close(stopCh) + + plugin.Serve(&plugin.ServeConfig{ + HandshakeConfig: loop.PluginRelayerHandshakeConfig(), + Plugins: map[string]plugin.Plugin{ + loop.PluginRelayerName: &loop.GRPCPluginRelayer{ + PluginServer: p, + BrokerConfig: loop.BrokerConfig{ + StopCh: stopCh, + Logger: s.Logger, + GRPCOpts: s.GRPCOpts, + }, + }, + }, + GRPCServer: s.GRPCOpts.NewServer, + }) +} + +type pluginRelayer struct { + loop.Plugin +} + +// NewRelayer implements the Loopp factory method used by the Loopp server to instantiate a starknet relayer +// [github.com/smartcontractkit/chainlink-common/pkg/loop.PluginRelayer] +// loopKs must be an implementation that can construct a starknet keystore adapter +// [github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/txm.NewKeystoreAdapter] +func (c *pluginRelayer) NewRelayer(ctx context.Context, config string, loopKs loop.Keystore, capRegistry core.CapabilitiesRegistry) (loop.Relayer, error) { + d := toml.NewDecoder(strings.NewReader(config)) + d.DisallowUnknownFields() + var cfg struct { + Starknet stkcfg.TOMLConfig + } + if err := d.Decode(&cfg); err != nil { + return nil, fmt.Errorf("failed to decode config toml: %w:\n\t%s", err, config) + } + + opts := starkchain.ChainOpts{ + Logger: c.Logger, + KeyStore: loopKs, + } + + chain, err := starkchain.NewChain(&cfg.Starknet, opts) + if err != nil { + return nil, fmt.Errorf("failed to create chain: %w", err) + } + ra := &loop.RelayerAdapter{Relayer: pkgstarknet.NewRelayer(c.Logger, chain, capRegistry), RelayerExt: chain} + + c.SubService(ra) + + return ra, nil +} diff --git a/relayer/pkg/chainlink/config/config.go b/relayer/pkg/chainlink/config/config.go new file mode 100644 index 000000000..c8369420f --- /dev/null +++ b/relayer/pkg/chainlink/config/config.go @@ -0,0 +1,273 @@ +package config + +import ( + "errors" + "fmt" + "net/url" + "slices" + "time" + + "github.com/pelletier/go-toml/v2" + + "github.com/smartcontractkit/chainlink-common/pkg/config" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/db" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/txm" +) + +var DefaultConfigSet = ConfigSet{ + OCR2CachePollPeriod: 5 * time.Second, + OCR2CacheTTL: time.Minute, + RequestTimeout: 10 * time.Second, + TxTimeout: 10 * time.Second, + ConfirmationPoll: 5 * time.Second, +} + +type ConfigSet struct { //nolint:revive + OCR2CachePollPeriod time.Duration + OCR2CacheTTL time.Duration + + // client config + RequestTimeout time.Duration + + // txm config + TxTimeout time.Duration + ConfirmationPoll time.Duration +} + +type Config interface { + txm.Config // txm config + + // ocr2 config + ocr2.Config + + // client config + RequestTimeout() time.Duration +} + +type Chain struct { + OCR2CachePollPeriod *config.Duration + OCR2CacheTTL *config.Duration + RequestTimeout *config.Duration + TxTimeout *config.Duration + ConfirmationPoll *config.Duration +} + +func (c *Chain) SetDefaults() { + if c.OCR2CachePollPeriod == nil { + c.OCR2CachePollPeriod = config.MustNewDuration(DefaultConfigSet.OCR2CachePollPeriod) + } + if c.OCR2CacheTTL == nil { + c.OCR2CacheTTL = config.MustNewDuration(DefaultConfigSet.OCR2CacheTTL) + } + if c.RequestTimeout == nil { + c.RequestTimeout = config.MustNewDuration(DefaultConfigSet.RequestTimeout) + } + if c.TxTimeout == nil { + c.TxTimeout = config.MustNewDuration(DefaultConfigSet.TxTimeout) + } + if c.ConfirmationPoll == nil { + c.ConfirmationPoll = config.MustNewDuration(DefaultConfigSet.ConfirmationPoll) + } +} + +type Node struct { + Name *string + URL *config.URL + // optional, only if rpc url needs api key passed in header + APIKey *string +} + +type TOMLConfigs []*TOMLConfig + +func (cs TOMLConfigs) ValidateConfig() (err error) { + return cs.validateKeys() +} + +func (cs TOMLConfigs) validateKeys() (err error) { + // Unique chain IDs + chainIDs := config.UniqueStrings{} + for i, c := range cs { + if chainIDs.IsDupe(c.ChainID) { + err = errors.Join(err, config.NewErrDuplicate(fmt.Sprintf("%d.ChainID", i), *c.ChainID)) + } + } + + // Unique node names + names := config.UniqueStrings{} + for i, c := range cs { + for j, n := range c.Nodes { + if names.IsDupe(n.Name) { + err = errors.Join(err, config.NewErrDuplicate(fmt.Sprintf("%d.Nodes.%d.Name", i, j), *n.Name)) + } + } + } + + // Unique URLs + urls := config.UniqueStrings{} + for i, c := range cs { + for j, n := range c.Nodes { + u := (*url.URL)(n.URL) + if urls.IsDupeFmt(u) { + err = errors.Join(err, config.NewErrDuplicate(fmt.Sprintf("%d.Nodes.%d.URL", i, j), u.String())) + } + } + } + return +} + +func (cs *TOMLConfigs) SetFrom(fs *TOMLConfigs) (err error) { + if err1 := fs.validateKeys(); err1 != nil { + return err1 + } + for _, f := range *fs { + if f.ChainID == nil { + *cs = append(*cs, f) + } else if i := slices.IndexFunc(*cs, func(c *TOMLConfig) bool { + return c.ChainID != nil && *c.ChainID == *f.ChainID + }); i == -1 { + *cs = append(*cs, f) + } else { + (*cs)[i].SetFrom(f) + } + } + return +} + +type TOMLConfig struct { + ChainID *string + FeederURL *config.URL + // Do not access directly. Use [IsEnabled] + Enabled *bool + Chain + Nodes Nodes +} + +func (c *TOMLConfig) IsEnabled() bool { + return c.Enabled == nil || *c.Enabled +} + +func (c *TOMLConfig) SetFrom(f *TOMLConfig) { + if f.ChainID != nil { + c.ChainID = f.ChainID + } + if f.Enabled != nil { + c.Enabled = f.Enabled + } + if f.FeederURL != nil { + c.FeederURL = f.FeederURL + } + setFromChain(&c.Chain, &f.Chain) + c.Nodes.SetFrom(&f.Nodes) +} + +func setFromChain(c, f *Chain) { + if f.OCR2CachePollPeriod != nil { + c.OCR2CachePollPeriod = f.OCR2CachePollPeriod + } + if f.OCR2CacheTTL != nil { + c.OCR2CacheTTL = f.OCR2CacheTTL + } + if f.RequestTimeout != nil { + c.RequestTimeout = f.RequestTimeout + } + if f.TxTimeout != nil { + c.TxTimeout = f.TxTimeout + } + if f.ConfirmationPoll != nil { + c.ConfirmationPoll = f.ConfirmationPoll + } +} + +func (c *TOMLConfig) ValidateConfig() (err error) { + if c.ChainID == nil { + err = errors.Join(err, config.ErrMissing{Name: "ChainID", Msg: "required for all chains"}) + } else if *c.ChainID == "" { + err = errors.Join(err, config.ErrEmpty{Name: "ChainID", Msg: "required for all chains"}) + } + + if len(c.Nodes) == 0 { + err = errors.Join(err, config.ErrMissing{Name: "Nodes", Msg: "must have at least one node"}) + } + + return +} + +func (c *TOMLConfig) TOMLString() (string, error) { + b, err := toml.Marshal(c) + if err != nil { + return "", err + } + return string(b), nil +} + +type Nodes []*Node + +func (ns *Nodes) SetFrom(fs *Nodes) { + for _, f := range *fs { + if f.Name == nil { + *ns = append(*ns, f) + } else if i := slices.IndexFunc(*ns, func(n *Node) bool { + return n.Name != nil && *n.Name == *f.Name + }); i == -1 { + *ns = append(*ns, f) + } else { + setFromNode((*ns)[i], f) + } + } +} + +func setFromNode(n, f *Node) { + if f.Name != nil { + n.Name = f.Name + } + if f.URL != nil { + n.URL = f.URL + } +} + +func legacyNode(n *Node, id string) db.Node { + var apiKey string + if n.APIKey == nil { + apiKey = "" + } else { + apiKey = *n.APIKey + } + return db.Node{ + Name: *n.Name, + ChainID: id, + URL: (*url.URL)(n.URL).String(), + APIKey: apiKey, + } +} + +var _ Config = &TOMLConfig{} + +func (c *TOMLConfig) TxTimeout() time.Duration { + return c.Chain.TxTimeout.Duration() +} + +func (c *TOMLConfig) ConfirmationPoll() time.Duration { + return c.Chain.ConfirmationPoll.Duration() +} + +func (c *TOMLConfig) OCR2CachePollPeriod() time.Duration { + return c.Chain.OCR2CachePollPeriod.Duration() +} + +func (c *TOMLConfig) OCR2CacheTTL() time.Duration { + return c.Chain.OCR2CacheTTL.Duration() +} + +func (c *TOMLConfig) RequestTimeout() time.Duration { + return c.Chain.RequestTimeout.Duration() +} + +func (c *TOMLConfig) ListNodes() ([]db.Node, error) { + var allNodes []db.Node + for _, n := range c.Nodes { + allNodes = append(allNodes, legacyNode(n, *c.ChainID)) + } + return allNodes, nil +} diff --git a/relayer/pkg/chainlink/db/db.go b/relayer/pkg/chainlink/db/db.go new file mode 100644 index 000000000..2f089753e --- /dev/null +++ b/relayer/pkg/chainlink/db/db.go @@ -0,0 +1,15 @@ +package db + +import ( + "time" +) + +type Node struct { + ID int32 + Name string + ChainID string `db:"starknet_chain_id"` + URL string + APIKey string + CreatedAt time.Time + UpdatedAt time.Time +} diff --git a/relayer/pkg/chainlink/erc20/client.go b/relayer/pkg/chainlink/erc20/client.go new file mode 100644 index 000000000..33eec45cf --- /dev/null +++ b/relayer/pkg/chainlink/erc20/client.go @@ -0,0 +1,96 @@ +package erc20 + +import ( + "context" + "fmt" + "math/big" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +//go:generate mockery --name ERC20Reader --output ./mocks/ +type ERC20Reader interface { //nolint:revive + BalanceOf(context.Context, *felt.Felt) (*big.Int, error) + Decimals(context.Context) (*big.Int, error) + + BaseReader() starknet.Reader +} + +var _ ERC20Reader = (*Client)(nil) + +type Client struct { + r starknet.Reader + lggr logger.Logger + tokenAddress *felt.Felt + decimals *big.Int +} + +func NewClient(reader starknet.Reader, lggr logger.Logger, tokenAddress *felt.Felt) (*Client, error) { + return &Client{ + r: reader, + lggr: lggr, + tokenAddress: tokenAddress, + // lazy initialize decimals + decimals: nil, + }, nil +} + +func (c *Client) BalanceOf(ctx context.Context, accountAddress *felt.Felt) (*big.Int, error) { + ops := starknet.CallOps{ + ContractAddress: c.tokenAddress, + Selector: starknetutils.GetSelectorFromNameFelt("balance_of"), + Calldata: []*felt.Felt{accountAddress}, + } + + balanceRes, err := c.r.CallContract(ctx, ops) + if err != nil { + return nil, fmt.Errorf("couldn't call balance_of on erc20: %w", err) + } + + if len(balanceRes) != 2 { + return nil, fmt.Errorf("unexpected data returned from balance_of on erc20") + } + + // a u256 balance consists of 2 felts (lower 128 bits | higher 128 bits) + balance := starknetutils.FeltArrToBigIntArr(balanceRes) + low := balance[0] + high := balance[1] + + // left shift "high" by 128 bits + summand := new(big.Int).Lsh(high, 128) + total := new(big.Int).Add(low, summand) + + return total, nil +} + +func (c *Client) Decimals(ctx context.Context) (*big.Int, error) { + if c.decimals == nil { + ops := starknet.CallOps{ + ContractAddress: c.tokenAddress, + Selector: starknetutils.GetSelectorFromNameFelt("decimals"), + } + + decimalsRes, err := c.r.CallContract(ctx, ops) + + if err != nil { + return nil, fmt.Errorf("couldn't call decimals on erc20: %w", err) + } + + if len(decimalsRes) != 1 { + return nil, fmt.Errorf("unexpected data returned from decimals on erc20") + } + + c.decimals = starknetutils.FeltToBigInt(decimalsRes[0]) + } + + return c.decimals, nil +} + +func (c *Client) BaseReader() starknet.Reader { + return c.r +} diff --git a/relayer/pkg/chainlink/erc20/client_test.go b/relayer/pkg/chainlink/erc20/client_test.go new file mode 100644 index 000000000..93d7cef73 --- /dev/null +++ b/relayer/pkg/chainlink/erc20/client_test.go @@ -0,0 +1,101 @@ +package erc20 + +import ( + "context" + "encoding/json" + "fmt" + "io" + "math/big" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +func TestERC20Client(t *testing.T) { + chainID := "SN_SEPOLIA" + lggr := logger.Test(t) + + mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + req, _ := io.ReadAll(r.Body) + fmt.Println(r.RequestURI, r.URL, string(req)) + + var out []byte + + switch { + case r.RequestURI == "/": + type Request struct { + Selector string `json:"entry_point_selector"` + } + type Call struct { + Method string `json:"method"` + Params []json.RawMessage `json:"params"` + } + + call := Call{} + require.NoError(t, json.Unmarshal(req, &call)) + + switch call.Method { + case "starknet_call": + raw := call.Params[0] + reqdata := Request{} + err := json.Unmarshal([]byte(raw), &reqdata) + require.NoError(t, err) + + fmt.Printf("%v %v\n", reqdata.Selector, starknetutils.GetSelectorFromNameFelt("latest_transmission_details").String()) + switch reqdata.Selector { + case starknetutils.GetSelectorFromNameFelt("decimals").String(): + out = []byte(`{"result":["0x1"]}`) + case starknetutils.GetSelectorFromNameFelt("balance_of").String(): + // balance_of returns a u256 which is represented as two felts [lower 128 bits, higher 128 bits] + out = []byte(`{"result":["0x2", "0x9"]}`) + default: + require.False(t, true, "unsupported contract method %s", reqdata.Selector) + } + default: + require.False(t, true, "unsupported RPC method") + } + default: + require.False(t, true, "unsupported endpoint") + } + + _, err := w.Write(out) + require.NoError(t, err) + })) + defer mockServer.Close() + + url := mockServer.URL + duration := 10 * time.Second + reader, err := starknet.NewClient(chainID, url, "", lggr, &duration) + require.NoError(t, err) + client, err := NewClient(reader, lggr, &felt.Zero) + assert.NoError(t, err) + + t.Run("get balance", func(t *testing.T) { + balance, err := client.BalanceOf(context.Background(), &felt.Zero) + require.NoError(t, err) + + // calculate the expected u256 value of two felts [0x2, 0x9] + low := new(big.Int).SetUint64(2) + high := new(big.Int).SetUint64(9) + summand := new(big.Int).Lsh(high, 128) + expectedTotal := new(big.Int).Add(low, summand) + + require.Equal(t, expectedTotal.String(), balance.String()) + }) + + t.Run("get decimals", func(t *testing.T) { + decimals, err := client.Decimals(context.Background()) + require.NoError(t, err) + require.Equal(t, uint64(1), decimals.Uint64()) + }) +} diff --git a/relayer/pkg/chainlink/erc20/mocks/ERC20Reader.go b/relayer/pkg/chainlink/erc20/mocks/ERC20Reader.go new file mode 100644 index 000000000..80a7c75ab --- /dev/null +++ b/relayer/pkg/chainlink/erc20/mocks/ERC20Reader.go @@ -0,0 +1,113 @@ +// Code generated by mockery v2.43.2. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + felt "github.com/NethermindEth/juno/core/felt" + + mock "github.com/stretchr/testify/mock" + + starknet "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +// ERC20Reader is an autogenerated mock type for the ERC20Reader type +type ERC20Reader struct { + mock.Mock +} + +// BalanceOf provides a mock function with given fields: _a0, _a1 +func (_m *ERC20Reader) BalanceOf(_a0 context.Context, _a1 *felt.Felt) (*big.Int, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BalanceOf") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) (*big.Int, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) *big.Int); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BaseReader provides a mock function with given fields: +func (_m *ERC20Reader) BaseReader() starknet.Reader { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for BaseReader") + } + + var r0 starknet.Reader + if rf, ok := ret.Get(0).(func() starknet.Reader); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(starknet.Reader) + } + } + + return r0 +} + +// Decimals provides a mock function with given fields: _a0 +func (_m *ERC20Reader) Decimals(_a0 context.Context) (*big.Int, error) { + ret := _m.Called(_a0) + + if len(ret) == 0 { + panic("no return value specified for Decimals") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(_a0) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewERC20Reader creates a new instance of ERC20Reader. 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 NewERC20Reader(t interface { + mock.TestingT + Cleanup(func()) +}) *ERC20Reader { + mock := &ERC20Reader{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/relayer/pkg/chainlink/ocr2/client.go b/relayer/pkg/chainlink/ocr2/client.go new file mode 100644 index 000000000..66705a143 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/client.go @@ -0,0 +1,288 @@ +package ocr2 + +import ( + "context" + "errors" + "fmt" + "math/big" + "time" + + "github.com/NethermindEth/juno/core/felt" + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" +) + +//go:generate mockery --name OCR2Reader --output ./mocks/ +type OCR2Reader interface { //nolint:revive + LatestConfigDetails(context.Context, *felt.Felt) (ContractConfigDetails, error) + LatestTransmissionDetails(context.Context, *felt.Felt) (TransmissionDetails, error) + LatestRoundData(context.Context, *felt.Felt) (RoundData, error) + LinkAvailableForPayment(context.Context, *felt.Felt) (*big.Int, error) + ConfigFromEventAt(context.Context, *felt.Felt, uint64) (ContractConfig, error) + NewTransmissionsFromEventsAt(context.Context, *felt.Felt, uint64) ([]NewTransmissionEvent, error) + BillingDetails(context.Context, *felt.Felt) (BillingDetails, error) + + BaseReader() starknet.Reader +} + +var _ OCR2Reader = (*Client)(nil) + +type Client struct { + r starknet.Reader + lggr logger.Logger +} + +func NewClient(reader starknet.Reader, lggr logger.Logger) (*Client, error) { + return &Client{ + r: reader, + lggr: lggr, + }, nil +} + +func (c *Client) BaseReader() starknet.Reader { + return c.r +} + +func (c *Client) BillingDetails(ctx context.Context, address *felt.Felt) (bd BillingDetails, err error) { + ops := starknet.CallOps{ + ContractAddress: address, + Selector: starknetutils.GetSelectorFromNameFelt("billing"), + } + + res, err := c.r.CallContract(ctx, ops) + if err != nil { + return bd, fmt.Errorf("couldn't call the contract: %w", err) + } + + // [0] - observation payment, [1] - transmission payment, [2] - gas base, [3] - gas per signature + if len(res) != 4 { + return bd, errors.New("unexpected result length") + } + + observationPayment := res[0].BigInt(big.NewInt(0)) + transmissionPayment := res[1].BigInt(big.NewInt(0)) + + bd, err = NewBillingDetails(observationPayment, transmissionPayment) + if err != nil { + return bd, fmt.Errorf("couldn't initialize billing details: %w", err) + } + + return +} + +func (c *Client) LatestConfigDetails(ctx context.Context, address *felt.Felt) (ccd ContractConfigDetails, err error) { + ops := starknet.CallOps{ + ContractAddress: address, + Selector: starknetutils.GetSelectorFromNameFelt("latest_config_details"), + } + + res, err := c.r.CallContract(ctx, ops) + if err != nil { + return ccd, fmt.Errorf("couldn't call the contract: %w", err) + } + + // [0] - config count, [1] - block number, [2] - config digest + if len(res) != 3 { + return ccd, errors.New("unexpected result length") + } + + blockNum := res[1] + configDigest := res[2] + + ccd, err = NewContractConfigDetails(blockNum.BigInt(big.NewInt((0))), configDigest.Bytes()) + if err != nil { + return ccd, fmt.Errorf("couldn't initialize config details: %w", err) + } + + return +} + +func (c *Client) LatestTransmissionDetails(ctx context.Context, address *felt.Felt) (td TransmissionDetails, err error) { + ops := starknet.CallOps{ + ContractAddress: address, + Selector: starknetutils.GetSelectorFromNameFelt("latest_transmission_details"), + } + + res, err := c.r.CallContract(ctx, ops) + if err != nil { + return td, fmt.Errorf("couldn't call the contract: %w", err) + } + + // [0] - config digest, [1] - epoch and round, [2] - latest answer, [3] - latest timestamp + if len(res) != 4 { + return td, errors.New("unexpected result length") + } + + digest := res[0] + configDigest := types.ConfigDigest{} + digest.BigInt(big.NewInt(0)).FillBytes(configDigest[:]) + + epoch, round := parseEpochAndRound(res[1].BigInt(big.NewInt(0))) + + latestAnswer := res[2].BigInt(big.NewInt(0)) + if err != nil { + return td, fmt.Errorf("latestAnswer invalid: %w", err) + } + + timestampFelt := res[3] + // TODO: Int64() can return invalid data if int is too big + unixTime := timestampFelt.BigInt(big.NewInt(0)).Int64() + latestTimestamp := time.Unix(unixTime, 0) + + td = TransmissionDetails{ + Digest: configDigest, + Epoch: epoch, + Round: round, + LatestAnswer: latestAnswer, + LatestTimestamp: latestTimestamp, + } + + return td, nil +} + +func (c *Client) LatestRoundData(ctx context.Context, address *felt.Felt) (round RoundData, err error) { + ops := starknet.CallOps{ + ContractAddress: address, + Selector: starknetutils.GetSelectorFromNameFelt("latest_round_data"), + } + + felts, err := c.r.CallContract(ctx, ops) + if err != nil { + return round, fmt.Errorf("couldn't call the contract with selector latest_round_data: %w", err) + } + + round, err = NewRoundData(felts) + if err != nil { + return round, fmt.Errorf("unable to decode RoundData: %w", err) + } + return round, nil +} + +func (c *Client) LinkAvailableForPayment(ctx context.Context, address *felt.Felt) (*big.Int, error) { + results, err := c.r.CallContract(ctx, starknet.CallOps{ + ContractAddress: address, + Selector: starknetutils.GetSelectorFromNameFelt("link_available_for_payment"), + }) + if err != nil { + return nil, fmt.Errorf("failed to call the contract with selector 'link_available_for_payment': %w", err) + } + if l := len(results); l != 2 { + return nil, fmt.Errorf("insufficient data from selector 'link_available_for_payment': need 2 results but got %d", l) + } + + isNegative := !results[0].IsZero() + ans := results[1].BigInt(big.NewInt(0)) + if isNegative { + ans.Neg(ans) + } + + return ans, nil +} + +func (c *Client) collectAllEvents(ctx context.Context, block starknetrpc.BlockID, address *felt.Felt, eventKey *felt.Felt, pageSize int) (events []starknetrpc.EmittedEvent, err error) { + input := starknetrpc.EventsInput{ + EventFilter: starknetrpc.EventFilter{ + FromBlock: block, + ToBlock: block, + Address: address, + Keys: [][]*felt.Felt{{eventKey}}, // skip other event types + }, + ResultPageRequest: starknetrpc.ResultPageRequest{ + ChunkSize: pageSize, + }, + } + + chunk, err := c.r.Events(ctx, input) + + if err != nil { + return nil, err + } + + events = chunk.Events + + for chunk.ContinuationToken != "" { + input.ResultPageRequest.ContinuationToken = chunk.ContinuationToken + + chunk, err = c.r.Events(ctx, input) + + if err != nil { + return nil, err + } + + events = append(events, chunk.Events...) + } + + return events, nil +} + +func (c *Client) fetchEventsFromBlock(ctx context.Context, address *felt.Felt, eventType string, blockNum uint64) (events []starknetrpc.EmittedEvent, err error) { + latestBlockHeight, err := c.r.LatestBlockHeight(ctx) + if err != nil { + return nil, fmt.Errorf("couldn't fetch latest block height: %w", err) + } + + var block starknetrpc.BlockID + // "blockNum" may be available on-chain, but unqueryable via the RPC because the block is pending + if blockNum > latestBlockHeight { + block = starknetrpc.WithBlockTag("pending") + } else { + block = starknetrpc.WithBlockNumber(blockNum) + } + + eventKey := starknetutils.GetSelectorFromNameFelt(eventType) + + events, err = c.collectAllEvents(ctx, block, address, eventKey, 10) + + if err != nil { + return events, fmt.Errorf("couldn't fetch events for block: %w", err) + } + + if len(events) == 0 { + return nil, fmt.Errorf("events not found in the block %d", blockNum) + } + return events, nil +} + +func (c *Client) ConfigFromEventAt(ctx context.Context, address *felt.Felt, blockNum uint64) (cc ContractConfig, err error) { + events, err := c.fetchEventsFromBlock(ctx, address, "ConfigSet", blockNum) + if err != nil { + return cc, fmt.Errorf("failed to fetch config_set events: %w", err) + } + if len(events) != 1 { + return cc, fmt.Errorf("expected to find one config_set event in block %d for address %s but found %d", blockNum, address, len(events)) + } + configAtEvent := events[0] + config, err := ParseConfigSetEvent(configAtEvent) + if err != nil { + return cc, fmt.Errorf("couldn't parse config event: %w", err) + } + return ContractConfig{ + Config: config, + ConfigBlock: blockNum, + }, nil +} + +// NewTransmissionsFromEventsAt finds events of type new_transmission emitted by the contract address in a given block number. +func (c *Client) NewTransmissionsFromEventsAt(ctx context.Context, address *felt.Felt, blockNum uint64) (events []NewTransmissionEvent, err error) { + rawEvents, err := c.fetchEventsFromBlock(ctx, address, "NewTransmission", blockNum) + if err != nil { + return nil, fmt.Errorf("failed to fetch new_transmission events: %w", err) + } + if len(rawEvents) == 0 { + return nil, fmt.Errorf("expected to find at least one new_transmission event in block %d for address %s but found %d", blockNum, address, len(rawEvents)) + } + events = []NewTransmissionEvent{} + for _, rawEvent := range rawEvents { + event, err := ParseNewTransmissionEvent(rawEvent) + if err != nil { + return nil, fmt.Errorf("couldn't parse new_transmission event: %w", err) + } + events = append(events, event) + } + return events, nil +} diff --git a/relayer/pkg/chainlink/ocr2/client_test.go b/relayer/pkg/chainlink/ocr2/client_test.go new file mode 100644 index 000000000..0df031d11 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/client_test.go @@ -0,0 +1,558 @@ +package ocr2 + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +const blockOutput = `{"result": {"events": [ {"from_address": "0xd43963a4e875a361f5d164b2e70953598eb4f45fde86924082d51b4d78e489", "keys": ["0x9a144bf4a6a8fd083c93211e163e59221578efcc86b93f8c97c620e7b9608a", "0x0", "0x4b791b801cf0d7b6a2f9e59daf15ec2dd7d9cdc3bc5e037bada9c86e4821c"], "data": ["0x1", "0x4", "0x4cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603730", "0x4cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603734", "0x4cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603731", "0x4cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603735", "0x4cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603732", "0x4cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603736", "0x4cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603733", "0x4cc1bfa99e282e434aef2815ca17337a923cd2c61cf0c7de5b326d7a8603737", "0x1", "0x3", "0x1", "0x0", "0xf4240", "0x2", "0x15", "0x263", "0x880a0d9e61d1080d88ee16f1880bcc1960b2080cab5ee01288090dfc04a30", "0x53a0201024220af400004fa5d02cd5170b5261032e71f2847ead36159cf8d", "0xee68affc3c8520904220af400004fa5d02cd5170b5261032e71f2847ead361", "0x59cf8dee68affc3c8520914220af400004fa5d02cd5170b5261032e71f2847", "0xead36159cf8dee68affc3c8520924220af400004fa5d02cd5170b5261032e7", "0x1f2847ead36159cf8dee68affc3c8520934a42307830346363316266613939", "0x65323832653433346165663238313563613137333337613932336364326336", "0x31636630633764653562333236643761383630333733304a42307830346363", "0x31626661393965323832653433346165663238313563613137333337613932", "0x33636432633631636630633764653562333236643761383630333733314a42", "0x30783034636331626661393965323832653433346165663238313563613137", "0x33333761393233636432633631636630633764653562333236643761383630", "0x333733324a4230783034636331626661393965323832653433346165663238", "0x31356361313733333761393233636432633631636630633764653562333236", "0x643761383630333733335200608094ebdc03688084af5f708084af5f788084", "0xaf5f82018c010a202ac49e648a1f84da5a143eeab68c8402c65a1567e63971", "0x7f5732d5e6310c2c761220a6c1ae85186dc981dc61cd14d7511ee5ab70258a", "0x10ac4e03e4d4991761b2c0a61a1090696dc7afed7f61a26887e78e683a1c1a", "0x10a29e5fa535f2edea7afa9acb4fd349b31a10d1b88713982955d79fa0e422", "0x685a748b1a10a07e0118cc38a71d2a9d60bf52938b4a"]}]}}` +const ocr2ContractAddress = "0xd43963a4e875a361f5d164b2e70953598eb4f45fde86924082d51b4d78e489" // matches blockOutput event +// 11 events will trigger pagination logic +const newTransmissionEvents = `{"result": { + "events": [ + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3b2465a459", + "0x66b23867", + "0x100020301000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3b20e5c6c0", + "0x3b22d7fbef", + "0x3b2465a459", + "0x3b28b1692d", + "0xd4e8dde018993e970", + "0xbb42b2ce90a2", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a604", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd0", + "0x573ea9a8602e03417a4a31d55d115748f37a08bbb23adf6347cb699743a998d" + ], + "transaction_hash": "0x4adcee6da21143dc987a08b77fdf1be9bde5531786ed54a5f8f045f7f1518d5" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3b0f955fa9", + "0x66b2387b", + "0x103000102000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3b0f955fa9", + "0x3b0f955fa9", + "0x3b0f955fa9", + "0x3b1a52d630", + "0xd4e8dde018993e970", + "0xbb42b2ce90a2", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a605", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd1", + "0x23a4d7f2cdf202ea916bbb07814f5bc32ae50e9cdf1fde114d8e6e808b1e965" + ], + "transaction_hash": "0x2899099a4b35c2d1cd4506177c0fb2ae7b725069cc4a85d5afb297b069636b" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3b122cdb00", + "0x66b2388f", + "0x101030002000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3b10027e01", + "0x3b10c2e26f", + "0x3b122cdb00", + "0x3b1e375618", + "0xd4e8dde018993e970", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a606", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd2", + "0x143fe26927dd6a302522ea1cd6a821ab06b3753194acee38d88a85c93b3cbc6" + ], + "transaction_hash": "0x25757f06d80d9d114d66d574711f0b7d5e6db431aac3298d71a74d41346480b" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3b0fe5793b", + "0x66b238a3", + "0x101020300000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3b0f547a79", + "0x3b0fdb02b3", + "0x3b0fe5793b", + "0x3b15b11fc0", + "0xd4e8dde018993e970", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a701", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd3", + "0x573ea9a8602e03417a4a31d55d115748f37a08bbb23adf6347cb699743a998d" + ], + "transaction_hash": "0x7d7fc93b94b2e35ad1ce58332ed21dc053d583f65c7e529d8e3d004a0bd8ae1" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3b0d25b529", + "0x66b238b7", + "0x102030001000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3b0cb32b74", + "0x3b0d24df9f", + "0x3b0d25b529", + "0x3b0d25b529", + "0xd4e8dde018993e970", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a702", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd4", + "0x143fe26927dd6a302522ea1cd6a821ab06b3753194acee38d88a85c93b3cbc6" + ], + "transaction_hash": "0x79faf4432ebc36288bbf95de04ca960f12a467c164ed1e2f250ddc001fd17e4" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3b084e2980", + "0x66b238cb", + "0x100030201000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3b06505b40", + "0x3b06cc23d7", + "0x3b084e2980", + "0x3b08b9a4de", + "0xd4e8dde018993e970", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a703", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd5", + "0x23a4d7f2cdf202ea916bbb07814f5bc32ae50e9cdf1fde114d8e6e808b1e965" + ], + "transaction_hash": "0xf8ebb0d9dd263e310225114909c8b9befcade0efaffcb7b8078a1f761c8bb4" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3b0d5e86a4", + "0x66b238df", + "0x101000203000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3b041e0a05", + "0x3b09e3e240", + "0x3b0d5e86a4", + "0x3b0dba65b0", + "0xd4e8dde018993e970", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a704", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd6", + "0x1d091b30a2d20ca2509579f8beae26934bfdc3725c0b497f50b353b7a3c636f" + ], + "transaction_hash": "0x4d792e87657b051a06f56e739a6779d0fe9df091ae6f66bb9f7029f9315e2c3" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3b0ab981c0", + "0x66b238f3", + "0x102030001000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3b06f4995d", + "0x3b0a4ce764", + "0x3b0ab981c0", + "0x3b13bc8a26", + "0xd4e8dde018993e970", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a705", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd7", + "0x143fe26927dd6a302522ea1cd6a821ab06b3753194acee38d88a85c93b3cbc6" + ], + "transaction_hash": "0x645ee25aae5a476997349c4d1543d0982678ed8d44c84f3dd7a7f77f412c71c" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3afcb55963", + "0x66b23907", + "0x103000201000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3af36a4483", + "0x3af942ae80", + "0x3afcb55963", + "0x3b00dab871", + "0xd4db3c15baa524ce2", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a706", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd8", + "0x143fe26927dd6a302522ea1cd6a821ab06b3753194acee38d88a85c93b3cbc6" + ], + "transaction_hash": "0x45e4733d6a001ce90a4862e0b31cf6993540feb094c9d31149838ae4f530865" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3aeb13458c", + "0x66b2391b", + "0x102000103000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3ae7ddbbb7", + "0x3aeb13458c", + "0x3aeb13458c", + "0x3aeb13458c", + "0xd4bd480255eb72602", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a801", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cd9", + "0x573ea9a8602e03417a4a31d55d115748f37a08bbb23adf6347cb699743a998d" + ], + "transaction_hash": "0x7dec2e2d75a5990a6d20f42724aeae28695b840199b0cb911535828a00ac704" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3af06fe86a", + "0x66b2392f", + "0x101020300000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3ae8d58830", + "0x3aed511116", + "0x3af06fe86a", + "0x3af389d680", + "0xd4bd480255eb72602", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a802", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cda", + "0x1d091b30a2d20ca2509579f8beae26934bfdc3725c0b497f50b353b7a3c636f" + ], + "transaction_hash": "0x3fe8250da4794708b523f75a57ea7a34196828d8b31d8cb27b03bd798486462" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3af135a645", + "0x66b23943", + "0x102030001000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3aede0fa8d", + "0x3af0e645aa", + "0x3af135a645", + "0x3af135a645", + "0xd4bd480255eb72602", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a803", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cdb", + "0x23a4d7f2cdf202ea916bbb07814f5bc32ae50e9cdf1fde114d8e6e808b1e965" + ], + "transaction_hash": "0x63cf059d9e2c153b8b600c7bf256c1d46eac35147bf03f5bb748ab4b2fa8cd0" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3ae5e39340", + "0x66b23957", + "0x103020001000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3adf456450", + "0x3ae56a9e68", + "0x3ae5e39340", + "0x3af68fa5c0", + "0xd4bd480255eb72602", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a804", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cdc", + "0x573ea9a8602e03417a4a31d55d115748f37a08bbb23adf6347cb699743a998d" + ], + "transaction_hash": "0x6b41146f8a1f5e749bb7cc5cafd325c94a92fb084f0a251986a8d0e2354adf2" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3af2dc4d1f", + "0x66b2396b", + "0x102010300000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3aeeba4089", + "0x3aef7dc08c", + "0x3af2dc4d1f", + "0x3af4226d00", + "0xd4bd480255eb72602", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a805", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cdd", + "0x1d091b30a2d20ca2509579f8beae26934bfdc3725c0b497f50b353b7a3c636f" + ], + "transaction_hash": "0xce398eb37e530ac2b3ff36b8b4825b52ca494358b4c8c34b7f073055e7fb7f" + }, + { + "block_hash": "0x20acc9de1b7a76b76ce4596ebbcbba9fceb25bd438cfb577e45d55589bb8848", + "block_number": 86153, + "data": [ + "0x3aeec2b180", + "0x66b2397f", + "0x102010300000000000000000000000000000000000000000000000000000000", + "0x4", + "0x3aecc28a2c", + "0x3aee3c12d4", + "0x3aeec2b180", + "0x3aef022b80", + "0xd4bd480255eb72602", + "0xa292d535f5c0", + "0x454e13523e484df9a580cea129056608a4531135a900bd72adbeaa8a2c8be", + "0xa1a806", + "0x0" + ], + "from_address": "0x132303a40ae2f271f4e1b707596a63f6f2921c4d400b38822548ed1bb0cbe0", + "keys": [ + "0x19e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81", + "0x10cde", + "0x143fe26927dd6a302522ea1cd6a821ab06b3753194acee38d88a85c93b3cbc6" + ], + "transaction_hash": "0x360a78756e8b72c937e45e71d7128889cf0a50c678b6ea8b3e15ccdbeb5c60a" + } + ] +}}` + +func TestOCR2Client(t *testing.T) { + chainID := "SN_SEPOLIA" + lggr := logger.Test(t) + + mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + req, _ := io.ReadAll(r.Body) + fmt.Println(r.RequestURI, r.URL, string(req)) + + var out []byte + + switch { + case r.RequestURI == "/": + type Request struct { + Selector string `json:"entry_point_selector"` + } + type Call struct { + Method string `json:"method"` + Params []json.RawMessage `json:"params"` + } + + call := Call{} + require.NoError(t, json.Unmarshal(req, &call)) + + switch call.Method { + case "starknet_blockNumber": + out = []byte(`{"result":777}`) + case "starknet_chainId": + out = []byte(`{"result":"0x534e5f4d41494e"}`) + case "starknet_call": + raw := call.Params[0] + reqdata := Request{} + err := json.Unmarshal([]byte(raw), &reqdata) + require.NoError(t, err) + + fmt.Printf("%v %v\n", reqdata.Selector, starknetutils.GetSelectorFromNameFelt("latest_transmission_details").String()) + switch reqdata.Selector { + case starknetutils.GetSelectorFromNameFelt("billing").String(): + // billing response + out = []byte(`{"result":["0x0","0x0","0x0","0x0"]}`) + case starknetutils.GetSelectorFromNameFelt("latest_config_details").String(): + // latest config details response + out = []byte(`{"result":["0x1","0x2","0x4b791b801cf0d7b6a2f9e59daf15ec2dd7d9cdc3bc5e037bada9c86e4821c"]}`) + case starknetutils.GetSelectorFromNameFelt("latest_transmission_details").String(): + // latest transmission details response + out = []byte(`{"result":["0x4cfc96325fa7d72e4854420e2d7b0abda72de17d45e4c3c0d9f626016d669","0x0","0x0","0x0"]}`) + case starknetutils.GetSelectorFromNameFelt("latest_round_data").String(): + // latest transmission details response + out = []byte(`{"result":["0x0","0x0","0x0","0x0","0x0"]}`) + case starknetutils.GetSelectorFromNameFelt("link_available_for_payment").String(): + // latest transmission details response + out = []byte(`{"result":["0x0","0x0"]}`) + default: + require.False(t, true, "unsupported contract method %s", reqdata.Selector) + } + case "starknet_getEvents": + eventsReq := starknetrpc.EventsInput{} + require.NoError(t, json.Unmarshal(call.Params[0], &eventsReq)) + + configSetSelector := starknetutils.GetSelectorFromNameFelt("ConfigSet") + + if eventsReq.EventFilter.Keys[0][0].Equal(configSetSelector) { + out = []byte(blockOutput) + } else { + // for new transmission event + out = []byte(newTransmissionEvents) + } + + default: + require.False(t, true, "unsupported RPC method") + } + case strings.Contains(r.RequestURI, "/feeder_gateway/get_block"): + out = []byte(blockOutput) + default: + require.False(t, true, "unsupported endpoint") + } + + _, err := w.Write(out) + require.NoError(t, err) + })) + defer mockServer.Close() + + url := mockServer.URL + duration := 10 * time.Second + reader, err := starknet.NewClient(chainID, url, "", lggr, &duration) + require.NoError(t, err) + client, err := NewClient(reader, lggr) + assert.NoError(t, err) + + contractAddress, err := starknetutils.HexToFelt(ocr2ContractAddress) + require.NoError(t, err) + + t.Run("get billing details", func(t *testing.T) { + billing, err := client.BillingDetails(context.Background(), contractAddress) + require.NoError(t, err) + fmt.Printf("%+v\n", billing) + }) + + t.Run("get latest config details", func(t *testing.T) { + details, err := client.LatestConfigDetails(context.Background(), contractAddress) + require.NoError(t, err) + fmt.Printf("%+v\n", details) + + config, err := client.ConfigFromEventAt(context.Background(), contractAddress, details.Block) + require.NoError(t, err) + fmt.Printf("%+v\n", config) + }) + + t.Run("get latest transmission details", func(t *testing.T) { + transmissions, err := client.LatestTransmissionDetails(context.Background(), contractAddress) + require.NoError(t, err) + fmt.Printf("%+v\n", transmissions) + }) + + t.Run("get new transmission event", func(t *testing.T) { + events, err := client.NewTransmissionsFromEventsAt(context.Background(), contractAddress, 123) + require.NoError(t, err) + assert.Len(t, events, 15) + }) + + t.Run("get latest round data", func(t *testing.T) { + round, err := client.LatestRoundData(context.Background(), contractAddress) + require.NoError(t, err) + fmt.Printf("%+v\n", round) + }) + + t.Run("get link available for payment", func(t *testing.T) { + available, err := client.LinkAvailableForPayment(context.Background(), contractAddress) + require.NoError(t, err) + fmt.Printf("%+v\n", available) + }) + + t.Run("get latest transmission", func(t *testing.T) { + round, err := client.LatestRoundData(context.Background(), contractAddress) + assert.NoError(t, err) + fmt.Printf("%+v\n", round) + }) +} diff --git a/relayer/pkg/chainlink/ocr2/config.go b/relayer/pkg/chainlink/ocr2/config.go new file mode 100644 index 000000000..5e95b2633 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/config.go @@ -0,0 +1,8 @@ +package ocr2 + +import "time" + +type Config interface { + OCR2CachePollPeriod() time.Duration + OCR2CacheTTL() time.Duration +} diff --git a/relayer/pkg/chainlink/ocr2/config_digester.go b/relayer/pkg/chainlink/ocr2/config_digester.go new file mode 100644 index 000000000..4272ae31d --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/config_digester.go @@ -0,0 +1,111 @@ +package ocr2 + +import ( + "encoding/binary" + "errors" + "math/big" + "strings" + + "github.com/NethermindEth/starknet.go/curve" + + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2/medianreport" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +// TODO: use libocr constant +const ConfigDigestPrefixStarknet types.ConfigDigestPrefix = 4 + +var _ types.OffchainConfigDigester = (*offchainConfigDigester)(nil) + +type offchainConfigDigester struct { + chainID string + contract string +} + +func NewOffchainConfigDigester(chainID, contract string) offchainConfigDigester { + return offchainConfigDigester{ + chainID: chainID, + contract: contract, + } +} + +// TODO: ConfigDigest is byte[32] but what we really want here is a felt +func (d offchainConfigDigester) ConfigDigest(cfg types.ContractConfig) (types.ConfigDigest, error) { + configDigest := types.ConfigDigest{} + + contractAddress, valid := new(big.Int).SetString(strings.TrimPrefix(d.contract, "0x"), 16) + if !valid { + return configDigest, errors.New("invalid contract address") + } + + if len(d.chainID) > 31 { + return configDigest, errors.New("chainID exceeds max length") + } + + if len(cfg.Signers) != len(cfg.Transmitters) { + return configDigest, errors.New("must have equal number of signers and transmitters") + } + + if len(cfg.Signers) <= 3*int(cfg.F) { + return configDigest, errors.New("number of oracles must be greater than 3*f") + } + + oracles := []*big.Int{} + for i := range cfg.Signers { + signer := new(big.Int).SetBytes(cfg.Signers[i]) + transmitter, valid := new(big.Int).SetString(strings.TrimPrefix(string(cfg.Transmitters[i]), "0x"), 16) + if !valid { + return configDigest, errors.New("invalid transmitter") + } + oracles = append(oracles, signer, transmitter) + } + + offchainConfig := starknet.EncodeFelts(cfg.OffchainConfig) + + onchainConfig, err := medianreport.OnchainConfigCodec{}.DecodeToFelts(cfg.OnchainConfig) + if err != nil { + return configDigest, err + } + + // golang... https://stackoverflow.com/questions/28625546/mixing-exploded-slices-and-regular-parameters-in-variadic-functions + msg := []*big.Int{ + new(big.Int).SetBytes([]byte(d.chainID)), // chain_id + contractAddress, // contract_address + new(big.Int).SetUint64(cfg.ConfigCount), // config_count + new(big.Int).SetInt64(int64(len(cfg.Signers))), // oracles_len + } + msg = append(msg, oracles...) + msg = append( + msg, + big.NewInt(int64(cfg.F)), // f + big.NewInt(int64(len(onchainConfig))), // onchain_config_len + ) + msg = append(msg, onchainConfig...) + msg = append( + msg, + new(big.Int).SetUint64(cfg.OffchainConfigVersion), // offchain_config_version + big.NewInt(int64(len(offchainConfig))), // offchain_config_len + ) + msg = append(msg, offchainConfig...) // offchain_config + + digest, err := curve.Curve.ComputeHashOnElements(msg) + if err != nil { + return configDigest, err + } + digest.FillBytes(configDigest[:]) + + // set first two bytes to the digest prefix + pre, err := d.ConfigDigestPrefix() + if err != nil { + return configDigest, err + } + binary.BigEndian.PutUint16(configDigest[:2], uint16(pre)) + + return configDigest, nil +} + +func (offchainConfigDigester) ConfigDigestPrefix() (types.ConfigDigestPrefix, error) { + return ConfigDigestPrefixStarknet, nil +} diff --git a/relayer/pkg/chainlink/ocr2/config_digester_test.go b/relayer/pkg/chainlink/ocr2/config_digester_test.go new file mode 100644 index 000000000..4ebdef320 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/config_digester_test.go @@ -0,0 +1,67 @@ +package ocr2_test + +import ( + "strings" + "testing" + + "github.com/smartcontractkit/libocr/offchainreporting2/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +var testConfig = types.ContractConfig{ + ConfigCount: 1, + Signers: []types.OnchainPublicKey{ + starknet.XXXMustHexDecodeString("03f5df103ef3ae4d8e5ec708abf48bfdbff08f9e8deacc1a0bedf3e93cffd2a3"), + starknet.XXXMustHexDecodeString("0312c009b6d4cad9bd653450bb81eec18e81733052ee3f6cb3a2c182082db173"), + starknet.XXXMustHexDecodeString("02fc4861ccb51c1548dee618ed1103fbc1c01be0144da8950ad1d80c1a7bc3ba"), + starknet.XXXMustHexDecodeString("0331d8d682d098b685a929e0ad1d89a768ea8a1ca254c2dcbddf57521623729e"), + }, + Transmitters: []types.Account{ + "01ccc16a80a22f0643b217d32798fe6994c823b7838262db80b4e2a867c61caa", + "00578180df3312211b37f95ff74428270ea5fe1850908c1d6165b7242e614277", + "0339c8b556e92cd6b7f7b6c0c69c942db62d0385209a387600077be35509d99e", + "07ac7c65dc083c4552d53dc5b925de392e41255c6eada6a1ebdf1bdcb6b3ba54", + }, + F: 1, + OnchainConfig: []byte{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // version + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // min (1) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 154, 202, 0, // max (1000000000) + }, + OffchainConfigVersion: 2, + OffchainConfig: []byte{1}, +} + +func TestConfigDigester(t *testing.T) { + d := ocr2.NewOffchainConfigDigester( + "SN_GOERLI", // DEFAULT_CHAIN_ID = StarknetChainId.TESTNET + "01dfac180005c5a5efc88d2c37f880320e1764b83dd3a35006690e1ed7da68d7", + ) + + digest, err := d.ConfigDigest(testConfig) + assert.NoError(t, err) + assert.Equal(t, "00047843e1622a4462e1209c9f8559ba43cbf43bf238da490f3b9c8e33f3419e", digest.Hex()) +} + +func TestConfigDigester_InvalidChainID(t *testing.T) { + d := ocr2.NewOffchainConfigDigester( + strings.Repeat("a", 256), // chain ID is too long + "42c59a00fd21bdc27c7be3e9cc272a9b684037e4a37417c2d5a920081e6e87c", + ) + + _, err := d.ConfigDigest(testConfig) + assert.Error(t, err, "chainID") +} + +func FuzzEncoding(f *testing.F) { + f.Add([]byte("hello world")) + f.Fuzz(func(t *testing.T, data []byte) { + result, err := starknet.DecodeFelts(starknet.EncodeFelts(data)) + require.NoError(t, err) + require.Equal(t, data, result) + }) +} diff --git a/relayer/pkg/chainlink/ocr2/contract_cache.go b/relayer/pkg/chainlink/ocr2/contract_cache.go new file mode 100644 index 000000000..4f41da21f --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/contract_cache.go @@ -0,0 +1,159 @@ +package ocr2 + +import ( + "context" + "errors" + "fmt" + "sync" + "time" + + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/utils" +) + +type Tracker interface { + Start() error + Close() error + poll() +} + +var _ Tracker = (*contractCache)(nil) +var _ types.ContractConfigTracker = (*contractCache)(nil) + +type contractCache struct { + contractConfig ContractConfig + blockHeight uint64 + ccLock sync.RWMutex + ccLastCheckedAt time.Time + + stop, done chan struct{} + + reader Reader + cfg Config + lggr logger.Logger +} + +func NewContractCache(cfg Config, reader Reader, lggr logger.Logger) *contractCache { + return &contractCache{ + cfg: cfg, + reader: reader, + lggr: lggr, + stop: make(chan struct{}), + done: make(chan struct{}), + } +} + +func (c *contractCache) updateConfig(ctx context.Context) error { + configBlock, configDigest, err := c.reader.LatestConfigDetails(ctx) + if err != nil { + return fmt.Errorf("couldn't fetch latest config details: %w", err) + } + + c.ccLock.RLock() + isSame := c.contractConfig.ConfigBlock == configBlock && c.contractConfig.Config.ConfigDigest == configDigest + c.ccLock.RUnlock() + + var newConfig types.ContractConfig + if !isSame { + newConfig, err = c.reader.LatestConfig(ctx, configBlock) + if err != nil { + return fmt.Errorf("couldn't fetch latest config: %w", err) + } + } + + blockHeight, err := c.reader.LatestBlockHeight(ctx) + if err != nil { + return fmt.Errorf("failed to fetch latest block height: %w", err) + } + + c.lggr.Debugw("contract cache update", "blockHeight", blockHeight, "configBlock", configBlock, "configDigest", configDigest) + + c.ccLock.Lock() + defer c.ccLock.Unlock() + c.ccLastCheckedAt = time.Now() + c.blockHeight = blockHeight + if !isSame { + c.contractConfig = ContractConfig{ + Config: newConfig, + ConfigBlock: configBlock, + } + } + + return nil +} + +func (c *contractCache) Start() error { + ctx, cancel := utils.ContextFromChan(c.stop) + defer cancel() + if err := c.updateConfig(ctx); err != nil { + c.lggr.Warnf("Failed to populate initial config: %v", err) + } + go c.poll() + return nil +} + +func (c *contractCache) Close() error { + close(c.stop) + return nil +} + +func (c *contractCache) poll() { + defer close(c.done) + tick := time.After(0) + for { + select { + case <-c.stop: + return + case <-tick: + ctx, cancel := utils.ContextFromChan(c.stop) + + if err := c.updateConfig(ctx); err != nil { + c.lggr.Errorf("Failed to update config: %v", err) + } + cancel() + + tick = time.After(utils.WithJitter(c.cfg.OCR2CachePollPeriod())) + } + } +} + +func (c *contractCache) Notify() <-chan struct{} { + return nil +} + +func (c *contractCache) LatestConfigDetails(ctx context.Context) (changedInBlock uint64, configDigest types.ConfigDigest, err error) { + c.ccLock.RLock() + defer c.ccLock.RUnlock() + changedInBlock = c.contractConfig.ConfigBlock + configDigest = c.contractConfig.Config.ConfigDigest + err = c.assertConfigNotStale() + return +} + +func (c *contractCache) LatestConfig(ctx context.Context, changedInBlock uint64) (config types.ContractConfig, err error) { + c.ccLock.RLock() + defer c.ccLock.RUnlock() + config = c.contractConfig.Config + err = c.assertConfigNotStale() + return +} + +func (c *contractCache) LatestBlockHeight(ctx context.Context) (blockHeight uint64, err error) { + c.ccLock.RLock() + defer c.ccLock.RUnlock() + return c.blockHeight, c.assertConfigNotStale() +} + +func (c *contractCache) assertConfigNotStale() error { + if c.ccLastCheckedAt.IsZero() { + return errors.New("contract config cache not yet initialized") + } + + if since := time.Since(c.ccLastCheckedAt); since > c.cfg.OCR2CacheTTL() { + return fmt.Errorf("contract config cache expired: checked last %s ago", since) + } + + return nil +} diff --git a/relayer/pkg/chainlink/ocr2/contract_reader.go b/relayer/pkg/chainlink/ocr2/contract_reader.go new file mode 100644 index 000000000..91d094864 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/contract_reader.go @@ -0,0 +1,127 @@ +package ocr2 + +import ( + "context" + "fmt" + "math/big" + "time" + + "github.com/NethermindEth/juno/core/felt" + starknetutils "github.com/NethermindEth/starknet.go/utils" + + "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" +) + +type Reader interface { + types.ContractConfigTracker + median.MedianContract +} + +var _ Reader = (*contractReader)(nil) + +type contractReader struct { + address *felt.Felt + reader OCR2Reader + lggr logger.Logger +} + +func NewContractReader(address string, reader OCR2Reader, lggr logger.Logger) Reader { + felt, err := starknetutils.HexToFelt(address) + if err != nil { + panic("invalid felt value") + } + + return &contractReader{ + address: felt, // TODO: propagate type everywhere + reader: reader, + lggr: lggr, + } +} + +func (c *contractReader) Notify() <-chan struct{} { + return nil +} + +func (c *contractReader) LatestConfigDetails(ctx context.Context) (changedInBlock uint64, configDigest types.ConfigDigest, err error) { + resp, err := c.reader.LatestConfigDetails(ctx, c.address) + if err != nil { + return changedInBlock, configDigest, fmt.Errorf("couldn't get latest config details: %w", err) + } + + changedInBlock = resp.Block + configDigest = resp.Digest + + return +} + +func (c *contractReader) LatestConfig(ctx context.Context, changedInBlock uint64) (config types.ContractConfig, err error) { + resp, err := c.reader.ConfigFromEventAt(ctx, c.address, changedInBlock) + if err != nil { + return config, fmt.Errorf("couldn't get latest config: %w", err) + } + + config = resp.Config + + return +} + +func (c *contractReader) LatestBlockHeight(ctx context.Context) (blockHeight uint64, err error) { + blockHeight, err = c.reader.BaseReader().LatestBlockHeight(ctx) + if err != nil { + return blockHeight, fmt.Errorf("couldn't get latest block height: %w", err) + } + + return +} + +func (c *contractReader) LatestTransmissionDetails( + ctx context.Context, +) ( + configDigest types.ConfigDigest, + epoch uint32, + round uint8, + latestAnswer *big.Int, + latestTimestamp time.Time, + err error, +) { + transmissionDetails, err := c.reader.LatestTransmissionDetails(ctx, c.address) + if err != nil { + err = fmt.Errorf("couldn't get transmission details: %w", err) + } + + configDigest = transmissionDetails.Digest + epoch = transmissionDetails.Epoch + round = transmissionDetails.Round + latestAnswer = transmissionDetails.LatestAnswer + latestTimestamp = transmissionDetails.LatestTimestamp + + return +} + +// round will never be requested on Starknet so we return 0 values +func (c *contractReader) LatestRoundRequested( + ctx context.Context, + lookback time.Duration, +) ( + configDigest types.ConfigDigest, + epoch uint32, + round uint8, + err error, +) { + configDigest = types.ConfigDigest{} + epoch = 0 + round = 0 + return +} + +func (c *contractReader) LatestBillingDetails(ctx context.Context) (bd BillingDetails, err error) { + bd, err = c.reader.BillingDetails(ctx, c.address) + if err != nil { + err = fmt.Errorf("couldn't get billing details: %w", err) + } + + return +} diff --git a/relayer/pkg/chainlink/ocr2/contract_transmitter.go b/relayer/pkg/chainlink/ocr2/contract_transmitter.go new file mode 100644 index 000000000..b93975d96 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/contract_transmitter.go @@ -0,0 +1,124 @@ +package ocr2 + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + + "github.com/NethermindEth/juno/core/felt" + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + starknetutils "github.com/NethermindEth/starknet.go/utils" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2/medianreport" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/txm" + + "github.com/smartcontractkit/libocr/offchainreporting2/types" +) + +var _ types.ContractTransmitter = (*contractTransmitter)(nil) + +type contractTransmitter struct { + reader *transmissionsCache + + contractAddress *felt.Felt + senderAddress *felt.Felt // account.publicKey + accountAddress *felt.Felt + + txm txm.TxManager +} + +func NewContractTransmitter( + reader *transmissionsCache, + contractAddress string, + senderAddress string, + accountAddress string, + txm txm.TxManager, +) *contractTransmitter { + contractAddr, _ := starknetutils.HexToFelt(contractAddress) + senderAddr, _ := starknetutils.HexToFelt(senderAddress) + accountAddr, _ := starknetutils.HexToFelt(accountAddress) + + return &contractTransmitter{ + reader: reader, + contractAddress: contractAddr, + senderAddress: senderAddr, + accountAddress: accountAddr, + txm: txm, + } +} + +func (c *contractTransmitter) Transmit( + ctx context.Context, + reportCtx types.ReportContext, + report types.Report, + sigs []types.AttributedOnchainSignature, +) error { + // flat array of arguments + // convert everything to hex string -> caigo internally converts into big.int + var transmitPayload []string + + // ReportContext: + // config_digest + // epoch_and_round + // extra_hash + reportContext := medianreport.RawReportContext(reportCtx) + + for _, r := range reportContext { + transmitPayload = append(transmitPayload, "0x"+hex.EncodeToString(r[:])) + } + + slices, err := medianreport.SplitReport(report) + if err != nil { + return err + } + for i := 0; i < len(slices); i++ { + hexStr := hex.EncodeToString(slices[i]) + transmitPayload = append(transmitPayload, "0x"+hexStr) + } + + transmitPayload = append(transmitPayload, "0x"+fmt.Sprintf("%x", len(sigs))) // signatures_len + for _, sig := range sigs { + // signature: 32 byte public key + 32 byte R + 32 byte S + signature := sig.Signature + if len(signature) != 32+32+32 { + return errors.New("invalid length of the signature") + } + transmitPayload = append(transmitPayload, "0x"+hex.EncodeToString(signature[32:64])) // r + transmitPayload = append(transmitPayload, "0x"+hex.EncodeToString(signature[64:])) // s + transmitPayload = append(transmitPayload, "0x"+hex.EncodeToString(signature[:32])) // public key + } + + // TODO: build felts directly rather than afterwards + calldata, err := starknetutils.HexArrToFelt(transmitPayload) + if err != nil { + return err + } + + err = c.txm.Enqueue(c.accountAddress, c.senderAddress, starknetrpc.FunctionCall{ + ContractAddress: c.contractAddress, + EntryPointSelector: starknetutils.GetSelectorFromNameFelt("transmit"), + Calldata: calldata, + }) + + return err +} + +func (c *contractTransmitter) LatestConfigDigestAndEpoch( + ctx context.Context, +) ( + configDigest types.ConfigDigest, + epoch uint32, + err error, +) { + configDigest, epoch, _, _, _, err = c.reader.LatestTransmissionDetails(ctx) + if err != nil { + err = fmt.Errorf("couldn't fetch latest transmission details: %w", err) + } + + return +} + +func (c *contractTransmitter) FromAccount() (types.Account, error) { + return types.Account(c.accountAddress.String()), nil +} diff --git a/relayer/pkg/chainlink/ocr2/events.go b/relayer/pkg/chainlink/ocr2/events.go new file mode 100644 index 000000000..3762d6a02 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/events.go @@ -0,0 +1,243 @@ +package ocr2 + +import ( + "errors" + "fmt" + "math/big" + "time" + + "github.com/NethermindEth/juno/core/felt" + + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2/medianreport" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +var ( + MaxObservers = 31 + + // Event selectors + NewTransmissionEventSelector = "019e22f866f4c5aead2809bf160d2b29e921e335d899979732101c6f3c38ff81" + ConfigSetEventSelector = "9a144bf4a6a8fd083c93211e163e59221578efcc86b93f8c97c620e7b9608a" +) + +// NewTransmissionEvent represents the 'NewTransmission' event +type NewTransmissionEvent struct { + RoundId uint32 //nolint:revive + LatestAnswer *big.Int + Transmitter *felt.Felt + LatestTimestamp time.Time + Observers []uint8 + ObservationsLen uint32 + Observations []*big.Int + JuelsPerFeeCoin *big.Int + GasPrice *big.Int + ConfigDigest types.ConfigDigest + Epoch uint32 + Round uint8 + Reimbursement *big.Int +} + +// ParseNewTransmissionEvent is decoding binary felt data as the NewTransmissionEvent type +func ParseNewTransmissionEvent(event starknetrpc.EmittedEvent) (NewTransmissionEvent, error) { + eventData := event.Data + { + const observationsLenIndex = 3 + const constNumOfElements = 9 + const constNumOfKeys = 2 + 1 // additional 1 for the automatic event ID key + + if len(eventData) < constNumOfElements { + return NewTransmissionEvent{}, errors.New("invalid: event data") + } + + if len(event.Keys) < constNumOfKeys { + return NewTransmissionEvent{}, errors.New("invalid: event data") + } + + observationsLen := eventData[observationsLenIndex].BigInt(big.NewInt(0)).Uint64() + if len(eventData) != constNumOfElements+int(observationsLen) { + return NewTransmissionEvent{}, errors.New("invalid: event data") + } + } + + // keys[0] == event_id + // round_id + roundID := uint32(event.Keys[1].BigInt(big.NewInt(0)).Uint64()) + // transmitter + transmitter := event.Keys[2] + + index := 0 + + // answer + latestAnswer := eventData[index].BigInt(big.NewInt(0)) + + // observation_timestamp + index++ + unixTime := eventData[index].BigInt(big.NewInt(0)).Int64() + latestTimestamp := time.Unix(unixTime, 0) + + // observers (raw) max 31 + index++ + observersRaw := starknet.PadBytes(eventData[index].BigInt(big.NewInt(0)).Bytes(), MaxObservers) + + // observation_len + index++ + observationsLen := uint32(eventData[index].BigInt(big.NewInt(0)).Uint64()) + + // observers (based on observationsLen) + var observers []uint8 + for i := 0; i < int(observationsLen); i++ { + observers = append(observers, observersRaw[i]) + } + + // observations (based on observationsLen) + var observations []*big.Int + for i := 0; i < int(observationsLen); i++ { + observations = append(observations, eventData[index+i+1].BigInt(big.NewInt(0))) + } + + // juels_per_fee_coin + index += int(observationsLen) + 1 + juelsPerFeeCoin := eventData[index].BigInt(big.NewInt(0)) + + // juels_per_fee_coin + index++ + gasPrice := eventData[index].BigInt(big.NewInt(0)) + + // config digest + index++ + digest := eventData[index].Bytes() + + // epoch_and_round + index++ + epoch, round := parseEpochAndRound(eventData[index].BigInt(big.NewInt(0))) + + // reimbursement + index++ + reimbursement := eventData[index].BigInt(big.NewInt(0)) + + return NewTransmissionEvent{ + RoundId: roundID, + LatestAnswer: latestAnswer, + Transmitter: transmitter, + LatestTimestamp: latestTimestamp, + Observers: observers, + ObservationsLen: observationsLen, + Observations: observations, + JuelsPerFeeCoin: juelsPerFeeCoin, + GasPrice: gasPrice, + ConfigDigest: digest, + Epoch: epoch, + Round: round, + Reimbursement: reimbursement, + }, nil +} + +// ParseConfigSetEvent is decoding binary felt data as the libocr ContractConfig type +func ParseConfigSetEvent(event starknetrpc.EmittedEvent) (types.ContractConfig, error) { + eventData := event.Data + { + const oraclesLenIdx = 1 + if len(eventData) < oraclesLenIdx { + return types.ContractConfig{}, errors.New("invalid: event data") + } + + oraclesLen := eventData[oraclesLenIdx].BigInt(big.NewInt(0)).Uint64() + onchainConfigLenIdx := oraclesLenIdx + 2*oraclesLen + 2 + + if uint64(len(eventData)) < onchainConfigLenIdx { + return types.ContractConfig{}, errors.New("invalid: event data") + } + + onchainConfigLen := eventData[onchainConfigLenIdx].BigInt(big.NewInt(0)).Uint64() + offchainConfigLenIdx := onchainConfigLenIdx + onchainConfigLen + 2 + + if uint64(len(eventData)) < offchainConfigLenIdx { + return types.ContractConfig{}, errors.New("invalid: event data") + } + + offchainConfigLen := eventData[offchainConfigLenIdx].BigInt(big.NewInt(0)).Uint64() + if uint64(len(eventData)) != offchainConfigLenIdx+offchainConfigLen+1 { + return types.ContractConfig{}, errors.New("invalid: event data") + } + } + + // keys[0] == event_id + // keys[1] == previous_config_block_number - skip + + // latest_config_digest + digest := event.Keys[2].Bytes() + + index := 0 + + // config_count + configCount := eventData[index].BigInt(big.NewInt(0)).Uint64() + + // oracles_len + index++ + oraclesLen := eventData[index].BigInt(big.NewInt(0)).Uint64() + + // oracles + index++ + oracleMembers := eventData[index:(index + int(oraclesLen)*2)] + var signers []types.OnchainPublicKey + var transmitters []types.Account + for i, member := range oracleMembers { + if i%2 == 0 { + b := member.Bytes() + signers = append(signers, b[:]) // pad to 32 bytes + } else { + transmitters = append(transmitters, types.Account(member.String())) + } + } + + // f + index = index + int(oraclesLen)*2 + f := eventData[index].BigInt(big.NewInt(0)).Uint64() + + // onchain_config length + index++ + onchainConfigLen := eventData[index].BigInt(big.NewInt(0)).Uint64() + + // onchain_config (version=1, min, max) + index++ + onchainConfigFelts := eventData[index:(index + int(onchainConfigLen))] + onchainConfig, err := medianreport.OnchainConfigCodec{}.EncodeFromFelt( + onchainConfigFelts[0].BigInt(big.NewInt(0)), + onchainConfigFelts[1].BigInt(big.NewInt(0)), + onchainConfigFelts[2].BigInt(big.NewInt(0)), + ) + if err != nil { + return types.ContractConfig{}, fmt.Errorf("err in encoding onchain config from felts: %w", err) + } + + // offchain_config_version + index += int(onchainConfigLen) + offchainConfigVersion := eventData[index].BigInt(big.NewInt(0)).Uint64() + + // offchain_config_len + index++ + offchainConfigLen := eventData[index].BigInt(big.NewInt(0)).Uint64() + + // offchain_config + index++ + offchainConfigFelts := eventData[index:(index + int(offchainConfigLen))] + offchainConfig, err := starknet.DecodeFelts(starknet.FeltsToBig(offchainConfigFelts)) + if err != nil { + return types.ContractConfig{}, fmt.Errorf("couldn't decode offchain config: %w", err) + } + + return types.ContractConfig{ + ConfigDigest: digest, + ConfigCount: configCount, + Signers: signers, + Transmitters: transmitters, + F: uint8(f), + OnchainConfig: onchainConfig, + OffchainConfigVersion: offchainConfigVersion, + OffchainConfig: offchainConfig, + }, nil +} diff --git a/relayer/pkg/chainlink/ocr2/events_test.go b/relayer/pkg/chainlink/ocr2/events_test.go new file mode 100644 index 000000000..5ad495a05 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/events_test.go @@ -0,0 +1,183 @@ +package ocr2 + +import ( + "encoding/hex" + "math/big" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + starknetutils "github.com/NethermindEth/starknet.go/utils" + + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2/medianreport" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +var ( + // NewTransmission + newTransmissionEventKeysRaw = []string{ + "0x9", // event_id + "0x1", // round_id + "0x2c0dd77ce74b1667dc6fa782bbafaef5becbe2d04b052726ab236daeb52ac5d", // transmitter + } + newTransmissionEventRaw = []string{ + "0x63", // answer + "0x1", // observation_timestamp + "0x10203000000000000000000000000000000000000000000000000000000", // observers + "0x4", // len(observations) + "0x63", + "0x63", + "0x63", + "0x63", + "0x1", // juels_per_fee_coin + "0x1", // gas_price + "0x485341c18461d70eac6ded4b8b17147f173308ddd56216a86f9ec4d994453", // config_digest + "0x1", // epoch_and_round + "0x1", // reimbursement + } + + // ConfigSet + configSetEventKeysRaw = []string{ + "0x10", // event_id + "0x0", // previous_block_number + "0x485341c18461d70eac6ded4b8b17147f173308ddd56216a86f9ec4d994453", // lastest_config_digest + } + configSetEventRaw = []string{ + "0x1", // config_count + "0x4", // len(oracles) + "0x21e867aa6e6c545949a9c6f9f5401b70007bd93675857a0a7d5345b8bffcbf0", + "0x2c0dd77ce74b1667dc6fa782bbafaef5becbe2d04b052726ab236daeb52ac5d", + "0x64642f34e68436f45757b920f4cdfbdff82728844d740bac672a19ad72011ca", + "0x2de61335d8f1caa7e9df54486f016ded83d0e02fde4c12280f4b898720b0e2b", + "0x3fad2efda193b37e4e526972d9613238b9ff993e1e3d3b1dd376d7b8ceb7acd", + "0x2f14e18cc198dd5133c8a9aa92992fc1a462f703401716f402d0ee383b54faa", + "0x4fcf11b05ebd00a207030c04836defbec3d37a3f77e581f2d0962a20a55adcd", + "0x5c35686f78db31d9d896bb425b3fd99be19019f8aeaf0f7a8767867903341d4", + "0x1", // f + "0x3", // len(onchain_config) + "0x1", + "0xa", + "0x3b9aca00", + "0x2", // offchain_config_version + "0x2", // len(offchain_config) + "0x1", + "0x1", + } +) + +func TestNewTransmissionEvent_Parse(t *testing.T) { + eventKeys, err := starknetutils.HexArrToFelt(newTransmissionEventKeysRaw) + assert.NoError(t, err) + eventData, err := starknetutils.HexArrToFelt(newTransmissionEventRaw) + assert.NoError(t, err) + require.Equal(t, len(newTransmissionEventRaw), len(eventData)) + + event := starknetrpc.EmittedEvent{ + Event: starknetrpc.Event{ + Keys: eventKeys, + Data: eventData, + }, + } + e, err := ParseNewTransmissionEvent(event) + assert.NoError(t, err) + + require.Equal(t, e.RoundId, uint32(1)) + require.Equal(t, e.LatestAnswer, big.NewInt(99)) + require.Equal(t, e.LatestTimestamp, time.Unix(1, 0)) + require.Equal(t, e.Epoch, uint32(0)) + require.Equal(t, e.Round, uint8(1)) + require.Equal(t, e.Reimbursement, big.NewInt(1)) + + require.Equal(t, e.JuelsPerFeeCoin, big.NewInt(1)) + require.Equal(t, e.GasPrice, big.NewInt(1)) + + transmitterHex := "0x2c0dd77ce74b1667dc6fa782bbafaef5becbe2d04b052726ab236daeb52ac5d" + require.Equal(t, len(transmitterHex), int(2+31.5*2)) // len('0x') + len(max_felt_len) + + expectedTransmitter, err := starknetutils.HexToFelt(transmitterHex) + require.NoError(t, err) + require.Equal(t, e.Transmitter, expectedTransmitter) + + require.Equal(t, e.Observers, []uint8{0, 1, 2, 3}) + require.Equal(t, e.ObservationsLen, uint32(4)) + require.Equal(t, e.ObservationsLen, uint32(len(e.Observers))) + + configDigest := XXXMustBytesToConfigDigest(starknet.XXXMustHexDecodeString("000485341c18461d70eac6ded4b8b17147f173308ddd56216a86f9ec4d994453")) + require.Equal(t, len(configDigest), 32) // padded to 32 bytes + require.Equal(t, e.ConfigDigest, configDigest) +} + +func TestConfigSetEvent_Parse(t *testing.T) { + eventKeys, err := starknetutils.HexArrToFelt(configSetEventKeysRaw) + assert.NoError(t, err) + eventData, err := starknetutils.HexArrToFelt(configSetEventRaw) + assert.NoError(t, err) + require.Equal(t, len(configSetEventRaw), len(eventData)) + + event := starknetrpc.EmittedEvent{ + Event: starknetrpc.Event{ + Keys: eventKeys, + Data: eventData, + }, + } + e, err := ParseConfigSetEvent(event) + assert.NoError(t, err) + + configDigest := XXXMustBytesToConfigDigest(starknet.XXXMustHexDecodeString("000485341c18461d70eac6ded4b8b17147f173308ddd56216a86f9ec4d994453")) + require.Equal(t, len(configDigest), 32) // padded to 32 bytes + require.Equal(t, e.ConfigDigest, configDigest) + require.Equal(t, e.ConfigCount, uint64(1)) + + oraclesLen := 4 + require.Equal(t, len(e.Signers), oraclesLen) + signersExpected := []types.OnchainPublicKey{ + starknet.XXXMustHexDecodeString("021e867aa6e6c545949a9c6f9f5401b70007bd93675857a0a7d5345b8bffcbf0"), + starknet.XXXMustHexDecodeString("064642f34e68436f45757b920f4cdfbdff82728844d740bac672a19ad72011ca"), + starknet.XXXMustHexDecodeString("03fad2efda193b37e4e526972d9613238b9ff993e1e3d3b1dd376d7b8ceb7acd"), + starknet.XXXMustHexDecodeString("04fcf11b05ebd00a207030c04836defbec3d37a3f77e581f2d0962a20a55adcd"), + } + require.Equal(t, e.Signers, signersExpected) + + transmittersExpected := []types.Account{ + "0x2c0dd77ce74b1667dc6fa782bbafaef5becbe2d04b052726ab236daeb52ac5d", + "0x2de61335d8f1caa7e9df54486f016ded83d0e02fde4c12280f4b898720b0e2b", + "0x2f14e18cc198dd5133c8a9aa92992fc1a462f703401716f402d0ee383b54faa", + "0x5c35686f78db31d9d896bb425b3fd99be19019f8aeaf0f7a8767867903341d4", + } + require.Equal(t, e.Transmitters, transmittersExpected) + require.Equal(t, len(e.Transmitters), oraclesLen) + + require.Equal(t, e.F, uint8(1)) + + onchainConfig, err := medianreport.OnchainConfigCodec{}.EncodeFromFelt( + big.NewInt(medianreport.OnchainConfigVersion), // version + big.NewInt(10), // min + big.NewInt(1000000000), // max + ) + assert.NoError(t, err) + require.Equal(t, e.OnchainConfig, onchainConfig) + + require.Equal(t, e.OffchainConfigVersion, uint64(2)) + require.Equal(t, e.OffchainConfig, []uint8{0x1}) // dummy config +} + +func TestNewTransmissionEventSelector(t *testing.T) { + bytes, err := hex.DecodeString(NewTransmissionEventSelector) + require.NoError(t, err) + eventKey := new(big.Int) + eventKey.SetBytes(bytes) + assert.Equal(t, starknetutils.GetSelectorFromName("NewTransmission").Cmp(eventKey), 0) +} + +func TestConfigSetEventSelector(t *testing.T) { + bytes, err := hex.DecodeString(ConfigSetEventSelector) + require.NoError(t, err) + eventKey := new(big.Int) + eventKey.SetBytes(bytes) + assert.Equal(t, starknetutils.GetSelectorFromName("ConfigSet").Cmp(eventKey), 0) +} diff --git a/relayer/pkg/chainlink/ocr2/medianreport/__debug_bin305974922 b/relayer/pkg/chainlink/ocr2/medianreport/__debug_bin305974922 new file mode 100755 index 000000000..3c34cd545 Binary files /dev/null and b/relayer/pkg/chainlink/ocr2/medianreport/__debug_bin305974922 differ diff --git a/relayer/pkg/chainlink/ocr2/medianreport/onchainconfig.go b/relayer/pkg/chainlink/ocr2/medianreport/onchainconfig.go new file mode 100644 index 000000000..1f86e0555 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/medianreport/onchainconfig.go @@ -0,0 +1,86 @@ +package medianreport + +import ( + "fmt" + "math/big" + + "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" +) + +const ( + OnchainConfigVersion = 1 + byteWidth = 32 + length = 3 * byteWidth +) + +// report format +// 32 bytes - version +// 32 bytes - min +// 32 bytes - max + +type OnchainConfigCodec struct{} + +var _ median.OnchainConfigCodec = &OnchainConfigCodec{} + +// DecodeToFelts decodes the onchainconfig into felt values (used in config digest hashing) +func (codec OnchainConfigCodec) DecodeToFelts(b []byte) ([]*big.Int, error) { + if len(b) != length { + return []*big.Int{}, fmt.Errorf("unexpected length of OnchainConfig, expected %v, got %v", length, len(b)) + } + + // convert from bytes to *big.Int + configVersion := new(big.Int).SetBytes(b[:32]) + + if OnchainConfigVersion != configVersion.Int64() { + return []*big.Int{}, fmt.Errorf("unexpected version of OnchainConfig, expected %v, got %v", OnchainConfigVersion, configVersion.Int64()) + } + + min := new(big.Int).SetBytes(b[byteWidth : 2*byteWidth]) + max := new(big.Int).SetBytes(b[2*byteWidth:]) + + return []*big.Int{configVersion, min, max}, nil +} + +// Decode converts the onchainconfig via the outputs of DecodeToFelts into unsigned big.Ints that libocr expects +func (codec OnchainConfigCodec) Decode(b []byte) (median.OnchainConfig, error) { + felts, err := codec.DecodeToFelts(b) + if err != nil { + return median.OnchainConfig{}, err + } + + min := felts[1] + max := felts[2] + + if !(min.Cmp(max) <= 0) { + return median.OnchainConfig{}, fmt.Errorf("OnchainConfig min (%v) should not be greater than max(%v)", min, max) + } + + return median.OnchainConfig{Min: min, Max: max}, nil +} + +// EncodeFromFelt encodes the config where min & max are big.Int representations of a felt +// Cairo has no notion of signed values: min and max values will be non-negative +func (codec OnchainConfigCodec) EncodeFromFelt(version, min, max *big.Int) ([]byte, error) { + if version.Uint64() != OnchainConfigVersion { + return nil, fmt.Errorf("unexpected version of OnchainConfig, expected %v, got %v", OnchainConfigVersion, version.Int64()) + } + + if min.Sign() == -1 || max.Sign() == -1 { + return nil, fmt.Errorf("starknet does not support negative values: min = (%v) and max = (%v)", min, max) + } + + result := []byte{} + versionBytes := make([]byte, byteWidth) + minBytes := make([]byte, byteWidth) + maxBytes := make([]byte, byteWidth) + result = append(result, version.FillBytes(versionBytes)...) + result = append(result, min.FillBytes(minBytes)...) + result = append(result, max.FillBytes(maxBytes)...) + + return result, nil +} + +// Encode takes the interface that libocr uses (big.Ints) and serializes it into 3 felts +func (codec OnchainConfigCodec) Encode(c median.OnchainConfig) ([]byte, error) { + return codec.EncodeFromFelt(big.NewInt(OnchainConfigVersion), c.Min, c.Max) +} diff --git a/relayer/pkg/chainlink/ocr2/medianreport/onchainconfig_test.go b/relayer/pkg/chainlink/ocr2/medianreport/onchainconfig_test.go new file mode 100644 index 000000000..9591c1c21 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/medianreport/onchainconfig_test.go @@ -0,0 +1,81 @@ +package medianreport + +import ( + "math/big" + "testing" + + "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestOnchainConfigCodec(t *testing.T) { + var params = []struct { + name string + val []*big.Int + expectErr bool + }{ + { + name: "positive min < positive max", + val: []*big.Int{big.NewInt(1), big.NewInt(1000)}, + expectErr: false, + }, + { + name: "0 < positive max", + val: []*big.Int{big.NewInt(0), big.NewInt(1000)}, + expectErr: false, + }, + { + name: "positive max < 0", + val: []*big.Int{big.NewInt(1000), big.NewInt(0)}, + expectErr: true, + }, + { + name: "positive min > positive max", + val: []*big.Int{big.NewInt(1000), big.NewInt(1)}, + expectErr: true, + }, + { + name: "min = max", + val: []*big.Int{big.NewInt(0), big.NewInt(0)}, + expectErr: false, + }, + } + + codec := OnchainConfigCodec{} + + for _, p := range params { + t.Run(p.name, func(t *testing.T) { + cfg := median.OnchainConfig{ + Min: p.val[0], + Max: p.val[1], + } + + configBytes, err := codec.Encode(cfg) + require.NoError(t, err) + + newCfg, err := codec.Decode(configBytes) + if p.expectErr { + assert.Error(t, err) + return // exit func if error is verified + } + require.NoError(t, err) + + assert.True(t, cfg.Min.Cmp(newCfg.Min) == 0) + assert.True(t, cfg.Max.Cmp(newCfg.Max) == 0) + }) + } + + t.Run("incorrect length", func(t *testing.T) { + b := make([]byte, length-1) + _, err := codec.Decode(b) + assert.Error(t, err) + }) + + t.Run("incorrect version", func(t *testing.T) { + b := make([]byte, length) + b[0] = 1 + _, err := codec.Decode(b) + assert.Error(t, err) + }) +} diff --git a/relayer/pkg/chainlink/ocr2/medianreport/report.go b/relayer/pkg/chainlink/ocr2/medianreport/report.go new file mode 100644 index 000000000..ffb7364b4 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/medianreport/report.go @@ -0,0 +1,187 @@ +package medianreport + +import ( + "errors" + "fmt" + "math" + "math/big" + "sort" + + "github.com/NethermindEth/juno/core/felt" + "github.com/NethermindEth/starknet.go/curve" + starknetutils "github.com/NethermindEth/starknet.go/utils" + + "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +var _ median.ReportCodec = (*ReportCodec)(nil) + +var ( + timestampSizeBytes = starknet.FeltLength + observersSizeBytes = starknet.FeltLength + observationsLenBytes = starknet.FeltLength + prefixSizeBytes = timestampSizeBytes + observersSizeBytes + observationsLenBytes + juelsPerFeeCoinSizeBytes = starknet.FeltLength + gasPriceSizeBytes = starknet.FeltLength + observationSizeBytes = starknet.FeltLength +) + +type ReportCodec struct{} + +func (c ReportCodec) BuildReport(oo []median.ParsedAttributedObservation) (types.Report, error) { + num := len(oo) + if num == 0 { + return nil, errors.New("couldn't build report from empty attributed observations") + } + + for _, o := range oo { + if o.Value.Sign() == -1 || o.JuelsPerFeeCoin.Sign() == -1 || o.GasPriceSubunits.Sign() == -1 { + return nil, fmt.Errorf("starknet does not support negative values: value = (%v), fee = (%v), gas = (%v)", o.Value, o.JuelsPerFeeCoin, o.GasPriceSubunits) + } + } + + // preserve original array + oo = append([]median.ParsedAttributedObservation{}, oo...) + numFelt := starknetutils.BigIntToFelt(big.NewInt(int64(num))) + + // median timestamp + sort.Slice(oo, func(i, j int) bool { + return oo[i].Timestamp < oo[j].Timestamp + }) + timestamp := oo[num/2].Timestamp + timestampFelt := starknetutils.BigIntToFelt(big.NewInt(int64(timestamp))) + + // median juelsPerFeeCoin + sort.Slice(oo, func(i, j int) bool { + return oo[i].JuelsPerFeeCoin.Cmp(oo[j].JuelsPerFeeCoin) < 0 + }) + juelsPerFeeCoin := oo[num/2].JuelsPerFeeCoin + juelsPerFeeCoinFelt := starknetutils.BigIntToFelt(juelsPerFeeCoin) + + sort.Slice(oo, func(i, j int) bool { + return oo[i].GasPriceSubunits.Cmp(oo[j].GasPriceSubunits) < 0 + }) + // gas price in FRI + gasPriceSubunits := oo[num/2].GasPriceSubunits + gasPriceSubunitsFelt := starknetutils.BigIntToFelt(gasPriceSubunits) + + // sort by values + sort.Slice(oo, func(i, j int) bool { + return oo[i].Value.Cmp(oo[j].Value) < 0 + }) + + var observers = make([]byte, starknet.FeltLength) + var observations []*felt.Felt + + observers[0] = uint8(1) + for i, o := range oo { + // encoding scheme is offset by 0x01-padded to avoid felt overflow + // [0x01, <1_ID>, <2_ID>, ..., , 0x0, 0x0, ..., 0x0] + // note: this does not alter Starknet's MAX_ORACLES (31) + // where N is the length of the observations array + observers[i+1] = byte(o.Observer) + + f := starknetutils.BigIntToFelt(o.Value) + observations = append(observations, f) + } + + observersBig := starknetutils.BytesToBig(observers) + if observersBig.Cmp(curve.Curve.P) != -1 { + return nil, fmt.Errorf("invalid observers value: %v is larger than size of finite field", observersBig) + } + + var report []byte + + buf := timestampFelt.Bytes() + report = append(report, buf[:]...) + report = append(report, observers...) + buf = numFelt.Bytes() + report = append(report, buf[:]...) + for _, o := range observations { + buf = o.Bytes() + report = append(report, buf[:]...) + } + buf = juelsPerFeeCoinFelt.Bytes() + report = append(report, buf[:]...) + buf = gasPriceSubunitsFelt.Bytes() + report = append(report, buf[:]...) + + return report, nil +} + +func (c ReportCodec) MedianFromReport(report types.Report) (*big.Int, error) { + rLen := len(report) + if rLen < prefixSizeBytes+juelsPerFeeCoinSizeBytes+gasPriceSizeBytes { + return nil, errors.New("invalid report length") + } + + // Decode the number of observations + numBig := new(felt.Felt).SetBytes(report[(timestampSizeBytes + observersSizeBytes):prefixSizeBytes]).BigInt(big.NewInt(0)) + if !numBig.IsUint64() { + return nil, errors.New("length of observations is invalid") + } + n64 := numBig.Uint64() + if n64 == 0 { + return nil, errors.New("unpacked report has no observations") + } + if n64 >= math.MaxInt8 { + return nil, errors.New("length of observations is invalid") + } + + // Check if the report is big enough + n := int(n64) + expectedLen := prefixSizeBytes + (observationSizeBytes * n) + juelsPerFeeCoinSizeBytes + gasPriceSizeBytes + if rLen < expectedLen { + return nil, errors.New("invalid report length, missing main, juelsPerFeeCoin or gasPrice observations") + } + + // Decode observations + var oo []*big.Int + for i := 0; i < n; i++ { + start := prefixSizeBytes + observationSizeBytes*i + end := start + observationSizeBytes + obv := new(felt.Felt).SetBytes(report[start:end]) + o := obv.BigInt(big.NewInt(0)) + oo = append(oo, o) + } + + // Check if the report contains sorted observations + _less := func(i, j int) bool { + return oo[i].Cmp(oo[j]) < 0 + } + sorted := sort.SliceIsSorted(oo, _less) + if !sorted { + return nil, errors.New("observations not sorted") + } + + return oo[n/2], nil +} + +func (c ReportCodec) MaxReportLength(n int) (int, error) { + return prefixSizeBytes + (n * observationSizeBytes) + juelsPerFeeCoinSizeBytes + gasPriceSizeBytes, nil +} + +func SplitReport(report types.Report) ([][]byte, error) { + chunkSize := starknet.FeltLength + if len(report)%chunkSize != 0 { + return [][]byte{}, errors.New("invalid report length") + } + + // order is guaranteed by buildReport: + // observation_timestamp + // observers + // observations_len + // observations + // juels_per_fee_coin + // gas_price + slices := [][]byte{} + for i := 0; i < len(report)/chunkSize; i++ { + idx := i * chunkSize + slices = append(slices, report[idx:(idx+chunkSize)]) + } + + return slices, nil +} diff --git a/relayer/pkg/chainlink/ocr2/medianreport/report_fuzz_test.go b/relayer/pkg/chainlink/ocr2/medianreport/report_fuzz_test.go new file mode 100644 index 000000000..1adb3c344 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/medianreport/report_fuzz_test.go @@ -0,0 +1,36 @@ +//go:build go1.18 +// +build go1.18 + +package medianreport + +import ( + "math/big" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" +) + +// go test -tags=go1.18 -fuzz ./... +func FuzzReportCodecMedianFromReport(f *testing.F) { + cdc := ReportCodec{} + report, err := cdc.BuildReport([]median.ParsedAttributedObservation{ + {Timestamp: uint32(time.Now().Unix()), Value: big.NewInt(10), JuelsPerFeeCoin: big.NewInt(100000), GasPriceSubunits: big.NewInt(100000)}, + {Timestamp: uint32(time.Now().Unix()), Value: big.NewInt(10), JuelsPerFeeCoin: big.NewInt(200000), GasPriceSubunits: big.NewInt(200000)}, + {Timestamp: uint32(time.Now().Unix()), Value: big.NewInt(11), JuelsPerFeeCoin: big.NewInt(300000), GasPriceSubunits: big.NewInt(300000)}, + }) + require.NoError(f, err) + + // Seed with valid report + f.Add([]byte(report)) + f.Fuzz(func(t *testing.T, report []byte) { + med, err := cdc.MedianFromReport(report) + if err == nil { + // Should always be able to build a report from the medians extracted + _, err = cdc.BuildReport([]median.ParsedAttributedObservation{{Timestamp: uint32(time.Now().Unix()), Value: med, JuelsPerFeeCoin: med, GasPriceSubunits: med}}) + require.NoError(t, err) + } + }) +} diff --git a/relayer/pkg/chainlink/ocr2/medianreport/report_test.go b/relayer/pkg/chainlink/ocr2/medianreport/report_test.go new file mode 100644 index 000000000..9bef66158 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/medianreport/report_test.go @@ -0,0 +1,213 @@ +package medianreport + +import ( + "fmt" + "math/big" + "testing" + "time" + + "github.com/NethermindEth/starknet.go/curve" + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/libocr/commontypes" + "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" +) + +func TestBuildReportWithNegativeValues(t *testing.T) { + c := ReportCodec{} + oo := []median.ParsedAttributedObservation{} + + oo = append(oo, median.ParsedAttributedObservation{ + Timestamp: uint32(time.Now().Unix()), + Value: big.NewInt(-10), + JuelsPerFeeCoin: big.NewInt(10), + GasPriceSubunits: big.NewInt(10), + Observer: commontypes.OracleID(1), + }) + + _, err := c.BuildReport(oo) + assert.ErrorContains(t, err, "starknet does not support negative values: value = (-10), fee = (10), gas = (10)") + + oo = []median.ParsedAttributedObservation{} + oo = append(oo, median.ParsedAttributedObservation{ + Timestamp: uint32(time.Now().Unix()), + Value: big.NewInt(10), + JuelsPerFeeCoin: big.NewInt(-10), + GasPriceSubunits: big.NewInt(10), + Observer: commontypes.OracleID(1), + }) + + _, err = c.BuildReport(oo) + assert.ErrorContains(t, err, "starknet does not support negative values: value = (10), fee = (-10), gas = (10)") + + oo = []median.ParsedAttributedObservation{} + oo = append(oo, median.ParsedAttributedObservation{ + Timestamp: uint32(time.Now().Unix()), + Value: big.NewInt(10), + JuelsPerFeeCoin: big.NewInt(10), + GasPriceSubunits: big.NewInt(-10), + Observer: commontypes.OracleID(1), + }) + + _, err = c.BuildReport(oo) + assert.ErrorContains(t, err, "starknet does not support negative values: value = (10), fee = (10), gas = (-10)") +} + +func TestBuildReportNoObserversOverflow(t *testing.T) { + c := ReportCodec{} + oo := []median.ParsedAttributedObservation{} + fmt.Println("hello") + v := big.NewInt(0) + v.SetString("1000000000000000000", 10) + + // test largest possible encoded observers byte array + for i := 30; i >= 0; i-- { + oo = append(oo, median.ParsedAttributedObservation{ + Timestamp: uint32(time.Now().Unix()), + Value: big.NewInt(1234567890), + GasPriceSubunits: big.NewInt(2), + JuelsPerFeeCoin: v, + Observer: commontypes.OracleID(i), + }) + } + + report, err := c.BuildReport(oo) + assert.Nil(t, err) + + index := timestampSizeBytes + observersBytes := []byte(report[index : index+observersSizeBytes]) + observersBig := starknetutils.BytesToBig(observersBytes) + + // encoded observers felt is less than max felt + assert.Equal(t, -1, observersBig.Cmp(curve.Curve.P), "observers should be less than max felt") +} + +func TestBuildReport(t *testing.T) { + c := ReportCodec{} + oo := []median.ParsedAttributedObservation{} + + // expected outputs + n := 4 + observers := make([]byte, 32) + v := big.NewInt(0) + v.SetString("1000000000000000000", 10) + + // 0x01 pad the first byte + observers[0] = uint8(1) + for i := 0; i < n; i++ { + oo = append(oo, median.ParsedAttributedObservation{ + Timestamp: uint32(time.Now().Unix()), + Value: big.NewInt(1234567890), + GasPriceSubunits: big.NewInt(2), + JuelsPerFeeCoin: v, + Observer: commontypes.OracleID(i), + }) + + // create expected outputs + // remember to add 1 byte offset to avoid felt overflow + observers[i+1] = uint8(i) + } + + report, err := c.BuildReport(oo) + assert.NoError(t, err) + + // validate length + totalLen := prefixSizeBytes + observationSizeBytes*n + juelsPerFeeCoinSizeBytes + gasPriceSizeBytes + assert.Equal(t, totalLen, len(report), "validate length") + + // validate timestamp + timestamp := new(big.Int).SetBytes(report[0:timestampSizeBytes]) + assert.Equal(t, uint64(oo[0].Timestamp), timestamp.Uint64(), "validate timestamp") + + // validate observers + index := timestampSizeBytes + assert.Equal(t, observers, []byte(report[index:index+observersSizeBytes]), "validate observers") + + // validate observer count + index += observersSizeBytes + count := new(big.Int).SetBytes(report[index : index+observationsLenBytes]) + assert.Equal(t, uint8(n), uint8(count.Uint64()), "validate observer count") + + // validate observations + for i := 0; i < n; i++ { + idx := prefixSizeBytes + observationSizeBytes*i + assert.Equal(t, oo[0].Value.FillBytes(make([]byte, observationSizeBytes)), []byte(report[idx:idx+observationSizeBytes]), fmt.Sprintf("validate median observation #%d", i)) + } + + // validate juelsPerFeeCoin + index = prefixSizeBytes + observationSizeBytes*n + assert.Equal(t, v.FillBytes(make([]byte, juelsPerFeeCoinSizeBytes)), []byte(report[index:index+juelsPerFeeCoinSizeBytes]), "validate juelsPerFeeCoin") + + // validate gasPrice + index += juelsPerFeeCoinSizeBytes + expectedGasPrice := big.NewInt(2) + assert.Equal(t, expectedGasPrice.FillBytes(make([]byte, gasPriceSizeBytes)), []byte(report[index:index+gasPriceSizeBytes]), "validate gasPrice") +} + +type medianTest struct { + name string + obs []*big.Int + expectedMedian *big.Int +} + +func TestMedianFromReport(t *testing.T) { + cdc := ReportCodec{} + // Requires at least one obs + _, err := cdc.BuildReport(nil) + require.Error(t, err) + var tt = []medianTest{ + { + name: "2 positive one zero", + obs: []*big.Int{big.NewInt(0), big.NewInt(10), big.NewInt(20)}, + expectedMedian: big.NewInt(10), + }, + { + name: "one zero", + obs: []*big.Int{big.NewInt(0)}, + expectedMedian: big.NewInt(0), + }, + { + name: "two equal", + obs: []*big.Int{big.NewInt(1), big.NewInt(1)}, + expectedMedian: big.NewInt(1), + }, + } + + // add cases for observation number from [1..31] + for i := 1; i < 32; i++ { + test := medianTest{ + name: fmt.Sprintf("observations=%d", i), + obs: []*big.Int{}, + expectedMedian: big.NewInt(1), + } + for j := 0; j < i; j++ { + test.obs = append(test.obs, big.NewInt(1)) + } + tt = append(tt, test) + } + + for _, tc := range tt { + tc := tc + t.Run(tc.name, func(t *testing.T) { + var pos []median.ParsedAttributedObservation + for i, obs := range tc.obs { + pos = append(pos, median.ParsedAttributedObservation{ + Value: obs, + JuelsPerFeeCoin: obs, + GasPriceSubunits: obs, + Observer: commontypes.OracleID(uint8(i))}, + ) + } + report, err := cdc.BuildReport(pos) + require.NoError(t, err) + max, err := cdc.MaxReportLength(len(tc.obs)) + require.NoError(t, err) + assert.Equal(t, len(report), max) + med, err := cdc.MedianFromReport(report) + require.NoError(t, err) + assert.Equal(t, tc.expectedMedian.String(), med.String()) + }) + } +} diff --git a/relayer/pkg/chainlink/ocr2/medianreport/utils.go b/relayer/pkg/chainlink/ocr2/medianreport/utils.go new file mode 100644 index 000000000..f343d9baa --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/medianreport/utils.go @@ -0,0 +1,15 @@ +package medianreport + +import ( + "github.com/smartcontractkit/libocr/offchainreporting2/chains/evmutil" + "github.com/smartcontractkit/libocr/offchainreporting2/types" +) + +// NOTE: this should sit in the ocr2 package but that causes import cycles +func RawReportContext(repctx types.ReportContext) [3][32]byte { + rawReportContext := evmutil.RawReportContext(repctx) + // NOTE: Ensure extra_hash is 31 bytes with first byte blanked out + // libocr generates a 32 byte extraHash but we need to fit it into a felt + rawReportContext[2][0] = 0 + return rawReportContext +} diff --git a/relayer/pkg/chainlink/ocr2/mocks/OCR2Reader.go b/relayer/pkg/chainlink/ocr2/mocks/OCR2Reader.go new file mode 100644 index 000000000..d16b02f58 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/mocks/OCR2Reader.go @@ -0,0 +1,255 @@ +// Code generated by mockery v2.43.2. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + felt "github.com/NethermindEth/juno/core/felt" + + mock "github.com/stretchr/testify/mock" + + ocr2 "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" + + starknet "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +// OCR2Reader is an autogenerated mock type for the OCR2Reader type +type OCR2Reader struct { + mock.Mock +} + +// BaseReader provides a mock function with given fields: +func (_m *OCR2Reader) BaseReader() starknet.Reader { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for BaseReader") + } + + var r0 starknet.Reader + if rf, ok := ret.Get(0).(func() starknet.Reader); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(starknet.Reader) + } + } + + return r0 +} + +// BillingDetails provides a mock function with given fields: _a0, _a1 +func (_m *OCR2Reader) BillingDetails(_a0 context.Context, _a1 *felt.Felt) (ocr2.BillingDetails, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for BillingDetails") + } + + var r0 ocr2.BillingDetails + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) (ocr2.BillingDetails, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) ocr2.BillingDetails); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(ocr2.BillingDetails) + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ConfigFromEventAt provides a mock function with given fields: _a0, _a1, _a2 +func (_m *OCR2Reader) ConfigFromEventAt(_a0 context.Context, _a1 *felt.Felt, _a2 uint64) (ocr2.ContractConfig, error) { + ret := _m.Called(_a0, _a1, _a2) + + if len(ret) == 0 { + panic("no return value specified for ConfigFromEventAt") + } + + var r0 ocr2.ContractConfig + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt, uint64) (ocr2.ContractConfig, error)); ok { + return rf(_a0, _a1, _a2) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt, uint64) ocr2.ContractConfig); ok { + r0 = rf(_a0, _a1, _a2) + } else { + r0 = ret.Get(0).(ocr2.ContractConfig) + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt, uint64) error); ok { + r1 = rf(_a0, _a1, _a2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LatestConfigDetails provides a mock function with given fields: _a0, _a1 +func (_m *OCR2Reader) LatestConfigDetails(_a0 context.Context, _a1 *felt.Felt) (ocr2.ContractConfigDetails, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for LatestConfigDetails") + } + + var r0 ocr2.ContractConfigDetails + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) (ocr2.ContractConfigDetails, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) ocr2.ContractConfigDetails); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(ocr2.ContractConfigDetails) + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LatestRoundData provides a mock function with given fields: _a0, _a1 +func (_m *OCR2Reader) LatestRoundData(_a0 context.Context, _a1 *felt.Felt) (ocr2.RoundData, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for LatestRoundData") + } + + var r0 ocr2.RoundData + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) (ocr2.RoundData, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) ocr2.RoundData); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(ocr2.RoundData) + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LatestTransmissionDetails provides a mock function with given fields: _a0, _a1 +func (_m *OCR2Reader) LatestTransmissionDetails(_a0 context.Context, _a1 *felt.Felt) (ocr2.TransmissionDetails, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for LatestTransmissionDetails") + } + + var r0 ocr2.TransmissionDetails + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) (ocr2.TransmissionDetails, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) ocr2.TransmissionDetails); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Get(0).(ocr2.TransmissionDetails) + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LinkAvailableForPayment provides a mock function with given fields: _a0, _a1 +func (_m *OCR2Reader) LinkAvailableForPayment(_a0 context.Context, _a1 *felt.Felt) (*big.Int, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for LinkAvailableForPayment") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) (*big.Int, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) *big.Int); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewTransmissionsFromEventsAt provides a mock function with given fields: _a0, _a1, _a2 +func (_m *OCR2Reader) NewTransmissionsFromEventsAt(_a0 context.Context, _a1 *felt.Felt, _a2 uint64) ([]ocr2.NewTransmissionEvent, error) { + ret := _m.Called(_a0, _a1, _a2) + + if len(ret) == 0 { + panic("no return value specified for NewTransmissionsFromEventsAt") + } + + var r0 []ocr2.NewTransmissionEvent + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt, uint64) ([]ocr2.NewTransmissionEvent, error)); ok { + return rf(_a0, _a1, _a2) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt, uint64) []ocr2.NewTransmissionEvent); ok { + r0 = rf(_a0, _a1, _a2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]ocr2.NewTransmissionEvent) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt, uint64) error); ok { + r1 = rf(_a0, _a1, _a2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewOCR2Reader creates a new instance of OCR2Reader. 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 NewOCR2Reader(t interface { + mock.TestingT + Cleanup(func()) +}) *OCR2Reader { + mock := &OCR2Reader{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/relayer/pkg/chainlink/ocr2/providers.go b/relayer/pkg/chainlink/ocr2/providers.go new file mode 100644 index 000000000..343ab3595 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/providers.go @@ -0,0 +1,161 @@ +package ocr2 + +import ( + "context" + "fmt" + + "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + relaytypes "github.com/smartcontractkit/chainlink-common/pkg/types" + "github.com/smartcontractkit/chainlink-common/pkg/utils" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2/medianreport" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/txm" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +var _ relaytypes.ConfigProvider = (*configProvider)(nil) + +type configProvider struct { + utils.StartStopOnce + + reader Reader + contractCache *contractCache + digester types.OffchainConfigDigester + + lggr logger.Logger +} + +func NewConfigProvider(chainID string, contractAddress string, basereader starknet.Reader, cfg Config, lggr logger.Logger) (*configProvider, error) { + lggr = logger.Named(lggr, "ConfigProvider") + chainReader, err := NewClient(basereader, lggr) + if err != nil { + return nil, fmt.Errorf("err in NewConfigProvider.NewClient: %w", err) + } + + reader := NewContractReader(contractAddress, chainReader, lggr) + cache := NewContractCache(cfg, reader, lggr) + digester := NewOffchainConfigDigester(chainID, contractAddress) + + return &configProvider{ + reader: reader, + contractCache: cache, + digester: digester, + lggr: lggr, + }, nil +} + +func (p *configProvider) Name() string { + return p.lggr.Name() +} + +func (p *configProvider) Start(context.Context) error { + return p.StartOnce("ConfigProvider", func() error { + p.lggr.Debugf("Config provider starting") + return p.contractCache.Start() + }) +} + +func (p *configProvider) Close() error { + return p.StopOnce("ConfigProvider", func() error { + p.lggr.Debugf("Config provider stopping") + return p.contractCache.Close() + }) +} + +func (p *configProvider) HealthReport() map[string]error { + return map[string]error{p.Name(): p.Healthy()} +} + +func (p *configProvider) ContractConfigTracker() types.ContractConfigTracker { + return p.contractCache +} + +func (p *configProvider) OffchainConfigDigester() types.OffchainConfigDigester { + return p.digester +} + +var _ relaytypes.MedianProvider = (*medianProvider)(nil) + +type medianProvider struct { + *configProvider + transmitter types.ContractTransmitter + transmissionsCache *transmissionsCache + reportCodec median.ReportCodec +} + +func NewMedianProvider(chainID string, contractAddress string, senderAddress string, accountAddress string, basereader starknet.Reader, cfg Config, txm txm.TxManager, lggr logger.Logger) (*medianProvider, error) { + lggr = logger.Named(lggr, "MedianProvider") + configProvider, err := NewConfigProvider(chainID, contractAddress, basereader, cfg, lggr) + if err != nil { + return nil, fmt.Errorf("error in NewMedianProvider.NewConfigProvider: %w", err) + } + + cache := NewTransmissionsCache(cfg, configProvider.reader, lggr) + transmitter := NewContractTransmitter(cache, contractAddress, senderAddress, accountAddress, txm) + + return &medianProvider{ + configProvider: configProvider, + transmitter: transmitter, + transmissionsCache: cache, + reportCodec: medianreport.ReportCodec{}, + }, nil +} + +func (p *medianProvider) Name() string { + return p.lggr.Name() +} + +func (p *medianProvider) Start(context.Context) error { + return p.StartOnce("MedianProvider", func() error { + p.lggr.Debugf("Median provider starting") + // starting both cache services here + // todo: find a better way + if err := p.configProvider.contractCache.Start(); err != nil { + return fmt.Errorf("couldn't start contractCache: %w", err) + } + return p.transmissionsCache.Start() + }) +} + +func (p *medianProvider) Close() error { + return p.StopOnce("MedianProvider", func() error { + p.lggr.Debugf("Median provider stopping") + // stopping both cache services here + // todo: find a better way + if err := p.configProvider.contractCache.Close(); err != nil { + return fmt.Errorf("coulnd't stop contractCache: %w", err) + } + return p.transmissionsCache.Close() + }) +} + +func (p *medianProvider) HealthReport() map[string]error { + return map[string]error{p.Name(): p.Healthy()} +} + +func (p *medianProvider) ContractTransmitter() types.ContractTransmitter { + return p.transmitter +} + +func (p *medianProvider) ReportCodec() median.ReportCodec { + return p.reportCodec +} + +func (p *medianProvider) MedianContract() median.MedianContract { + return p.transmissionsCache +} + +func (p *medianProvider) OnchainConfigCodec() median.OnchainConfigCodec { + return medianreport.OnchainConfigCodec{} +} + +func (p *medianProvider) ChainReader() relaytypes.ContractReader { + return nil +} + +func (p *medianProvider) Codec() relaytypes.Codec { + return nil +} diff --git a/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzEncoding/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 b/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzEncoding/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 new file mode 100644 index 000000000..67322c704 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzEncoding/caf81e9797b19c76c1fc4dbf537d4d81f389524539f402d13aa01f93a65ac7e9 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("") diff --git a/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzReportCodecMedianFromReport/a027c0abbee32f49cd1a35d5c9b9bea24ec8bb8ee322e03d12b98b6a90367d45 b/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzReportCodecMedianFromReport/a027c0abbee32f49cd1a35d5c9b9bea24ec8bb8ee322e03d12b98b6a90367d45 new file mode 100644 index 000000000..b83d99930 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzReportCodecMedianFromReport/a027c0abbee32f49cd1a35d5c9b9bea24ec8bb8ee322e03d12b98b6a90367d45 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000") diff --git a/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzReportCodecMedianFromReport/ef90fb60d9b326ffdcebdf49782fb2ea099a8dba26e80f2652b621cd5c180bb2 b/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzReportCodecMedianFromReport/ef90fb60d9b326ffdcebdf49782fb2ea099a8dba26e80f2652b621cd5c180bb2 new file mode 100644 index 000000000..483a977b4 --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzReportCodecMedianFromReport/ef90fb60d9b326ffdcebdf49782fb2ea099a8dba26e80f2652b621cd5c180bb2 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") diff --git a/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzReportCodecMedianFromReport/f285bc28d7b7e7006a25508b22bf71aceb4f9ecd5849401dbc4f549fb9233e53 b/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzReportCodecMedianFromReport/f285bc28d7b7e7006a25508b22bf71aceb4f9ecd5849401dbc4f549fb9233e53 new file mode 100644 index 000000000..98c4f157d --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/testdata/fuzz/FuzzReportCodecMedianFromReport/f285bc28d7b7e7006a25508b22bf71aceb4f9ecd5849401dbc4f549fb9233e53 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("0000000000000000000000000000000000000000000000000000000000000000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000\x00\x00\x00\x00\x00\x00\x0000000000000000000000000000000000") diff --git a/relayer/pkg/chainlink/ocr2/transmissions_cache.go b/relayer/pkg/chainlink/ocr2/transmissions_cache.go new file mode 100644 index 000000000..7928738cd --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/transmissions_cache.go @@ -0,0 +1,146 @@ +package ocr2 + +import ( + "context" + "errors" + "fmt" + "math/big" + "sync" + "time" + + "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/utils" +) + +var _ Tracker = (*transmissionsCache)(nil) +var _ median.MedianContract = (*transmissionsCache)(nil) + +type transmissionsCache struct { + transmissionDetails TransmissionDetails + tdLock sync.RWMutex + tdLastCheckedAt time.Time + + stop, done chan struct{} + + reader Reader + cfg Config + lggr logger.Logger +} + +func NewTransmissionsCache(cfg Config, reader Reader, lggr logger.Logger) *transmissionsCache { + return &transmissionsCache{ + cfg: cfg, + reader: reader, + lggr: lggr, + stop: make(chan struct{}), + done: make(chan struct{}), + transmissionDetails: TransmissionDetails{ + LatestAnswer: big.NewInt(0), // should always return at least 0 and not nil + }, + } +} + +func (c *transmissionsCache) updateTransmission(ctx context.Context) error { + digest, epoch, round, answer, timestamp, err := c.reader.LatestTransmissionDetails(ctx) + if err != nil { + return fmt.Errorf("couldn't fetch latest transmission details: %w", err) + } + + c.tdLock.Lock() + defer c.tdLock.Unlock() + c.tdLastCheckedAt = time.Now() + c.transmissionDetails = TransmissionDetails{ + Digest: digest, + Epoch: epoch, + Round: round, + LatestAnswer: answer, + LatestTimestamp: timestamp, + } + + c.lggr.Debugw("transmission cache update", "details", c.transmissionDetails) + + return nil +} + +func (c *transmissionsCache) Start() error { + ctx, cancel := utils.ContextFromChan(c.stop) + defer cancel() + if err := c.updateTransmission(ctx); err != nil { + c.lggr.Warnf("failed to populate initial transmission details: %v", err) + } + go c.poll() + return nil +} + +func (c *transmissionsCache) Close() error { + close(c.stop) + return nil +} + +func (c *transmissionsCache) poll() { + defer close(c.done) + tick := time.After(0) + for { + select { + case <-c.stop: + return + case <-tick: + ctx, cancel := utils.ContextFromChan(c.stop) + + if err := c.updateTransmission(ctx); err != nil { + c.lggr.Errorf("Failed to update transmission: %v", err) + } + cancel() + + tick = time.After(utils.WithJitter(c.cfg.OCR2CachePollPeriod())) + } + } +} + +func (c *transmissionsCache) LatestTransmissionDetails( + ctx context.Context, +) ( + configDigest types.ConfigDigest, + epoch uint32, + round uint8, + latestAnswer *big.Int, + latestTimestamp time.Time, + err error, +) { + c.tdLock.RLock() + defer c.tdLock.RUnlock() + configDigest = c.transmissionDetails.Digest + epoch = c.transmissionDetails.Epoch + round = c.transmissionDetails.Round + latestAnswer = c.transmissionDetails.LatestAnswer + latestTimestamp = c.transmissionDetails.LatestTimestamp + err = c.assertTransmissionsNotStale() + return +} + +func (c *transmissionsCache) LatestRoundRequested( + ctx context.Context, + lookback time.Duration, +) ( + configDigest types.ConfigDigest, + epoch uint32, + round uint8, + err error, +) { + return c.reader.LatestRoundRequested(ctx, lookback) +} + +func (c *transmissionsCache) assertTransmissionsNotStale() error { + if c.tdLastCheckedAt.IsZero() { + return errors.New("transmissions cache not yet initialized") + } + + if since := time.Since(c.tdLastCheckedAt); since > c.cfg.OCR2CacheTTL() { + return fmt.Errorf("transmissions cache expired: checked last %s ago", since) + } + + return nil +} diff --git a/relayer/pkg/chainlink/ocr2/types.go b/relayer/pkg/chainlink/ocr2/types.go new file mode 100644 index 000000000..24a21e0fc --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/types.go @@ -0,0 +1,84 @@ +package ocr2 + +import ( + "fmt" + "math" + "math/big" + "time" + + "github.com/NethermindEth/juno/core/felt" + "github.com/smartcontractkit/libocr/offchainreporting2/types" +) + +type ContractConfigDetails struct { + Block uint64 + Digest types.ConfigDigest +} + +func NewContractConfigDetails(blockNum *big.Int, digest [32]byte) (ccd ContractConfigDetails, err error) { + return ContractConfigDetails{ + Block: blockNum.Uint64(), + Digest: digest, + }, nil +} + +type ContractConfig struct { + Config types.ContractConfig + ConfigBlock uint64 +} + +type TransmissionDetails struct { + Digest types.ConfigDigest + Epoch uint32 + Round uint8 + LatestAnswer *big.Int + LatestTimestamp time.Time +} + +type BillingDetails struct { + ObservationPaymentGJuels uint64 + TransmissionPaymentGJuels uint64 +} + +func NewBillingDetails(observationPaymentGJuels *big.Int, transmissionPaymentGJuels *big.Int) (bd BillingDetails, err error) { + return BillingDetails{ + ObservationPaymentGJuels: observationPaymentGJuels.Uint64(), + TransmissionPaymentGJuels: transmissionPaymentGJuels.Uint64(), + }, nil +} + +type RoundData struct { + RoundID uint32 + Answer *big.Int + BlockNumber uint64 + StartedAt time.Time + UpdatedAt time.Time +} + +func NewRoundData(felts []*felt.Felt) (data RoundData, err error) { + if len(felts) != 5 { + return data, fmt.Errorf("expected number of felts to be 5 but got %d", len(felts)) + } + roundID := felts[0].BigInt(big.NewInt(0)) + if !roundID.IsUint64() && roundID.Uint64() > math.MaxUint32 { + return data, fmt.Errorf("aggregator round id does not fit in a uint32 '%s'", felts[0].String()) + } + data.RoundID = uint32(roundID.Uint64()) + data.Answer = felts[1].BigInt(big.NewInt(0)) + blockNumber := felts[2].BigInt(big.NewInt(0)) + if !blockNumber.IsUint64() { + return data, fmt.Errorf("block number '%s' does not fit into uint64", blockNumber.String()) + } + data.BlockNumber = blockNumber.Uint64() + startedAt := felts[3].BigInt(big.NewInt(0)) + if !startedAt.IsInt64() { + return data, fmt.Errorf("startedAt '%s' does not fit into int64", startedAt.String()) + } + data.StartedAt = time.Unix(startedAt.Int64(), 0) + updatedAt := felts[4].BigInt(big.NewInt(0)) + if !updatedAt.IsInt64() { + return data, fmt.Errorf("updatedAt '%s' does not fit into int64", startedAt.String()) + } + data.UpdatedAt = time.Unix(updatedAt.Int64(), 0) + return data, nil +} diff --git a/relayer/pkg/chainlink/ocr2/types_test.go b/relayer/pkg/chainlink/ocr2/types_test.go new file mode 100644 index 000000000..3c30b9d1d --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/types_test.go @@ -0,0 +1,40 @@ +package ocr2 + +import ( + "math/big" + "testing" + "time" + + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/stretchr/testify/require" +) + +func TestNewRoundData(t *testing.T) { + raw := []string{ + "0x121e", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffca5b1701", + "0x1087", + "0x633344a3", + "0x633344a5", + } + + felts, err := starknetutils.HexArrToFelt(raw) + require.NoError(t, err) + actualRound, err := NewRoundData(felts) + require.NoError(t, err) + expectedRound := RoundData{ + RoundID: 0x121e, + Answer: bigIntFromString("3618502788666131213697322783095070105623107215331596699973092056134972020481"), + BlockNumber: 0x1087, + StartedAt: time.Unix(int64(0x633344a3), 0), + UpdatedAt: time.Unix(int64(0x633344a5), 0), + } + require.Equal(t, expectedRound, actualRound) +} + +// Helpers + +func bigIntFromString(s string) *big.Int { + out, _ := new(big.Int).SetString(s, 10) + return out +} diff --git a/relayer/pkg/chainlink/ocr2/utils.go b/relayer/pkg/chainlink/ocr2/utils.go new file mode 100644 index 000000000..2ec62d7ae --- /dev/null +++ b/relayer/pkg/chainlink/ocr2/utils.go @@ -0,0 +1,28 @@ +package ocr2 + +import ( + "encoding/binary" + "math/big" + + "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +func parseEpochAndRound(felt *big.Int) (epoch uint32, round uint8) { + var epochAndRound [starknet.FeltLength]byte + felt.FillBytes(epochAndRound[:]) + epoch = binary.BigEndian.Uint32(epochAndRound[starknet.FeltLength-5 : starknet.FeltLength-1]) + round = epochAndRound[starknet.FeltLength-1] + return epoch, round +} + +/* Testing utils - do not use (XXX) outside testing context */ + +func XXXMustBytesToConfigDigest(b []byte) types.ConfigDigest { + c, err := types.BytesToConfigDigest(b) + if err != nil { + panic(err) + } + return c +} diff --git a/relayer/pkg/chainlink/relay.go b/relayer/pkg/chainlink/relay.go new file mode 100644 index 000000000..8ef911bba --- /dev/null +++ b/relayer/pkg/chainlink/relay.go @@ -0,0 +1,141 @@ +package chainlink + +import ( + "context" + "encoding/json" + "errors" + "fmt" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/services" + relaytypes "github.com/smartcontractkit/chainlink-common/pkg/types" + "github.com/smartcontractkit/chainlink-common/pkg/types/core" + + starkchain "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/chain" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/ocr2" +) + +var _ relaytypes.Relayer = (*relayer)(nil) //nolint:staticcheck + +type relayer struct { + chain starkchain.Chain + stopCh services.StopChan + + lggr logger.Logger +} + +func NewRelayer(lggr logger.Logger, chain starkchain.Chain, capRegistry core.CapabilitiesRegistry) *relayer { + return &relayer{ + chain: chain, + stopCh: make(chan struct{}), + lggr: lggr, + } +} + +func (r *relayer) Name() string { + return r.lggr.Name() +} + +func (r *relayer) Start(context.Context) error { + return nil +} + +func (r *relayer) Close() error { + close(r.stopCh) + return nil +} + +func (r *relayer) Ready() error { + return r.chain.Ready() +} + +func (r *relayer) Healthy() error { return nil } + +func (r *relayer) HealthReport() map[string]error { + return map[string]error{r.Name(): r.Healthy()} +} + +func (r *relayer) NewChainWriter(_ context.Context, _ []byte) (relaytypes.ChainWriter, error) { + return nil, errors.New("chain writer is not supported for starknet") +} + +func (r *relayer) NewContractReader(_ []byte) (relaytypes.ContractReader, error) { + return nil, errors.New("contract reader is not supported for starknet") +} + +func (r *relayer) NewConfigProvider(args relaytypes.RelayArgs) (relaytypes.ConfigProvider, error) { + var relayConfig RelayConfig + + err := json.Unmarshal(args.RelayConfig, &relayConfig) + if err != nil { + return nil, fmt.Errorf("couldn't unmarshal RelayConfig: %w", err) + } + + reader, err := r.chain.Reader() + if err != nil { + return nil, fmt.Errorf("error in NewConfigProvider chain.Reader: %w", err) + } + configProvider, err := ocr2.NewConfigProvider(r.chain.ID(), args.ContractID, reader, r.chain.Config(), r.lggr) + if err != nil { + return nil, fmt.Errorf("coudln't initialize ConfigProvider: %w", err) + } + + return configProvider, nil +} + +func (r *relayer) NewMedianProvider(rargs relaytypes.RelayArgs, pargs relaytypes.PluginArgs) (relaytypes.MedianProvider, error) { + var relayConfig RelayConfig + + err := json.Unmarshal(rargs.RelayConfig, &relayConfig) + if err != nil { + return nil, fmt.Errorf("couldn't unmarshal RelayConfig: %w", err) + } + + if relayConfig.AccountAddress == "" { + return nil, errors.New("no account address in relay config") + } + + // todo: use pargs for median provider + reader, err := r.chain.Reader() + if err != nil { + return nil, fmt.Errorf("error in NewMedianProvider chain.Reader: %w", err) + } + medianProvider, err := ocr2.NewMedianProvider(r.chain.ID(), rargs.ContractID, pargs.TransmitterID, relayConfig.AccountAddress, reader, r.chain.Config(), r.chain.TxManager(), r.lggr) + if err != nil { + return nil, fmt.Errorf("couldn't initilize MedianProvider: %w", err) + } + + return medianProvider, nil +} + +func (r *relayer) NewMercuryProvider(rargs relaytypes.RelayArgs, pargs relaytypes.PluginArgs) (relaytypes.MercuryProvider, error) { + return nil, errors.New("mercury is not supported for starknet") +} + +func (r *relayer) NewLLOProvider(rargs relaytypes.RelayArgs, pargs relaytypes.PluginArgs) (relaytypes.LLOProvider, error) { + return nil, errors.New("data streams is not supported for starknet") +} + +func (r *relayer) NewFunctionsProvider(rargs relaytypes.RelayArgs, pargs relaytypes.PluginArgs) (relaytypes.FunctionsProvider, error) { + return nil, errors.New("functions are not supported for solana") +} + +func (r *relayer) NewAutomationProvider(rargs relaytypes.RelayArgs, pargs relaytypes.PluginArgs) (relaytypes.AutomationProvider, error) { + return nil, errors.New("automation is not supported for starknet") +} + +func (r *relayer) NewPluginProvider(rargs relaytypes.RelayArgs, pargs relaytypes.PluginArgs) (relaytypes.PluginProvider, error) { + return nil, errors.New("plugin provider is not supported for starknet") +} + +func (r *relayer) NewOCR3CapabilityProvider(rargs relaytypes.RelayArgs, pargs relaytypes.PluginArgs) (relaytypes.OCR3CapabilityProvider, error) { + return nil, errors.New("ocr3 capability provider is not supported for starknet") +} + +func (r *relayer) NewCCIPCommitProvider(rargs relaytypes.RelayArgs, pargs relaytypes.PluginArgs) (relaytypes.CCIPCommitProvider, error) { + return nil, errors.New("ccip.commit is not supported for starknet") +} + +func (r *relayer) NewCCIPExecProvider(rargs relaytypes.RelayArgs, pargs relaytypes.PluginArgs) (relaytypes.CCIPExecProvider, error) { + return nil, errors.New("ccip.exec is not supported for starknet") +} diff --git a/relayer/pkg/chainlink/txm/config.go b/relayer/pkg/chainlink/txm/config.go new file mode 100644 index 000000000..6198b1270 --- /dev/null +++ b/relayer/pkg/chainlink/txm/config.go @@ -0,0 +1,11 @@ +package txm + +import "time" + +//go:generate mockery --name Config --output ./mocks/ --case=underscore --filename config.go + +// txm config +type Config interface { + ConfirmationPoll() time.Duration + TxTimeout() time.Duration +} diff --git a/relayer/pkg/chainlink/txm/keystore.go b/relayer/pkg/chainlink/txm/keystore.go new file mode 100644 index 000000000..4d4741155 --- /dev/null +++ b/relayer/pkg/chainlink/txm/keystore.go @@ -0,0 +1,54 @@ +package txm + +import ( + "context" + "errors" + "fmt" + "math/big" + + starknetaccount "github.com/NethermindEth/starknet.go/account" + + "github.com/smartcontractkit/chainlink-common/pkg/loop" + adapters "github.com/smartcontractkit/chainlink-common/pkg/loop/adapters/starknet" +) + +// KeystoreAdapter is a starknet-specific adaption layer to translate between the generic Loop Keystore (bytes) and +// the type specific caigo Keystore (big.Int) +type KeystoreAdapter interface { + starknetaccount.Keystore + Loopp() loop.Keystore +} + +// keystoreAdapter implements [KeystoreAdapter]. +type keystoreAdapter struct { + looppKs loop.Keystore +} + +// NewKeystoreAdapter instantiates the KeystoreAdapter interface +// The implementation requires that the given [looppKs] produces a signature [loop.Keystore.Sign] +// that is []byte representation of [adapters.Signature] +// Callers are responsible for ensuring that the given LOOPp Keystore encodes +// signatures correctly. +func NewKeystoreAdapter(lk loop.Keystore) KeystoreAdapter { + return &keystoreAdapter{looppKs: lk} +} + +var ErrBadAdapterEncoding = errors.New("failed to decode raw signature as adapter signature") + +// Sign implements the caigo Keystore Sign func. Returns [ErrBadAdapterSignature] if the signature cannot be +// decoded from the [loop.Keystore] implementation +func (ca *keystoreAdapter) Sign(ctx context.Context, senderAddress string, hash *big.Int) (*big.Int, *big.Int, error) { + raw, err := ca.looppKs.Sign(ctx, senderAddress, hash.Bytes()) + if err != nil { + return nil, nil, fmt.Errorf("error computing loopp keystore signature: %w", err) + } + starknetSig, serr := adapters.SignatureFromBytes(raw) + if serr != nil { + return nil, nil, fmt.Errorf("%w: %w", ErrBadAdapterEncoding, serr) + } + return starknetSig.Ints() +} + +func (ca *keystoreAdapter) Loopp() loop.Keystore { + return ca.looppKs +} diff --git a/relayer/pkg/chainlink/txm/keystore_test.go b/relayer/pkg/chainlink/txm/keystore_test.go new file mode 100644 index 000000000..6cf531250 --- /dev/null +++ b/relayer/pkg/chainlink/txm/keystore_test.go @@ -0,0 +1,51 @@ +package txm_test + +import ( + "context" + "math/big" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/loop" + adapters "github.com/smartcontractkit/chainlink-common/pkg/loop/adapters/starknet" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/txm" +) + +func TestKeystoreAdapterImpl(t *testing.T) { + t.Run("valid loop keystore impl", func(t *testing.T) { + goodLoopSignFn := func(ctx context.Context, account string, data []byte) (signed []byte, err error) { + sig, err := adapters.SignatureFromBigInts(big.NewInt(7), big.NewInt(11)) + require.NoError(t, err) + return sig.Bytes() + } + ksa := txm.NewKeystoreAdapter(&testLoopKeystore{signFn: goodLoopSignFn}) + + _, _, err := ksa.Sign(context.Background(), "anything", big.NewInt(42)) + require.NoError(t, err) + }) + t.Run("invalid loop keystore impl", func(t *testing.T) { + badLoopSignFn := func(ctx context.Context, account string, data []byte) (signed []byte, err error) { + return []byte("not an adapter signature"), nil + } + ksa := txm.NewKeystoreAdapter(&testLoopKeystore{signFn: badLoopSignFn}) + + _, _, err := ksa.Sign(context.Background(), "anything", big.NewInt(42)) + require.ErrorIs(t, err, txm.ErrBadAdapterEncoding) + }) +} + +type testLoopKeystore struct { + signFn func(ctx context.Context, account string, data []byte) (signed []byte, err error) +} + +var _ loop.Keystore = &testLoopKeystore{} + +func (lk *testLoopKeystore) Sign(ctx context.Context, account string, data []byte) (signed []byte, err error) { + return lk.signFn(ctx, account, data) +} + +func (lk *testLoopKeystore) Accounts(ctx context.Context) (accounts []string, err error) { + return nil, nil +} diff --git a/relayer/pkg/chainlink/txm/mocks/config.go b/relayer/pkg/chainlink/txm/mocks/config.go new file mode 100644 index 000000000..d66b14251 --- /dev/null +++ b/relayer/pkg/chainlink/txm/mocks/config.go @@ -0,0 +1,64 @@ +// Code generated by mockery v2.43.2. DO NOT EDIT. + +package mocks + +import ( + time "time" + + mock "github.com/stretchr/testify/mock" +) + +// Config is an autogenerated mock type for the Config type +type Config struct { + mock.Mock +} + +// ConfirmationPoll provides a mock function with given fields: +func (_m *Config) ConfirmationPoll() time.Duration { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for ConfirmationPoll") + } + + var r0 time.Duration + if rf, ok := ret.Get(0).(func() time.Duration); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(time.Duration) + } + + return r0 +} + +// TxTimeout provides a mock function with given fields: +func (_m *Config) TxTimeout() time.Duration { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for TxTimeout") + } + + var r0 time.Duration + if rf, ok := ret.Get(0).(func() time.Duration); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(time.Duration) + } + + return r0 +} + +// NewConfig creates a new instance of Config. 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 NewConfig(t interface { + mock.TestingT + Cleanup(func()) +}) *Config { + mock := &Config{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/relayer/pkg/chainlink/txm/test_helpers.go b/relayer/pkg/chainlink/txm/test_helpers.go new file mode 100644 index 000000000..ac3399154 --- /dev/null +++ b/relayer/pkg/chainlink/txm/test_helpers.go @@ -0,0 +1,89 @@ +package txm + +import ( + "bytes" + "net/http" + "os/exec" + "testing" + "time" + + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/utils" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" +) + +var ( + // seed = 0 keys for starknet-devnet + PrivateKeys0Seed = []string{ + "0xe3e70682c2094cac629f6fbed82c07cd", + "0xf728b4fa42485e3a0a5d2f346baa9455", + "0xeb1167b367a9c3787c65c1e582e2e662", + "0xf7c1bd874da5e709d4713d60c8a70639", + "0xe443df789558867f5ba91faf7a024204", + "0x23a7711a8133287637ebdcd9e87a1613", + "0x1846d424c17c627923c6612f48268673", + "0xfcbd04c340212ef7cca5a5a19e4d6e3c", + "0xb4862b21fb97d43588561712e8e5216a", + "0x259f4329e6f4590b9a164106cf6a659e", + } +) + +// SetupLocalStarknetNode sets up a local starknet node via cli, and returns the url +func SetupLocalStarknetNode(t *testing.T) string { + ctx := tests.Context(t) + port := utils.MustRandomPort(t) + url := "http://127.0.0.1:" + port + cmd := exec.Command("starknet-devnet", + "--seed", "0", // use same seed for testing + "--port", port, + ) + var stdErr bytes.Buffer + cmd.Stderr = &stdErr + require.NoError(t, cmd.Start()) + t.Cleanup(func() { + assert.NoError(t, cmd.Process.Kill()) + if err2 := cmd.Wait(); assert.Error(t, err2) { + if !assert.Contains(t, err2.Error(), "signal: killed", cmd.ProcessState.String()) { + t.Log("starknet-devnet stderr:", stdErr.String()) + } + } + t.Log("starknet-devnet server closed") + }) + + // Wait for api server to boot + var ready bool + for i := 0; i < 30; i++ { + time.Sleep(time.Second) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url+"/is_alive", nil) + if err != nil { + t.Fatalf("failed to create request: %v", err) + } + res, err := http.DefaultClient.Do(req) + if err != nil || res.StatusCode != 200 { + t.Logf("API server not ready yet (attempt %d)\n", i+1) + continue + } + ready = true + t.Logf("API server ready at %s\n", url) + break + } + require.True(t, ready) + return url +} + +func TestKeys(t *testing.T, count int) (rawkeys [][]byte) { + require.True(t, len(PrivateKeys0Seed) >= count, "requested more keys than available") + for i, k := range PrivateKeys0Seed { + // max number of keys to generate + if i >= count { + break + } + f, _ := starknetutils.HexToFelt(k) + keyBytes := f.Bytes() + rawkeys = append(rawkeys, keyBytes[:]) + } + return rawkeys +} diff --git a/relayer/pkg/chainlink/txm/txm.go b/relayer/pkg/chainlink/txm/txm.go new file mode 100644 index 000000000..37613676f --- /dev/null +++ b/relayer/pkg/chainlink/txm/txm.go @@ -0,0 +1,506 @@ +package txm + +import ( + "context" + "errors" + "fmt" + "math/big" + "strings" + "sync" + "time" + + "github.com/NethermindEth/juno/core/felt" + starknetaccount "github.com/NethermindEth/starknet.go/account" + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + starknetutils "github.com/NethermindEth/starknet.go/utils" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/loop" + "github.com/smartcontractkit/chainlink-common/pkg/services" + "github.com/smartcontractkit/chainlink-common/pkg/utils" + + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +const ( + MaxQueueLen = 1000 +) + +type TxManager interface { + Enqueue(accountAddress *felt.Felt, publicKey *felt.Felt, txFn starknetrpc.FunctionCall) error + InflightCount() (int, int) +} + +type Tx struct { + publicKey *felt.Felt + accountAddress *felt.Felt + call starknetrpc.FunctionCall +} + +type StarkTXM interface { + services.Service + TxManager +} + +type starktxm struct { + starter utils.StartStopOnce + lggr logger.Logger + done sync.WaitGroup + stop chan struct{} + queue chan Tx + ks KeystoreAdapter + cfg Config + + client *utils.LazyLoad[*starknet.Client] + feederClient *utils.LazyLoad[*starknet.FeederClient] + accountStore *AccountStore +} + +func New(lggr logger.Logger, keystore loop.Keystore, cfg Config, getClient func() (*starknet.Client, error), + getFeederClient func() (*starknet.FeederClient, error)) (StarkTXM, error) { + txm := &starktxm{ + lggr: logger.Named(lggr, "StarknetTxm"), + queue: make(chan Tx, MaxQueueLen), + stop: make(chan struct{}), + client: utils.NewLazyLoad(getClient), + feederClient: utils.NewLazyLoad(getFeederClient), + ks: NewKeystoreAdapter(keystore), + cfg: cfg, + accountStore: NewAccountStore(), + } + + return txm, nil +} + +func (txm *starktxm) Name() string { + return txm.lggr.Name() +} + +func (txm *starktxm) Start(ctx context.Context) error { + return txm.starter.StartOnce("starktxm", func() error { + txm.done.Add(2) // waitgroup: broadcast loop and confirm loop + go txm.broadcastLoop() + go txm.confirmLoop() + + return nil + }) +} + +func (txm *starktxm) broadcastLoop() { + defer txm.done.Done() + + ctx, cancel := utils.ContextFromChan(txm.stop) + defer cancel() + + txm.lggr.Debugw("broadcastLoop: started") + for { + select { + case <-txm.stop: + txm.lggr.Debugw("broadcastLoop: stopped") + return + case tx := <-txm.queue: + if _, err := txm.client.Get(); err != nil { + txm.lggr.Errorw("failed to fetch client: skipping processing tx", "error", err) + continue + } + + // broadcast tx serially - wait until accepted by mempool before processing next + hash, err := txm.broadcast(ctx, tx.publicKey, tx.accountAddress, tx.call) + if err != nil { + txm.lggr.Errorw("transaction failed to broadcast", "error", err, "tx", tx.call) + } else { + txm.lggr.Infow("transaction broadcast", "txhash", hash) + } + } + } +} + +const FeeMargin uint32 = 115 +const RPCNonceErrMsg = "Invalid transaction nonce" + +func (txm *starktxm) estimateFriFee(ctx context.Context, client *starknet.Client, accountAddress *felt.Felt, tx starknetrpc.InvokeTxnV3) (*starknetrpc.FeeEstimate, *felt.Felt, error) { + // skip prevalidation, which is known to overestimate amount of gas needed and error with L1GasBoundsExceedsBalance + simFlags := []starknetrpc.SimulationFlag{starknetrpc.SKIP_VALIDATE} + + var largestEstimateNonce *felt.Felt + + for i := 1; i <= 5; i++ { + txm.lggr.Infow("attempt to estimate fee", "attempt", i) + + estimateNonce, err := client.AccountNonce(ctx, accountAddress) + if err != nil { + return nil, nil, fmt.Errorf("failed to check account nonce: %+w", err) + } + tx.Nonce = estimateNonce + + if largestEstimateNonce == nil || estimateNonce.Cmp(largestEstimateNonce) > 0 { + largestEstimateNonce = estimateNonce + } + + feeEstimate, err := client.Provider.EstimateFee(ctx, []starknetrpc.BroadcastTxn{tx}, simFlags, starknetrpc.BlockID{Tag: "pending"}) + if err != nil { + var dataErr *starknetrpc.RPCError + if !errors.As(err, &dataErr) { + return nil, nil, fmt.Errorf("failed to read EstimateFee error: %T %+v", err, err) + } + data := dataErr.Data + dataStr := fmt.Sprintf("%+v", data) + + txm.lggr.Errorw("failed to estimate fee", "attempt", i, "error", err, "data", dataStr) + + if strings.Contains(dataStr, RPCNonceErrMsg) { + continue + } + + return nil, nil, fmt.Errorf("failed to estimate fee: %T %+v", err, err) + } + + // track the FRI estimate, but keep looping so we print out all estimates + var friEstimate *starknetrpc.FeeEstimate + for j, f := range feeEstimate { + txm.lggr.Infow("Estimated fee", "attempt", i, "index", j, "EstimateNonce", estimateNonce, "GasConsumed", f.GasConsumed, "GasPrice", f.GasPrice, "DataGasConsumed", f.DataGasConsumed, "DataGasPrice", f.DataGasPrice, "OverallFee", f.OverallFee, "FeeUnit", string(f.FeeUnit)) + if f.FeeUnit == "FRI" { + friEstimate = &feeEstimate[j] + } + } + if friEstimate != nil { + return friEstimate, largestEstimateNonce, nil + } + + txm.lggr.Errorw("No FRI estimate was returned", "attempt", i) + } + + txm.lggr.Errorw("all attempts to estimate fee failed") + return nil, nil, fmt.Errorf("all attempts to estimate fee failed") +} + +func (txm *starktxm) broadcast(ctx context.Context, publicKey *felt.Felt, accountAddress *felt.Felt, call starknetrpc.FunctionCall) (txhash string, err error) { + client, err := txm.client.Get() + if err != nil { + txm.client.Reset() + return txhash, fmt.Errorf("broadcast: failed to fetch client: %+w", err) + } + + txStore := txm.accountStore.GetTxStore(accountAddress) + if txStore == nil { + initialNonce, accountNonceErr := client.AccountNonce(ctx, accountAddress) + if accountNonceErr != nil { + return txhash, fmt.Errorf("failed to check account nonce during TxStore creation: %+w", accountNonceErr) + } + newTxStore, createErr := txm.accountStore.CreateTxStore(accountAddress, initialNonce) + if createErr != nil { + return txhash, fmt.Errorf("failed to create TxStore: %+w", createErr) + } + txStore = newTxStore + } + + // create new account + cairoVersion := 2 + account, err := starknetaccount.NewAccount(client.Provider, accountAddress, publicKey.String(), txm.ks, cairoVersion) + if err != nil { + return txhash, fmt.Errorf("failed to create new account: %+w", err) + } + + tx := starknetrpc.InvokeTxnV3{ + Type: starknetrpc.TransactionType_Invoke, + SenderAddress: account.AccountAddress, + Version: starknetrpc.TransactionV3, + Signature: []*felt.Felt{}, + Nonce: &felt.Zero, // filled in below + ResourceBounds: starknetrpc.ResourceBoundsMapping{ + L1Gas: starknetrpc.ResourceBounds{ + MaxAmount: "0x0", + MaxPricePerUnit: "0x0", + }, + L2Gas: starknetrpc.ResourceBounds{ + MaxAmount: "0x0", + MaxPricePerUnit: "0x0", + }, + }, + Tip: "0x0", + PayMasterData: []*felt.Felt{}, + AccountDeploymentData: []*felt.Felt{}, + NonceDataMode: starknetrpc.DAModeL1, + FeeMode: starknetrpc.DAModeL1, + } + + // Building the Calldata with the help of FmtCalldata where we pass in the FnCall struct along with the Cairo version + tx.Calldata, err = account.FmtCalldata([]starknetrpc.FunctionCall{call}) + if err != nil { + return txhash, err + } + + friEstimate, largestEstimateNonce, err := txm.estimateFriFee(ctx, client, accountAddress, tx) + if err != nil { + return txhash, fmt.Errorf("failed to get FRI estimate: %+w", err) + } + + nonce := txStore.GetNextNonce() + if largestEstimateNonce.Cmp(nonce) > 0 { + // The nonce value returned from the node during estimation is greater than our expected next nonce + // - which means that we are behind, due to a resync. Fast forward our locally tracked nonce value. + // See resyncNonce for a more detailed explanation. + staleTxs := txStore.SetNextNonce(largestEstimateNonce) + txm.lggr.Infow("fast-forwarding nonce after resync", "previousNonce", nonce, "updatedNonce", largestEstimateNonce, "staleTxs", len(staleTxs)) + if len(staleTxs) > 0 { + txm.lggr.Errorw("unexpected stale transactions after nonce fast-forward", "accountAddress", accountAddress) + } + nonce = largestEstimateNonce + } + + // TODO: consider making this configurable + // pad estimate to 250% (add extra because estimate did not include validation) + gasConsumed := friEstimate.GasConsumed.BigInt(new(big.Int)) + expandedGas := new(big.Int).Mul(gasConsumed, big.NewInt(250)) + maxGas := new(big.Int).Div(expandedGas, big.NewInt(100)) + tx.ResourceBounds.L1Gas.MaxAmount = starknetrpc.U64(starknetutils.BigIntToFelt(maxGas).String()) + + // pad by 150% + gasPrice := friEstimate.GasPrice.BigInt(new(big.Int)) + overallFee := friEstimate.OverallFee.BigInt(new(big.Int)) // overallFee = gas_used*gas_price + data_gas_used*data_gas_price + + // TODO: consider making this configurable + // pad estimate to 150% (add extra because estimate did not include validation) + gasUnits := new(big.Int).Div(overallFee, gasPrice) + expandedGasUnits := new(big.Int).Mul(gasUnits, big.NewInt(150)) + maxGasUnits := new(big.Int).Div(expandedGasUnits, big.NewInt(100)) + tx.ResourceBounds.L1Gas.MaxAmount = starknetrpc.U64(starknetutils.BigIntToFelt(maxGasUnits).String()) + + // pad by 150% + expandedGasPrice := new(big.Int).Mul(gasPrice, big.NewInt(150)) + maxGasPrice := new(big.Int).Div(expandedGasPrice, big.NewInt(100)) + tx.ResourceBounds.L1Gas.MaxPricePerUnit = starknetrpc.U128(starknetutils.BigIntToFelt(maxGasPrice).String()) + + txm.lggr.Infow("Set resource bounds", "L1MaxAmount", tx.ResourceBounds.L1Gas.MaxAmount, "L1MaxPricePerUnit", tx.ResourceBounds.L1Gas.MaxPricePerUnit) + + tx.Nonce = nonce + // Re-sign transaction now that we've determined MaxFee + // TODO: SignInvokeTransaction for V3 is missing so we do it by hand + hash, err := account.TransactionHashInvoke(tx) + if err != nil { + return txhash, err + } + signature, err := account.Sign(ctx, hash) + if err != nil { + return txhash, err + } + tx.Signature = signature + + execCtx, execCancel := context.WithTimeout(ctx, txm.cfg.TxTimeout()) + defer execCancel() + + // finally, transmit the invoke + res, err := account.AddInvokeTransaction(execCtx, tx) + if err != nil { + // TODO: handle initial broadcast errors - what kind of errors occur? + var dataErr *starknetrpc.RPCError + var dataStr string + if !errors.As(err, &dataErr) { + return txhash, fmt.Errorf("failed to read EstimateFee error: %T %+v", err, err) + } + data := dataErr.Data + dataStr = fmt.Sprintf("%+v", data) + txm.lggr.Errorw("failed to invoke tx", "accountAddress", accountAddress, "error", err, "data", dataStr) + + if strings.Contains(dataStr, RPCNonceErrMsg) { + // if we see an invalid nonce error at the broadcast stage, that means that we are out of sync. + // see the comment at resyncNonce for more details. + if resyncErr := txm.resyncNonce(ctx, client, accountAddress); resyncErr != nil { + txm.lggr.Errorw("failed to resync nonce after unsuccessful invoke", "error", err, "resyncError", resyncErr) + return txhash, fmt.Errorf("failed to resync after bad invoke: %+w", err) + } + } + return txhash, fmt.Errorf("failed to invoke tx: %+w", err) + } + // handle nil pointer + if res == nil { + return txhash, errors.New("execute response and error are nil") + } + + // update nonce if transaction is successful + txhash = res.TransactionHash.String() + err = txStore.AddUnconfirmed(nonce, txhash, call, publicKey) + if err != nil { + return txhash, fmt.Errorf("failed to add unconfirmed tx: %+w", err) + } + return txhash, nil +} + +func (txm *starktxm) confirmLoop() { + defer txm.done.Done() + + ctx, cancel := utils.ContextFromChan(txm.stop) + defer cancel() + + tick := time.After(txm.cfg.ConfirmationPoll()) + + txm.lggr.Debugw("confirmLoop: started") + + for { + var start time.Time + select { + case <-tick: + start = time.Now() + client, err := txm.client.Get() + if err != nil { + txm.lggr.Errorw("failed to load client", "error", err) + break + } + + allUnconfirmedTxs := txm.accountStore.GetAllUnconfirmed() + for accountAddressStr, unconfirmedTxs := range allUnconfirmedTxs { + accountAddress, err := new(felt.Felt).SetString(accountAddressStr) + // this should never occur because the acccount address string key was created from the account address felt. + if err != nil { + txm.lggr.Errorw("could not recreate account address felt", "accountAddress", accountAddressStr) + continue + } + for _, unconfirmedTx := range unconfirmedTxs { + hash := unconfirmedTx.Hash + f, err := starknetutils.HexToFelt(hash) + if err != nil { + txm.lggr.Errorw("invalid felt value", "hash", hash) + continue + } + response, err := client.Provider.GetTransactionStatus(ctx, f) + + // tx can be rejected due to a nonce error. but we cannot know from the Starknet RPC directly so we have to wait for + // a broadcasted tx to fail in order to fix the nonce errors + + if err != nil { + txm.lggr.Errorw("failed to fetch transaction status", "hash", hash, "nonce", unconfirmedTx.Nonce, "error", err) + continue + } + + finalityStatus := response.FinalityStatus + executionStatus := response.ExecutionStatus + + // any finalityStatus other than received + if finalityStatus == starknetrpc.TxnStatus_Accepted_On_L1 || finalityStatus == starknetrpc.TxnStatus_Accepted_On_L2 || finalityStatus == starknetrpc.TxnStatus_Rejected { + txm.lggr.Debugw(fmt.Sprintf("tx confirmed: %s", finalityStatus), "hash", hash, "nonce", unconfirmedTx.Nonce, "finalityStatus", finalityStatus) + if err := txm.accountStore.GetTxStore(accountAddress).Confirm(unconfirmedTx.Nonce, hash); err != nil { + txm.lggr.Errorw("failed to confirm tx in TxStore", "hash", hash, "accountAddress", accountAddress, "error", err) + } + } + + // currently, feeder client is only way to get rejected reason + if finalityStatus == starknetrpc.TxnStatus_Rejected { + // we assume that all rejected transactions results in a unused rejected nonce, so + // resync. see the comment at resyncNonce for more details. + if resyncErr := txm.resyncNonce(ctx, client, accountAddress); resyncErr != nil { + txm.lggr.Errorw("resync failed for rejected tx", "error", resyncErr) + } + + go txm.logFeederError(ctx, hash, f) + } + + if executionStatus == starknetrpc.TxnExecutionStatusREVERTED { + // TODO: get revert reason? + txm.lggr.Errorw("transaction reverted", "hash", hash) + } + } + } + case <-txm.stop: + txm.lggr.Debugw("confirmLoop: stopped") + return + } + t := txm.cfg.ConfirmationPoll() - time.Since(start) + tick = time.After(utils.WithJitter(t.Abs())) + } +} + +func (txm *starktxm) logFeederError(ctx context.Context, hash string, f *felt.Felt) { + feederClient, err := txm.feederClient.Get() + if err != nil { + txm.lggr.Errorw("failed to load feeder client", "error", err) + return + } + + rejectedTx, err := feederClient.TransactionFailure(ctx, f) + if err != nil { + txm.lggr.Errorw("failed to fetch reason for transaction failure", "hash", hash, "error", err) + return + } + + txm.lggr.Errorw("feeder rejected reason", "hash", hash, "errorMessage", rejectedTx.ErrorMessage) +} + +func (txm *starktxm) resyncNonce(ctx context.Context, client *starknet.Client, accountAddress *felt.Felt) error { + /* + the follow errors indicate that there could be a problem with our locally tracked nonce value: + 1. a EstimateFee was successful, but broadcasting using the locally tracked nonce results in a nonce error, + 2. a transaction was rejected after a successful broadcast. + + for these cases, we call starknet_getNonce from the RPC node and resync the locally tracked next nonce + with the RPC node's value. + + however, while the value returned by starknet_getNonce is eventually consistent, it can be lower than the actual + next nonce value when pending transactions haven't yet been processed - resulting in more category 1 + invalid nonce broadcast errors. + + in order to recover from these cases, each time we do starknet_getNonce during estimation (see estimateFriFee), + we compare it with our locally tracked nonce - if it is greater, than that means our locally tracked value is + behind, and we fast forward. this ensures our locally tracked value will also eventually be correct. + */ + + rpcNonce, err := client.AccountNonce(ctx, accountAddress) + if err != nil { + return fmt.Errorf("failed to check nonce during resync: %+w", err) + } + + txStore := txm.accountStore.GetTxStore(accountAddress) + currentNonce := txStore.GetNextNonce() + + if rpcNonce.Cmp(currentNonce) == 0 { + txm.lggr.Infow("resync nonce skipped, nonce value is the same", "accountAddress", accountAddress, "nonce", currentNonce) + return nil + } + + staleTxs := txStore.SetNextNonce(rpcNonce) + + txm.lggr.Infow("resynced nonce", "accountAddress", "accountAddress", "previousNonce", currentNonce, "updatedNonce", rpcNonce, "staleTxCount", len(staleTxs)) + + return nil +} + +func (txm *starktxm) Close() error { + return txm.starter.StopOnce("starktxm", func() error { + close(txm.stop) + txm.done.Wait() + return nil + }) +} + +func (txm *starktxm) Healthy() error { + return txm.starter.Healthy() +} + +func (txm *starktxm) Ready() error { + return txm.starter.Ready() +} + +func (txm *starktxm) HealthReport() map[string]error { + return map[string]error{txm.Name(): txm.Healthy()} +} + +func (txm *starktxm) Enqueue(accountAddress, publicKey *felt.Felt, tx starknetrpc.FunctionCall) error { + // validate key exists for sender + // use the embedded Loopp Keystore to do this; the spec and design + // encourage passing nil data to the loop.Keystore.Sign as way to test + // existence of a key + if _, err := txm.ks.Loopp().Sign(context.Background(), publicKey.String(), nil); err != nil { + return fmt.Errorf("enqueue: failed to sign: %+w", err) + } + + select { + case txm.queue <- Tx{publicKey: publicKey, accountAddress: accountAddress, call: tx}: // TODO fix naming here + default: + return fmt.Errorf("failed to enqueue transaction: %+v", tx) + } + + return nil +} + +func (txm *starktxm) InflightCount() (queue int, unconfirmed int) { + return len(txm.queue), txm.accountStore.GetTotalInflightCount() +} diff --git a/relayer/pkg/chainlink/txm/txm_test.go b/relayer/pkg/chainlink/txm/txm_test.go new file mode 100644 index 000000000..74d27fc53 --- /dev/null +++ b/relayer/pkg/chainlink/txm/txm_test.go @@ -0,0 +1,175 @@ +//go:build integration + +package txm + +import ( + "context" + "fmt" + "math/big" + "testing" + "time" + + "github.com/NethermindEth/starknet.go/curve" + "github.com/NethermindEth/starknet.go/devnet" + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/loop" + adapters "github.com/smartcontractkit/chainlink-common/pkg/loop/adapters/starknet" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/txm/mocks" + "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +func TestIntegration_Txm(t *testing.T) { + n := 2 // number of txs per key + // url := SetupLocalStarknetNode(t) + url := "http://127.0.0.1:5050" + devnet := devnet.NewDevNet(url) + accounts, err := devnet.Accounts() + require.NoError(t, err) + fmt.Println("qqq") + + // parse keys into expected format + type Key struct { + PrivateKey *big.Int + Account string + } + localKeys := map[string]Key{} + for i := range accounts { + publicKey := accounts[i].PublicKey + fmt.Printf("account %v pubkey %v\n", accounts[i].Address, publicKey) + localKeys[publicKey] = Key{ + PrivateKey: starknetutils.HexToBN(accounts[i].PrivateKey), + Account: accounts[i].Address, + } + } + + // mock keystore + looppKs := NewLooppKeystore(func(publicKey string) (*big.Int, error) { + key, ok := localKeys[publicKey] + if !ok { + return nil, fmt.Errorf("key does not exist id=%s", publicKey) + } + return key.PrivateKey, nil + }) + ksAdapter := NewKeystoreAdapter(looppKs) + + lggr, observer := logger.TestObserved(t, zapcore.DebugLevel) + timeout := 10 * time.Second + client, err := starknet.NewClient("SN_SEPOLIA", url+"/rpc", "", lggr, &timeout) + require.NoError(t, err) + + getFeederClient := func() (*starknet.FeederClient, error) { + return starknet.NewTestFeederClient(t), nil + } + + getClient := func() (*starknet.Client, error) { + return client, err + } + + // mock config to prevent import cycle + cfg := mocks.NewConfig(t) + cfg.On("TxTimeout").Return(20 * time.Second) + cfg.On("ConfirmationPoll").Return(1 * time.Second) + + txm, err := New(lggr, ksAdapter.Loopp(), cfg, getClient, getFeederClient) + require.NoError(t, err) + + // ready fail if start not called + require.Error(t, txm.Ready()) + + // start txm + checks + require.NoError(t, txm.Start(context.Background())) + require.NoError(t, txm.Ready()) + fmt.Println("sss") + + for publicKeyStr := range localKeys { + publicKey, err := starknetutils.HexToFelt(publicKeyStr) + require.NoError(t, err) + + accountAddress, err := starknetutils.HexToFelt(localKeys[publicKeyStr].Account) + require.NoError(t, err) + + contractAddress, err := starknetutils.HexToFelt("0x49D36570D4E46F48E99674BD3FCC84644DDD6B96F7C741B1562B82F9E004DC7") + require.NoError(t, err) + + selector := starknetutils.GetSelectorFromNameFelt("totalSupply") + + for i := 0; i < n; i++ { + require.NoError(t, txm.Enqueue(accountAddress, publicKey, starknetrpc.FunctionCall{ + ContractAddress: contractAddress, // send to ETH token contract + EntryPointSelector: selector, + })) + } + } + var empty bool + for i := 0; i < 30; i++ { + time.Sleep(500 * time.Millisecond) + queued, unconfirmed := txm.InflightCount() + accepted := len(observer.FilterMessageSnippet("ACCEPTED_ON_L2").All()) + t.Logf("inflight count: queued (%d), unconfirmed (%d), accepted (%d)", queued, unconfirmed, accepted) + + // check queue + tx store counts are 0, accepted txs == total txs broadcast + if queued == 0 && unconfirmed == 0 && n*len(localKeys) == accepted { + empty = true + break + } + } + + // stop txm + assert.True(t, empty, "txm timed out while trying to confirm transactions") + require.NoError(t, txm.Close()) + require.Error(t, txm.Ready()) + assert.Equal(t, 0, observer.FilterLevelExact(zapcore.ErrorLevel).Len()) // assert no error logs + assert.Equal(t, n*len(localKeys), len(observer.FilterMessageSnippet("ACCEPTED_ON_L2").All())) // validate txs were successfully included on chain +} + +// LooppKeystore implements [loop.Keystore] interface and the requirements +// of signature d/encoding of the [KeystoreAdapter] +type LooppKeystore struct { + Get func(id string) (*big.Int, error) +} + +func NewLooppKeystore(get func(id string) (*big.Int, error)) *LooppKeystore { + return &LooppKeystore{ + Get: get, + } +} + +var _ loop.Keystore = &LooppKeystore{} + +// Sign implements [loop.Keystore] +// hash is expected to be the byte representation of big.Int +// the return []byte is encodes a starknet signature per [signature.bytes] +func (lk *LooppKeystore) Sign(ctx context.Context, id string, hash []byte) ([]byte, error) { + + k, err := lk.Get(id) + if err != nil { + return nil, err + } + // loopp spec requires passing nil hash to check existence of id + if hash == nil { + return nil, nil + } + + starkHash := new(big.Int).SetBytes(hash) + x, y, err := curve.Curve.Sign(starkHash, k) + if err != nil { + return nil, fmt.Errorf("error signing data with curve: %w", err) + } + + sig, err := adapters.SignatureFromBigInts(x, y) + if err != nil { + return nil, err + } + return sig.Bytes() +} + +// TODO what is this supposed to return for starknet? +func (lk *LooppKeystore) Accounts(ctx context.Context) ([]string, error) { + return nil, fmt.Errorf("unimplemented") +} diff --git a/relayer/pkg/chainlink/txm/txstore.go b/relayer/pkg/chainlink/txm/txstore.go new file mode 100644 index 000000000..943857bcb --- /dev/null +++ b/relayer/pkg/chainlink/txm/txstore.go @@ -0,0 +1,187 @@ +package txm + +import ( + "fmt" + "sort" + "sync" + + "github.com/NethermindEth/juno/core/felt" + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + "golang.org/x/exp/maps" +) + +type UnconfirmedTx struct { + Hash string + PublicKey *felt.Felt + Nonce *felt.Felt + Call starknetrpc.FunctionCall +} + +// TxStore tracks broadcast & unconfirmed txs per account address per chain id +type TxStore struct { + lock sync.RWMutex + + nextNonce *felt.Felt + unconfirmedNonces map[string]*UnconfirmedTx +} + +func NewTxStore(initialNonce *felt.Felt) *TxStore { + return &TxStore{ + nextNonce: new(felt.Felt).Set(initialNonce), + unconfirmedNonces: map[string]*UnconfirmedTx{}, + } +} + +func (s *TxStore) SetNextNonce(newNextNonce *felt.Felt) []*UnconfirmedTx { + s.lock.Lock() + defer s.lock.Unlock() + + staleTxs := []*UnconfirmedTx{} + s.nextNonce = new(felt.Felt).Set(newNextNonce) + + // Remove any stale transactions with nonces greater than the new next nonce. + for nonceStr, tx := range s.unconfirmedNonces { + if tx.Nonce.Cmp(s.nextNonce) >= 0 { + staleTxs = append(staleTxs, tx) + delete(s.unconfirmedNonces, nonceStr) + } + } + + sort.Slice(staleTxs, func(i, j int) bool { + a := staleTxs[i] + b := staleTxs[j] + return a.Nonce.Cmp(b.Nonce) < 0 + }) + + return staleTxs +} + +func (s *TxStore) GetNextNonce() *felt.Felt { + s.lock.Lock() + defer s.lock.Unlock() + return new(felt.Felt).Set(s.nextNonce) +} + +func (s *TxStore) AddUnconfirmed(nonce *felt.Felt, hash string, call starknetrpc.FunctionCall, publicKey *felt.Felt) error { + s.lock.Lock() + defer s.lock.Unlock() + + if nonce.Cmp(s.nextNonce) < 0 { + return fmt.Errorf("tried to add an unconfirmed tx at an old nonce: expected %s, got %s", s.nextNonce, nonce) + } + if nonce.Cmp(s.nextNonce) > 0 { + return fmt.Errorf("tried to add an unconfirmed tx at a future nonce: expected %s, got %s", s.nextNonce, nonce) + } + + nonceStr := nonce.String() + if h, exists := s.unconfirmedNonces[nonceStr]; exists { + return fmt.Errorf("nonce used: tried to use nonce (%s) for tx (%s), already used by (%s)", nonce, h.Hash, h) + } + + s.unconfirmedNonces[nonceStr] = &UnconfirmedTx{ + Nonce: new(felt.Felt).Set(nonce), + PublicKey: new(felt.Felt).Set(publicKey), + Hash: hash, + Call: call, + } + + s.nextNonce = new(felt.Felt).Add(s.nextNonce, new(felt.Felt).SetUint64(1)) + return nil +} + +func (s *TxStore) Confirm(nonce *felt.Felt, hash string) error { + s.lock.Lock() + defer s.lock.Unlock() + + nonceStr := nonce.String() + unconfirmed, exists := s.unconfirmedNonces[nonceStr] + if !exists { + return fmt.Errorf("no such unconfirmed nonce: %s", nonce) + } + // sanity check that the hash matches + if unconfirmed.Hash != hash { + return fmt.Errorf("unexpected tx hash: expected %s, got %s", unconfirmed.Hash, hash) + } + delete(s.unconfirmedNonces, nonceStr) + return nil +} + +func (s *TxStore) GetUnconfirmed() []*UnconfirmedTx { + s.lock.RLock() + defer s.lock.RUnlock() + + unconfirmed := maps.Values(s.unconfirmedNonces) + sort.Slice(unconfirmed, func(i, j int) bool { + a := unconfirmed[i] + b := unconfirmed[j] + return a.Nonce.Cmp(b.Nonce) < 0 + }) + + return unconfirmed +} + +func (s *TxStore) InflightCount() int { + s.lock.RLock() + defer s.lock.RUnlock() + return len(s.unconfirmedNonces) +} + +type AccountStore struct { + store map[string]*TxStore // map account address to txstore + lock sync.RWMutex +} + +func NewAccountStore() *AccountStore { + return &AccountStore{ + store: map[string]*TxStore{}, + } +} + +func (c *AccountStore) CreateTxStore(accountAddress *felt.Felt, initialNonce *felt.Felt) (*TxStore, error) { + c.lock.Lock() + defer c.lock.Unlock() + addressStr := accountAddress.String() + _, ok := c.store[addressStr] + if ok { + return nil, fmt.Errorf("TxStore already exists: %s", accountAddress) + } + store := NewTxStore(initialNonce) + c.store[addressStr] = store + return store, nil +} + +// GetTxStore returns the TxStore for the provided account. +func (c *AccountStore) GetTxStore(accountAddress *felt.Felt) *TxStore { + c.lock.Lock() + defer c.lock.Unlock() + store, ok := c.store[accountAddress.String()] + if !ok { + return nil + } + return store +} + +func (c *AccountStore) GetTotalInflightCount() int { + // use read lock for methods that read underlying data + c.lock.RLock() + defer c.lock.RUnlock() + + count := 0 + for _, store := range c.store { + count += store.InflightCount() + } + + return count +} + +func (c *AccountStore) GetAllUnconfirmed() map[string][]*UnconfirmedTx { + // use read lock for methods that read underlying data + c.lock.RLock() + defer c.lock.RUnlock() + + allUnconfirmed := map[string][]*UnconfirmedTx{} + for accountAddressStr, store := range c.store { + allUnconfirmed[accountAddressStr] = store.GetUnconfirmed() + } + return allUnconfirmed +} diff --git a/relayer/pkg/chainlink/txm/txstore_test.go b/relayer/pkg/chainlink/txm/txstore_test.go new file mode 100644 index 000000000..27c5d82e9 --- /dev/null +++ b/relayer/pkg/chainlink/txm/txstore_test.go @@ -0,0 +1,232 @@ +package txm + +import ( + "errors" + "fmt" + "sync" + "testing" + + "github.com/NethermindEth/juno/core/felt" + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestTxStore(t *testing.T) { + t.Parallel() + + t.Run("happypath", func(t *testing.T) { + t.Parallel() + + call := starknetrpc.FunctionCall{ + ContractAddress: new(felt.Felt).SetUint64(0), + EntryPointSelector: new(felt.Felt).SetUint64(0), + } + + nonce := new(felt.Felt).SetUint64(3) + publicKey := new(felt.Felt).SetUint64(7) + + s := NewTxStore(nonce) + assert.True(t, s.GetNextNonce().Cmp(nonce) == 0) + assert.Equal(t, 0, s.InflightCount()) + require.NoError(t, s.AddUnconfirmed(nonce, "0x42", call, publicKey)) + assert.Equal(t, 1, s.InflightCount()) + assert.Equal(t, 1, len(s.GetUnconfirmed())) + assert.Equal(t, "0x42", s.GetUnconfirmed()[0].Hash) + require.NoError(t, s.Confirm(nonce, "0x42")) + assert.Equal(t, 0, s.InflightCount()) + assert.Equal(t, 0, len(s.GetUnconfirmed())) + assert.True(t, s.GetNextNonce().Cmp(new(felt.Felt).Add(nonce, new(felt.Felt).SetUint64(1))) == 0) + }) + + t.Run("save", func(t *testing.T) { + t.Parallel() + + // create + s := NewTxStore(new(felt.Felt).SetUint64(0)) + + call := starknetrpc.FunctionCall{ + ContractAddress: new(felt.Felt).SetUint64(0), + EntryPointSelector: new(felt.Felt).SetUint64(0), + } + + publicKey := new(felt.Felt).SetUint64(7) + + // accepts tx in order + require.NoError(t, s.AddUnconfirmed(new(felt.Felt).SetUint64(0), "0x0", call, publicKey)) + assert.Equal(t, 1, s.InflightCount()) + + // reject tx that skips a nonce + require.ErrorContains(t, s.AddUnconfirmed(new(felt.Felt).SetUint64(2), "0x2", call, publicKey), "tried to add an unconfirmed tx at a future nonce") + assert.Equal(t, 1, s.InflightCount()) + + // accepts a subsequent tx + require.NoError(t, s.AddUnconfirmed(new(felt.Felt).SetUint64(1), "0x1", call, publicKey)) + assert.Equal(t, 2, s.InflightCount()) + + // reject already in use nonce + require.ErrorContains(t, s.AddUnconfirmed(new(felt.Felt).SetUint64(1), "0xskip", call, publicKey), "tried to add an unconfirmed tx at an old nonce") + assert.Equal(t, 2, s.InflightCount()) + + // race save + var err0 error + var err1 error + var wg sync.WaitGroup + wg.Add(2) + go func() { + err0 = s.AddUnconfirmed(new(felt.Felt).SetUint64(2), "0x10", call, publicKey) + wg.Done() + }() + go func() { + err1 = s.AddUnconfirmed(new(felt.Felt).SetUint64(2), "0x10", call, publicKey) + wg.Done() + }() + wg.Wait() + assert.True(t, !errors.Is(err0, err1) && ((err0 != nil && err1 == nil) || (err0 == nil && err1 != nil))) + assert.Equal(t, 3, s.InflightCount()) + + // check that returned unconfirmed tx's are sorted + unconfirmed := s.GetUnconfirmed() + assert.Equal(t, 3, len(unconfirmed)) + assert.Equal(t, 0, unconfirmed[0].Nonce.Cmp(new(felt.Felt).SetUint64(0))) + assert.Equal(t, 0, unconfirmed[1].Nonce.Cmp(new(felt.Felt).SetUint64(1))) + assert.Equal(t, 0, unconfirmed[2].Nonce.Cmp(new(felt.Felt).SetUint64(2))) + }) + + t.Run("confirm", func(t *testing.T) { + t.Parallel() + + call := starknetrpc.FunctionCall{ + ContractAddress: new(felt.Felt).SetUint64(0), + EntryPointSelector: new(felt.Felt).SetUint64(0), + } + + publicKey := new(felt.Felt).SetUint64(7) + + // init store + s := NewTxStore(new(felt.Felt).SetUint64(0)) + for i := 0; i < 6; i++ { + require.NoError(t, s.AddUnconfirmed(new(felt.Felt).SetUint64(uint64(i)), "0x"+fmt.Sprintf("%d", i), call, publicKey)) + } + + // confirm in order + require.NoError(t, s.Confirm(new(felt.Felt).SetUint64(0), "0x0")) + require.NoError(t, s.Confirm(new(felt.Felt).SetUint64(1), "0x1")) + assert.Equal(t, 4, s.InflightCount()) + + // confirm out of order + require.NoError(t, s.Confirm(new(felt.Felt).SetUint64(4), "0x4")) + require.NoError(t, s.Confirm(new(felt.Felt).SetUint64(3), "0x3")) + require.NoError(t, s.Confirm(new(felt.Felt).SetUint64(2), "0x2")) + assert.Equal(t, 1, s.InflightCount()) + + // confirm unknown/duplicate + require.ErrorContains(t, s.Confirm(new(felt.Felt).SetUint64(10), "0x10"), "no such unconfirmed nonce") + // confirm with incorrect hash + require.ErrorContains(t, s.Confirm(new(felt.Felt).SetUint64(5), "0x99"), "unexpected tx hash") + + // race confirm + var err0 error + var err1 error + var wg sync.WaitGroup + wg.Add(2) + go func() { + err0 = s.Confirm(new(felt.Felt).SetUint64(5), "0x5") + wg.Done() + }() + go func() { + err1 = s.Confirm(new(felt.Felt).SetUint64(5), "0x5") + wg.Done() + }() + wg.Wait() + assert.True(t, !errors.Is(err0, err1) && ((err0 != nil && err1 == nil) || (err0 == nil && err1 != nil))) + assert.Equal(t, 0, s.InflightCount()) + }) + + t.Run("resync", func(t *testing.T) { + t.Parallel() + + call := starknetrpc.FunctionCall{ + ContractAddress: new(felt.Felt).SetUint64(0), + EntryPointSelector: new(felt.Felt).SetUint64(0), + } + + publicKey := new(felt.Felt).SetUint64(7) + txCount := 6 + + // init store + s := NewTxStore(new(felt.Felt).SetUint64(0)) + for i := 0; i < txCount; i++ { + require.NoError(t, s.AddUnconfirmed(new(felt.Felt).SetUint64(uint64(i)), "0x"+fmt.Sprintf("%d", i), call, publicKey)) + } + assert.Equal(t, s.InflightCount(), txCount) + + staleTxs := s.SetNextNonce(new(felt.Felt).SetUint64(0)) + + assert.Equal(t, len(staleTxs), txCount) + for i := 0; i < txCount; i++ { + staleTx := staleTxs[i] + assert.Equal(t, staleTx.Nonce.Cmp(new(felt.Felt).SetUint64(uint64(i))), 0) + assert.Equal(t, staleTx.Call, call) + assert.Equal(t, staleTx.PublicKey.Cmp(publicKey), 0) + assert.Equal(t, staleTx.Hash, "0x"+fmt.Sprintf("%d", i)) + } + assert.Equal(t, s.InflightCount(), 0) + + for i := 0; i < txCount; i++ { + require.NoError(t, s.AddUnconfirmed(new(felt.Felt).SetUint64(uint64(i)), "0x"+fmt.Sprintf("%d", i), call, publicKey)) + } + + newNextNonce := uint64(txCount - 1) + staleTxs = s.SetNextNonce(new(felt.Felt).SetUint64(newNextNonce)) + assert.Equal(t, len(staleTxs), 1) + assert.Equal(t, staleTxs[0].Nonce.Cmp(new(felt.Felt).SetUint64(newNextNonce)), 0) + }) +} + +func TestAccountStore(t *testing.T) { + t.Parallel() + + c := NewAccountStore() + + felt0 := new(felt.Felt).SetUint64(0) + felt1 := new(felt.Felt).SetUint64(1) + + store0, err := c.CreateTxStore(felt0, felt0) + require.NoError(t, err) + + store1, err := c.CreateTxStore(felt1, felt1) + require.NoError(t, err) + + _, err = c.CreateTxStore(felt0, felt0) + require.ErrorContains(t, err, "TxStore already exists") + + assert.Equal(t, store0, c.GetTxStore(felt0)) + assert.Equal(t, store1, c.GetTxStore(felt1)) + + assert.Equal(t, c.GetTotalInflightCount(), 0) + + publicKey := new(felt.Felt).SetUint64(2) + + call := starknetrpc.FunctionCall{ + ContractAddress: new(felt.Felt).SetUint64(0), + EntryPointSelector: new(felt.Felt).SetUint64(0), + } + + // inflight count + require.NoError(t, store0.AddUnconfirmed(felt0, "0x0", call, publicKey)) + require.NoError(t, store1.AddUnconfirmed(felt1, "0x1", call, publicKey)) + assert.Equal(t, c.GetTotalInflightCount(), 2) + + // get unconfirmed + m := c.GetAllUnconfirmed() + assert.Equal(t, 2, len(m)) + hashes0, ok := m[felt0.String()] + assert.True(t, ok) + assert.Equal(t, len(hashes0), 1) + assert.Equal(t, hashes0[0].Hash, "0x0") + hashes1, ok := m[felt1.String()] + assert.True(t, ok) + assert.Equal(t, len(hashes1), 1) + assert.Equal(t, hashes1[0].Hash, "0x1") +} diff --git a/relayer/pkg/chainlink/types.go b/relayer/pkg/chainlink/types.go new file mode 100644 index 000000000..df669be54 --- /dev/null +++ b/relayer/pkg/chainlink/types.go @@ -0,0 +1,8 @@ +package chainlink + +// [relayConfig] member of Chainlink's job spec v2 (OCR2 only currently) +type RelayConfig struct { + ChainID string `json:"chainID"` + AccountAddress string `json:"accountAddress"` // address of the account contract + NodeName string `json:"nodeName"` // optional, defaults to random node with 'chainID' +} diff --git a/relayer/pkg/starknet/chain_client.go b/relayer/pkg/starknet/chain_client.go new file mode 100644 index 000000000..d092195ab --- /dev/null +++ b/relayer/pkg/starknet/chain_client.go @@ -0,0 +1,228 @@ +package starknet + +import ( + "context" + "fmt" + + "github.com/NethermindEth/juno/core/felt" + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + gethrpc "github.com/ethereum/go-ethereum/rpc" +) + +// type alias for readibility +type FinalizedBlock = starknetrpc.Block + +// used to create batch requests +type BatchBuilder interface { + RequestBlockByHash(h *felt.Felt) BatchBuilder + RequestBlockByNumber(id uint64) BatchBuilder + RequestChainID() BatchBuilder + // RequestLatestPendingBlock() (BatchBuilder) + RequestLatestBlockHashAndNumber() BatchBuilder + RequestEventsByFilter(f starknetrpc.EventsInput) BatchBuilder + // RequestTxReceiptByHash(h *felt.Felt) (BatchBuilder) + Build() []gethrpc.BatchElem +} + +var _ BatchBuilder = (*batchBuilder)(nil) + +type batchBuilder struct { + args []gethrpc.BatchElem +} + +func (b *batchBuilder) RequestEventsByFilter(e starknetrpc.EventsInput) BatchBuilder { + b.args = append(b.args, gethrpc.BatchElem{ + Method: "starknet_getEvents", + Args: []interface{}{e}, + Result: &starknetrpc.EventChunk{}, + }) + return b +} + +func NewBatchBuilder() BatchBuilder { + return &batchBuilder{ + args: nil, + } +} + +func (b *batchBuilder) RequestChainID() BatchBuilder { + b.args = append(b.args, gethrpc.BatchElem{ + Method: "starknet_chainId", + Args: nil, + Result: new(string), + }) + return b +} + +func (b *batchBuilder) RequestBlockByHash(h *felt.Felt) BatchBuilder { + b.args = append(b.args, gethrpc.BatchElem{ + Method: "starknet_getBlockWithTxs", + Args: []interface{}{ + starknetrpc.BlockID{Hash: h}, + }, + Result: &FinalizedBlock{}, + }) + return b +} + +func (b *batchBuilder) RequestBlockByNumber(id uint64) BatchBuilder { + b.args = append(b.args, gethrpc.BatchElem{ + Method: "starknet_getBlockWithTxs", + Args: []interface{}{ + starknetrpc.BlockID{Number: &id}, + }, + Result: &FinalizedBlock{}, + }) + return b +} + +func (b *batchBuilder) RequestLatestBlockHashAndNumber() BatchBuilder { + b.args = append(b.args, gethrpc.BatchElem{ + Method: "starknet_blockHashAndNumber", + Args: nil, + Result: &starknetrpc.BlockHashAndNumberOutput{}, + }) + return b +} + +func (b *batchBuilder) Build() []gethrpc.BatchElem { + return b.args +} + +type ChainClient interface { + // only finalized blocks have a block hashes + BlockByHash(ctx context.Context, h *felt.Felt) (FinalizedBlock, error) + // only finalized blocks have numbers + BlockByNumber(ctx context.Context, id uint64) (FinalizedBlock, error) + ChainID(ctx context.Context) (string, error) + // only way to get the latest pending block (only 1 pending block exists at a time) + // LatestPendingBlock(ctx context.Context) (starknetrpc.PendingBlock, error) + // returns block number and block has of latest finalized block + LatestBlockHashAndNumber(ctx context.Context) (starknetrpc.BlockHashAndNumberOutput, error) + // get block logs, event logs, etc. + EventsByFilter(ctx context.Context, f starknetrpc.EventsInput) (starknetrpc.EventChunk, error) + // TxReceiptByHash(ctx context.Context, h *felt.Felt) (starknetrpc.TransactionReceipt, error) + Batch(ctx context.Context, builder BatchBuilder) ([]gethrpc.BatchElem, error) +} + +var _ ChainClient = (*Client)(nil) + +func (c *Client) ChainID(ctx context.Context) (string, error) { + // we do not use c.Provider.ChainID method because it caches + // the chainID after the first request + + results, err := c.Batch(ctx, NewBatchBuilder().RequestChainID()) + + if err != nil { + return "", fmt.Errorf("error in ChainID : %w", err) + } + + if len(results) != 1 { + return "", fmt.Errorf("unexpected result from ChainID") + } + + if results[0].Error != nil { + return "", fmt.Errorf("error in ChainID result: %w", results[0].Error) + } + + chainID, ok := results[0].Result.(*string) + + if !ok { + return "", fmt.Errorf("expected type string block but found: %T", chainID) + } + + return *chainID, nil +} + +func (c *Client) BlockByHash(ctx context.Context, h *felt.Felt) (FinalizedBlock, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + block, err := c.Provider.BlockWithTxs(ctx, starknetrpc.BlockID{Hash: h}) + + if err != nil { + return FinalizedBlock{}, fmt.Errorf("error in BlockByHash: %w", err) + } + + finalizedBlock, ok := block.(*FinalizedBlock) + + if !ok { + return FinalizedBlock{}, fmt.Errorf("expected type Finalized block but found: %T", block) + } + + return *finalizedBlock, nil +} + +func (c *Client) BlockByNumber(ctx context.Context, id uint64) (FinalizedBlock, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + block, err := c.Provider.BlockWithTxs(ctx, starknetrpc.BlockID{Number: &id}) + + if err != nil { + return FinalizedBlock{}, fmt.Errorf("error in BlockByNumber: %w", err) + } + + finalizedBlock, ok := block.(*FinalizedBlock) + + if !ok { + return FinalizedBlock{}, fmt.Errorf("expected type Finalized block but found: %T", block) + } + + return *finalizedBlock, nil +} + +func (c *Client) LatestBlockHashAndNumber(ctx context.Context) (starknetrpc.BlockHashAndNumberOutput, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + info, err := c.Provider.BlockHashAndNumber(ctx) + if err != nil { + return starknetrpc.BlockHashAndNumberOutput{}, fmt.Errorf("error in LatestBlockHashAndNumber: %w", err) + } + + return *info, nil +} + +func (c *Client) EventsByFilter(ctx context.Context, f starknetrpc.EventsInput) (starknetrpc.EventChunk, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + chunk, err := c.Provider.Events(ctx, f) + + if err != nil { + return starknetrpc.EventChunk{}, fmt.Errorf("error in EventsByFilter: %w", err) + } + + return *chunk, nil +} + +func (c *Client) Batch(ctx context.Context, builder BatchBuilder) ([]gethrpc.BatchElem, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + args := builder.Build() + + err := c.EthClient.BatchCallContext(ctx, args) + + if err != nil { + return nil, fmt.Errorf("error in Batch: %w", err) + } + + return args, nil +} diff --git a/relayer/pkg/starknet/chain_client_test.go b/relayer/pkg/starknet/chain_client_test.go new file mode 100644 index 000000000..dc3f8061a --- /dev/null +++ b/relayer/pkg/starknet/chain_client_test.go @@ -0,0 +1,329 @@ +package starknet + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/NethermindEth/juno/core/felt" + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" +) + +var ( + myTimeout = 100 * time.Second + blockNumber = 48719 + uintBlockNum = uint64(blockNumber) + blockHash, _ = new(felt.Felt).SetString("0x725407fcc3bd43e50884f50f1e0ef32aa9f814af3da475411934a7dbd4b41a") + blockResponse = []byte(` + "result": { + "status": "ACCEPTED_ON_L2", + "block_hash": "0x725407fcc3bd43e50884f50f1e0ef32aa9f814af3da475411934a7dbd4b41a", + "parent_hash": "0x5ac8b4099a26e9331a015f8437feadf56fa7fb447e8183aa1bdb3bf541a2cbb", + "block_number": 48719, + "new_root": "0x624f0f3cf2fbbd5951b0d90e4e1fc858f3d77cf34303781fcf3e4dc3afaf666", + "timestamp": 1710445796, + "sequencer_address": "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "l1_gas_price": { + "price_in_fri": "0x1d1a94a20000", + "price_in_wei": "0x4a817c800" + }, + "starknet_version": "0.13.1", + "transactions": [ + { + "transaction_hash": "0x27a9a9bc927efc37658acfb9c27b1fc56e7cfcf7a30db1ecdd9820bb2dddf0c", + "type": "INVOKE", + "version": "0x1", + "nonce": "0x62b", + "max_fee": "0x271963aac565a", + "sender_address": "0x42db30408353b25c5a0b3dd798bfe98eba08956786374e961cc5dbb9811ec6e", + "signature": [ + "0x66f70855f35096c6aea45be365617bc70fca65808bb85332dd3c2f6f4a86071", + "0x43c09cab9be65cdc59b29b8018c201c1eb42d51529cb9b5dd64859652bf827f" + ], + "calldata": [ + "0x1", + "0x517567ac7026ce129c950e6e113e437aa3c83716cd61481c6bb8c5057e6923e", + "0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126", + "0xa", + "0x53616d706c654465706f7369745374617274", + "0x8", + "0x4", + "0x18343d00000001", + "0x1", + "0x5", + "0x469", + "0x2", + "0x1", + "0x4eb" + ] + }] + }`) + eventResponse = []byte(` + "result": { + "events": [ + { + "from_address": "0x517567ac7026ce129c950e6e113e437aa3c83716cd61481c6bb8c5057e6923e", + "keys": [ + "0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef", + "0x496e76656e746f7279" + ], + "data": [ + "0x2", + "0x4690005", + "0x2", + "0xa", + "0x1", + "0x4a61fe0", + "0xa3013f8", + "0x0", + "0x0", + "0x2", + "0xaf", + "0x41f", + "0x81", + "0xb50a" + ], + "block_number": 48719, + "block_hash": "0x725407fcc3bd43e50884f50f1e0ef32aa9f814af3da475411934a7dbd4b41a", + "transaction_hash": "0x27a9a9bc927efc37658acfb9c27b1fc56e7cfcf7a30db1ecdd9820bb2dddf0c" + }, + { + "from_address": "0x517567ac7026ce129c950e6e113e437aa3c83716cd61481c6bb8c5057e6923e", + "keys": [ + "0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef", + "0x436f6e74726f6c" + ], + "data": [ + "0x1", + "0x116c0007", + "0x1", + "0x4eb" + ], + "block_number": 48719, + "block_hash": "0x725407fcc3bd43e50884f50f1e0ef32aa9f814af3da475411934a7dbd4b41a", + "transaction_hash": "0x27a9a9bc927efc37658acfb9c27b1fc56e7cfcf7a30db1ecdd9820bb2dddf0c" + } + ], + "continuation_token": "48719-2" + }`) + blockHashAndNumberResponse = fmt.Sprintf(`{"block_hash": "%s", "block_number": %d}`, + "0x725407fcc3bd43e50884f50f1e0ef32aa9f814af3da475411934a7dbd4b41a", + 48719, + ) + // hex-encoded value for "SN_SEPOLIA" + chainIDHex = "0x534e5f5345504f4c4941" + eventsInput = starknetrpc.EventsInput{ + EventFilter: starknetrpc.EventFilter{ + FromBlock: starknetrpc.BlockID{Number: &uintBlockNum}, + ToBlock: starknetrpc.BlockID{Number: &uintBlockNum}, + }, + ResultPageRequest: starknetrpc.ResultPageRequest{ + ChunkSize: 2, + }, + } +) + +func TestChainClient(t *testing.T) { + mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + req, _ := io.ReadAll(r.Body) + fmt.Println(r.RequestURI, r.URL, string(req)) + + var out []byte + + type Call struct { + Method string `json:"method"` + Params []json.RawMessage `json:"params"` + ID uint `json:"id,omitempty"` + } + + call := Call{} + errMarshal := json.Unmarshal(req, &call) + if errMarshal == nil { + switch call.Method { + case "starknet_getBlockWithTxs": + out = []byte(fmt.Sprintf(`{ %s }`, blockResponse)) + case "starknet_blockNumber": + out = []byte(`{"result": 1}`) + case "starknet_blockHashAndNumber": + out = []byte(fmt.Sprintf(`{"result": %s}`, blockHashAndNumberResponse)) + case "starknet_chainId": + out = []byte(fmt.Sprintf(`{"result": "%s"}`, chainIDHex)) + case "starknet_getEvents": + out = []byte(fmt.Sprintf(`{ %s }`, eventResponse)) + default: + require.False(t, true, "unsupported RPC method %s", call.Method) + } + } else { + // batch method + var batchCall []Call + errBatchMarshal := json.Unmarshal(req, &batchCall) + assert.NoError(t, errBatchMarshal) + + // special case where we test chainID call + if len(batchCall) == 1 { + response := fmt.Sprintf(` + [ + { "jsonrpc": "2.0", + "id": %d, + "result": "%s" + } + ]`, batchCall[0].ID, chainIDHex) + out = []byte(response) + } else { + response := fmt.Sprintf(` + [ + { "jsonrpc": "2.0", + "id": %d, + "result": "%s" + }, + { + "jsonrpc": "2.0", + "id": %d, + %s + }, + { + "jsonrpc": "2.0", + "id": %d, + %s + }, + { + "jsonrpc": "2.0", + "id": %d, + "result": %s + }, + { + "jsonrpc": "2.0", + "id": %d, + %s + } + ]`, batchCall[0].ID, chainIDHex, + batchCall[1].ID, blockResponse, + batchCall[2].ID, blockResponse, + batchCall[3].ID, blockHashAndNumberResponse, + batchCall[4].ID, eventResponse, + ) + + out = []byte(response) + } + } + + _, err := w.Write(out) + require.NoError(t, err) + })) + defer mockServer.Close() + + lggr := logger.Test(t) + client, err := NewClient(chainID, mockServer.URL, "", lggr, &myTimeout) + require.NoError(t, err) + assert.Equal(t, myTimeout, client.defaultTimeout) + + t.Run("get BlockByHash", func(t *testing.T) { + block, err := client.BlockByHash(context.TODO(), blockHash) + require.NoError(t, err) + assert.Equal(t, blockHash, block.BlockHash) + }) + + t.Run("get BlockByNumber", func(t *testing.T) { + block, err := client.BlockByNumber(context.TODO(), uint64(blockNumber)) + require.NoError(t, err) + assert.Equal(t, uint64(blockNumber), block.BlockNumber) + }) + + t.Run("get LatestBlockHashAndNumber", func(t *testing.T) { + output, err := client.LatestBlockHashAndNumber(context.TODO()) + require.NoError(t, err) + assert.Equal(t, blockHash, output.BlockHash) + assert.Equal(t, uint64(blockNumber), output.BlockNumber) + }) + + t.Run("get ChainID", func(t *testing.T) { + output, err := client.ChainID(context.TODO()) + require.NoError(t, err) + assert.Equal(t, chainIDHex, output) + }) + + t.Run("get Events", func(t *testing.T) { + blockNumber := uint64(blockNumber) + events, err := client.EventsByFilter(context.TODO(), eventsInput) + require.NoError(t, err) + + assert.Equal(t, 2, len(events.Events)) + assert.Equal(t, "48719-2", events.ContinuationToken) + for _, event := range events.Events { + assert.NotNil(t, event) + assert.Equal(t, blockNumber, event.BlockNumber) + assert.Equal(t, blockHash, event.BlockHash) + } + }) + + t.Run("get Batch", func(t *testing.T) { + builder := NewBatchBuilder() + builder. + RequestChainID(). + RequestBlockByHash(blockHash). + RequestBlockByNumber(uint64(blockNumber)). + RequestLatestBlockHashAndNumber(). + RequestEventsByFilter(eventsInput) + + results, err := client.Batch(context.TODO(), builder) + require.NoError(t, err) + + assert.Equal(t, 5, len(results)) + + t.Run("gets ChainID in Batch", func(t *testing.T) { + assert.Equal(t, "starknet_chainId", results[0].Method) + assert.Nil(t, results[0].Error) + id, ok := results[0].Result.(*string) + assert.True(t, ok) + assert.Equal(t, chainIDHex, *id) + }) + + t.Run("gets BlockByHash in Batch", func(t *testing.T) { + assert.Equal(t, "starknet_getBlockWithTxs", results[1].Method) + assert.Nil(t, results[1].Error) + block, ok := results[1].Result.(*FinalizedBlock) + assert.True(t, ok) + assert.Equal(t, blockHash, block.BlockHash) + }) + + t.Run("gets BlockByNumber in Batch", func(t *testing.T) { + assert.Equal(t, "starknet_getBlockWithTxs", results[2].Method) + assert.Nil(t, results[2].Error) + block, ok := results[2].Result.(*FinalizedBlock) + assert.True(t, ok) + assert.Equal(t, uint64(blockNumber), block.BlockNumber) + }) + + t.Run("gets LatestBlockHashAndNumber in Batch", func(t *testing.T) { + assert.Equal(t, "starknet_blockHashAndNumber", results[3].Method) + assert.Nil(t, results[3].Error) + info, ok := results[3].Result.(*starknetrpc.BlockHashAndNumberOutput) + assert.True(t, ok) + assert.Equal(t, blockHash, info.BlockHash) + assert.Equal(t, uint64(blockNumber), info.BlockNumber) + }) + + t.Run("gets EventsByFilter in Batch", func(t *testing.T) { + assert.Equal(t, "starknet_getEvents", results[4].Method) + assert.Nil(t, results[4].Error) + events, ok := results[4].Result.(*starknetrpc.EventChunk) + assert.True(t, ok) + assert.Equal(t, 2, len(events.Events)) + assert.Equal(t, "48719-2", events.ContinuationToken) + for _, event := range events.Events { + assert.NotNil(t, event) + assert.Equal(t, uint64(blockNumber), event.BlockNumber) + assert.Equal(t, blockHash, event.BlockHash) + } + }) + }) +} diff --git a/relayer/pkg/starknet/client.go b/relayer/pkg/starknet/client.go new file mode 100644 index 000000000..9b473ea16 --- /dev/null +++ b/relayer/pkg/starknet/client.go @@ -0,0 +1,210 @@ +package starknet + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/NethermindEth/juno/core/felt" + starknetrpc "github.com/NethermindEth/starknet.go/rpc" + ethrpc "github.com/ethereum/go-ethereum/rpc" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" +) + +//go:generate mockery --name Reader --output ./mocks/ + +type Reader interface { + CallContract(context.Context, CallOps) ([]*felt.Felt, error) + LatestBlockHeight(context.Context) (uint64, error) + + // provider interface + BlockWithTxHashes(ctx context.Context, blockID starknetrpc.BlockID) (*starknetrpc.Block, error) + Call(context.Context, starknetrpc.FunctionCall, starknetrpc.BlockID) ([]*felt.Felt, error) + Events(ctx context.Context, input starknetrpc.EventsInput) (*starknetrpc.EventChunk, error) + TransactionByHash(context.Context, *felt.Felt) (starknetrpc.Transaction, error) + TransactionReceipt(context.Context, *felt.Felt) (starknetrpc.TransactionReceipt, error) + AccountNonce(context.Context, *felt.Felt) (*felt.Felt, error) +} + +type Writer interface { +} + +type ReaderWriter interface { + Reader + Writer +} + +var _ ReaderWriter = (*Client)(nil) + +// var _ starknettypes.Provider = (*Client)(nil) + +type Client struct { + Provider starknetrpc.RpcProvider + EthClient *ethrpc.Client + lggr logger.Logger + defaultTimeout time.Duration +} + +// pass nil or 0 to timeout to not use built in default timeout +func NewClient(chainID string, baseURL string, apiKey string, lggr logger.Logger, timeout *time.Duration) (*Client, error) { + // TODO: chainID now unused + + options := []ethrpc.ClientOption{} + if strings.TrimSpace(apiKey) != "" { + options = append(options, ethrpc.WithHeader("x-apikey", apiKey)) + } + + provider, err := starknetrpc.NewProvider(baseURL, options...) + if err != nil { + return nil, err + } + + c, err := ethrpc.DialContext(context.Background(), baseURL) + if err != nil { + return nil, err + } + + client := &Client{ + Provider: provider, + EthClient: c, + lggr: lggr, + } + + // make copy to preserve value + // defensive in case the timeout reference is ever garbage collected or removed + if timeout == nil { + client.defaultTimeout = 0 + } else { + client.defaultTimeout = *timeout + } + + return client, nil +} + +// -- Custom Wrapped Func -- + +func (c *Client) CallContract(ctx context.Context, ops CallOps) (data []*felt.Felt, err error) { + tx := starknetrpc.FunctionCall{ + ContractAddress: ops.ContractAddress, + EntryPointSelector: ops.Selector, + Calldata: ops.Calldata, + } + + res, err := c.Call(ctx, tx, starknetrpc.WithBlockTag("pending")) + if err != nil { + return nil, fmt.Errorf("error in client.CallContract: %w", err) + } + + return res, nil +} + +func (c *Client) LatestBlockHeight(ctx context.Context) (uint64, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + blockNum, err := c.Provider.BlockNumber(ctx) + if err != nil { + return 0, fmt.Errorf("error in client.LatestBlockHeight: %w", err) + } + + return blockNum, nil +} + +// -- caigo.Provider interface -- + +func (c *Client) BlockWithTxHashes(ctx context.Context, blockID starknetrpc.BlockID) (*starknetrpc.Block, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + out, err := c.Provider.BlockWithTxHashes(ctx, blockID) + if err != nil { + return out.(*starknetrpc.Block), fmt.Errorf("error in client.BlockWithTxHashes: %w", err) + } + return out.(*starknetrpc.Block), nil +} + +func (c *Client) Call(ctx context.Context, calls starknetrpc.FunctionCall, blockHashOrTag starknetrpc.BlockID) ([]*felt.Felt, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + out, err := c.Provider.Call(ctx, calls, blockHashOrTag) + if err != nil { + return out, fmt.Errorf("error in client.Call: %w", err) + } + if out == nil { + return out, NilResultError("client.Call") + } + return out, nil +} + +func (c *Client) TransactionByHash(ctx context.Context, hash *felt.Felt) (starknetrpc.Transaction, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + out, err := c.Provider.TransactionByHash(ctx, hash) + if err != nil { + return out, fmt.Errorf("error in client.TransactionByHash: %w", err) + } + if out == nil { + return out, NilResultError("client.TransactionByHash") + } + return out, nil +} + +func (c *Client) TransactionReceipt(ctx context.Context, hash *felt.Felt) (starknetrpc.TransactionReceipt, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + out, err := c.Provider.TransactionReceipt(ctx, hash) + if err != nil { + return out, fmt.Errorf("error in client.TransactionReceipt: %w", err) + } + if out == nil { + return out, NilResultError("client.TransactionReceipt") + } + return out, nil +} + +func (c *Client) Events(ctx context.Context, input starknetrpc.EventsInput) (*starknetrpc.EventChunk, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + out, err := c.Provider.Events(ctx, input) + if err != nil { + return out, fmt.Errorf("error in client.Events: %w", err) + } + if out == nil { + return out, NilResultError("client.Events") + } + return out, nil +} + +func (c *Client) AccountNonce(ctx context.Context, accountAddress *felt.Felt) (*felt.Felt, error) { + if c.defaultTimeout != 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, c.defaultTimeout) + defer cancel() + } + + return c.Provider.Nonce(ctx, starknetrpc.BlockID{Tag: "pending"}, accountAddress) +} diff --git a/relayer/pkg/starknet/client_test.go b/relayer/pkg/starknet/client_test.go new file mode 100644 index 000000000..7e82a3b55 --- /dev/null +++ b/relayer/pkg/starknet/client_test.go @@ -0,0 +1,71 @@ +package starknet + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "testing" + "time" + + starknetutils "github.com/NethermindEth/starknet.go/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" +) + +var ( + chainID = "SN_SEPOLIA" + timeout = 10 * time.Second +) + +func TestRPCClient(t *testing.T) { + mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + req, _ := io.ReadAll(r.Body) + fmt.Println(r.RequestURI, r.URL, string(req)) + + var out []byte + + type Call struct { + Method string `json:"method"` + Params []json.RawMessage `json:"params"` + } + + call := Call{} + require.NoError(t, json.Unmarshal(req, &call)) + + switch call.Method { + case "starknet_chainId": + id := starknetutils.BigToHex(starknetutils.UTF8StrToBig(chainID)) + out = []byte(fmt.Sprintf(`{"result": "%s"}`, id)) + case "starknet_blockNumber": + out = []byte(`{"result": 1}`) + default: + require.False(t, true, "unsupported RPC method %s", call.Method) + } + _, err := w.Write(out) + require.NoError(t, err) + })) + defer mockServer.Close() + + lggr := logger.Test(t) + client, err := NewClient(chainID, mockServer.URL, "", lggr, &timeout) + require.NoError(t, err) + assert.Equal(t, timeout, client.defaultTimeout) + + t.Run("get chain id", func(t *testing.T) { + // TODO: mock the chainID query + id, err := client.Provider.ChainID(context.Background()) + require.NoError(t, err) + assert.Equal(t, chainID, id) + }) + + t.Run("get block height", func(t *testing.T) { + blockNum, err := client.LatestBlockHeight(context.Background()) + assert.NoError(t, err) + assert.Equal(t, uint64(1), blockNum) + }) +} diff --git a/relayer/pkg/starknet/feeder_client.go b/relayer/pkg/starknet/feeder_client.go new file mode 100644 index 000000000..f2d4d7e17 --- /dev/null +++ b/relayer/pkg/starknet/feeder_client.go @@ -0,0 +1,214 @@ +package starknet + +import ( + "context" + "encoding/json" + "errors" + "io" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + "time" + + "github.com/NethermindEth/juno/core/felt" + "github.com/NethermindEth/juno/utils" +) + +type Backoff func(wait time.Duration) time.Duration + +type RejectedTransaction struct { + FailureReason string `json:"transaction_failure_reason"` +} + +type TransactionFailureReason struct { + Code string `json:"code"` + ErrorMessage string `json:"error_message"` +} + +type FeederClient struct { + url string + client *http.Client + backoff Backoff + maxRetries int + maxWait time.Duration + minWait time.Duration + log utils.SimpleLogger +} + +func (c *FeederClient) WithBackoff(b Backoff) *FeederClient { + c.backoff = b + return c +} + +func (c *FeederClient) WithMaxRetries(num int) *FeederClient { + c.maxRetries = num + return c +} + +func (c *FeederClient) WithMaxWait(d time.Duration) *FeederClient { + c.maxWait = d + return c +} + +func (c *FeederClient) WithMinWait(d time.Duration) *FeederClient { + c.minWait = d + return c +} + +func (c *FeederClient) WithLogger(log utils.SimpleLogger) *FeederClient { + c.log = log + return c +} + +func ExponentialBackoff(wait time.Duration) time.Duration { + return wait * 2 +} + +func NopBackoff(d time.Duration) time.Duration { + return 0 +} + +func NewFeederClient(clientURL string) *FeederClient { + return &FeederClient{ + url: clientURL, + client: http.DefaultClient, + backoff: ExponentialBackoff, + maxRetries: 5, + maxWait: 10 * time.Second, + minWait: time.Second, + log: utils.NewNopZapLogger(), + } +} + +// buildQueryString builds the query url with encoded parameters +func (c *FeederClient) buildQueryString(endpoint string, args map[string]string) string { + base, err := url.Parse(c.url) + if err != nil { + panic("Malformed feeder base URL") + } + + base.Path += endpoint + + params := url.Values{} + for k, v := range args { + params.Add(k, v) + } + base.RawQuery = params.Encode() + + return base.String() +} + +// get performs a "GET" http request with the given URL and returns the response body +func (c *FeederClient) get(ctx context.Context, queryURL string) (io.ReadCloser, error) { + var res *http.Response + var err error + wait := time.Duration(0) + for i := 0; i <= c.maxRetries; i++ { + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-time.After(wait): + var req *http.Request + req, err = http.NewRequestWithContext(ctx, "GET", queryURL, http.NoBody) + if err != nil { + return nil, err + } + + res, err = c.client.Do(req) + if err == nil { + if res.StatusCode == http.StatusOK { + return res.Body, nil + } + + if res.StatusCode != http.StatusOK { + err = errors.New(res.Status) + } + res.Body.Close() + } + + if wait < c.minWait { + wait = c.minWait + } + wait = c.backoff(wait) + if wait > c.maxWait { + wait = c.maxWait + } + c.log.Warnw("failed query to feeder, retrying...", "retryAfter", wait.String()) + } + } + return nil, err +} + +func (c *FeederClient) TransactionFailure(ctx context.Context, transactionHash *felt.Felt) (*TransactionFailureReason, error) { + queryURL := c.buildQueryString("get_transaction", map[string]string{ + "transactionHash": transactionHash.String(), + }) + + body, err := c.get(ctx, queryURL) + + if err != nil { + return nil, err + } + defer body.Close() + + txStatus := new(TransactionFailureReason) + if err = json.NewDecoder(body).Decode(txStatus); err != nil { + return nil, err + } + return txStatus, nil +} + +// Only responds on valid /get_transaction?transactionHash= requests. fails otherwise +func NewTestFeederServer() *httptest.Server { + return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + queryMap, err := url.ParseQuery(r.URL.RawQuery) + if err != nil || !strings.HasSuffix(r.URL.Path, "get_transaction") { + w.WriteHeader(http.StatusBadRequest) + return + } + + queryArg := "transactionHash" + + _, found := queryMap[queryArg] + if !found { + w.WriteHeader(http.StatusBadRequest) + return + } + + defaultErr := []byte(`{ + "code": "SOME_ERROR", + "error_message": "some error was encountered" + }`) + + _, err = w.Write(defaultErr) + if err != nil { + panic(err) + } + })) +} + +// NewTestFeederClient returns a client and a function to close a test server. +func NewTestFeederClient(t *testing.T) *FeederClient { + srv := NewTestFeederServer() + t.Cleanup(srv.Close) + + c := NewFeederClient(srv.URL).WithBackoff(NopBackoff).WithMaxRetries(0) + c.client = &http.Client{ + Transport: &http.Transport{ + // On macOS tests often fail with the following error: + // + // "Get "http://127.0.0.1:xxxx/get_{feeder gateway method}?{arg}={value}": dial tcp 127.0.0.1:xxxx: + // connect: can't assign requested address" + // + // This error makes running local tests, in quick succession, difficult because we have to wait for the OS to release ports. + // Sometimes the sync tests will hang because sync process will keep making requests if there was some error. + // This problem is further exacerbated by having parallel tests. + // + // Increasing test client's idle conns allows for large concurrent requests to be made from a single test client. + MaxIdleConnsPerHost: 1000, + }, + } + return c +} diff --git a/relayer/pkg/starknet/feeder_client_test.go b/relayer/pkg/starknet/feeder_client_test.go new file mode 100644 index 000000000..3fbd5a214 --- /dev/null +++ b/relayer/pkg/starknet/feeder_client_test.go @@ -0,0 +1,21 @@ +package starknet + +import ( + "context" + "testing" + + "github.com/NethermindEth/juno/core/felt" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestFeederClient(t *testing.T) { + client := NewTestFeederClient(t) + tx, err := client.TransactionFailure(context.TODO(), &felt.Zero) + require.NoError(t, err) + + // test server will return this for a transaction failure + // so, the test server will never return a nonce error + assert.Equal(t, tx.Code, "SOME_ERROR") + assert.Equal(t, tx.ErrorMessage, "some error was encountered") +} diff --git a/relayer/pkg/starknet/mocks/Reader.go b/relayer/pkg/starknet/mocks/Reader.go new file mode 100644 index 000000000..4d43319bf --- /dev/null +++ b/relayer/pkg/starknet/mocks/Reader.go @@ -0,0 +1,271 @@ +// Code generated by mockery v2.43.2. DO NOT EDIT. + +package mocks + +import ( + context "context" + + felt "github.com/NethermindEth/juno/core/felt" + mock "github.com/stretchr/testify/mock" + + rpc "github.com/NethermindEth/starknet.go/rpc" + + starknet "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/starknet" +) + +// Reader is an autogenerated mock type for the Reader type +type Reader struct { + mock.Mock +} + +// AccountNonce provides a mock function with given fields: _a0, _a1 +func (_m *Reader) AccountNonce(_a0 context.Context, _a1 *felt.Felt) (*felt.Felt, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AccountNonce") + } + + var r0 *felt.Felt + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) (*felt.Felt, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) *felt.Felt); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*felt.Felt) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BlockWithTxHashes provides a mock function with given fields: ctx, blockID +func (_m *Reader) BlockWithTxHashes(ctx context.Context, blockID rpc.BlockID) (*rpc.Block, error) { + ret := _m.Called(ctx, blockID) + + if len(ret) == 0 { + panic("no return value specified for BlockWithTxHashes") + } + + var r0 *rpc.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, rpc.BlockID) (*rpc.Block, error)); ok { + return rf(ctx, blockID) + } + if rf, ok := ret.Get(0).(func(context.Context, rpc.BlockID) *rpc.Block); ok { + r0 = rf(ctx, blockID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*rpc.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, rpc.BlockID) error); ok { + r1 = rf(ctx, blockID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Call provides a mock function with given fields: _a0, _a1, _a2 +func (_m *Reader) Call(_a0 context.Context, _a1 rpc.FunctionCall, _a2 rpc.BlockID) ([]*felt.Felt, error) { + ret := _m.Called(_a0, _a1, _a2) + + if len(ret) == 0 { + panic("no return value specified for Call") + } + + var r0 []*felt.Felt + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, rpc.FunctionCall, rpc.BlockID) ([]*felt.Felt, error)); ok { + return rf(_a0, _a1, _a2) + } + if rf, ok := ret.Get(0).(func(context.Context, rpc.FunctionCall, rpc.BlockID) []*felt.Felt); ok { + r0 = rf(_a0, _a1, _a2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*felt.Felt) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, rpc.FunctionCall, rpc.BlockID) error); ok { + r1 = rf(_a0, _a1, _a2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CallContract provides a mock function with given fields: _a0, _a1 +func (_m *Reader) CallContract(_a0 context.Context, _a1 starknet.CallOps) ([]*felt.Felt, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for CallContract") + } + + var r0 []*felt.Felt + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, starknet.CallOps) ([]*felt.Felt, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, starknet.CallOps) []*felt.Felt); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*felt.Felt) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, starknet.CallOps) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Events provides a mock function with given fields: ctx, input +func (_m *Reader) Events(ctx context.Context, input rpc.EventsInput) (*rpc.EventChunk, error) { + ret := _m.Called(ctx, input) + + if len(ret) == 0 { + panic("no return value specified for Events") + } + + var r0 *rpc.EventChunk + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, rpc.EventsInput) (*rpc.EventChunk, error)); ok { + return rf(ctx, input) + } + if rf, ok := ret.Get(0).(func(context.Context, rpc.EventsInput) *rpc.EventChunk); ok { + r0 = rf(ctx, input) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*rpc.EventChunk) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, rpc.EventsInput) error); ok { + r1 = rf(ctx, input) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LatestBlockHeight provides a mock function with given fields: _a0 +func (_m *Reader) LatestBlockHeight(_a0 context.Context) (uint64, error) { + ret := _m.Called(_a0) + + if len(ret) == 0 { + panic("no return value specified for LatestBlockHeight") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(_a0) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(_a0) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionByHash provides a mock function with given fields: _a0, _a1 +func (_m *Reader) TransactionByHash(_a0 context.Context, _a1 *felt.Felt) (rpc.Transaction, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for TransactionByHash") + } + + var r0 rpc.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) (rpc.Transaction, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) rpc.Transaction); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(rpc.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionReceipt provides a mock function with given fields: _a0, _a1 +func (_m *Reader) TransactionReceipt(_a0 context.Context, _a1 *felt.Felt) (rpc.TransactionReceipt, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for TransactionReceipt") + } + + var r0 rpc.TransactionReceipt + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) (rpc.TransactionReceipt, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *felt.Felt) rpc.TransactionReceipt); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(rpc.TransactionReceipt) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *felt.Felt) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewReader creates a new instance of Reader. 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 NewReader(t interface { + mock.TestingT + Cleanup(func()) +}) *Reader { + mock := &Reader{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/relayer/pkg/starknet/testdata/fuzz/FuzzEncodeDecodeFelts/8dd7c6d4e51a9d0d2fd249dc251e4b7cc673a85738e29a86310d186cd8e2ce1b b/relayer/pkg/starknet/testdata/fuzz/FuzzEncodeDecodeFelts/8dd7c6d4e51a9d0d2fd249dc251e4b7cc673a85738e29a86310d186cd8e2ce1b new file mode 100644 index 000000000..cf2a1c1e4 --- /dev/null +++ b/relayer/pkg/starknet/testdata/fuzz/FuzzEncodeDecodeFelts/8dd7c6d4e51a9d0d2fd249dc251e4b7cc673a85738e29a86310d186cd8e2ce1b @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("\x00") diff --git a/relayer/pkg/starknet/types.go b/relayer/pkg/starknet/types.go new file mode 100644 index 000000000..d79603af6 --- /dev/null +++ b/relayer/pkg/starknet/types.go @@ -0,0 +1,11 @@ +package starknet + +import ( + "github.com/NethermindEth/juno/core/felt" +) + +type CallOps struct { + ContractAddress *felt.Felt + Selector *felt.Felt + Calldata []*felt.Felt +} diff --git a/relayer/pkg/starknet/utils.go b/relayer/pkg/starknet/utils.go new file mode 100644 index 000000000..334378f0b --- /dev/null +++ b/relayer/pkg/starknet/utils.go @@ -0,0 +1,106 @@ +package starknet + +import ( + "cmp" + "encoding/hex" + "errors" + "fmt" + "math/big" + + "github.com/NethermindEth/juno/core/felt" +) + +const ( + FeltLength = 32 + chunkSize = 31 +) + +// padd bytes to specific length +func PadBytes(a []byte, length int) []byte { + if len(a) < length { + pad := make([]byte, length-len(a)) + return append(pad, a...) + } + + // return original if length is >= to specified length + return a +} + +func NilResultError(funcName string) error { + return fmt.Errorf("nil result in %s", funcName) +} + +func Min[T cmp.Ordered](a, b T) T { + if a < b { + return a + } + return b +} + +// EncodeFelts takes a byte slice and splits as bunch of felts. First felt indicates the total byte size. +func EncodeFelts(data []byte) (felts []*big.Int) { + // prefix with len + length := big.NewInt(int64(len(data))) + felts = append(felts, length) + + // chunk every 31 bytes + for i := 0; i < len(data); i += chunkSize { + chunk := data[i:Min(i+chunkSize, len(data))] + // cast to int + felt := new(big.Int).SetBytes(chunk) + felts = append(felts, felt) + } + + return felts +} + +// DecodeFelts is the reverse of EncodeFelts +func DecodeFelts(felts []*big.Int) ([]byte, error) { + if len(felts) == 0 { + return []byte{}, nil + } + + data := []byte{} + buf := make([]byte, chunkSize) + length := felts[0].Uint64() + + for _, felt := range felts[1:] { + bytesLen := Min(chunkSize, length) + bytesBuffer := buf[:bytesLen] + + // TODO: this is inefficient because Bytes() and FillBytes() duplicate work + // reuse felt.Bytes() + if bytesLen < uint64(len(felt.Bytes())) { + return nil, errors.New("invalid: felt array can't be decoded") + } + + felt.FillBytes(bytesBuffer) + data = append(data, bytesBuffer...) + + length -= bytesLen + } + + if length != 0 { + return nil, errors.New("invalid: contained less bytes than the specified length") + } + + return data, nil +} + +func FeltsToBig(in []*felt.Felt) (out []*big.Int) { + for _, f := range in { + out = append(out, f.BigInt(big.NewInt(0))) + } + + return out +} + +/* Testing utils - do not use (XXX) outside testing context */ + +func XXXMustHexDecodeString(data string) []byte { + bytes, err := hex.DecodeString(data) + if err != nil { + panic(err) + } + return bytes +} diff --git a/relayer/pkg/starknet/utils_fuzz_test.go b/relayer/pkg/starknet/utils_fuzz_test.go new file mode 100644 index 000000000..56a353f99 --- /dev/null +++ b/relayer/pkg/starknet/utils_fuzz_test.go @@ -0,0 +1,21 @@ +//go:build go1.18 +// +build go1.18 + +package starknet + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func FuzzEncodeDecodeFelts(f *testing.F) { + f.Add([]byte{1, 2, 3}) + f.Fuzz(func(t *testing.T, data []byte) { + encodedData := EncodeFelts(data) + decodedData, err := DecodeFelts(encodedData) + require.NoError(t, err) + + require.Equal(t, data, decodedData) + }) +} diff --git a/relayer/pkg/starknet/utils_test.go b/relayer/pkg/starknet/utils_test.go new file mode 100644 index 000000000..8a7f9598d --- /dev/null +++ b/relayer/pkg/starknet/utils_test.go @@ -0,0 +1,131 @@ +package starknet + +import ( + "crypto/rand" + "math/big" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var ( + lengths = []int{1, 31, 32, 40} + length = 32 +) + +func TestPadBytes(t *testing.T) { + for i, v := range lengths { + // generate random + in := make([]byte, v) + _, err := rand.Read(in) + require.NoError(t, err) + require.Equal(t, lengths[i], len(in)) + + out := PadBytes(in, length) + expectLen := length + if v > expectLen { + expectLen = v + } + assert.Equal(t, expectLen, len(out)) + + start := 0 + if v < length { + start = length - v + } + assert.Equal(t, in, out[start:]) + } +} + +func TestDecodeFeltFails(t *testing.T) { + val, _ := new(big.Int).SetString("1231927389172389172983712738127391273891", 10) + + array := make([]*big.Int, 2) + array[0] = val + array[1] = val + + _, err := DecodeFelts(array) + assert.Equal(t, err.Error(), "invalid: contained less bytes than the specified length") +} + +func TestDecodeFeltsSuccesses(t *testing.T) { + b, _ := new(big.Int).SetString("1231927389172389172983712738127391273891", 10) + bBytesLen := int64(len(b.Bytes())) + a := big.NewInt(bBytesLen) + + array := make([]*big.Int, 2) + array[0] = a + array[1] = b + + fBytes, err := DecodeFelts(array) + assert.Equal(t, int64(len(fBytes)), bBytesLen) + require.NoError(t, err) +} + +func TestEncodeThenDecode(t *testing.T) { + const dataLen = 232 + + // create random bytes + data := make([]byte, dataLen) + _, err := rand.Read(data) + require.NoError(t, err) + + encodedData := EncodeFelts(data) + decodedData, err := DecodeFelts(encodedData) + require.NoError(t, err) + + assert.Equal(t, data, decodedData) +} + +func TestDecodeThenEncode(t *testing.T) { + const numOfFelts = 12 + + // Create random array of felts + felts := make([]*big.Int, numOfFelts+1) + felts[0] = big.NewInt(numOfFelts * 31) + for i := 1; i <= numOfFelts; i++ { + feltRaw := make([]byte, 31) + _, err := rand.Read(feltRaw) + require.NoError(t, err) + + felt := new(big.Int).SetBytes(feltRaw) + felts[i] = felt + } + + decodedFelts, err := DecodeFelts(felts) + require.NoError(t, err) + + encodedFelts := EncodeFelts(decodedFelts) + assert.Equal(t, encodedFelts, felts) +} + +func TestIncorrectDecode(t *testing.T) { + felts := make([]*big.Int, 3) + felts[0] = big.NewInt(35) + // bytes length can be less than 31 + felts[1] = new(big.Int).SetBytes([]byte{0x1, 0x2, 0x3, 0x4}) + felts[2] = new(big.Int).SetBytes([]byte{0x11, 0x21}) + + _, err := DecodeFelts(felts) + + require.NoError(t, err) +} + +func TestDecodeFelts(t *testing.T) { + a, _ := new(big.Int).SetString("1231927389172389172983712738127391273891", 10) + array := make([]*big.Int, 2) + array[0] = a + array[1] = a + _, err := DecodeFelts(array) + require.Error(t, err) +} + +func TestDecodeFelts2(t *testing.T) { + a, _ := new(big.Int).SetString("1", 10) + b, _ := new(big.Int).SetString("1231927389172389172983712738127391273891", 10) + array := make([]*big.Int, 2) + array[0] = a + array[1] = b + _, err := DecodeFelts(array) + require.Error(t, err) +} diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 000000000..83b9e45ab --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -euo pipefail + +container_version="starknet" + +pushd "$(dirname -- "$0")/../core" +docker build . -t smartcontract/chainlink:${container_version} -f ./core/chainlink.Dockerfile +popd + diff --git a/scripts/core.down.sh b/scripts/core.down.sh new file mode 100755 index 000000000..c211a835f --- /dev/null +++ b/scripts/core.down.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +echo "Cleaning up core containers.." + +echo "Checking for existing 'chainlink.core' docker containers..." + +for i in {1..5} +do + echo " Checking for chainlink.core.$i" + dpid=$(docker ps -a | grep chainlink.core.$i | awk '{print $1}') + if [ -z "$dpid" ]; then + echo "No docker core container running." + else + docker kill $dpid + docker rm $dpid + fi +done + +echo "Cleanup finished." diff --git a/scripts/core.sh b/scripts/core.sh new file mode 100755 index 000000000..2799f2808 --- /dev/null +++ b/scripts/core.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash + +set -euo pipefail + +bash "$(dirname -- "$0")/core.down.sh" + +container_name_prefix="chainlink.core" +container_version="starknet" + +# https://github.com/smartcontractkit/chainlink/blob/600365a7a27508d699dbd4b994fafba7dc288659/integration-tests/client/chainlink_k8s.go#L82-L83 +api_email="notreal@fakeemail.ch" +api_password="fj293fbBnlQ!f9vNs" + +if [[ -z "${CL_CONFIG:-}" ]]; then + echo "No CL_CONFIG env var provided." >&2 + exit 1 +fi + +platform_arg="" +if [ -n "${CORE_IMAGE:-}" ]; then + image_name="${CORE_IMAGE}" +else + image_name="smartcontract/chainlink:${container_version}" + platform_arg="--platform linux/amd64" +fi +echo "Using core image: ${image_name}" + +listen_ips="0.0.0.0" + +NODE_COUNT="${NODE_COUNT:-5}" + +declare -i core_base_port=50100 +declare -i core_p2p_base_port=50200 + +for ((i = 1; i <= NODE_COUNT; i++)); do + database_name="core_test_${i}" + echo "Creating database: ${database_name}" + # postgres_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' chainlink.postgres) + # TODO: use postgres db ip + host_postgres_url="postgresql://postgres:postgres@127.0.0.1:5432/postgres" + psql "${host_postgres_url}" -c "DROP DATABASE ${database_name};" &>/dev/null || true + psql "${host_postgres_url}" -c "CREATE DATABASE ${database_name};" &>/dev/null || true + + # TODO: remove this and use node ids + listen_args=() + for ip in $listen_ips; do + listen_args+=("-p" "${ip}:$((core_base_port + i - 1)):6688") + # listen_args+=("-p" "${ip}:$((core_p2p_base_port + i - 1)):6690") + done + + echo "Starting core container $i" + container_name="${container_name_prefix}.$i" + + # --rm \ + docker run \ + -d \ + $platform_arg \ + "${listen_args[@]}" \ + --add-host=host.containers.internal:host-gateway \ + --name "${container_name}" \ + --network-alias "${container_name}" \ + --network chainlink \ + -e "CL_CONFIG=${CL_CONFIG}" \ + -e "CL_DATABASE_URL=postgresql://postgres:postgres@chainlink.postgres:5432/${database_name}?sslmode=disable" \ + -e 'CL_PASSWORD_KEYSTORE=asdfasdfasdfasdf' \ + --entrypoint bash \ + "${image_name}" \ + -c \ + "echo -e \"${api_email}\\n${api_password}\" > /tmp/api_credentials && chainlink node start --api /tmp/api_credentials" + + echo "Waiting for core container to become ready.." + start_time=$(date +%s) + prev_output="" + while true; do + output=$(docker logs "${container_name}" 2>&1) + if [[ "${output}" != "${prev_output}" ]]; then + echo -n "${output#$prev_output}" + prev_output="${output}" + fi + + if [[ $output == *"Listening and serving HTTP"* ]]; then + echo "" + echo "node is ready." + break + fi + + current_time=$(date +%s) + elapsed_time=$((current_time - start_time)) + + if ((elapsed_time > 600)); then + echo "Error: Command did not become ready within 600 seconds" + exit 1 + fi + + sleep 3 + done +done diff --git a/scripts/devnet.down.sh b/scripts/devnet.down.sh new file mode 100755 index 000000000..6390ede42 --- /dev/null +++ b/scripts/devnet.down.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +echo "Cleaning up devnet container.." + +echo "Checking for existing 'chainlink-starknet.starknet-devnet' docker container..." +dpid=`docker ps -a | grep chainlink-starknet.starknet-devnet | awk '{print $1}'`; +if [ -z "$dpid" ] +then + echo "No docker devnet container running."; +else + docker kill $dpid; + docker rm $dpid; +fi + +echo "Cleanup finished." diff --git a/scripts/devnet.sh b/scripts/devnet.sh new file mode 100755 index 000000000..70fb3a3a2 --- /dev/null +++ b/scripts/devnet.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# cpu_struct=`arch`; +# echo $cpu_struct; +cpu_struct="linux"; + +# Clean up first +bash "$(dirname -- "$0";)/devnet.down.sh" + +echo "Checking CPU structure..." +if [[ $cpu_struct == *"arm"* ]] +then + echo "Starting arm devnet container..." + container_version="a147b4cd72f9ce9d1fa665d871231370db0f51c7-arm" +else + echo "Starting i386 devnet container..." + container_version="a147b4cd72f9ce9d1fa665d871231370db0f51c7" +fi + +echo "Starting starknet-devnet" + +container_name="chainlink-starknet.starknet-devnet" + +# we need to replace the entrypoint because starknet-devnet's docker builds at 0.5.1 don't include cargo or gcc. +docker run \ + -p 127.0.0.1:5050:5050 \ + -p 127.0.0.1:8545:8545 \ + --rm \ + -d \ + --name "${container_name}" \ + --network-alias "${container_name}" \ + --network chainlink \ + "shardlabs/starknet-devnet-rs:${container_version}" \ + --seed 0 \ + --gas-price 1 \ + --data-gas-price 1 \ + --account-class cairo1 + +# echo "Starting hardhat..." +# docker run --net container:chainlink-starknet.starknet-devnet -d --name chainlink-starknet.hardhat ethereumoptimism/hardhat-node:nightly + +# starknet-devnet startup is slow and requires compiling cairo. +echo "Waiting for starknet-devnet to become ready.." +start_time=$(date +%s) +prev_output="" +while true +do + output=$(docker logs chainlink-starknet.starknet-devnet 2>&1) + if [[ "${output}" != "${prev_output}" ]]; then + echo -n "${output#$prev_output}" + prev_output="${output}" + fi + + if [[ $output == *"listening"* ]]; then + echo "" + echo "starknet-devnet is ready." + exit 0 + fi + + current_time=$(date +%s) + elapsed_time=$((current_time - start_time)) + + if (( elapsed_time > 600 )); then + echo "Error: Command did not become ready within 600 seconds" + exit 1 + fi + + sleep 3 +done diff --git a/scripts/generate-codegraph.sh b/scripts/generate-codegraph.sh new file mode 100755 index 000000000..df4c9cd92 --- /dev/null +++ b/scripts/generate-codegraph.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +if ! command -v godepgraph &> /dev/null +then + echo 'godepgraph not found! \nCheck https://github.com/kisielk/godepgraph for instructions!' + exit +fi + +if ! command -v dot &> /dev/null +then + echo 'dot not found! \nCheck https://graphviz.org/ for instructions!' + exit +fi + +usage="usage: $(basename "$0") [-h] [-a] [-p GO_PACKAGE] [-o OUTPUT_PNG_PATH] +Create a dependency diagram for the provided go module: + -h show this tip + -a include all dependencies (otherwise include only github.com/smartcontractkit dependencies) + -p package name (i.e. github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink) + -o output PNG path" + +options=':hap:o:' +while getopts $options option; do + case "$option" in + h) echo "$usage"; exit;; + a) ALL_DEPENDENCIES=1;; + p) GO_MODULE_PATH=$OPTARG;; + o) OUTPUT_PNG_PATH=$OPTARG;; + esac +done + +if [ ! "$GO_MODULE_PATH" ]; +then + echo "-p argument must be provided" + echo "$usage" >&2; exit 1 +fi + +if [ ! "$OUTPUT_PNG_PATH" ]; +then + OUTPUT_PNG_PATH="./godepgraph.png" +fi + +if [ ! "$ALL_DEPENDENCIES" ]; +then + godepgraph -s -o .,github.com/smartcontractkit $GO_MODULE_PATH | dot -Tpng -o $OUTPUT_PNG_PATH +else + godepgraph -s $GO_MODULE_PATH | dot -Tpng -o $OUTPUT_PNG_PATH +fi + +echo "Finished!" + + + + + + + + diff --git a/scripts/mock-adapter.down.sh b/scripts/mock-adapter.down.sh new file mode 100755 index 000000000..69a79bed6 --- /dev/null +++ b/scripts/mock-adapter.down.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +echo "Killing any running mock-adapter processes.." +killall "dummy-external-adapter" &>/dev/null || true +echo "Done." diff --git a/scripts/mock-adapter.sh b/scripts/mock-adapter.sh new file mode 100755 index 000000000..d8b4bf8b5 --- /dev/null +++ b/scripts/mock-adapter.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -euo pipefail + +cache_path="$(git rev-parse --show-toplevel)/.local-mock-server" +binary_name="dummy-external-adapter" +binary_path="${cache_path}/bin/${binary_name}" + +bash "$(dirname -- "$0")/mock-adapter.down.sh" + +listen_address="0.0.0.0:6060" +echo "Listen address: ${listen_address}" + +if [ ! -f "${binary_path}" ]; then + echo "Installing mock-adapter" + export GOPATH="${cache_path}" + export GOBIN="${cache_path}/bin" + go install 'github.com/smartcontractkit/dummy-external-adapter@latest' +fi + +nohup "${binary_path}" "${listen_address}" &>/dev/null & +echo "Started mock-adapter (PID $!)" diff --git a/scripts/postgres.down.sh b/scripts/postgres.down.sh new file mode 100755 index 000000000..667b917ed --- /dev/null +++ b/scripts/postgres.down.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# TODO: this script needs to be replaced with a predefined K8s enviroment + +echo "Cleaning up postgres container.." + +echo "Checking for existing 'chainlink.postgres' docker container..." +dpid=$(docker ps -a | grep chainlink.postgres | awk '{print $1}') +if [ -z "$dpid" ]; then + echo "No docker postgres container running." +else + docker kill $dpid + docker rm $dpid +fi + +echo "Cleanup finished." diff --git a/scripts/postgres.sh b/scripts/postgres.sh new file mode 100755 index 000000000..cf4f6e7b3 --- /dev/null +++ b/scripts/postgres.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +container_name="chainlink.postgres" +container_version="15.2-alpine" + +set -euo pipefail + +bash "$(dirname -- "$0")/postgres.down.sh" + +listen_ips="0.0.0.0" + +echo "Starting postgres container" + +listen_args=() +for ip in $listen_ips; do + listen_args+=("-p" "${ip}:5432:5432") +done + +docker run \ + "${listen_args[@]}" \ + -d \ + --name "${container_name}" \ + --network-alias "${container_name}" \ + --network chainlink \ + -e POSTGRES_USER=postgres \ + -e POSTGRES_PASSWORD=postgres \ + -e POSTGRES_DB=chainlink_test \ + "postgres:${container_version}" \ + -c 'listen_addresses=*' + +echo "Waiting for postgres container to become ready.." +start_time=$(date +%s) +prev_output="" +while true; do + output=$(docker logs "${container_name}" 2>&1) + if [[ "${output}" != "${prev_output}" ]]; then + echo -n "${output#$prev_output}" + prev_output="${output}" + fi + + if [[ $output == *"listening on IPv4 address"* ]]; then + echo "" + echo "postgres is ready." + exit 0 + fi + + current_time=$(date +%s) + elapsed_time=$((current_time - start_time)) + + if ((elapsed_time > 600)); then + echo "Error: Command did not become ready within 600 seconds" + exit 1 + fi + + sleep 3 +done diff --git a/shell.nix b/shell.nix index e2a3ee223..5a18c6994 100644 --- a/shell.nix +++ b/shell.nix @@ -1,17 +1,62 @@ -{ stdenv, pkgs, lib }: - -pkgs.mkShell { - buildInputs = with pkgs; [ - pkgs.python39 - pkgs.python39Packages.venvShellHook - gmp - nodejs - nodePackages.npm - ]; - - venvDir = "./.venv"; - - postShellHook = '' - pip install -r contracts/requirements.txt -c contracts/constraints.txt - ''; -} +{ + stdenv, + pkgs, + lib, + scriptDir, +}: +with pkgs; let + go = pkgs.go_1_21; + + mkShell' = mkShell.override { + # juno requires building with clang, not gcc + stdenv = pkgs.clangStdenv; + }; +in + mkShell' { + nativeBuildInputs = + [ + stdenv.cc.cc.lib + (rust-bin.stable.latest.default.override {extensions = ["rust-src"];}) + nodejs-18_x + (yarn.override {nodejs = nodejs-18_x;}) + nodePackages.typescript + nodePackages.typescript-language-server + nodePackages.npm + python3 + + python311Packages.ledgerwallet + go + + gopls + delve + (golangci-lint.override {buildGoModule = buildGo122Module;}) + gotools + + kubectl + kubernetes-helm + + postgresql_15 # psql + ] + ++ lib.optionals stdenv.isLinux [ + # ledger specific packages + libudev-zero + libusb1 + ]; + + LD_LIBRARY_PATH = lib.makeLibraryPath [pkgs.zlib stdenv.cc.cc.lib]; # lib64 + + GOROOT = "${go}/share/go"; + CGO_ENABLED = 0; + HELM_REPOSITORY_CONFIG = "${scriptDir}/.helm-repositories.yaml"; + + shellHook = '' + # Update helm repositories + helm repo update > /dev/null + # setup go bin for nix + export GOBIN=$HOME/.nix-go/bin + mkdir -p $GOBIN + export PATH=$GOBIN:$PATH + # install gotestloghelper + go install github.com/smartcontractkit/chainlink-testing-framework/tools/gotestloghelper@latest + ''; + } diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 000000000..ecf80728e --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,13 @@ +# required (may be found under "Project Information" in SonarQube) +sonar.projectKey=smartcontractkit_chainlink-starknet +sonar.sources=. + +# Full exclusions from the static analysis +sonar.exclusions=**/vendor/**/*, **/contracts/**/*, **/mocks/**/*, **/examples/**/*, **/node_modules/**/*, **/docs/**/*, **/scripts/**/*, **/*.config.ts, **/*.config.js, **/*.txt +# Coverage exclusions +sonar.coverage.exclusions=**/*.test.ts, **/*_test.go, **/integration-tests/**/*, **/ops/**/*, **/test/**/*, **/testdata/**/* + +# Tests' root folder, inclusions (tests to check and count) and exclusions +sonar.tests=. +sonar.test.inclusions=**/*_test.go, **/*.test.ts, **/test/**/* +sonar.test.exclusions=**/integration-tests/**/* diff --git a/tsconfig.json b/tsconfig.json index 154038e5d..0c5132c51 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,25 +4,34 @@ "include": [], "references": [ { - "path": "./packages-ts/gauntlet-starknet" + "path": "./packages-ts/starknet-gauntlet" }, { - "path": "./packages-ts/gauntlet-starknet-example" + "path": "./packages-ts/starknet-gauntlet-oz" }, { - "path": "./packages-ts/gauntlet-starknet-oz" + "path": "./packages-ts/starknet-gauntlet-argent" }, { - "path": "./packages-ts/gauntlet-starknet-starkgate" + "path": "./packages-ts/starknet-gauntlet-multisig" }, { - "path": "./packages-ts/gauntlet-starknet-argent" + "path": "./packages-ts/starknet-gauntlet-example" }, { - "path": "./packages-ts/gauntlet-starknet-ocr2" + "path": "./packages-ts/starknet-gauntlet-token" }, { - "path": "./packages-ts/gauntlet-starknet-cli" - } + "path": "./packages-ts/starknet-gauntlet-ocr2" + }, + { + "path": "./packages-ts/starknet-gauntlet-emergency-protocol" + }, + { + "path": "./packages-ts/starknet-gauntlet-ledger" + }, + { + "path": "./packages-ts/starknet-gauntlet-cli" + }, ] } diff --git a/vendor/cairo b/vendor/cairo new file mode 160000 index 000000000..b4459a565 --- /dev/null +++ b/vendor/cairo @@ -0,0 +1 @@ +Subproject commit b4459a56578d26746658704fda9841772f84d4af diff --git a/vendor/scarb b/vendor/scarb new file mode 160000 index 000000000..d49f54394 --- /dev/null +++ b/vendor/scarb @@ -0,0 +1 @@ +Subproject commit d49f543948a7ae8a7d3108c8ff8f6b17dc15ef78 diff --git a/yarn.lock b/yarn.lock index ddd34348a..f0c2d4ccb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -10,157 +15,191 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@babel/code-frame@^7.0.0": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: - "@babel/highlight" "^7.16.7" + "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" - integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== +"@babel/compat-data@^7.20.0": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" + integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" - integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.6.tgz#7122ae4f5c5a37c0946c066149abd8e75f81540f" + integrity sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg== dependencies: "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-module-transforms" "^7.17.7" - "@babel/helpers" "^7.17.9" - "@babel/parser" "^7.17.10" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.10" - "@babel/types" "^7.17.10" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.6" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helpers" "^7.19.4" + "@babel/parser" "^7.19.6" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" - integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== +"@babel/generator@7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" + integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== dependencies: - "@babel/types" "^7.17.10" - "@jridgewell/gen-mapping" "^0.1.0" + "@babel/types" "^7.18.2" + "@jridgewell/gen-mapping" "^0.3.0" + jsesc "^2.5.1" + +"@babel/generator@^7.19.6", "@babel/generator@^7.20.1", "@babel/generator@^7.7.2": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.1.tgz#ef32ecd426222624cbd94871a7024639cf61a9fa" + integrity sha512-u1dMdBUmA7Z0rBB97xh8pIhviK7oItYOkjbsCxTWMknyvbQRBwX7/gn4JXurRdirWMFh+ZtYARqkA6ydogVZpg== + dependencies: + "@babel/types" "^7.20.0" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" - integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== +"@babel/helper-compilation-targets@^7.19.3": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.20.2" + "@babel/compat-data" "^7.20.0" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" semver "^6.3.0" -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" - integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-simple-access@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" - integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== - dependencies: - "@babel/types" "^7.17.0" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.15.7", "@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helpers@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" - integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.9" - "@babel/types" "^7.17.0" - -"@babel/highlight@^7.16.7": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" - integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f" + integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.6" + "@babel/types" "^7.19.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" + integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== + +"@babel/helper-simple-access@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz#be553f4951ac6352df2567f7daa19a0ee15668e7" + integrity sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg== + dependencies: + "@babel/types" "^7.19.4" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10", "@babel/helper-string-parser@^7.19.4", "@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.19.4": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" + integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.0" + +"@babel/highlight@^7.18.6": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" + integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@7.16.2": - version "7.16.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.2.tgz#3723cd5c8d8773eef96ce57ea1d9b7faaccd12ac" - integrity sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw== +"@babel/parser@7.18.4": + version "7.18.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef" + integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow== -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" - integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.6", "@babel/parser@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.1.tgz#3e045a92f7b4623cafc2425eddcb8cf2e54f9cc5" + integrity sha512-hp0AYxaZJhxULfM1zyp7Wgr+pSUKBcP3M+PHnSzWGdXOzg/kHWIgiUWARvubhUKGOEw3xqY4x+lyZ9ytBVcELw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -246,45 +285,70 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/template@^7.16.7", "@babel/template@^7.3.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.17.10", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" - integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.10" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.10" - "@babel/types" "^7.17.10" +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" + integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.18.10", "@babel/template@^7.3.3": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.19.6", "@babel/traverse@^7.20.1", "@babel/traverse@^7.7.2": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" + integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.1" + "@babel/types" "^7.20.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" - integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== +"@babel/types@7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600" + integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== + dependencies: + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.18.6" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.4", "@babel/types@^7.20.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.0.tgz#52c94cf8a7e24e89d2a194c25c35b17a64871479" + integrity sha512-Jlgt3H0TajCW164wkTOTzHkZb075tMQMULzrLUoUeKmO7eFL96GgDxf7/Axhc5CAuKE3KFyVW1p6ysKsi2oXAg== dependencies: - "@babel/helper-validator-identifier" "^7.15.7" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.17.10", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" - integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== +"@babel/types@^7.18.2": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" + integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -292,43 +356,786 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@chainlink/gauntlet-core@0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@chainlink/gauntlet-core/-/gauntlet-core-0.3.0.tgz#58822788deb027a28bfa9b224cc8486270dae576" - integrity sha512-h89rRzJcGdHIDU8Ey/UyKSKM+/YpgicxrcAJRhI6bcNe6eVvgCIZFFD8LklOeMssbYFRbZXe3XuMBWyXwstWKA== +"@chainlink/contracts@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainlink/contracts/-/contracts-0.4.2.tgz#2928a35e8da94664b8ffeb8f5a54b1a3f14d5b3f" + integrity sha512-wVI/KZ9nIH0iqoebVxYrZfNVWO23vwds1UrHdbF+S0JwyixtT+54xYGlot723jCrAeBeQHsDRQXnEhhbUEHpgQ== + dependencies: + "@eth-optimism/contracts" "^0.5.21" + +"@chainlink/evm-gauntlet@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@chainlink/evm-gauntlet/-/evm-gauntlet-0.1.0.tgz#cf5cdbf66f1126b5b1d23fa8d494ab4598317674" + integrity sha512-59/1BoS0ENuE8jQTenSM3ymvWVHmElF2rwb+LlRMhqNjnvYy3zRTwx2dlCXGf2j0H6E4NJFs+naBq2cJr43Eag== + dependencies: + "@chainlink/gauntlet-core" "0.3.1" + ethers "^5.6.9" + +"@chainlink/evm-gauntlet@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@chainlink/evm-gauntlet/-/evm-gauntlet-0.0.2.tgz#8827070c228aa466bfe069ff92ac9b661097bdcb" + integrity sha512-e6uDeoVluro5QBFcK2N0Ctk2g0daY0SUDfZblKb64QeIE7X+d5SoRMFgwhr20L4pL8ihvLkkXDETsIgT/r9cpw== + dependencies: + "@chainlink/gauntlet-core" "0.3.1" + ethers "^5.6.9" + +"@chainlink/evm-gauntlet@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@chainlink/evm-gauntlet/-/evm-gauntlet-0.4.0.tgz#95a5a63eaab641e9558c910dba5cead6ce56b862" + integrity sha512-gQAzl7o/Hesz+UPY3rBw/kkHqjUxReYCIQdtdqKT6hRHDOqncVrAO4iAcHuKLSHtnQ79kSaDCfTSlUn1nTrrTQ== + dependencies: + "@chainlink/gauntlet-core" "0.3.1" + ethers "^5.6.9" + +"@chainlink/gauntlet-contracts-example@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@chainlink/gauntlet-contracts-example/-/gauntlet-contracts-example-0.1.1.tgz#bf7827460dcb404ba3683245cec1df61ee5ee5c5" + integrity sha512-7qAg0504cQYJIiQY3QxWW/wvfAJzGokIk6qpn94Em3fOYpPFYJ+WH665B+lxwtjZLUef6DyK04Tiu55amPpCWQ== + dependencies: + "@chainlink/gauntlet-core" "*" + +"@chainlink/gauntlet-contracts-ocr2@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@chainlink/gauntlet-contracts-ocr2/-/gauntlet-contracts-ocr2-0.2.2.tgz#b2e6deab8c52abea588cad7c152bf8cc7a03ca28" + integrity sha512-Wmxl3lwlEFVO+jQ7CvOnOV4UA67XguIs6tCY2ayf4KdnNVARgPatI5emAniooNd27n0zgDT+61s5gEpVzWBEqw== + dependencies: + "@chainlink/gauntlet-core" "*" + +"@chainlink/gauntlet-core@*": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@chainlink/gauntlet-core/-/gauntlet-core-0.4.0.tgz#bf830090dd9996ea2cb893c2bf120213932fbd00" + integrity sha512-hCCK3gbDKH4jZeoiwEWB/4fpaq3qoFaKbkDPvfxSJiuXcwD3oKOMxnhqRQNwG9aw/30CN/FUmb+KHDJfk03tRQ== dependencies: "@ethersproject/keccak256" "^5.5.0" axios "^0.24.0" bn.js "^5.2.0" protobufjs "^6.11.2" -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== +"@chainlink/gauntlet-core@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainlink/gauntlet-core/-/gauntlet-core-0.3.1.tgz#27badd597ef6a2db8cfdb56367b9ea5ca0866976" + integrity sha512-T/L3zswTw62r5oKpDkvg8xR8JhBNItGkfaoGL8h/B1+4HN4mRcl4L5iIY21CF53rHx9PootZoxUEKAorhBxOqA== dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" + "@ethersproject/keccak256" "^5.5.0" + axios "^0.24.0" + bn.js "^5.2.0" + protobufjs "^6.11.2" + +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + +"@changesets/apply-release-plan@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-7.0.0.tgz#ce3c3dfc5720550a5d592b54ad2f411f816ec5ff" + integrity sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/config" "^3.0.0" + "@changesets/get-version-range-type" "^0.4.0" + "@changesets/git" "^3.0.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + detect-indent "^6.0.0" + fs-extra "^7.0.1" + lodash.startcase "^4.4.0" + outdent "^0.5.0" + prettier "^2.7.1" + resolve-from "^5.0.0" + semver "^7.5.3" -"@ethersproject/bytes@^5.6.0", "@ethersproject/bytes@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" - integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== +"@changesets/assemble-release-plan@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.0.tgz#c69969b4bef7c32a8544b6941d1053260ca47e05" + integrity sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/errors" "^0.2.0" + "@changesets/get-dependents-graph" "^2.0.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + semver "^7.5.3" + +"@changesets/changelog-git@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@changesets/changelog-git/-/changelog-git-0.2.0.tgz#1f3de11becafff5a38ebe295038a602403c93a86" + integrity sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ== + dependencies: + "@changesets/types" "^6.0.0" + +"@changesets/cli@^2.22.0": + version "2.27.1" + resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.27.1.tgz#abce480fd30b9abbe2cfcf07d5d668c364ce2804" + integrity sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/apply-release-plan" "^7.0.0" + "@changesets/assemble-release-plan" "^6.0.0" + "@changesets/changelog-git" "^0.2.0" + "@changesets/config" "^3.0.0" + "@changesets/errors" "^0.2.0" + "@changesets/get-dependents-graph" "^2.0.0" + "@changesets/get-release-plan" "^4.0.0" + "@changesets/git" "^3.0.0" + "@changesets/logger" "^0.1.0" + "@changesets/pre" "^2.0.0" + "@changesets/read" "^0.6.0" + "@changesets/types" "^6.0.0" + "@changesets/write" "^0.3.0" + "@manypkg/get-packages" "^1.1.3" + "@types/semver" "^7.5.0" + ansi-colors "^4.1.3" + chalk "^2.1.0" + ci-info "^3.7.0" + enquirer "^2.3.0" + external-editor "^3.1.0" + fs-extra "^7.0.1" + human-id "^1.0.2" + meow "^6.0.0" + outdent "^0.5.0" + p-limit "^2.2.0" + preferred-pm "^3.0.0" + resolve-from "^5.0.0" + semver "^7.5.3" + spawndamnit "^2.0.0" + term-size "^2.1.0" + tty-table "^4.1.5" + +"@changesets/config@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@changesets/config/-/config-3.0.0.tgz#a1a1cafc77134b117b4a9266459c84fdd360a6be" + integrity sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA== + dependencies: + "@changesets/errors" "^0.2.0" + "@changesets/get-dependents-graph" "^2.0.0" + "@changesets/logger" "^0.1.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + fs-extra "^7.0.1" + micromatch "^4.0.2" + +"@changesets/errors@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@changesets/errors/-/errors-0.2.0.tgz#3c545e802b0f053389cadcf0ed54e5636ff9026a" + integrity sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow== dependencies: - "@ethersproject/logger" "^5.6.0" + extendable-error "^0.1.5" -"@ethersproject/keccak256@^5.5.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" - integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== +"@changesets/get-dependents-graph@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-2.0.0.tgz#97f0cc9fbec436e0d6ab95a6a59c08acf21ac714" + integrity sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA== dependencies: - "@ethersproject/bytes" "^5.6.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + chalk "^2.1.0" + fs-extra "^7.0.1" + semver "^7.5.3" + +"@changesets/get-release-plan@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-4.0.0.tgz#8cb057da90a08796a335dfd18073234d33902069" + integrity sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/assemble-release-plan" "^6.0.0" + "@changesets/config" "^3.0.0" + "@changesets/pre" "^2.0.0" + "@changesets/read" "^0.6.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + +"@changesets/get-version-range-type@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz#429a90410eefef4368502c41c63413e291740bf5" + integrity sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ== + +"@changesets/git@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@changesets/git/-/git-3.0.0.tgz#e71d003752a97bc27988db6d410e0038a4a88055" + integrity sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/errors" "^0.2.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + is-subdir "^1.1.1" + micromatch "^4.0.2" + spawndamnit "^2.0.0" + +"@changesets/logger@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@changesets/logger/-/logger-0.1.0.tgz#2d2a58536c5beeeaef52ab464931d99fcf24f17b" + integrity sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g== + dependencies: + chalk "^2.1.0" + +"@changesets/parse@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@changesets/parse/-/parse-0.4.0.tgz#5cabbd9844b3b213cb83f5edb5768454c70dd2b4" + integrity sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw== + dependencies: + "@changesets/types" "^6.0.0" + js-yaml "^3.13.1" + +"@changesets/pre@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@changesets/pre/-/pre-2.0.0.tgz#ad3edf3d6ac287991d7ef5e26cf280d03c9e3764" + integrity sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/errors" "^0.2.0" + "@changesets/types" "^6.0.0" + "@manypkg/get-packages" "^1.1.3" + fs-extra "^7.0.1" + +"@changesets/read@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.6.0.tgz#27e13b58d0b0eb3b0a5cba48a3f4f71f05ef4610" + integrity sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/git" "^3.0.0" + "@changesets/logger" "^0.1.0" + "@changesets/parse" "^0.4.0" + "@changesets/types" "^6.0.0" + chalk "^2.1.0" + fs-extra "^7.0.1" + p-filter "^2.1.0" + +"@changesets/types@^4.0.1": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@changesets/types/-/types-4.1.0.tgz#fb8f7ca2324fd54954824e864f9a61a82cb78fe0" + integrity sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw== + +"@changesets/types@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@changesets/types/-/types-6.0.0.tgz#e46abda9890610dd1fbe1617730173d2267544bd" + integrity sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ== + +"@changesets/write@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@changesets/write/-/write-0.3.0.tgz#c6c5bc390cce4031da20eab8a4ca2d71453a1985" + integrity sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw== + dependencies: + "@babel/runtime" "^7.20.1" + "@changesets/types" "^6.0.0" + fs-extra "^7.0.1" + human-id "^1.0.2" + prettier "^2.7.1" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== + +"@eth-optimism/contracts@^0.5.21": + version "0.5.37" + resolved "https://registry.yarnpkg.com/@eth-optimism/contracts/-/contracts-0.5.37.tgz#3aaca1ca1f49ef895d4165cc7bf29c8d1f5b0f56" + integrity sha512-HbNUUDIM1dUAM0hWPfGp3l9/Zte40zi8QhVbUSIwdYRA7jG7cZgbteqavrjW8wwFqxkWX9IrtA0KAR7pNlSAIQ== + dependencies: + "@eth-optimism/core-utils" "0.10.1" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + +"@eth-optimism/core-utils@0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.10.1.tgz#44515fbca627532a24c6fd433395f00be8525832" + integrity sha512-IJvG5UtYvyz6An9QdohlCLoeB3NBFxx2lRJKlPzvYYlfugUNNCHsajRIWIwJTcPRRma0WPd46JUsKACLJDdNrA== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/providers" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bufio "^1.0.7" + chai "^4.3.4" + +"@ethereum-waffle/mock-contract@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz#f13fea29922d87a4d2e7c4fc8fe72ea04d2c13de" + integrity sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA== + +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" - integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/providers@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" + integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== + +"@humanwhocodes/config-array@^0.11.13": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -346,175 +1153,197 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^28.1.3" + jest-util "^28.1.3" slash "^3.0.0" -"@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== +"@jest/core@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" + integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^28.1.3" + "@jest/reporters" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" + ci-info "^3.2.0" exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" + graceful-fs "^4.2.9" + jest-changed-files "^28.1.3" + jest-config "^28.1.3" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-resolve-dependencies "^28.1.3" + jest-runner "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + jest-watcher "^28.1.3" + micromatch "^4.0.4" + pretty-format "^28.1.3" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== +"@jest/environment@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^26.6.2" + jest-mock "^28.1.3" -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" + jest-get-type "^28.0.2" + +"@jest/expect@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== + dependencies: + expect "^28.1.3" + jest-snapshot "^28.1.3" + +"@jest/fake-timers@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + dependencies: + "@jest/types" "^28.1.3" + "@sinonjs/fake-timers" "^9.1.2" "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== +"@jest/globals@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/types" "^28.1.3" -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== +"@jest/reporters@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" + integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.4" + glob "^7.1.3" + graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" + istanbul-reports "^3.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + jest-worker "^28.1.3" slash "^3.0.0" - source-map "^0.6.0" string-length "^4.0.1" + strip-ansi "^6.0.0" terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== dependencies: + "@jridgewell/trace-mapping" "^0.3.13" callsites "^3.0.0" - graceful-fs "^4.2.4" - source-map "^0.6.0" + graceful-fs "^4.2.9" -"@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== - dependencies: - "@jest/test-result" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" +"@jest/test-sequencer@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== + dependencies: + "@jest/test-result" "^28.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + slash "^3.0.0" + +"@jest/transform@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + micromatch "^4.0.4" + pirates "^4.0.4" slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" + write-file-atomic "^4.0.1" -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== dependencies: + "@jest/schemas" "^28.1.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^15.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" "@jridgewell/gen-mapping@^0.1.0": @@ -525,38 +1354,227 @@ "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/resolve-uri@^3.0.3": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" - integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/set-array@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.13" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" - integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@noble/hashes@^0.5.7": - version "0.5.9" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-0.5.9.tgz#9f3051a4cc6f7c168022b3b7fbbe9fe2a35cccf0" - integrity sha512-7lN1Qh6d8DUGmfN36XRsbN/WcGIPNtTGhkw26vWId/DlCIGsYJJootTtPGghTLcn/AaXPx2Q0b3cacrwXa7OVw== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@ledgerhq/devices@^7.0.3": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-7.0.7.tgz#3499304a1c9d3aa7399de2ad390719bef5d1e89c" + integrity sha512-PZ9TtaTGBYUm/g0qNKPbECZt7DDNvqM3ILS5wAtOMna2cBR+mrywUGXrkjuOWlHpuqZ8wenaAKveQBbzF2ba8w== + dependencies: + "@ledgerhq/errors" "^6.12.3" + "@ledgerhq/logs" "^6.10.1" + rxjs "6" + semver "^7.3.5" + +"@ledgerhq/devices@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-8.2.0.tgz#ef67bf49628252d1779acaa151b1a941acba790e" + integrity sha512-XROTW2gTmmuy+YPPDjdtKKTQ3mfxrPtKtV+a9QFbj8f5MnjVMV0Zpy1BIB4CyIMsVVi4z6+nI67auT7IlsM3SQ== + dependencies: + "@ledgerhq/errors" "^6.16.1" + "@ledgerhq/logs" "^6.12.0" + rxjs "^7.8.1" + semver "^7.3.5" -"@noble/secp256k1@^1.4.0": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" - integrity sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ== +"@ledgerhq/errors@^6.11.1", "@ledgerhq/errors@^6.12.3": + version "6.13.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.13.1.tgz#fd9570c1806824de734aed21df1a3d643ba8ed0c" + integrity sha512-y5qOFiX7ILACF7GvCAB67S5nCABEP5rm8lxK66qKIBRApcLlTplbjUACDRfKQbAIwf0SJPuR31rtTKB92ykwKQ== + +"@ledgerhq/errors@^6.16.1": + version "6.16.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.16.1.tgz#df650a9ba105397dee2e8c0ceddf6931c5b25ede" + integrity sha512-4D4wKecGzQpIu7sx03Sg4uE1e8g1oZUndWgw9gw776H8h9ov9c5TxPaldTn2j6orPECAERViLf7LTO4L5pE2Cw== + +"@ledgerhq/hw-app-starknet@^2.1.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-app-starknet/-/hw-app-starknet-2.1.1.tgz#c4efc6c4447d45a90db327d8d4819b12df6b0cb7" + integrity sha512-VlFEo/LAh0kfQdZrruKfmFnc4a5LCVK7MjBgMj8LIfd9gf2H46//lIhtC4IX7dt8dYyCX5KuvzO0vBlvL63UXA== + dependencies: + "@ledgerhq/hw-transport" "^6.27.1" + "@types/bn.js" "^5.1.1" + bn.js "^5.2.1" + +"@ledgerhq/hw-transport-node-hid-noevents@^6.29.1": + version "6.29.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-6.29.1.tgz#e819aa189157d34a1c2beba4f749bd424213e05d" + integrity sha512-eJms10MVMlWQHLrseyThZ5rrVSVRr/fRmqiHsbldprK2Xh3hl9BFp7gCJ7W8BJe8WxrndkztgRvf2ZLknb8+/Q== + dependencies: + "@ledgerhq/devices" "^8.2.0" + "@ledgerhq/errors" "^6.16.1" + "@ledgerhq/hw-transport" "^6.30.1" + "@ledgerhq/logs" "^6.12.0" + node-hid "^2.1.2" + +"@ledgerhq/hw-transport-node-hid@^6.27.6": + version "6.28.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-6.28.1.tgz#4e3c54b4267ad071aa272e2794edcf47feb7f8a6" + integrity sha512-9aM9qVXMq/GLjYg3qm+LuzIdgbdihFhyrKb7mVDXyuUlu2f4JeGGrCnF+DfSXTMuGIMRJ8W6I/2yrO1CcB3sIA== + dependencies: + "@ledgerhq/devices" "^8.2.0" + "@ledgerhq/errors" "^6.16.1" + "@ledgerhq/hw-transport" "^6.30.1" + "@ledgerhq/hw-transport-node-hid-noevents" "^6.29.1" + "@ledgerhq/logs" "^6.12.0" + lodash "^4.17.21" + node-hid "^2.1.2" + usb "2.9.0" + +"@ledgerhq/hw-transport@^6.27.1": + version "6.27.6" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.27.6.tgz#87f886591bad047c18e76920519aceb9d844667b" + integrity sha512-DRGUsB8WfbeEPuU42nAtwYpA5D6Bq3q1CvC2VjDinkukLcf6XMc22YUJl9mxt+h+/cLTU1Ff/pz+fqYqeELLEA== + dependencies: + "@ledgerhq/devices" "^7.0.3" + "@ledgerhq/errors" "^6.11.1" + events "^3.3.0" + +"@ledgerhq/hw-transport@^6.30.1": + version "6.30.1" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.30.1.tgz#fd3c825f41197aeaf705e3c066f82843eaf48cae" + integrity sha512-Xeeo4nt33g5Fsp3CdsPvcc2Uk7dwYeKRSlSFLWcYAAKprf/PmxgNekhke1eaNU/wLoeLOWhY2Cki8F8w9nLMdQ== + dependencies: + "@ledgerhq/devices" "^8.2.0" + "@ledgerhq/errors" "^6.16.1" + "@ledgerhq/logs" "^6.12.0" + events "^3.3.0" + +"@ledgerhq/logs@^6.10.1", "@ledgerhq/logs@^6.12.0": + version "6.12.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.12.0.tgz#ad903528bf3687a44da435d7b2479d724d374f5d" + integrity sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA== + +"@manypkg/find-root@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" + integrity sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA== + dependencies: + "@babel/runtime" "^7.5.5" + "@types/node" "^12.7.1" + find-up "^4.1.0" + fs-extra "^8.1.0" + +"@manypkg/get-packages@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@manypkg/get-packages/-/get-packages-1.1.3.tgz#e184db9bba792fa4693de4658cfb1463ac2c9c47" + integrity sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A== + dependencies: + "@babel/runtime" "^7.5.5" + "@changesets/types" "^4.0.1" + "@manypkg/find-root" "^1.1.0" + fs-extra "^8.1.0" + globby "^11.0.0" + read-yaml-file "^1.1.0" + +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@noble/curves@1.1.0", "@noble/curves@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== + dependencies: + "@noble/hashes" "1.3.1" + +"@noble/curves@~1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== + dependencies: + "@noble/hashes" "1.3.3" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/hashes@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + +"@noble/hashes@1.3.3", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1", "@noble/hashes@~1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -571,7 +1589,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -579,10 +1597,231 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.2" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== + dependencies: + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== + +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" + +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== + dependencies: + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/hardhat-chai-matchers@^1.0.3": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz#72a2e312e1504ee5dd73fe302932736432ba96bc" + integrity sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + +"@nomiclabs/hardhat-ethers@^2.0.5": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== + +"@openzeppelin/contracts@^4.7.3": + version "4.9.5" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.5.tgz#1eed23d4844c861a1835b5d33507c1017fa98de8" + integrity sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== "@protobufjs/base64@^1.1.2": version "1.1.2" @@ -597,12 +1836,12 @@ "@protobufjs/eventemitter@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== "@protobufjs/fetch@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== dependencies: "@protobufjs/aspromise" "^1.1.1" "@protobufjs/inquire" "^1.1.0" @@ -610,27 +1849,147 @@ "@protobufjs/float@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== "@protobufjs/inquire@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== "@protobufjs/path@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== "@protobufjs/pool@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== "@protobufjs/utf8@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@scure/base@~1.1.0", "@scure/base@~1.1.3": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@scure/starknet@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@scure/starknet/-/starknet-1.0.0.tgz#4419bc2fdf70f3dd6cb461d36c878c9ef4419f8c" + integrity sha512-o5J57zY0f+2IL/mq8+AYJJ4Xpc1fOtDhr+mFQKbHnYFmm3WQrC+8zj2HEgxak1a+x86mhmBC1Kq305KUpVf0wg== + dependencies: + "@noble/curves" "~1.3.0" + "@noble/hashes" "~1.3.3" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== "@sinonjs/commons@^1.7.0": version "1.8.3" @@ -639,19 +1998,41 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== dependencies: "@sinonjs/commons" "^1.7.0" -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@solidity-parser/parser@^0.16.0": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" + integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": +"@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== @@ -677,19 +2058,67 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.17.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" - integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309" + integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== dependencies: "@babel/types" "^7.3.0" -"@types/chai@^4.2.22": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" - integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== +"@types/bn.js@*", "@types/bn.js@^5.1.0": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" + integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== + dependencies: + "@types/node" "*" + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" + +"@types/chai-as-promised@^7.1.3": + version "7.1.5" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" + integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== + dependencies: + "@types/chai" "*" + +"@types/chai@*": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" + integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== -"@types/graceful-fs@^4.1.2": +"@types/chai@^4.3.3": + version "4.3.11" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.11.tgz#e95050bf79a932cb7305dd130254ccdf9bde671c" + integrity sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ== + +"@types/elliptic@^6.4.14": + version "6.4.18" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.18.tgz#bc96e26e1ccccbabe8b6f0e409c85898635482e1" + integrity sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw== + dependencies: + "@types/bn.js" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.3": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== @@ -715,83 +2144,280 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^26.0.15": - version "26.0.24" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a" - integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== +"@types/jest@^28.1.0": + version "28.1.8" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.8.tgz#6936409f3c9724ea431efd412ea0238a0f03b09b" + integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== dependencies: - jest-diff "^26.0.0" - pretty-format "^26.0.0" + expect "^28.0.0" + pretty-format "^28.0.0" + +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/long@^4.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== -"@types/node@*", "@types/node@>=13.7.0": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.32.tgz#51d59d7a90ef2d0ae961791e0900cad2393a0149" - integrity sha512-eAIcfAvhf/BkHcf4pkLJ7ECpBAhh9kcxRBpip9cTiO+hf+aJrsxYxBeS6OXvOd9WqNAJmavXVpZvY1rBjNsXmw== +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/mocha@^9.1.1": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== + +"@types/node@*": + version "20.11.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.1.tgz#6a93f94abeda166f688d3d2aca18012afbe5f850" + integrity sha512-DsXojJUES2M+FE8CpptJTKpg+r54moV9ZEncPstni1WHFmTcCzeFLnMFfyhCVS8XNOy/OQG+8lVxRLRrVHmV5A== + dependencies: + undici-types "~5.26.4" + +"@types/node@>=13.7.0": + version "18.11.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.2.tgz#c59b7641832531264fda3f1ba610362dc9a7dfc8" + integrity sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw== -"@types/node@^14.11.2": - version "14.18.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.17.tgz#37d3c01043fd09f3f17ffa8c17062bbb580f9558" - integrity sha512-oajWz4kOajqpKJMPgnCvBajPq8QAvl2xIWoFjlAJPKGu6n7pjov5SxGE45a+0RxHDoo4ycOMoZw1SCOWtDERbw== +"@types/node@^12.7.1": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/node@^18.7.11": + version "18.19.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.7.tgz#9a5f6ac7ec42a5dff68fe7faf2dd359710de4a12" + integrity sha512-IGRJfoNX10N/PfrReRZ1br/7SQ+2vF/tK3KXNwzXz82D32z5dMQEoOlFew18nLSN+vMNcLY4GrKfzwi/yWI8/w== + dependencies: + undici-types "~5.26.4" "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== -"@types/prettier@^2.0.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759" - integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw== +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.5": + version "2.7.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" + integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + +"@types/secp256k1@^4.0.1": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" + integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ== + dependencies: + "@types/node" "*" + +"@types/semver@^7.5.0": + version "7.5.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" + integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/w3c-web-usb@^1.0.6": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz#cf89cccd2d93b6245e784c19afe0a9f5038d4528" + integrity sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== +"@types/yargs@^17.0.8": + version "17.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" + integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== dependencies: "@types/yargs-parser" "*" -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +"@typescript-eslint/eslint-plugin@^6.7.2": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.18.1.tgz#0df881a47da1c1a9774f39495f5f7052f86b72e0" + integrity sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.18.1" + "@typescript-eslint/type-utils" "6.18.1" + "@typescript-eslint/utils" "6.18.1" + "@typescript-eslint/visitor-keys" "6.18.1" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.7.2": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.18.1.tgz#3c3987e186b38c77b30b6bfa5edf7c98ae2ec9d3" + integrity sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA== + dependencies: + "@typescript-eslint/scope-manager" "6.18.1" + "@typescript-eslint/types" "6.18.1" + "@typescript-eslint/typescript-estree" "6.18.1" + "@typescript-eslint/visitor-keys" "6.18.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.18.1": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.18.1.tgz#28c31c60f6e5827996aa3560a538693cb4bd3848" + integrity sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw== + dependencies: + "@typescript-eslint/types" "6.18.1" + "@typescript-eslint/visitor-keys" "6.18.1" + +"@typescript-eslint/type-utils@6.18.1": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.18.1.tgz#115cf535f8b39db8301677199ce51151e2daee96" + integrity sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q== + dependencies: + "@typescript-eslint/typescript-estree" "6.18.1" + "@typescript-eslint/utils" "6.18.1" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.18.1": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.18.1.tgz#91617d8080bcd99ac355d9157079970d1d49fefc" + integrity sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw== + +"@typescript-eslint/typescript-estree@6.18.1": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.18.1.tgz#a12b6440175b4cbc9d09ab3c4966c6b245215ab4" + integrity sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA== + dependencies: + "@typescript-eslint/types" "6.18.1" + "@typescript-eslint/visitor-keys" "6.18.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.18.1": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.18.1.tgz#3451cfe2e56babb6ac657e10b6703393d4b82955" + integrity sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.18.1" + "@typescript-eslint/types" "6.18.1" + "@typescript-eslint/typescript-estree" "6.18.1" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.18.1": + version "6.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.18.1.tgz#704d789bda2565a15475e7d22f145b8fe77443f4" + integrity sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA== + dependencies: + "@typescript-eslint/types" "6.18.1" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + +abi-wan-kanabi@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/abi-wan-kanabi/-/abi-wan-kanabi-2.2.1.tgz#367050c57b9e66a7cf977453d85579ad1fd8af36" + integrity sha512-W3RNuu2tG10W4AY63uq89JX/MsZSOxvpmsitQ3pbdVn3e8RxXR2oegN0QmGpgfyT0KlPdreydHsqq/u+2Pt2PQ== dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" + ansicolors "^0.3.2" + cardinal "^2.1.1" + fs-extra "^10.0.0" + yargs "^17.7.2" -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== + dependencies: + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.4.1, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -acorn@^8.2.4: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +address@^1.0.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6: version "6.0.2" @@ -800,19 +2426,47 @@ agent-base@6: dependencies: debug "4" -ansi-escapes@^4.2.1: +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -831,13 +2485,20 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansicolors@^0.3.2, ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@^3.0.3: version "3.1.2" @@ -847,18 +2508,13 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" + normalize-path "^3.0.0" + picomatch "^2.0.4" arg@^4.1.0: version "4.1.3" @@ -872,57 +2528,71 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array.prototype.flat@^1.2.3: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -axios@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.23.0.tgz#b0fa5d0948a8d1d75e3d5635238b6c4625b05149" - integrity sha512-NmvAE4i0YAv5cKq8zlDoPd1VLKAqX5oLuZKs8xkJa4qi6RGn0uhCYFjWtHHC9EM/MwOwYWOs53W+V0aqEXq1sg== - dependencies: - follow-redirects "^1.14.4" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== axios@^0.24.0: version "0.24.0" @@ -931,21 +2601,20 @@ axios@^0.24.0: dependencies: follow-redirects "^1.14.4" -babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== +babel-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" + "@jest/transform" "^28.1.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.1.3" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" slash "^3.0.0" -babel-plugin-istanbul@^6.0.0: +babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== @@ -956,14 +2625,14 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== +babel-plugin-jest-hoist@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" + "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: @@ -984,12 +2653,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== +babel-preset-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== dependencies: - babel-plugin-jest-hoist "^26.6.2" + babel-plugin-jest-hoist "^28.1.3" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -997,28 +2666,46 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-x@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +better-path-resolve@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" + integrity sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g== dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" + is-windows "^1.0.0" -bignumber.js@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== +bigint-crypto-utils@^3.0.23: + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" bl@^4.0.3: version "4.1.0" @@ -1029,15 +2716,25 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bn.js@^4.11.9: +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== +bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== brace-expansion@^1.1.7: version "1.1.11" @@ -1047,49 +2744,68 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.2: +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" +breakword@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/breakword/-/breakword-1.0.6.tgz#242506e7b871b7fad1bce8dc05cb0f2a129c12bd" + integrity sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw== + dependencies: + wcwidth "^1.0.1" + brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.20.2: - version "4.20.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" - integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: - caniuse-lite "^1.0.30001332" - electron-to-chromium "^1.4.118" - escalade "^3.1.1" - node-releases "^2.0.3" - picocolors "^1.0.0" + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" bs-logger@0.x: version "0.2.6" @@ -1098,6 +2814,22 @@ bs-logger@0.x: dependencies: fast-json-stable-stringify "2.x" +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -1105,11 +2837,16 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-from@1.x, buffer-from@^1.0.0: +buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -1118,49 +2855,114 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufio@^1.0.7: + version "1.1.3" + resolved "https://registry.yarnpkg.com/bufio/-/bufio-1.1.3.tgz#7f8e524fd719ced2caa563a09d50550f283f745f" + integrity sha512-W0ydG8t+ST+drUpEwl1N+dU9Ije06g8+43CLtvEIzfKo9nPFLXbKqDYE2XSg4w6RugsBcCj7pEU7jOpBC6BqrA== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001332: - version "1.0.30001340" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001340.tgz#029a2f8bfc025d4820fafbfaa6259fd7778340c7" - integrity sha512-jUNz+a9blQTQVu4uFcn17uAD8IDizPzQkIKh3LCJfg9BkyIqExYYdyc/ZSlWUSKb8iYiXxKsxbv4zYSvkqjrxw== +caniuse-lite@^1.0.30001400: + version "1.0.30001422" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz#f2d7c6202c49a8359e6e35add894d88ef93edba1" + integrity sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog== -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== dependencies: - rsvp "^4.8.4" + ansicolors "~0.3.2" + redeyed "~2.1.0" + +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== -chalk@^2.0.0: +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + dependencies: + check-error "^1.0.2" + +chai@^4.3.4: + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chai@^4.3.6: + version "4.4.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + +chalk@^2.1.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1169,7 +2971,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1182,6 +2984,33 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.2, check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +chokidar@3.5.3, chokidar@^3.4.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -1192,20 +3021,39 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== +ci-info@^3.2.0, ci-info@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== +classic-level@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" + integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cliui@^6.0.0: version "6.0.0" @@ -1225,29 +3073,30 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1265,64 +3114,93 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1331,74 +3209,93 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== +csv-generate@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-3.4.3.tgz#bc42d943b45aea52afa896874291da4b9108ffff" + integrity sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw== -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== +csv-parse@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-4.16.3.tgz#7ca624d517212ebc520a36873c3478fa66efbaf7" + integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" +csv-stringify@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/csv-stringify/-/csv-stringify-5.6.5.tgz#c6d74badda4b49a79bf4e72f91cce1e33b94de00" + integrity sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== +csv@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/csv/-/csv-5.5.3.tgz#cd26c1e45eae00ce6a9b7b27dcb94955ec95207d" + integrity sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g== dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" + csv-generate "^3.4.3" + csv-parse "^4.16.3" + csv-stringify "^5.6.5" + stream-transform "^2.1.3" + +death@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== -debug@4, debug@^4.1.0, debug@^4.1.1: +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: - ms "2.0.0" + decamelize "^1.1.0" + map-obj "^1.0.0" -decamelize@^1.2.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" -decompress-response@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" - integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + +deep-eql@^4.0.1, deep-eql@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: - mimic-response "^2.0.0" + type-detect "^4.0.0" deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -1408,58 +3305,81 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== dependencies: - is-descriptor "^0.1.0" + clone "^1.0.2" -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: - is-descriptor "^1.0.0" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +detect-indent@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-libc@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +detect-port@^1.3.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1467,19 +3387,19 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - webidl-conversions "^5.0.0" + esutils "^2.0.2" -electron-to-chromium@^1.4.118: - version "1.4.137" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f" - integrity sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA== +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== -elliptic@^6.5.4: +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -1492,10 +3412,10 @@ elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== emoji-regex@^8.0.0: version "8.0.0" @@ -1509,6 +3429,19 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +enquirer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1516,39 +3449,204 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" + esprima "^2.7.1" + estraverse "^1.9.1" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: - source-map "~0.6.1" + source-map "~0.2.0" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.49.0: + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.56.0" + "@humanwhocodes/config-array" "^0.11.13" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^5.2.0: +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== + +estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -1558,116 +3656,199 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -ethereum-cryptography@^0.2.0: - version "0.2.5" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.2.5.tgz#dfa636f0fa1978d962a13362d0850befb9ab8e7e" - integrity sha512-aWvqiegXgSTwbuDE1DDnM7taLteLcHVHh5nMZnnD2dwlvH6w5bOxcdXW20oS+1aLDorDlrK1c82stB8jsLDN5Q== +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== dependencies: - "@noble/hashes" "^0.5.7" - "@noble/secp256k1" "^1.4.0" - micro-base "^0.10.1" + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethers@^5.6.8, ethers@^5.6.9, ethers@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" strip-final-newline "^2.0.0" exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== -expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== +expect@^28.0.0, expect@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" +extendable-error@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" + integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= +external-editor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.0.3, fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -1680,34 +3861,44 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.16.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.16.0.tgz#83b9a9375692db77a822df081edb6a9cf6839320" + integrity sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA== dependencies: reusify "^1.0.4" fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= +fetch-cookie@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-3.0.1.tgz#6a77f7495e1a639ae019db916a234db8c85d5963" + integrity sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q== + dependencies: + set-cookie-parser "^2.4.8" + tough-cookie "^4.0.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + flat-cache "^3.0.4" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== fill-range@^7.0.1: version "7.0.1" @@ -1716,6 +3907,21 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== + dependencies: + locate-path "^2.0.0" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -1724,36 +3930,64 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -follow-redirects@^1.14.4: - version "1.15.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" - integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +find-yarn-workspace-root2@1.2.16: + version "1.2.16" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" + integrity sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA== + dependencies: + micromatch "^4.0.2" + pkg-dir "^4.2.0" -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +follow-redirects@^1.12.1: + version "1.15.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== + +follow-redirects@^1.14.4: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: - map-cache "^0.2.2" + is-callable "^1.1.3" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== from2@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g== dependencies: inherits "^2.0.1" readable-stream "^2.0.0" @@ -1763,6 +3997,44 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -1776,31 +4048,42 @@ fs-extra@^9.1.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.1.2: +fsevents@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -1812,43 +4095,67 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-func-name@^2.0.0, get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== dependencies: - pump "^3.0.0" + call-bind "^1.0.2" + get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +ghost-testrpc@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== + dependencies: + chalk "^2.4.2" + node-emoji "^1.10.0" github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -1860,12 +4167,79 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^11.0.4: +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +globby@^11.0.0, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -1877,70 +4251,163 @@ globby@^11.0.4: merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +handlebars@^4.0.1: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +hardhat@^2.16.1: + version "2.19.4" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.4.tgz#5112c30295d8be2e18e55d847373c50483ed1902" + integrity sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" + get-intrinsic "^1.2.2" -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-values@^1.0.0: +has-tostringtag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + has-symbols "^1.0.2" has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - function-bind "^1.1.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -1948,10 +4415,27 @@ hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -1962,26 +4446,21 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" https-proxy-agent@^5.0.0: version "5.0.1" @@ -1991,27 +4470,45 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-id@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" + integrity sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw== -iconv-lite@0.4.24: +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + +immutable@^4.0.0-rc.12: + version "4.3.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" import-local@^3.0.2: version "3.1.0" @@ -2024,26 +4521,45 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@~1.3.0: +ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + into-stream@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702" @@ -2052,104 +4568,91 @@ into-stream@^6.0.0: from2 "^2.3.0" p-is-promise "^3.0.0" -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: - kind-of "^3.0.2" + fp-ts "^1.0.0" -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: - kind-of "^6.0.0" + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: - ci-info "^2.0.0" + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" -is-core-module@^2.8.1: +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + hasown "^2.0.0" -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== +is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + has "^1.0.3" -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: - is-plain-object "^2.0.4" + has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -2161,105 +4664,147 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: - kind-of "^3.0.2" + has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-stream@^1.1.0: +is-plain-obj@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-subdir@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-subdir/-/is-subdir-1.2.0.tgz#b791cd28fab5202e91a08280d51d9d7254fd20d4" + integrity sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw== + dependencies: + better-path-resolve "1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" -is-windows@^1.0.2: +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-windows@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -isarray@1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-instrument@^5.0.4: - version "5.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -2285,208 +4830,196 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== +jest-changed-files@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" + integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" -jest-cli@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== +jest-cli@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" + integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/core" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" chalk "^4.0.0" exit "^0.1.2" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-config "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" prompts "^2.0.1" - yargs "^15.4.1" + yargs "^17.3.1" -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== +jest-config@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" + integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.3" + "@jest/types" "^28.1.3" + babel-jest "^28.1.3" chalk "^4.0.0" + ci-info "^3.2.0" deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.3" + jest-environment-node "^28.1.3" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-runner "^28.1.3" + jest-util "^28.1.3" + jest-validate "^28.1.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" -jest-diff@^26.0.0, jest-diff@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== +jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== dependencies: chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== dependencies: detect-newline "^3.0.0" -jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== +jest-each@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^28.1.3" chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" - -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + jest-get-type "^28.0.2" + jest-util "^28.1.3" + pretty-format "^28.1.3" + +jest-environment-node@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" - -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== - dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-mock "^28.1.3" + jest-util "^28.1.3" -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== +jest-haste-map@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== dependencies: - "@jest/types" "^26.6.2" - "@types/graceful-fs" "^4.1.2" + "@jest/types" "^28.1.3" + "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" - walker "^1.0.7" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + jest-worker "^28.1.3" + micromatch "^4.0.4" + walker "^1.0.8" optionalDependencies: - fsevents "^2.1.2" - -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^26.6.2" - is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" - -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== - dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" - -jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + fsevents "^2.3.2" + +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== dependencies: chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" -jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" slash "^3.0.0" - stack-utils "^2.0.2" + stack-utils "^2.0.3" -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== +jest-mock@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^28.1.3" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -2494,179 +5027,181 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== +jest-resolve-dependencies@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" + integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" + jest-regex-util "^28.0.2" + jest-snapshot "^28.1.3" -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== +jest-resolve@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== dependencies: - "@jest/types" "^26.6.2" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" + jest-util "^28.1.3" + jest-validate "^28.1.3" + resolve "^1.20.0" + resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== +jest-runner@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^28.1.3" + "@jest/environment" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" - emittery "^0.7.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" - source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/globals" "^28.1.3" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" chalk "^4.0.0" - cjs-module-lexer "^0.6.0" + cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - exit "^0.1.2" + execa "^5.0.0" glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.4.1" - -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.4" -jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^26.6.2" - graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" + expect "^28.1.3" + graceful-fs "^4.2.9" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" natural-compare "^1.4.0" - pretty-format "^26.6.2" - semver "^7.3.2" + pretty-format "^28.1.3" + semver "^7.3.5" -jest-util@^26.1.0, jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== +jest-util@^28.0.0, jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^28.1.3" "@types/node" "*" chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== +jest-validate@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" + "@jest/types" "^28.1.3" + camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^26.3.0" + jest-get-type "^28.0.2" leven "^3.1.0" - pretty-format "^26.6.2" + pretty-format "^28.1.3" -jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== +jest-watcher@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.6.2" + emittery "^0.10.2" + jest-util "^28.1.3" string-length "^4.0.1" -jest-worker@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== +jest-worker@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== dependencies: "@types/node" "*" merge-stream "^2.0.0" - supports-color "^7.0.0" + supports-color "^8.0.0" -jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" - integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== +jest@^28.1.0: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" + integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== dependencies: - "@jest/core" "^26.6.3" + "@jest/core" "^28.1.3" + "@jest/types" "^28.1.3" import-local "^3.0.2" - jest-cli "^26.6.3" + jest-cli "^28.1.3" -js-sha3@0.8.0: +js-sdsl@^4.1.4: + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== + +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -2676,7 +5211,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: +js-yaml@3.x, js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.6.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -2684,61 +5219,57 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsdom@^16.4.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json5@2.x, json5@^2.2.1: +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -2748,44 +5279,87 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" +jsonschema@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== dependencies: - is-buffer "^1.1.5" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +kleur@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + dependencies: + buffer "^6.0.3" + module-error "^1.0.1" + +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== + dependencies: + browser-level "^1.0.1" + classic-level "^1.2.0" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -2795,6 +5369,24 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +load-yaml-file@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/load-yaml-file/-/load-yaml-file-0.2.0.tgz#af854edaf2bea89346c07549122753c07372f64d" + integrity sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw== + dependencies: + graceful-fs "^4.1.5" + js-yaml "^3.13.0" + pify "^4.0.1" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -2802,16 +5394,73 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash@4.x, lodash@^4.7.0: +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== + +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +lossless-json@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lossless-json/-/lossless-json-4.0.1.tgz#d45229e3abb213a0235812780ca894ea8c5b2c6b" + integrity sha512-l0L+ppmgPDnb+JGxNLndPtJZGNf6+ZmVaQzoxQm3u6TXmhdnsA+YtdVR8DjzZd/em58686CQhOFDPewfJ4l7MA== + +loupe@^2.3.1, loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -2819,6 +5468,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -2838,51 +5492,75 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" -map-visit@^1.0.0: +memory-level@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== dependencies: - object-visit "^1.0.0" + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +meow@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" + integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "^4.0.2" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micro-base@^0.10.1: - version "0.10.2" - resolved "https://registry.yarnpkg.com/micro-base/-/micro-base-0.10.2.tgz#f6f9f0bd949ce511883e5a99f9147d80ddc32f5a" - integrity sha512-lqqJrT7lfJtDmmiQ4zRLZuIJBk96t0RAc5pCrrWpL9zDeH5i/SUL85mku9HqzTI/OCZ8EQ3aicbMW+eK5Nyu5w== - -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" @@ -2892,27 +5570,20 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" - integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" @@ -2922,48 +5593,109 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mixme@^0.5.1: + version "0.5.10" + resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.10.tgz#d653b2984b75d9018828f1ea333e51717ead5f51" + integrity sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q== mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@1.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +mkdirp@0.5.x: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@10.2.0, mocha@^10.0.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multistream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8" @@ -2972,73 +5704,104 @@ multistream@^4.1.0: once "^1.4.0" readable-stream "^3.6.0" -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== napi-build-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-abi@^3.3.0: + version "3.54.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.54.0.tgz#f6386f7548817acac6434c6cba02999c9aebcc69" + integrity sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA== + dependencies: + semver "^7.3.5" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^3.0.2: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-addon-api@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" -node-abi@^2.21.0: - version "2.30.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" - integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: - semver "^5.4.1" + whatwg-url "^5.0.0" -node-fetch@^2.6.6: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== +node-fetch@^2.6.12, node-fetch@^2.6.6: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== dependencies: whatwg-url "^5.0.0" +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0, node-gyp-build@^4.5.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== + +node-hid@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-2.2.0.tgz#33e039e7530a7bfe2b7a25f0a2f9496af8b02236" + integrity sha512-vj48zh9j555DZzUhMc8tk/qw6xPFrDyPBH1ST1Z/hWaA/juBJw7IuSxPeOgpzNFNU36mGYj+THioRMt1xOdm/g== + dependencies: + bindings "^1.5.0" + node-addon-api "^3.0.2" + prebuild-install "^7.1.1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-notifier@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== -node-releases@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" - integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + dependencies: + abbrev "1" normalize-package-data@^2.5.0: version "2.5.0" @@ -3050,88 +5813,59 @@ normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" -npmlog@^4.0.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + bn.js "4.11.6" + strip-hex-prefix "1.0.0" -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - isobject "^3.0.0" + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -3150,21 +5884,52 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +outdent@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" + integrity sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q== + +p-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" p-is-promise@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ== +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -3172,6 +5937,20 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -3179,17 +5958,48 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== pako@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" - integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -3199,15 +6009,10 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -3217,19 +6022,14 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.7: +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -3239,17 +6039,38 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pirates@^4.0.1: +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== @@ -3261,10 +6082,10 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-fetch@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-3.3.0.tgz#3afc2fb7a19219839cf75654fa8b54a2630df891" - integrity sha512-xJnIZ1KP+8rNN+VLafwu4tEeV4m8IkFBDdCFqmAJz9K1aiXEtbARmdbEe6HlXWGSVuShSHjFXpfkKRkDBQ5kiA== +pkg-fetch@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-3.4.2.tgz#6f68ebc54842b73f8c0808959a9df3739dcb28b7" + integrity sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA== dependencies: chalk "^4.1.2" fs-extra "^9.1.0" @@ -3276,69 +6097,82 @@ pkg-fetch@3.3.0: yargs "^16.2.0" pkg@^5.2.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/pkg/-/pkg-5.6.0.tgz#53d2616491e429db293d93d474e69ca3dc0f281d" - integrity sha512-mHrAVSQWmHA41RnUmRpC7pK9lNnMfdA16CF3cqOI22a8LZxOQzF7M8YWtA2nfs+d7I0MTDXOtkDsAsFXeCpYjg== + version "5.8.1" + resolved "https://registry.yarnpkg.com/pkg/-/pkg-5.8.1.tgz#862020f3c0575638ef7d1146f951a54d65ddc984" + integrity sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA== dependencies: - "@babel/parser" "7.16.2" - "@babel/types" "7.16.0" + "@babel/generator" "7.18.2" + "@babel/parser" "7.18.4" + "@babel/types" "7.19.0" chalk "^4.1.2" - escodegen "^2.0.0" fs-extra "^9.1.0" - globby "^11.0.4" + globby "^11.1.0" into-stream "^6.0.0" - minimist "^1.2.5" + is-core-module "2.9.0" + minimist "^1.2.6" multistream "^4.1.0" - pkg-fetch "3.3.0" - prebuild-install "6.1.4" - progress "^2.0.3" - resolve "^1.20.0" + pkg-fetch "3.4.2" + prebuild-install "7.1.1" + resolve "^1.22.0" stream-meter "^1.0.4" - tslib "2.3.1" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -prebuild-install@6.1.4: - version "6.1.4" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" - integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== +prebuild-install@7.1.1, prebuild-install@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== dependencies: - detect-libc "^1.0.3" + detect-libc "^2.0.0" expand-template "^2.0.3" github-from-package "0.0.0" minimist "^1.2.3" mkdirp-classic "^0.5.3" napi-build-utils "^1.0.1" - node-abi "^2.21.0" - npmlog "^4.0.1" + node-abi "^3.3.0" pump "^3.0.0" rc "^1.2.7" - simple-get "^3.0.3" + simple-get "^4.0.0" tar-fs "^2.0.0" tunnel-agent "^0.6.0" +preferred-pm@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.1.2.tgz#aedb70550734a574dffcbf2ce82642bd1753bdd6" + integrity sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q== + dependencies: + find-up "^5.0.0" + find-yarn-workspace-root2 "1.2.16" + path-exists "^4.0.0" + which-pm "2.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== prettier@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.1.tgz#d9485dd5e499daa6cb547023b87a6cf51bee37d6" integrity sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw== -pretty-format@^26.0.0, pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== +prettier@^2.7.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +pretty-format@^28.0.0, pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" process-nextick-args@~2.0.0: version "2.0.1" @@ -3359,9 +6193,9 @@ prompts@^2.0.1: sisteransi "^1.0.5" protobufjs@^6.11.2: - version "6.11.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" - integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== + version "6.11.3" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74" + integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -3377,10 +6211,15 @@ protobufjs@^6.11.2: "@types/node" ">=13.7.0" long "^4.0.0" +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: version "3.0.0" @@ -3390,16 +6229,43 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -queue-microtask@^1.2.2: +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -3410,10 +6276,10 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== read-pkg-up@^7.0.1: version "7.0.1" @@ -3434,10 +6300,20 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@^2.1.4: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +read-yaml-file@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-yaml-file/-/read-yaml-file-1.1.0.tgz#9362bbcbdc77007cc8ea4519fe1c0b821a7ce0d8" + integrity sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA== + dependencies: + graceful-fs "^4.1.5" + js-yaml "^3.6.1" + pify "^4.0.1" + strip-bom "^3.0.0" + +readable-stream@^2.0.0, readable-stream@^2.1.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -3448,47 +6324,84 @@ readable-stream@^2.0.0, readable-stream@^2.0.6, readable-stream@^2.1.4: util-deprecate "~1.0.1" readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" + picomatch "^2.2.1" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + dependencies: + esprima "~4.0.0" -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -3496,46 +6409,100 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.1.6, resolve@^1.10.0: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.10.0, resolve@^1.18.1, resolve@^1.20.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +resolve@^1.22.0: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.0: +rimraf@^2.2.8: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.3: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" run-parallel@^1.1.9: version "1.2.0" @@ -3544,7 +6511,36 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@^5.0.1, safe-buffer@~5.2.0: +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +rxjs@6: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -3554,76 +6550,142 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= +safe-regex-test@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.2.tgz#3ba32bdb3ea35f940ee87e5087c60ee786c3f6c5" + integrity sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ== dependencies: - ret "~0.1.10" + call-bind "^1.0.5" + get-intrinsic "^1.2.2" + is-regex "^1.1.4" "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" +sc-istanbul@^0.4.5: + version "0.4.6" + resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: - xmlchars "^2.2.0" + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.x, semver@^7.3.2, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +semver@7.x: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.3.0: +semver@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -set-blocking@^2.0.0, set-blocking@~2.0.0: +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-value@^2.0.0, set-value@^2.0.1: +set-cookie-parser@^2.4.8: + version "2.6.0" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" + integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== + +set-function-length@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== + dependencies: + define-data-property "^1.1.1" + function-bind "^1.1.2" + get-intrinsic "^1.2.2" + gopd "^1.0.1" + has-property-descriptors "^1.0.1" + +set-function-name@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + inherits "^2.0.1" + safe-buffer "^5.0.1" shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -3637,19 +6699,32 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shelljs@^0.8.3: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -3659,12 +6734,12 @@ simple-concat@^1.0.0: resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== -simple-get@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" - integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: - decompress-response "^4.2.0" + decompress-response "^6.0.0" once "^1.3.1" simple-concat "^1.0.0" @@ -3678,48 +6753,68 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== +smartwrap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/smartwrap/-/smartwrap-2.0.2.tgz#7e25d3dd58b51c6ca4aba3a9e391650ea62698a4" + integrity sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA== dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" + array.prototype.flat "^1.2.3" + breakword "^1.0.5" + grapheme-splitter "^1.0.4" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + yargs "^15.1.0" -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +solidity-coverage@^0.8.2: + version "0.8.5" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.5.tgz#64071c3a0c06a0cecf9a7776c35f49edc961e875" + integrity sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ== + dependencies: + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.16.0" + chalk "^2.4.2" + death "^1.1.0" + detect-port "^1.3.0" + difflib "^0.2.4" + fs-extra "^8.1.0" + ghost-testrpc "^0.0.2" + global-modules "^2.0.0" + globby "^10.0.1" + jsonschema "^1.2.4" + lodash "^4.17.15" + mocha "10.2.0" + node-emoji "^1.10.0" + pify "^4.0.1" + recursive-readdir "^2.2.2" + sc-istanbul "^0.4.5" + semver "^7.3.4" + shelljs "^0.8.3" + web3-utils "^1.3.6" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" + buffer-from "^1.0.0" + source-map "^0.6.0" -source-map-support@^0.5.17, source-map-support@^0.5.6: +source-map-support@^0.5.13: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -3727,30 +6822,30 @@ source-map-support@^0.5.17, source-map-support@^0.5.6: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== + dependencies: + amdefine ">=0.0.4" + +spawndamnit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" + integrity sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA== + dependencies: + cross-spawn "^5.1.0" + signal-exit "^3.0.2" spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -3769,61 +6864,64 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -stack-utils@^2.0.2: +stack-utils@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: escape-string-regexp "^2.0.0" -starknet@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/starknet/-/starknet-3.11.0.tgz#fff6411692eab8f1660ad0515705a0e633c8e763" - integrity sha512-+Qc3xuVseV74iKHbmiUJZx0zqH0qXoSbJJn/ZdDh9Rx/qbh6sqbmwxVlWAnYd5wsrZrEMiWttUd0OW+3ICGV/w== - dependencies: - "@ethersproject/bytes" "^5.6.1" - axios "^0.23.0" - bn.js "^5.2.0" - elliptic "^6.5.4" - ethereum-cryptography "^0.2.0" - hash.js "^1.1.7" - json-bigint "^1.0.0" - minimalistic-assert "^1.0.1" +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +starknet@6.6.6: + version "6.6.6" + resolved "https://registry.yarnpkg.com/starknet/-/starknet-6.6.6.tgz#5c4264811bb17cc61e2d08544156445b33e9916b" + integrity sha512-hriWRdfyvetf7mGqaKS7U7KSuGJ8tANFiY9gLxB7EJSRYvAXUcn2Xg/39QUenH5D4WzX4T4GVrpMw2GLZ+NZKw== + dependencies: + "@noble/curves" "~1.3.0" + "@scure/base" "~1.1.3" + "@scure/starknet" "~1.0.0" + abi-wan-kanabi "^2.2.1" + fetch-cookie "^3.0.0" + isomorphic-fetch "^3.0.0" + lossless-json "^4.0.1" pako "^2.0.4" - superstruct "^0.15.3" + ts-mixer "^6.0.3" url-join "^4.0.1" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== stream-meter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d" - integrity sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0= + integrity sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ== dependencies: readable-stream "^2.1.4" +stream-transform@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/stream-transform/-/stream-transform-2.1.3.tgz#a1c3ecd72ddbf500aa8d342b0b9df38f5aa598e3" + integrity sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ== + dependencies: + mixme "^0.5.1" + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -3832,16 +6930,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3850,6 +6939,33 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -3864,13 +6980,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -3878,30 +6987,58 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" -superstruct@^0.15.3: - version "0.15.4" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.4.tgz#e3381dd84ca07e704e19f69eda74eee1a5efb1f9" - integrity sha512-eOoMeSbP9ZJChNOm/9RYjE+F36rYR966AAqeG3xhQB02j2sfAUXDp4EQ/7bAOqnlJnuFDB8yvOu50SocvKpUEw== +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" supports-color@^5.3.0: version "5.5.0" @@ -3918,9 +7055,9 @@ supports-color@^7.0.0, supports-color@^7.1.0: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" @@ -3930,11 +7067,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - tar-fs@^2.0.0, tar-fs@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" @@ -3956,6 +7088,11 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" +term-size@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" + integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -3973,10 +7110,17 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" tmpl@1.0.5: version "1.0.5" @@ -3986,22 +7130,7 @@ tmpl@1.0.5: to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" @@ -4010,88 +7139,148 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== -ts-jest@^26.4.3: - version "26.5.6" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.5.6.tgz#c32e0746425274e1dfe333f43cd3c800e014ec35" - integrity sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA== +ts-jest@^28.0.7: + version "28.0.8" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" + integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== dependencies: bs-logger "0.x" - buffer-from "1.x" fast-json-stable-stringify "2.x" - jest-util "^26.1.0" - json5 "2.x" - lodash "4.x" + jest-util "^28.0.0" + json5 "^2.2.1" + lodash.memoize "4.x" make-error "1.x" - mkdirp "1.x" semver "7.x" - yargs-parser "20.x" + yargs-parser "^21.0.1" -ts-node@^8.3.0: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== - dependencies: +ts-mixer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.3.tgz#69bd50f406ff39daa369885b16c77a6194c7cae6" + integrity sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ== + +ts-node@^10.8.0: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" arg "^4.1.0" + create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" - source-map-support "^0.5.17" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^1.9.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +tty-table@^4.1.5: + version "4.2.3" + resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-4.2.3.tgz#e33eb4007a0a9c976c97c37fa13ba66329a5c515" + integrity sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA== + dependencies: + chalk "^4.1.2" + csv "^5.5.3" + kleur "^4.1.5" + smartwrap "^2.0.2" + strip-ansi "^6.0.1" + wcwidth "^1.0.1" + yargs "^17.7.1" tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -4102,84 +7291,172 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== dependencies: - is-typedarray "^1.0.0" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" -typescript@4.3.5: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.2.tgz#1f9aa2ceb9af87cca227813b4310fff0b51593c4" + integrity sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A== + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^5.14.0: + version "5.28.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.2.tgz#fea200eac65fc7ecaff80a023d1a0543423b4c91" + integrity sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w== dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" + "@fastify/busboy" "^2.0.0" -universalify@^0.1.2: +universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unset-value@^1.0.0: +unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: - has-value "^0.3.1" - isobject "^3.0.0" + escalade "^3.1.1" + picocolors "^1.0.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" url-join@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +usb@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/usb/-/usb-2.9.0.tgz#8ae3b175f93bee559400bff33491eee63406b6a2" + integrity sha512-G0I/fPgfHUzWH8xo2KkDxTTFruUWfppgSFJ+bQxz/kVY2x15EQ/XDB7dqD1G432G4gBG4jYQuF3U7j/orSs5nw== + dependencies: + "@types/w3c-web-usb" "^1.0.6" + node-addon-api "^6.0.0" + node-gyp-build "^4.5.0" + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@^8.3.0: +uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-to-istanbul@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" - integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== dependencies: + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" - source-map "^0.7.3" validate-npm-package-license@^3.0.1: version "3.0.4" @@ -4189,101 +7466,115 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7, walker@~1.0.5: +walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web3-utils@^1.3.6: + version "1.10.3" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.3.tgz#f1db99c82549c7d9f8348f04ffe4e0188b449714" + integrity sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-fetch@^3.4.1: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-pm@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" + integrity sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w== + dependencies: + load-yaml-file "^0.2.0" + path-exists "^4.0.0" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" -which@^1.2.9: +which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@^2.0.1, which@^2.0.2: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^6.2.0: version "6.2.0" @@ -4306,32 +7597,25 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== +write-file-atomic@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.4.6: - version "7.5.7" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" - integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + signal-exit "^3.0.7" -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== y18n@^4.0.0: version "4.0.3" @@ -4343,17 +7627,27 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@20.x, yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^18.1.2: +yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -4361,7 +7655,40 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^15.4.1: +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0, yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^15.1.0: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -4378,20 +7705,38 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^17.3.1: + version "17.6.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.1.tgz#712508771045019cda059bc1ba3ae091aaa1402e" + integrity sha512-leBuCGrL4dAd6ispNOGsJlhd0uZ6Qehkbu/B9KCR+Pxa/NVdNwi+i31lo0buCm6XxhJQFshXCD0/evfV4xfoUg== dependencies: - cliui "^7.0.2" + cliui "^8.0.1" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" - string-width "^4.2.0" + string-width "^4.2.3" y18n "^5.0.5" - yargs-parser "^20.2.2" + yargs-parser "^21.0.0" + +yargs@^17.7.1, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==