diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index da6af4e8..367056a5 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -13,7 +13,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.19 + go-version: 1.23 - uses: actions/checkout@v2 diff --git a/.github/workflows/dependecy-review.yml b/.github/workflows/dependecy-review.yml deleted file mode 100644 index 65c1cab3..00000000 --- a/.github/workflows/dependecy-review.yml +++ /dev/null @@ -1,17 +0,0 @@ -# The Licensed Work is (c) 2022 Sygma -# SPDX-License-Identifier: LGPL-3.0-only - -name: 'Dependency Review' -on: [pull_request] - -permissions: - contents: read - -jobs: - dependency-review: - runs-on: ubuntu-latest - steps: - - name: 'Checkout Repository' - uses: actions/checkout@v3 - - name: 'Dependency Review' - uses: actions/dependency-review-action@v2 diff --git a/.github/workflows/deploy_mainnet.yml b/.github/workflows/deploy_mainnet.yml deleted file mode 100644 index 70fc3586..00000000 --- a/.github/workflows/deploy_mainnet.yml +++ /dev/null @@ -1,167 +0,0 @@ -# The Licensed Work is (c) 2022 Sygma -# SPDX-License-Identifier: BUSL-1.1 - -name: Sygma Mainnet - -on: - workflow_dispatch: - inputs: - release_tag: - description: 'The Release tag Version' - required: true - type: string - TOKEN: - description: 'Authentication token' - required: true - type: string - -run-name: Deploy Relayers to Mainnet - ${{ inputs.release_tag }} by @${{ github.actor }} - -env: - ENVIRONMENT: 'MAINNET' - REGISTRY: 'ghcr.io' - -jobs: - ######################## region 1 ######################## - deploy_region_1: - name: deploy - runs-on: ubuntu-latest - environment: mainnet - strategy: - matrix: - relayer_id: [0, 1] - env: - AWS_MAINNET: '${{ secrets.AWS_MAINNET }}' - - permissions: - contents: read - id-token: write - - steps: - - name: Authentication - id: auth - run: | - if [ "${{ secrets.AUTH_TOKEN }}" != "${{ github.event.inputs.TOKEN }}" ]; then - echo "Authentcation failed. Exiting..." - exit 1 - fi - - name: Continue - if: steps.auth.outcome == 'success' - run: | - echo 'Authentication Succeeded!!!' - - - name: checkout ecs repo - uses: actions/checkout@v3 - with: - repository: sprintertech/devops - token: ${{ secrets.GHCR_TOKEN }} - - - name: render jinja2 templates to task definition json files - uses: cuchi/jinja2-action@v1.2.0 - with: - template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' - output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - data_format: json - variables: | - relayerId=${{ matrix.relayer_id }} - awsAccountId=${{ env.AWS_MAINNET }} - awsRegion=${{ secrets.AWS_REGION_1 }} - imageTag=${{ inputs.release_tag }} - awsEnv=${{ env.ENVIRONMENT }} - awsEfs=${{ secrets.MAINNET_EFS_1 }} - - - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - role-to-assume: arn:aws:iam::${{ env.AWS_MAINNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - aws-region: ${{ secrets.AWS_REGION_1 }} - role-session-name: GithubActions - - - name: deploy task definition - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' - cluster: 'relayer-${{ env.ENVIRONMENT }}' - wait-for-service-stability: true - - - name: slack notify - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,author,action,job,eventName,ref,workflow - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required - if: always() - - ######################## region 3 ######################## - deploy_region_3: - name: deploy - runs-on: ubuntu-latest - environment: mainnet - strategy: - matrix: - relayer_id: [2] - env: - AWS_MAINNET: '${{ secrets.AWS_MAINNET }}' - - permissions: - contents: read - id-token: write - - steps: - - name: Authentication - id: auth - run: | - if [ "${{ secrets.AUTH_TOKEN }}" != "${{ github.event.inputs.TOKEN }}" ]; then - echo "Authentcation failed. Exiting..." - exit 1 - fi - - name: Continue - if: steps.auth.outcome == 'success' - run: | - echo 'Authentication Succeeded!!!' - - - name: checkout ecs repo - uses: actions/checkout@v3 - with: - repository: sprintertech/devops - token: ${{ secrets.GHCR_TOKEN }} - - - name: render jinja2 templates to task definition json files - uses: cuchi/jinja2-action@v1.2.0 - with: - template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' - output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - data_format: json - variables: | - relayerId=${{ matrix.relayer_id }} - awsAccountId=${{ env.AWS_MAINNET }} - awsRegion=${{ secrets.AWS_REGION_3 }} - imageTag=${{ inputs.release_tag }} - awsEnv=${{ env.ENVIRONMENT }} - awsEfs=${{ secrets.MAINNET_EFS_3 }} - - - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - role-to-assume: arn:aws:iam::${{ env.AWS_MAINNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - aws-region: ${{ secrets.AWS_REGION_3 }} - role-session-name: GithubActions - - - name: deploy task definition - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' - cluster: 'relayer-${{ env.ENVIRONMENT }}' - wait-for-service-stability: true - - - name: slack notify - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,author,action,job,eventName,ref,workflow - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required - if: always() \ No newline at end of file diff --git a/.github/workflows/deploy_stage.yml b/.github/workflows/deploy_stage.yml deleted file mode 100644 index 95267b3f..00000000 --- a/.github/workflows/deploy_stage.yml +++ /dev/null @@ -1,176 +0,0 @@ -# The Licensed Work is (c) 2022 Sygma -# SPDX-License-Identifier: LGPL-3.0-only - -name: Sygma Devnet - -on: - push: - branches: - - main - -run-name: Deploy Relayers to Devnet - ${{ inputs.release_tag }} by @${{ github.actor }} - -env: - ENVIRONMENT: STAGE - REGISTRY: 'ghcr.io' - TAG: 'latest' - - -jobs: - push: - name: push - runs-on: ubuntu-latest - - permissions: - contents: read - id-token: write - - steps: - - name: checkout the source code - uses: actions/checkout@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: login to ghcr - id: ghcr - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.repository_owner }} - password: ${{ secrets.GHCR_TOKEN }} - - - name: build / tag / push docker image into ghcr - id: build-and-push - uses: docker/build-push-action@v3 - with: - context: . - push: true - tags: ${{ env.REGISTRY }}/${{ github.repository }}:${{ env.TAG }} - - - name: slack notify - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,author,action,job,eventName,ref,workflow # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required - if: always() - - ######################## region 1 ######################## - deploy_reg_1: - needs: push - name: deploy region 1 - runs-on: ubuntu-latest - environment: devnet - strategy: - matrix: - relayer_id: [1] - env: - AWS_DEVNET: '${{ secrets.AWS_DEVNET }}' - permissions: - contents: read - id-token: write - - steps: - - name: checkout ecs repo - uses: actions/checkout@v3 - with: - repository: sygmaprotocol/devops - token: ${{ secrets.GHCR_TOKEN }} - - - name: render jinja2 templates to task definition json files - uses: cuchi/jinja2-action@v1.2.0 - with: - template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' - output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - data_format: json - variables: | - relayerId=${{ matrix.relayer_id }} - awsAccountId=${{ env.AWS_DEVNET }} - awsRegion=${{ secrets.AWS_REGION_1 }} - awsEfs=${{ secrets.DEVNET_EFS_1 }} - - - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - role-to-assume: arn:aws:iam::${{ env.AWS_DEVNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - aws-region: ${{ secrets.AWS_REGION_1 }} - role-session-name: GithubActions - - - name: deploy task definition - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' - cluster: 'relayer-${{ env.ENVIRONMENT }}' - wait-for-service-stability: true - - - name: slack notify - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,author,action,job,eventName,ref,workflow # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required - if: always() - - ######################## region 3 ######################## - deploy_reg_3: - needs: push - name: deploy region 3 - runs-on: ubuntu-latest - environment: devnet - strategy: - matrix: - relayer_id: [4] - - env: - AWS_DEVNET: '${{ secrets.AWS_DEVNET }}' - - permissions: - contents: read - id-token: write - - steps: - - name: checkout ecs repo - uses: actions/checkout@v3 - with: - repository: sygmaprotocol/devops - token: ${{ secrets.GHCR_TOKEN }} - - - name: render jinja2 templates to task definition json files - uses: cuchi/jinja2-action@v1.2.0 - with: - template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' - output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - data_format: json - variables: | - relayerId=${{ matrix.relayer_id }} - awsAccountId=${{ env.AWS_DEVNET }} - awsRegion=${{ secrets.AWS_REGION_3 }} - awsEfs=${{ secrets.DEVNET_EFS_3 }} - - - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - role-to-assume: arn:aws:iam::${{ env.AWS_DEVNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - aws-region: ${{ secrets.AWS_REGION_3 }} - role-session-name: GithubActions - - - name: deploy task definition - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' - cluster: 'relayer-${{ env.ENVIRONMENT }}' - wait-for-service-stability: true - - - name: slack notify - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,author,action,job,eventName,ref,workflow # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required - if: always() diff --git a/.github/workflows/deploy_testnet.yml b/.github/workflows/deploy_testnet.yml deleted file mode 100644 index 778aef28..00000000 --- a/.github/workflows/deploy_testnet.yml +++ /dev/null @@ -1,174 +0,0 @@ -# The Licensed Work is (c) 2022 Sygma -# SPDX-License-Identifier: LGPL-3.0-only - -name: Sygma Testnet - -on: - release: - types: - - published - -run-name: Deploy Relayers to Testnet - ${{ inputs.release_tag }} by @${{ github.actor }} - -env: - ENVIRONMENT: 'TESTNET' - REGISTRY: 'ghcr.io' - TAG: 'stable' - -jobs: - push: - name: push - runs-on: ubuntu-latest - permissions: - contents: read - id-token: write - - steps: - - name: checkout the source code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: login to ghcr - id: ghcr - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.repository_owner }} - password: ${{ secrets.GHCR_TOKEN }} - - - name: build / tag / push docker image into ghcr - id: build-and-push-tag - uses: docker/build-push-action@v3 - with: - context: . - push: true - tags: ${{ env.REGISTRY }}/${{ github.repository }}:${{ env.TAG }},${{ env.REGISTRY }}/${{ github.repository }}:${{ github.ref_name }} - - - name: slack notify - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,author,action,job,eventName,ref,workflow # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required - if: always() - - ######################## region 1 ######################## - deploy: - needs: push - name: deploy - runs-on: ubuntu-latest - environment: testnet - strategy: - matrix: - relayer_id: [0, 1] - env: - AWS_TESTNET: '${{ secrets.AWS_TESTNET }}' - permissions: - contents: read - id-token: write - - steps: - - name: checkout ecs repo - uses: actions/checkout@v4 - with: - repository: sprintertech/devops - token: ${{ secrets.GHCR_TOKEN }} - - - name: render jinja2 templates to task definition json files - uses: cuchi/jinja2-action@v1.2.0 - with: - template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' - output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - data_format: json - variables: | - relayerId=${{ matrix.relayer_id }} - awsAccountId=${{ env.AWS_TESTNET }} - awsRegion=${{ secrets.AWS_REGION_1 }} - awsEfs=${{ secrets.TESTNET_EFS_1 }} - imageTag=${{ github.ref_name }} - - - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: arn:aws:iam::${{ env.AWS_TESTNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - aws-region: ${{ secrets.AWS_REGION_1 }} - role-session-name: GithubActions - - - name: deploy task definition - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' - cluster: 'relayer-${{ env.ENVIRONMENT }}' - wait-for-service-stability: true - - - name: slack notify - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,author,action,job,eventName,ref,workflow # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required - if: always() - - ######################## region 3 ######################## - deploy_reg_3: - needs: push - name: deploy region 3 - runs-on: ubuntu-latest - environment: testnet - strategy: - matrix: - relayer_id: [2] - env: - AWS_TESTNET: '${{ secrets.AWS_TESTNET }}' - permissions: - contents: read - id-token: write - - steps: - - name: checkout ecs repo - uses: actions/checkout@v4 - with: - repository: sprintertech/devops - token: ${{ secrets.GHCR_TOKEN }} - - - name: render jinja2 templates to task definition json files - uses: cuchi/jinja2-action@v1.2.0 - with: - template: 'relayers/ecs/task_definition-${{ env.ENVIRONMENT }}.j2' - output_file: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - data_format: json - variables: | - relayerId=${{ matrix.relayer_id }} - awsAccountId=${{ env.AWS_TESTNET }} - awsRegion=${{ secrets.AWS_REGION_3 }} - awsEfs=${{ secrets.TESTNET_EFS_3 }} - imageTag=${{ github.ref_name }} - - - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: arn:aws:iam::${{ env.AWS_TESTNET }}:role/github-actions-${{ env.ENVIRONMENT }}-chainbridge - aws-region: ${{ secrets.AWS_REGION_3 }} - role-session-name: GithubActions - - - name: deploy task definition - uses: aws-actions/amazon-ecs-deploy-task-definition@v1 - with: - task-definition: 'relayers/ecs/task_definition-${{ matrix.relayer_id }}_${{ env.ENVIRONMENT }}.json' - service: 'relayer-${{ matrix.relayer_id }}-service-${{ env.ENVIRONMENT }}' - cluster: 'relayer-${{ env.ENVIRONMENT }}' - wait-for-service-stability: true - - - name: slack notify - uses: 8398a7/action-slack@v3 - with: - status: ${{ job.status }} - fields: repo,message,commit,author,action,job,eventName,ref,workflow # selectable (default: repo,message) - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} # required - if: always() diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml deleted file mode 100644 index 80fdd922..00000000 --- a/.github/workflows/e2e.yml +++ /dev/null @@ -1,41 +0,0 @@ -# The Licensed Work is (c) 2022 Sygma -# SPDX-License-Identifier: LGPL-3.0-only - -on: - pull_request: - types: [opened, synchronize, reopened] - push: - branches: - - main - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -name: E2E tests -jobs: - e2e: - name: E2E Tests - strategy: - matrix: - go-version: [ 1.19.x ] - platform: [ ubuntu-latest ] - runs-on: ${{ matrix.platform }} - steps: - - name: Install Go - uses: actions/setup-go@v2 - with: - go-version: ${{ matrix.go-version }} - - name: Checkout code - uses: actions/checkout@v2 - - name: Run nodes - run: docker compose -f ./example/docker-compose.yml up -d - - name: Sleep - run: sleep 15 - - name: Run tests - run: make e2e-test - - name: Print logs - if: always() - run: | - docker ps -a - docker logs example_relayer1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 65e21682..1474b066 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: test: strategy: matrix: - go-version: [1.19.x] + go-version: [1.23.x] platform: [ ubuntu-latest ] runs-on: ubuntu-latest steps: diff --git a/CHANGELOG.md b/CHANGELOG.md index b05044e9..4dc68c6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,523 +1,2 @@ # Changelog -## [2.6.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.5.0...v2.6.0) (2024-12-04) - - -### Features - -* cross network retry ([#337](https://github.com/sygmaprotocol/sygma-relayer/issues/337)) ([eb43206](https://github.com/sygmaprotocol/sygma-relayer/commit/eb432060ef3fa823437e5039137320ecbbe84cc3)) -* metrics ([#380](https://github.com/sygmaprotocol/sygma-relayer/issues/380)) ([03ec27c](https://github.com/sygmaprotocol/sygma-relayer/commit/03ec27cc9b9ab754279a3c6e7cdacc52ce7606bd)) - - -### Bug Fixes - -* add optional revert gas to max fee set by user ([#388](https://github.com/sygmaprotocol/sygma-relayer/issues/388)) ([aacf99a](https://github.com/sygmaprotocol/sygma-relayer/commit/aacf99a30ec2b3d8ba10469b3f000e4aad8b9d6b)) -* v1 retry signature ([#386](https://github.com/sygmaprotocol/sygma-relayer/issues/386)) ([ae06d67](https://github.com/sygmaprotocol/sygma-relayer/commit/ae06d6776ef302cf95d25dbc2afaaced476de7f3)) - - -### Miscellaneous - -* added loki logs to example docker-compose ([#385](https://github.com/sygmaprotocol/sygma-relayer/issues/385)) ([2f772c2](https://github.com/sygmaprotocol/sygma-relayer/commit/2f772c26e1949ba6258689d77b28beb632bebd79)) - -## [2.5.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.4.1...v2.5.0) (2024-10-23) - - -### Features - -* match configs by domainID ([#375](https://github.com/sygmaprotocol/sygma-relayer/issues/375)) ([f695875](https://github.com/sygmaprotocol/sygma-relayer/commit/f6958751cf3838aedca255d8469525fa3056f2ce)) - - -### Bug Fixes - -* enable setting custom transfer gas per chain ([#376](https://github.com/sygmaprotocol/sygma-relayer/issues/376)) ([0b38483](https://github.com/sygmaprotocol/sygma-relayer/commit/0b3848362c193ba4463dd14e6a52748063acd1b7)) -* panic on shared config network fetching ([#378](https://github.com/sygmaprotocol/sygma-relayer/issues/378)) ([6cd6397](https://github.com/sygmaprotocol/sygma-relayer/commit/6cd6397f02c63589e4fdb4d8326a45283a69e029)) - - -### Miscellaneous - -* Access Secrets based on specific environments ([#367](https://github.com/sygmaprotocol/sygma-relayer/issues/367)) ([eed1e97](https://github.com/sygmaprotocol/sygma-relayer/commit/eed1e97d4cb09c9c2920aedcdec3801157629e94)) -* Update version of Substrate pallet ([#377](https://github.com/sygmaprotocol/sygma-relayer/issues/377)) ([4a3613b](https://github.com/sygmaprotocol/sygma-relayer/commit/4a3613b7e6e853c6c83c57c830fd78b2a49830b3)) - -## [2.4.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.4.0...v2.4.1) (2024-09-18) - - -### Bug Fixes - -* add generic call gas limit buffer ([#364](https://github.com/sygmaprotocol/sygma-relayer/issues/364)) ([3f01dae](https://github.com/sygmaprotocol/sygma-relayer/commit/3f01dae4cc69f46afd5c308c463ed6ae42a9f5f6)) - -## [2.4.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.3.0...v2.4.0) (2024-09-16) - - -### Features - -* treat native handler as erc20 ([#361](https://github.com/sygmaprotocol/sygma-relayer/issues/361)) ([d292ca0](https://github.com/sygmaprotocol/sygma-relayer/commit/d292ca0909459d2ad272bc76756996ed0333be63)) - - -### Bug Fixes - -* remove invalid frost resharing ([#363](https://github.com/sygmaprotocol/sygma-relayer/issues/363)) ([491f4f4](https://github.com/sygmaprotocol/sygma-relayer/commit/491f4f4367b5db716898c1157a1f2d66f0d5559a)) -* remove peer as well as addresses from peerstore ([#359](https://github.com/sygmaprotocol/sygma-relayer/issues/359)) ([fca7423](https://github.com/sygmaprotocol/sygma-relayer/commit/fca74235f8a1b10e123e41d580715fa889fbc3fe)) - -## [2.3.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.2.0...v2.3.0) (2024-09-03) - - -### Features - -* erc20 additional data ([#356](https://github.com/sygmaprotocol/sygma-relayer/issues/356)) ([74f3c5b](https://github.com/sygmaprotocol/sygma-relayer/commit/74f3c5b30e7cdc62600bffba45dbb6416bea5e09)) -* upload btc execution metadata to ipfs ([#339](https://github.com/sygmaprotocol/sygma-relayer/issues/339)) ([ff55000](https://github.com/sygmaprotocol/sygma-relayer/commit/ff55000d8e78f2138fd3d5849a8ae110429508cd)) - - -### Bug Fixes - -* frost key resharing ([#346](https://github.com/sygmaprotocol/sygma-relayer/issues/346)) ([7b35e11](https://github.com/sygmaprotocol/sygma-relayer/commit/7b35e11a5eaaa5d76ed01a5030432a70ee69d0c8)) -* return error when upload to ipfs fails ([#350](https://github.com/sygmaprotocol/sygma-relayer/issues/350)) ([8aff649](https://github.com/sygmaprotocol/sygma-relayer/commit/8aff6493514ce260563fe3d143079ca88b36ce29)) -* treat coordinator missing as a warn log ([#352](https://github.com/sygmaprotocol/sygma-relayer/issues/352)) ([25c41f5](https://github.com/sygmaprotocol/sygma-relayer/commit/25c41f5ba0df0801636ccd8d3496f41e466dacab)) - - -### Miscellaneous - -* add ipfs node to docker-compose ([#351](https://github.com/sygmaprotocol/sygma-relayer/issues/351)) ([09039b5](https://github.com/sygmaprotocol/sygma-relayer/commit/09039b53c05e6ded762650eae31086a28e8df109)) -* update fees docs ([#343](https://github.com/sygmaprotocol/sygma-relayer/issues/343)) ([6cfbbcc](https://github.com/sygmaprotocol/sygma-relayer/commit/6cfbbccbd1e0e699433a767f44870a45938e3a29)) - -## [2.2.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.1.2...v2.2.0) (2024-07-24) - - -### Features - -* btc fee collection ([#299](https://github.com/sygmaprotocol/sygma-relayer/issues/299)) ([9eeff52](https://github.com/sygmaprotocol/sygma-relayer/commit/9eeff5228db1c157ac53a91ea97732408437345b)) -* enable starting multiple tss processes with the same peer subset ([#331](https://github.com/sygmaprotocol/sygma-relayer/issues/331)) ([f65b16f](https://github.com/sygmaprotocol/sygma-relayer/commit/f65b16f9388e365a656817b526de5d8b1c39643a)) -* unlock pending btc proposals when doing retry ([#319](https://github.com/sygmaprotocol/sygma-relayer/issues/319)) ([5c67c79](https://github.com/sygmaprotocol/sygma-relayer/commit/5c67c793902c2ed121cccab6433bc8a1aa9aba84)) - - -### Bug Fixes - -* add fee estimate when calculating btc inputs ([#311](https://github.com/sygmaprotocol/sygma-relayer/issues/311)) ([0ca3a1b](https://github.com/sygmaprotocol/sygma-relayer/commit/0ca3a1b93d5d885a8c2686e86582df4413ea174b)) -* bad non zero check ([#315](https://github.com/sygmaprotocol/sygma-relayer/issues/315)) ([90ab5eb](https://github.com/sygmaprotocol/sygma-relayer/commit/90ab5ebe26ee157aab7999c053b4a08f026afcaf)) -* bump core to fix panic on invalid domain ([#328](https://github.com/sygmaprotocol/sygma-relayer/issues/328)) ([34830ae](https://github.com/sygmaprotocol/sygma-relayer/commit/34830aef2ddad502fea96ac3905762f7ddfba120)) -* enforce proposal execution per resource ([#309](https://github.com/sygmaprotocol/sygma-relayer/issues/309)) ([49a0777](https://github.com/sygmaprotocol/sygma-relayer/commit/49a07772563f1a579035f979ae6db6511f803e2b)) -* fix typos ([#313](https://github.com/sygmaprotocol/sygma-relayer/issues/313)) ([a3c54af](https://github.com/sygmaprotocol/sygma-relayer/commit/a3c54afd957bae2d1e918846a1319059811b6f12)) -* handle msg.To being empty properly ([#312](https://github.com/sygmaprotocol/sygma-relayer/issues/312)) ([68a3acc](https://github.com/sygmaprotocol/sygma-relayer/commit/68a3accae212d7712b94079f8c33133572d8c479)) -* ignore refresh errors to prevent infinite loops ([#332](https://github.com/sygmaprotocol/sygma-relayer/issues/332)) ([496e9ae](https://github.com/sygmaprotocol/sygma-relayer/commit/496e9aed26cbb041f92c34ee9ea39f3f939865a7)) -* is proposal executed nonce ([#335](https://github.com/sygmaprotocol/sygma-relayer/issues/335)) ([a966428](https://github.com/sygmaprotocol/sygma-relayer/commit/a96642887db523557f7d19506df481b24225d4b1)) -* possible race condition ([#316](https://github.com/sygmaprotocol/sygma-relayer/issues/316)) ([b9b5341](https://github.com/sygmaprotocol/sygma-relayer/commit/b9b5341f61b7cdf1ca2c408d1f05074d979a4e80)) -* post audit fixes ([#329](https://github.com/sygmaprotocol/sygma-relayer/issues/329)) ([d23d61d](https://github.com/sygmaprotocol/sygma-relayer/commit/d23d61d4be792c030a74c832547865e2e8c05035)) -* reduce tx nonce collision chances ([#314](https://github.com/sygmaprotocol/sygma-relayer/issues/314)) ([5431db5](https://github.com/sygmaprotocol/sygma-relayer/commit/5431db55c1dcb47b41616032ed0cc376d0fcf78e)) -* remove ECDSA peer ([#324](https://github.com/sygmaprotocol/sygma-relayer/issues/324)) ([3c4cbaa](https://github.com/sygmaprotocol/sygma-relayer/commit/3c4cbaa5a5bae5d14af2f3e343445dc56c17d84f)) -* schnorr signature hash missing leading zeroes ([#341](https://github.com/sygmaprotocol/sygma-relayer/issues/341)) ([34f52b1](https://github.com/sygmaprotocol/sygma-relayer/commit/34f52b17c314aca63e4d32c7988eb1e7049eb576)) -* sort utxos by oldest to prevent mismatched messages ([#317](https://github.com/sygmaprotocol/sygma-relayer/issues/317)) ([033b58a](https://github.com/sygmaprotocol/sygma-relayer/commit/033b58a92236bf8c97198912cbfb4c0ec487e7b4)) -* update key threshold when doing frost resharing ([#333](https://github.com/sygmaprotocol/sygma-relayer/issues/333)) ([f1e6db1](https://github.com/sygmaprotocol/sygma-relayer/commit/f1e6db13998487c6af77097615f68344c84c8f53)) -* update sygma-core version ([#321](https://github.com/sygmaprotocol/sygma-relayer/issues/321)) ([94429d4](https://github.com/sygmaprotocol/sygma-relayer/commit/94429d42b26726ccfa8414a24dacdc61b51f5783)) - - -### Miscellaneous - -* add btc deposit format explanation ([#318](https://github.com/sygmaprotocol/sygma-relayer/issues/318)) ([080554c](https://github.com/sygmaprotocol/sygma-relayer/commit/080554c24662acb74153789c343dcc8fb57b5e5c)) -* bump polkadot libs ([#330](https://github.com/sygmaprotocol/sygma-relayer/issues/330)) ([1119f23](https://github.com/sygmaprotocol/sygma-relayer/commit/1119f231542225bc64c2e4511e35e63d382fe11c)) - -## [2.1.2](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.1.1...v2.1.2) (2024-06-21) - - -### Bug Fixes - -* Stop tssProcess only once in coordinator.execute function ([#276](https://github.com/sygmaprotocol/sygma-relayer/issues/276)) ([d2e83e9](https://github.com/sygmaprotocol/sygma-relayer/commit/d2e83e92fd8ec4c0590142479ba3e8c8bf42f626)) - - -### Miscellaneous - -* remove keyshare check ([#310](https://github.com/sygmaprotocol/sygma-relayer/issues/310)) ([4f50c7c](https://github.com/sygmaprotocol/sygma-relayer/commit/4f50c7c1c578faaef96bf1bb4302c77ffa4c571a)) - -## [2.1.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.1.0...v2.1.1) (2024-06-14) - - -### Bug Fixes - -* add timeout for frost outbound messages ([#301](https://github.com/sygmaprotocol/sygma-relayer/issues/301)) ([53c63a0](https://github.com/sygmaprotocol/sygma-relayer/commit/53c63a054948c9dec0d94fdcf17b4ee20c946e17)) - - -### Miscellaneous - -* add e2e tests btc -> evm transfer ([#298](https://github.com/sygmaprotocol/sygma-relayer/issues/298)) ([79777bd](https://github.com/sygmaprotocol/sygma-relayer/commit/79777bdaab8e86d337bfc03069803b4745b5316f)) - -## [2.1.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.0.4...v2.1.0) (2024-06-11) - - -### Features - -* bitcoin ([#296](https://github.com/sygmaprotocol/sygma-relayer/issues/296)) ([ff09579](https://github.com/sygmaprotocol/sygma-relayer/commit/ff09579a5c384f010ecd57657663c29ef26573ea)) - -## [2.0.4](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.0.3...v2.0.4) (2024-05-29) - - -### Bug Fixes - -* refresh coordinator being outside the peerstore ([#283](https://github.com/sygmaprotocol/sygma-relayer/issues/283)) ([9dfee13](https://github.com/sygmaprotocol/sygma-relayer/commit/9dfee131d9bfcd69dec45b4051f3bbc655fe0971)) - - -### Miscellaneous - -* reduced devnet to one nodes per region ([#271](https://github.com/sygmaprotocol/sygma-relayer/issues/271)) ([d84aae3](https://github.com/sygmaprotocol/sygma-relayer/commit/d84aae31ea932e56516548026ffb8637f8e9f182)) -* visibility of image versions ([#292](https://github.com/sygmaprotocol/sygma-relayer/issues/292)) ([ce8a986](https://github.com/sygmaprotocol/sygma-relayer/commit/ce8a98679176c6db8647da1997917f529b916d0a)) - -## [2.0.3](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.0.2...v2.0.3) (2024-05-20) - - -### Miscellaneous - -* Add keygen CLI ([#278](https://github.com/sygmaprotocol/sygma-relayer/issues/278)) ([9d9a113](https://github.com/sygmaprotocol/sygma-relayer/commit/9d9a113df03a417e715f7e59ff73665b7456ba31)) -* remove relayers from devnet pipeline ([#280](https://github.com/sygmaprotocol/sygma-relayer/issues/280)) ([14fdb0d](https://github.com/sygmaprotocol/sygma-relayer/commit/14fdb0dc6d0fd7e19e93b1f08e75c7a335b5cafa)) - -## [2.0.2](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.0.1...v2.0.2) (2024-04-18) - - -### Bug Fixes - -* use existing message channel for substrate network event handlers ([#272](https://github.com/sygmaprotocol/sygma-relayer/issues/272)) ([a592ef7](https://github.com/sygmaprotocol/sygma-relayer/commit/a592ef7fe06ffbad3efd6008430cd9d0da874264)) - -## [2.0.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v2.0.0...v2.0.1) (2024-04-15) - - -### Bug Fixes - -* revert starting block changes ([#269](https://github.com/sygmaprotocol/sygma-relayer/issues/269)) ([3babab3](https://github.com/sygmaprotocol/sygma-relayer/commit/3babab31e248af7ad007a14ae2efd3fdb3ca8e76)) - -## [2.0.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.11.0...v2.0.0) (2024-04-12) - - -### ⚠ BREAKING CHANGES - -* sygma core refactor ([#256](https://github.com/sygmaprotocol/sygma-relayer/issues/256)) - -### Features - -* add message id to logs ([#267](https://github.com/sygmaprotocol/sygma-relayer/issues/267)) ([347657b](https://github.com/sygmaprotocol/sygma-relayer/commit/347657b6220cd0efcfe3aae8cbfab981d973e5c2)) -* sygma core refactor ([#256](https://github.com/sygmaprotocol/sygma-relayer/issues/256)) ([de153be](https://github.com/sygmaprotocol/sygma-relayer/commit/de153be95d580d979082d3600cb7ee89a9e320a2)) - - -### Bug Fixes - -* avoid blocking when refresh and keygen fail ([#266](https://github.com/sygmaprotocol/sygma-relayer/issues/266)) ([3bce952](https://github.com/sygmaprotocol/sygma-relayer/commit/3bce9528965986e627cedd0524f94c01d62a70af)) -* duplicate and missing message ids ([#268](https://github.com/sygmaprotocol/sygma-relayer/issues/268)) ([bdf6519](https://github.com/sygmaprotocol/sygma-relayer/commit/bdf65198f57a9256cddfd8903c7f612fcaa65c67)) - - -### Miscellaneous - -* Add CLI description to docs ([#239](https://github.com/sygmaprotocol/sygma-relayer/issues/239)) ([9fb9d17](https://github.com/sygmaprotocol/sygma-relayer/commit/9fb9d1701a238e2b852ab6f16281ea138578913e)) -* reduce turnaround time ([#260](https://github.com/sygmaprotocol/sygma-relayer/issues/260)) ([8d18d3c](https://github.com/sygmaprotocol/sygma-relayer/commit/8d18d3c1060410df62a9970725654a16dc64ad2a)) -* remove stable tag for image version ([#258](https://github.com/sygmaprotocol/sygma-relayer/issues/258)) ([371b55a](https://github.com/sygmaprotocol/sygma-relayer/commit/371b55a4ffb1483d3558565226b3741d56a680b0)) - -## [1.11.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.10.4...v1.11.0) (2024-03-21) - - -### Features - -* add erc1155 listener/handler ([#254](https://github.com/sygmaprotocol/sygma-relayer/issues/254)) ([68923e3](https://github.com/sygmaprotocol/sygma-relayer/commit/68923e3cfd825693b3cfc8f1bdd3ca1c639a140d)) - -## [1.10.4](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.10.3...v1.10.4) (2024-01-31) - - -### Miscellaneous - -* slack notify ([#249](https://github.com/sygmaprotocol/sygma-relayer/issues/249)) ([9d19568](https://github.com/sygmaprotocol/sygma-relayer/commit/9d19568447e8e652b2c8a5740d8128f03875135a)) -* workflow renaming ([#251](https://github.com/sygmaprotocol/sygma-relayer/issues/251)) ([c7de390](https://github.com/sygmaprotocol/sygma-relayer/commit/c7de390f6a872d1ffdcf611540acf2d89b9b636d)) - -## [1.10.3](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.10.2...v1.10.3) (2024-01-11) - - -### Miscellaneous - -* bump dependencies ([#244](https://github.com/sygmaprotocol/sygma-relayer/issues/244)) ([621f81c](https://github.com/sygmaprotocol/sygma-relayer/commit/621f81c121fc2f6f4c6c9b871f3d4fa063f91d2d)) - -## [1.10.2](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.10.1...v1.10.2) (2023-11-30) - - -### Miscellaneous - -* add version on startup ([#240](https://github.com/sygmaprotocol/sygma-relayer/issues/240)) ([e86c9d9](https://github.com/sygmaprotocol/sygma-relayer/commit/e86c9d9b31cc24bce542f99bab1d774863dab608)) -* update codeowners ([#237](https://github.com/sygmaprotocol/sygma-relayer/issues/237)) ([a6be32a](https://github.com/sygmaprotocol/sygma-relayer/commit/a6be32a19dbfe2b856840fd1995fde2dcfb14f91)) - -## [1.10.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.10.0...v1.10.1) (2023-10-19) - - -### Bug Fixes - -* invalid bully restart ([#227](https://github.com/sygmaprotocol/sygma-relayer/issues/227)) ([884b58d](https://github.com/sygmaprotocol/sygma-relayer/commit/884b58d286acbf9b07028adb2cfaddc35a96c42a)) -* listeners not retrying failed event handlers ([#229](https://github.com/sygmaprotocol/sygma-relayer/issues/229)) ([37567c9](https://github.com/sygmaprotocol/sygma-relayer/commit/37567c945e5808f176b81cf5e2aac847a44fa7c4)) - - -### Miscellaneous - -* update readme file ([#210](https://github.com/sygmaprotocol/sygma-relayer/issues/210)) ([17f796f](https://github.com/sygmaprotocol/sygma-relayer/commit/17f796f16c4fd1332b2679b11028999f16814f9a)) - -## [1.10.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.9.1...v1.10.0) (2023-10-10) - - -### Features - -* enable generic transaction batching ([#217](https://github.com/sygmaprotocol/sygma-relayer/issues/217)) ([67a5ae7](https://github.com/sygmaprotocol/sygma-relayer/commit/67a5ae78dcb4cf5986b74c634bc3e341fd5e3cef)) - - -### Miscellaneous - -* enabled region_1 pipeline ([#225](https://github.com/sygmaprotocol/sygma-relayer/issues/225)) ([fe2df97](https://github.com/sygmaprotocol/sygma-relayer/commit/fe2df979646002d2cd90800ef5bc7e2dbe613978)) -* multi region deployment ([#219](https://github.com/sygmaprotocol/sygma-relayer/issues/219)) ([6b42706](https://github.com/sygmaprotocol/sygma-relayer/commit/6b427066b21b7b647476fb98f9c1c9162cbc371e)) -* testing regional deployment ([#224](https://github.com/sygmaprotocol/sygma-relayer/issues/224)) ([ae91338](https://github.com/sygmaprotocol/sygma-relayer/commit/ae91338e07652f3c1a2b3a66356fd8f1e475cda2)) -* testnet regional deployment ([#222](https://github.com/sygmaprotocol/sygma-relayer/issues/222)) ([d46d870](https://github.com/sygmaprotocol/sygma-relayer/commit/d46d870a720fd56c1d2ffed737cb24df0ddc3519)) -* update aws region ([#221](https://github.com/sygmaprotocol/sygma-relayer/issues/221)) ([bc47380](https://github.com/sygmaprotocol/sygma-relayer/commit/bc47380923447c14a6302e0c92835eb360207af9)) - -## [1.9.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.9.0...v1.9.1) (2023-09-04) - - -### Bug Fixes - -* fixed efs id ([#212](https://github.com/sygmaprotocol/sygma-relayer/issues/212)) ([c3ad702](https://github.com/sygmaprotocol/sygma-relayer/commit/c3ad702f38038f83213be5a2c74ddb8d5195b53c)) - - -### Miscellaneous - -* added efs interpolation ([#214](https://github.com/sygmaprotocol/sygma-relayer/issues/214)) ([f723b4d](https://github.com/sygmaprotocol/sygma-relayer/commit/f723b4d550d7cc592e0a87dd310f675cda9e6386)) -* fix typo ([#215](https://github.com/sygmaprotocol/sygma-relayer/issues/215)) ([1410b08](https://github.com/sygmaprotocol/sygma-relayer/commit/1410b08822fba93d8cda7e8053f7a208698e08d0)) - -## [1.9.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.8.1...v1.9.0) (2023-09-01) - - -### Features - -* calculate gas based on proposal count ([#202](https://github.com/sygmaprotocol/sygma-relayer/issues/202)) ([3da4977](https://github.com/sygmaprotocol/sygma-relayer/commit/3da4977a812bae442f765796182a8b3c8fd67e86)) - - -### Bug Fixes - -* fix-bug-with-locked-keystore ([#211](https://github.com/sygmaprotocol/sygma-relayer/issues/211)) ([abffaf4](https://github.com/sygmaprotocol/sygma-relayer/commit/abffaf4f0ec480c6bf428599ee4fb3568b08adcc)) - - -### Miscellaneous - -* multi regional deployment ([#208](https://github.com/sygmaprotocol/sygma-relayer/issues/208)) ([c24c540](https://github.com/sygmaprotocol/sygma-relayer/commit/c24c540439ed107e4aba21b04a1d9add1a4e6bd0)) -* percentage fee strategy docs ([#206](https://github.com/sygmaprotocol/sygma-relayer/issues/206)) ([800cddf](https://github.com/sygmaprotocol/sygma-relayer/commit/800cddfdf077a7c915448c00ffebffa7bb344dd3)) -* revert changes to 1980918 ([#209](https://github.com/sygmaprotocol/sygma-relayer/issues/209)) ([5900dca](https://github.com/sygmaprotocol/sygma-relayer/commit/5900dca2f0bf323a48c3af88b14ff060fba7b110)) - -## [1.8.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.8.0...v1.8.1) (2023-06-28) - - -### Bug Fixes - -* substrate metadata update event not caught ([#198](https://github.com/sygmaprotocol/sygma-relayer/issues/198)) ([ce0b9bc](https://github.com/sygmaprotocol/sygma-relayer/commit/ce0b9bc7f715dccabe7100942bd642f48d02d93d)) - -## [1.8.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.7.0...v1.8.0) (2023-06-26) - - -### Features - -* mainnet deployment pipeline with release tags ([#196](https://github.com/sygmaprotocol/sygma-relayer/issues/196)) ([3977179](https://github.com/sygmaprotocol/sygma-relayer/commit/3977179ad2645b7da39f6dd47dea68eaf9beba79)) - - -### Miscellaneous - -* fix glib error in docker ([#194](https://github.com/sygmaprotocol/sygma-relayer/issues/194)) ([31a8b8f](https://github.com/sygmaprotocol/sygma-relayer/commit/31a8b8f9c6930ffb8999eea6313022a575c9bc77)) - -## [1.7.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.6.0...v1.7.0) (2023-06-07) - - -### Features - -* update otlp sdk version and add metric tags ([#192](https://github.com/sygmaprotocol/sygma-relayer/issues/192)) ([ba919d6](https://github.com/sygmaprotocol/sygma-relayer/commit/ba919d6e2e0e4533146917d1b486bab1928771ab)) - - -### Bug Fixes - -* fix extrinsic failed event not throwing error ([#191](https://github.com/sygmaprotocol/sygma-relayer/issues/191)) ([c45f3ee](https://github.com/sygmaprotocol/sygma-relayer/commit/c45f3ee438e99b1addd7d208e3aa5057ce5904de)) - -## [1.6.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.5.1...v1.6.0) (2023-05-31) - - -### Features - -* wait until executions are over before exiting ([#179](https://github.com/sygmaprotocol/sygma-relayer/issues/179)) ([d396d6f](https://github.com/sygmaprotocol/sygma-relayer/commit/d396d6f30ba6598d1c74d22c7ea74c4135398b54)) - - -### Bug Fixes - -* end singing tss process after signature is received ([#183](https://github.com/sygmaprotocol/sygma-relayer/issues/183)) ([36b6c6f](https://github.com/sygmaprotocol/sygma-relayer/commit/36b6c6f71e60aa34d6239cabe35e17e56a3d70be)) -* fix bug of calculateBock panic when latestBlock is true ([#182](https://github.com/sygmaprotocol/sygma-relayer/issues/182)) ([82c222c](https://github.com/sygmaprotocol/sygma-relayer/commit/82c222cfc5282b67b66dfa5e0897b9190d2b9d55)) - - -### Miscellaneous - -* bump core version to 1.3.1 ([#185](https://github.com/sygmaprotocol/sygma-relayer/issues/185)) ([bc60d6a](https://github.com/sygmaprotocol/sygma-relayer/commit/bc60d6a011bb76b306d1345ac26be15eab7a653f)) -* update license ([#187](https://github.com/sygmaprotocol/sygma-relayer/issues/187)) ([1980918](https://github.com/sygmaprotocol/sygma-relayer/commit/1980918290a91d77102eda1600d369754c31a33d)) - -## [1.5.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.5.0...v1.5.1) (2023-05-19) - - -### Miscellaneous - -* add least authority audit report ([#174](https://github.com/sygmaprotocol/sygma-relayer/issues/174)) ([1457447](https://github.com/sygmaprotocol/sygma-relayer/commit/145744749d32405bafabd7b9b40f18f21e6d9c0d)) -* add more verbosity to some p2p comm logs ([#177](https://github.com/sygmaprotocol/sygma-relayer/issues/177)) ([ed65fa8](https://github.com/sygmaprotocol/sygma-relayer/commit/ed65fa893683695002cb397576d2da7d09a93a50)) -* updated audit report ([#176](https://github.com/sygmaprotocol/sygma-relayer/issues/176)) ([8bbf68d](https://github.com/sygmaprotocol/sygma-relayer/commit/8bbf68d62c99dbd98474a70f88290bb3b25cbc92)) - -## [1.5.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.4.1...v1.5.0) (2023-05-15) - - -### Features - -* add relayerID and instance env to configuration to use in metrics ([#165](https://github.com/sygmaprotocol/sygma-relayer/issues/165)) ([d9c0860](https://github.com/sygmaprotocol/sygma-relayer/commit/d9c0860568145f5ce509e91c48691c4cf1e29f1a)) -* implement metrics ([#153](https://github.com/sygmaprotocol/sygma-relayer/issues/153)) ([cea714e](https://github.com/sygmaprotocol/sygma-relayer/commit/cea714e09a5848d7349bf100692a1ff84a2ee995)) -* track substrate extrinsic status ([#157](https://github.com/sygmaprotocol/sygma-relayer/issues/157)) ([eee465c](https://github.com/sygmaprotocol/sygma-relayer/commit/eee465c60dfc5ad1aa3ca652935b9010ba2e1ac1)) -* update library versions ([#172](https://github.com/sygmaprotocol/sygma-relayer/issues/172)) ([aba6d60](https://github.com/sygmaprotocol/sygma-relayer/commit/aba6d60f5d02812c119e399ca836c90e3deaee9d)) -* use finalized head when indexing substrate ([#161](https://github.com/sygmaprotocol/sygma-relayer/issues/161)) ([5bdcd42](https://github.com/sygmaprotocol/sygma-relayer/commit/5bdcd4268d8dc923a9384759922462c7f172f7af)) -* use structured concurrency for tss processes ([#160](https://github.com/sygmaprotocol/sygma-relayer/issues/160)) ([986966f](https://github.com/sygmaprotocol/sygma-relayer/commit/986966f7df29b14a270edd649c89e85173cfbba0)) - - -### Bug Fixes - -* Add substrate default event ([#150](https://github.com/sygmaprotocol/sygma-relayer/issues/150)) ([bc3bbb5](https://github.com/sygmaprotocol/sygma-relayer/commit/bc3bbb5c0ada1dd9b53a06242b34787cc4af3974)) -* fix substrate event handling ([#152](https://github.com/sygmaprotocol/sygma-relayer/issues/152)) ([1e14379](https://github.com/sygmaprotocol/sygma-relayer/commit/1e1437967cc32a95dc38ada5e94757a223d1a798)) -* ignore extra networks from shared config ([#163](https://github.com/sygmaprotocol/sygma-relayer/issues/163)) ([9eaf1c6](https://github.com/sygmaprotocol/sygma-relayer/commit/9eaf1c66f1f435d2e9082562f5406880ac546e33)) - -## [1.4.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.4.0...v1.4.1) (2023-03-22) - - -### Bug Fixes - -* fix latest and fresh flags being switched ([#145](https://github.com/sygmaprotocol/sygma-relayer/issues/145)) ([da98cd2](https://github.com/sygmaprotocol/sygma-relayer/commit/da98cd2a055c29edea58f7343d7e4e943f797a93)) -* Remove hardcoded multilocation ([#146](https://github.com/sygmaprotocol/sygma-relayer/issues/146)) ([257058a](https://github.com/sygmaprotocol/sygma-relayer/commit/257058a3a32d060abe388ef52977cac0267106fb)) - - -### Miscellaneous - -* fix flaky test ([#141](https://github.com/sygmaprotocol/sygma-relayer/issues/141)) ([fcbf19e](https://github.com/sygmaprotocol/sygma-relayer/commit/fcbf19eda22633497ca77409e975a0bb029403bb)) - -## [1.4.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.3.1...v1.4.0) (2023-03-20) - - -### Features - -* improve logging ([#136](https://github.com/sygmaprotocol/sygma-relayer/issues/136)) ([0958ec7](https://github.com/sygmaprotocol/sygma-relayer/commit/0958ec7ffaa6bb779259392686398557e502b30f)) -* topology encryption utils and refactor ([#128](https://github.com/sygmaprotocol/sygma-relayer/issues/128)) ([9be4953](https://github.com/sygmaprotocol/sygma-relayer/commit/9be49532f163e91bd73e6c523984042cca61b50d)) -* unify SYG_DOM variables into a single SYG_CHAINS variable ([#134](https://github.com/sygmaprotocol/sygma-relayer/issues/134)) ([5e08745](https://github.com/sygmaprotocol/sygma-relayer/commit/5e087455da57f6522dbc81e1033ceffa2d7ebe37)) - - -### Bug Fixes - -* fixing Topology file fetcher and related unit test ([#138](https://github.com/sygmaprotocol/sygma-relayer/issues/138)) ([d619cda](https://github.com/sygmaprotocol/sygma-relayer/commit/d619cda660184e72892dd802022a982cc350d122)) -* increase max gas price allowed by default ([#133](https://github.com/sygmaprotocol/sygma-relayer/issues/133)) ([a8fad65](https://github.com/sygmaprotocol/sygma-relayer/commit/a8fad65a4db3e67f73b54d8d7abf84b7b5ff7830)) - - -### Miscellaneous - -* add more debug logs for libp2p initialisation ([#137](https://github.com/sygmaprotocol/sygma-relayer/issues/137)) ([54138a0](https://github.com/sygmaprotocol/sygma-relayer/commit/54138a09b84b38d6619660a1f8aaabb5f3de7b26)) -* Add shared configuration docs ([#129](https://github.com/sygmaprotocol/sygma-relayer/issues/129)) ([1389a3b](https://github.com/sygmaprotocol/sygma-relayer/commit/1389a3b20aa26e3ebf296fa2d7d14a12281f448f)) - -## [1.3.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.3.0...v1.3.1) (2023-03-14) - - -### Miscellaneous - -* add fees documentation ([#120](https://github.com/sygmaprotocol/sygma-relayer/issues/120)) ([f6261db](https://github.com/sygmaprotocol/sygma-relayer/commit/f6261dbd52cf9193fbb6187cbc8944af370a6094)) -* add topology map documentation ([#125](https://github.com/sygmaprotocol/sygma-relayer/issues/125)) ([e032b2f](https://github.com/sygmaprotocol/sygma-relayer/commit/e032b2f99363f03aae25bd9bd07640b06b7d9a8b)) -* fix testnet release pipeline ([#131](https://github.com/sygmaprotocol/sygma-relayer/issues/131)) ([5db8acc](https://github.com/sygmaprotocol/sygma-relayer/commit/5db8acc5da1d9f7a12c3badfb4e5f3bef40c3ab7)) -* update example to latest solidity version ([#127](https://github.com/sygmaprotocol/sygma-relayer/issues/127)) ([c072181](https://github.com/sygmaprotocol/sygma-relayer/commit/c072181e1770df5cc67ebd5470a8a6fdb8a2d822)) - -## [1.3.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.2.0...v1.3.0) (2023-03-03) - - -### Features - -* check hash value of encrypted topology ([#123](https://github.com/sygmaprotocol/sygma-relayer/issues/123)) ([f179194](https://github.com/sygmaprotocol/sygma-relayer/commit/f17919461e63acec792b28f0b04797e4c9a24330)) - - -### Miscellaneous - -* fixate versions in local setup ([#118](https://github.com/sygmaprotocol/sygma-relayer/issues/118)) ([3a6ffd2](https://github.com/sygmaprotocol/sygma-relayer/commit/3a6ffd29c17493b6a8c67d172eb05ded736a2f9e)) -* Tags Versioning ([#122](https://github.com/sygmaprotocol/sygma-relayer/issues/122)) ([3c031d8](https://github.com/sygmaprotocol/sygma-relayer/commit/3c031d833dc24bfe5d1ced5aa0e3772a477cb126)) - -## [1.2.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.1.4...v1.2.0) (2023-02-24) - - -### Features - -* substrate integration ([#114](https://github.com/sygmaprotocol/sygma-relayer/issues/114)) ([7f8f0b9](https://github.com/sygmaprotocol/sygma-relayer/commit/7f8f0b972b5e849bcf1b2197ee2becef1906b541)) -* support erc20 handler response ([#109](https://github.com/sygmaprotocol/sygma-relayer/issues/109)) ([2d902ba](https://github.com/sygmaprotocol/sygma-relayer/commit/2d902baffa09812e757d461fdb3562b5b3f477b1)) -* switch tss lib ([#115](https://github.com/sygmaprotocol/sygma-relayer/issues/115)) ([673792c](https://github.com/sygmaprotocol/sygma-relayer/commit/673792cf7137ecf61dad8f0d8ea059f835702c99)) - -## [1.1.4](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.1.3...v1.1.4) (2023-02-17) - - -### Bug Fixes - -* starting block with latest flag ([#104](https://github.com/sygmaprotocol/sygma-relayer/issues/104)) ([72907dc](https://github.com/sygmaprotocol/sygma-relayer/commit/72907dc1c2f2c2c922ac7042c57a1bf26b3e0ccd)) - -## [1.1.3](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.1.2...v1.1.3) (2023-02-02) - - -### Miscellaneous - -* bump core version ([#101](https://github.com/sygmaprotocol/sygma-relayer/issues/101)) ([70a6d85](https://github.com/sygmaprotocol/sygma-relayer/commit/70a6d85bf25c99da9fd7bd100aa49aaeb17695d6)) -* refactor event handler logging ([#99](https://github.com/sygmaprotocol/sygma-relayer/issues/99)) ([d47ccc1](https://github.com/sygmaprotocol/sygma-relayer/commit/d47ccc1403d1090cf0ffd5af3932c40e6b92d3b1)) - -## [1.1.2](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.1.1...v1.1.2) (2023-02-01) - - -### Miscellaneous - -* refactor communication health check ([#97](https://github.com/sygmaprotocol/sygma-relayer/issues/97)) ([a8039a2](https://github.com/sygmaprotocol/sygma-relayer/commit/a8039a201f78bf9648c442e5bc573398e241699f)) - -## [1.1.1](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.1.0...v1.1.1) (2023-01-30) - - -### Bug Fixes - -* fix topology resolution ([#92](https://github.com/sygmaprotocol/sygma-relayer/issues/92)) ([fefefbe](https://github.com/sygmaprotocol/sygma-relayer/commit/fefefbe3afaca68f07092af0fdee3f11aa9195ab)) -* health endpoint not starting ([#95](https://github.com/sygmaprotocol/sygma-relayer/issues/95)) ([2957ab0](https://github.com/sygmaprotocol/sygma-relayer/commit/2957ab0c9f9f13261404e521f7deafa273bdff49)) - - -### Miscellaneous - -* add explicit error log to lvlDB connection ([#87](https://github.com/sygmaprotocol/sygma-relayer/issues/87)) ([80f0c65](https://github.com/sygmaprotocol/sygma-relayer/commit/80f0c658f7c648ac386c7eb7a001509af1183128)) -* added jinja2 render ([#89](https://github.com/sygmaprotocol/sygma-relayer/issues/89)) ([2731c1c](https://github.com/sygmaprotocol/sygma-relayer/commit/2731c1c7defe6fb37627913595717e9188ff8bc1)) -* execute health check when health endpoint called ([#94](https://github.com/sygmaprotocol/sygma-relayer/issues/94)) ([84cb3e5](https://github.com/sygmaprotocol/sygma-relayer/commit/84cb3e5dc2a6d6f047c1e55bec43fd4815eaa5b1)) -* fix ref error ([#90](https://github.com/sygmaprotocol/sygma-relayer/issues/90)) ([dc79c6e](https://github.com/sygmaprotocol/sygma-relayer/commit/dc79c6ed8f32aa10dac02af9cf6e1329ec857612)) - -## [1.1.0](https://github.com/sygmaprotocol/sygma-relayer/compare/v1.0.0...v1.1.0) (2023-01-23) - - -### Features - -* Add substrate chain type ([#42](https://github.com/sygmaprotocol/sygma-relayer/issues/42)) ([f2c40c0](https://github.com/sygmaprotocol/sygma-relayer/commit/f2c40c012a57cec744901263c1f95c14210026d4)) -* Add substrate connection ([#51](https://github.com/sygmaprotocol/sygma-relayer/issues/51)) ([627e8fa](https://github.com/sygmaprotocol/sygma-relayer/commit/627e8fa863c986b7869160d04feb3f4f31317095)) -* add substrate event listener module ([#46](https://github.com/sygmaprotocol/sygma-relayer/issues/46)) ([d46030b](https://github.com/sygmaprotocol/sygma-relayer/commit/d46030b180fb3fc6fe54470858d39d572b2a9e5d)) -* Add substrate message-handler ([#65](https://github.com/sygmaprotocol/sygma-relayer/issues/65)) ([ec71361](https://github.com/sygmaprotocol/sygma-relayer/commit/ec71361da6e69bb53828e813c0ba124f5a9ef385)) -* copy existing workflows to deploy to TESTNET ([#59](https://github.com/sygmaprotocol/sygma-relayer/issues/59)) ([63fea85](https://github.com/sygmaprotocol/sygma-relayer/commit/63fea85e423f4a05a5605be6479cf842377e9eae)) -* fetch topology from ipfs ([#40](https://github.com/sygmaprotocol/sygma-relayer/issues/40)) ([8daa7e2](https://github.com/sygmaprotocol/sygma-relayer/commit/8daa7e2c78eb0de7b8f4826d10ca8a7db9e44c62)) -* Generate libp2p key command ([#36](https://github.com/sygmaprotocol/sygma-relayer/issues/36)) ([27103c1](https://github.com/sygmaprotocol/sygma-relayer/commit/27103c19b6f90a9420f84336eb93a6279198f631)) -* Implement deposit(fungibleTransfer) event handler ([#55](https://github.com/sygmaprotocol/sygma-relayer/issues/55)) ([23d2479](https://github.com/sygmaprotocol/sygma-relayer/commit/23d24799300e1e3de215c815a9b8be2798abb5a1)) -* integrate datadog in testnet relayers ([#85](https://github.com/sygmaprotocol/sygma-relayer/issues/85)) ([206d325](https://github.com/sygmaprotocol/sygma-relayer/commit/206d325cd421d39618f435644a207290728a37d7)) -* process permissionless generic messages sequentially ([#41](https://github.com/sygmaprotocol/sygma-relayer/issues/41)) ([6933acb](https://github.com/sygmaprotocol/sygma-relayer/commit/6933acb4b5d907bafca9f744a8d8de4bf26964b8)) -* release pipeline ([48a96eb](https://github.com/sygmaprotocol/sygma-relayer/commit/48a96eb3994717482396bf2eac7b2b687abdb0bb)) -* shared configuration ([#84](https://github.com/sygmaprotocol/sygma-relayer/issues/84)) ([eace2ad](https://github.com/sygmaprotocol/sygma-relayer/commit/eace2ad5084c68e46bc9df81bd0ccfb57688d96d)) -* support for permissionless generic format v2 ([#60](https://github.com/sygmaprotocol/sygma-relayer/issues/60)) ([3343708](https://github.com/sygmaprotocol/sygma-relayer/commit/3343708bdf8c443f024ea67fbbfce0a2f72b0a82)) - - -### Bug Fixes - -* improve tss process sessionID logging ([#71](https://github.com/sygmaprotocol/sygma-relayer/issues/71)) ([6ad9b21](https://github.com/sygmaprotocol/sygma-relayer/commit/6ad9b219c30058e4eae0dbfb39f5f40e037a5ced)) -* libp2p streams not closed after usage ([#54](https://github.com/sygmaprotocol/sygma-relayer/issues/54)) ([60e65f8](https://github.com/sygmaprotocol/sygma-relayer/commit/60e65f8773a7d84fe633ee9586d2150eb438b21c)) -* release not creating PR ([056be93](https://github.com/sygmaprotocol/sygma-relayer/commit/056be93531a79a678fa61e872dbcc4738b37b023)) -* remove deprecated libp2p packages ([#50](https://github.com/sygmaprotocol/sygma-relayer/issues/50)) ([6320494](https://github.com/sygmaprotocol/sygma-relayer/commit/6320494479dbabfc934c55ba7db576dae73fa344)) -* resources id issue ([#74](https://github.com/sygmaprotocol/sygma-relayer/issues/74)) ([168b80e](https://github.com/sygmaprotocol/sygma-relayer/commit/168b80ea8ab08e43871d4348ff102dddc0818a10)) - - -### Miscellaneous - -* 'changed actor to repository_owner' ([#79](https://github.com/sygmaprotocol/sygma-relayer/issues/79)) ([2607d74](https://github.com/sygmaprotocol/sygma-relayer/commit/2607d7462f467e8a5ae70e0ad17b91e5cb1b996e)) -* 'fixed typo on matrix job' remove duplicates & exposed data ([#78](https://github.com/sygmaprotocol/sygma-relayer/issues/78)) ([7e01cac](https://github.com/sygmaprotocol/sygma-relayer/commit/7e01cac72ddb157ed72a2b0d8198e68b54ae8ab3)) -* 'fixed typo' remove duplicates & exposed data ([#77](https://github.com/sygmaprotocol/sygma-relayer/issues/77)) ([e96f1c4](https://github.com/sygmaprotocol/sygma-relayer/commit/e96f1c47e71462e9e34a0246ba74c987b2f8cd9b)) -* add code quality analysis by github ([#44](https://github.com/sygmaprotocol/sygma-relayer/issues/44)) ([b327429](https://github.com/sygmaprotocol/sygma-relayer/commit/b32742993b0bf7870c55bc7bcb94383070140a9f)) -* add shibuya to relayers ([#67](https://github.com/sygmaprotocol/sygma-relayer/issues/67)) ([84b76e0](https://github.com/sygmaprotocol/sygma-relayer/commit/84b76e0942bfb2a5a07e6ea0f25c807adb32559a)) -* bump solidity version ([#23](https://github.com/sygmaprotocol/sygma-relayer/issues/23)) ([db53bd4](https://github.com/sygmaprotocol/sygma-relayer/commit/db53bd4a56dc1ffb9658d31e834a752396fcadae)) -* changed github_token ([#80](https://github.com/sygmaprotocol/sygma-relayer/issues/80)) ([d693b67](https://github.com/sygmaprotocol/sygma-relayer/commit/d693b6732eaf79e369c204b0211033311563bd6e)) -* expand logging on relayer start ([#86](https://github.com/sygmaprotocol/sygma-relayer/issues/86)) ([5bb0cbc](https://github.com/sygmaprotocol/sygma-relayer/commit/5bb0cbca7fb3dbfcfa89a5d87bea8484ac58a90a)) -* fixed forbidden error ([#83](https://github.com/sygmaprotocol/sygma-relayer/issues/83)) ([1dd5fdd](https://github.com/sygmaprotocol/sygma-relayer/commit/1dd5fdd537efef9f3fc4279443e8e1636eec822b)) -* publish binaries on release ([#39](https://github.com/sygmaprotocol/sygma-relayer/issues/39)) ([adf8af2](https://github.com/sygmaprotocol/sygma-relayer/commit/adf8af2c44be6a129ca6b5472de0800c09b436a8)) -* remove duplicates & exposed data ([#76](https://github.com/sygmaprotocol/sygma-relayer/issues/76)) ([a6db67b](https://github.com/sygmaprotocol/sygma-relayer/commit/a6db67badb05c7ad2d5ea02913fa32ecd2f90b77)) -* remove unused functions ([#64](https://github.com/sygmaprotocol/sygma-relayer/issues/64)) ([96a9b96](https://github.com/sygmaprotocol/sygma-relayer/commit/96a9b963da39ce6409c3858451f7ad02159c7bc9)) diff --git a/Dockerfile b/Dockerfile index e9bddcb6..a122d705 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ ADD . /src WORKDIR /src RUN cd /src && echo $(ls -1 /src) RUN go mod download -RUN go build -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=ignore -X github.com/ChainSafe/sygma-relayer/app.Version=$(sed -n '0,/## \[\([0-9.]*\)\]/s/.*\[\([0-9.]*\)\].*/\1/p' CHANGELOG.md)" -o /bridge . +RUN go build -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=ignore -X github.com/sprintertech/sprinter-signing/app.Version=$(sed -n '0,/## \[\([0-9.]*\)\]/s/.*\[\([0-9.]*\)\].*/\1/p' CHANGELOG.md)" -o /bridge . # final stage FROM debian:stable-slim diff --git a/Makefile b/Makefile index 74ad0868..7f3f3eb6 100644 --- a/Makefile +++ b/Makefile @@ -27,19 +27,14 @@ genmocks: mockgen -destination=./tss/ecdsa/common/mock/tss.go github.com/binance-chain/tss-lib/tss Message mockgen -destination=./tss/ecdsa/common/mock/communication.go -source=./tss/ecdsa/common/base.go -package mock_tss mockgen --package mock_tss -destination=./tss/mock/ecdsa.go -source=./tss/ecdsa/keygen/keygen.go - mockgen --package mock_tss -destination=./tss/mock/frost.go -source=./tss/frost/keygen/keygen.go mockgen -source=./tss/coordinator.go -destination=./tss/mock/coordinator.go mockgen -source=./comm/communication.go -destination=./comm/mock/communication.go - mockgen -source=./chains/evm/listener/eventHandlers/deposit.go -destination=./chains/evm/listener/eventHandlers/mock/listener.go - mockgen -source=./chains/evm/listener/eventHandlers/retry.go -destination=./chains/evm/listener/eventHandlers/mock/retry.go mockgen -source=./chains/evm/calls/events/listener.go -destination=./chains/evm/calls/events/mock/listener.go - mockgen -source=./chains/substrate/listener/event-handlers.go -destination=./chains/substrate/listener/mock/handlers.go - mockgen -source=./chains/btc/listener/event-handlers.go -destination=./chains/btc/listener/mock/handlers.go - mockgen -source=./chains/btc/listener/listener.go -destination=./chains/btc/listener/mock/listener.go mockgen -source=./topology/topology.go -destination=./topology/mock/topology.go - mockgen -source=./chains/btc/executor/message-handler.go -destination=./chains/btc/executor/mock/message-handler.go - mockgen -source=./chains/substrate/executor/message-handler.go -destination=./chains/substrate/executor/mock/message-handler.go - mockgen -source=./chains/evm/executor/message-handler.go -destination=./chains/evm/executor/mock/message-handler.go + mockgen -destination=./comm/p2p/mock/host/host.go github.com/libp2p/go-libp2p/core/host Host + mockgen -destination=./comm/p2p/mock/conn/conn.go github.com/libp2p/go-libp2p/core/network Conn + mockgen -destination=./comm/p2p/mock/stream/stream.go github.com/libp2p/go-libp2p/core/network Stream,Conn + e2e-test: diff --git a/app/app.go b/app/app.go index 9babd382..3244ccdb 100644 --- a/app/app.go +++ b/app/app.go @@ -3,395 +3,8 @@ package app -import ( - "context" - "fmt" - "net/http" - "os" - "os/signal" - "strings" - "sync" - "syscall" - "time" - - "github.com/ChainSafe/sygma-relayer/chains" - "github.com/ChainSafe/sygma-relayer/chains/btc" - "github.com/ChainSafe/sygma-relayer/chains/btc/mempool" - "github.com/ChainSafe/sygma-relayer/chains/btc/uploader" - "github.com/ChainSafe/sygma-relayer/chains/evm" - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/contracts/bridge" - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/chains/evm/executor" - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/depositHandlers" - evmEventHandlers "github.com/ChainSafe/sygma-relayer/chains/evm/listener/eventHandlers" - "github.com/ChainSafe/sygma-relayer/chains/substrate" - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - propStore "github.com/ChainSafe/sygma-relayer/store" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/gas" - coreSubstrate "github.com/sygmaprotocol/sygma-core/chains/substrate" - "github.com/sygmaprotocol/sygma-core/crypto/secp256k1" - "github.com/sygmaprotocol/sygma-core/observability" - "github.com/sygmaprotocol/sygma-core/relayer" - "github.com/sygmaprotocol/sygma-core/relayer/message" - "github.com/sygmaprotocol/sygma-core/store" - "github.com/sygmaprotocol/sygma-core/store/lvldb" - - btcConfig "github.com/ChainSafe/sygma-relayer/chains/btc/config" - btcConnection "github.com/ChainSafe/sygma-relayer/chains/btc/connection" - btcExecutor "github.com/ChainSafe/sygma-relayer/chains/btc/executor" - btcListener "github.com/ChainSafe/sygma-relayer/chains/btc/listener" - substrateExecutor "github.com/ChainSafe/sygma-relayer/chains/substrate/executor" - substrateListener "github.com/ChainSafe/sygma-relayer/chains/substrate/listener" - substratePallet "github.com/ChainSafe/sygma-relayer/chains/substrate/pallet" - "github.com/ChainSafe/sygma-relayer/metrics" - "github.com/centrifuge/go-substrate-rpc-client/v4/signature" - coreEvm "github.com/sygmaprotocol/sygma-core/chains/evm" - evmClient "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/listener" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/monitored" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/transaction" - substrateClient "github.com/sygmaprotocol/sygma-core/chains/substrate/client" - "github.com/sygmaprotocol/sygma-core/chains/substrate/connection" - coreSubstrateListener "github.com/sygmaprotocol/sygma-core/chains/substrate/listener" - - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/comm/p2p" - "github.com/ChainSafe/sygma-relayer/config" - "github.com/ChainSafe/sygma-relayer/health" - "github.com/ChainSafe/sygma-relayer/jobs" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/topology" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ethereum/go-ethereum/common" - "github.com/libp2p/go-libp2p/core/crypto" - "github.com/rs/zerolog/log" - "github.com/spf13/viper" -) - var Version string func Run() error { - var err error - - configFlag := viper.GetString(config.ConfigFlagName) - configURL := viper.GetString("config-url") - - var configuration *config.Config - if configURL != "" { - configuration, err = config.GetSharedConfigFromNetwork(configURL) - panicOnError(err) - } - - if strings.ToLower(configFlag) == "env" { - configuration, err = config.GetConfigFromENV(configuration) - panicOnError(err) - } else { - configuration, err = config.GetConfigFromFile(configFlag, configuration) - panicOnError(err) - } - - observability.ConfigureLogger(configuration.RelayerConfig.LogLevel, os.Stdout) - - log.Info().Msg("Successfully loaded configuration") - - topologyProvider, err := topology.NewNetworkTopologyProvider(configuration.RelayerConfig.MpcConfig.TopologyConfiguration, http.DefaultClient) - panicOnError(err) - topologyStore := topology.NewTopologyStore(configuration.RelayerConfig.MpcConfig.TopologyConfiguration.Path) - networkTopology, err := topologyStore.Topology() - // if topology is not already in file, read from provider - if err != nil { - networkTopology, err = topologyProvider.NetworkTopology("") - panicOnError(err) - - err = topologyStore.StoreTopology(networkTopology) - panicOnError(err) - } - log.Info().Msgf("Successfully loaded topology") - - privBytes, err := crypto.ConfigDecodeKey(configuration.RelayerConfig.MpcConfig.Key) - panicOnError(err) - - priv, err := crypto.UnmarshalPrivateKey(privBytes) - panicOnError(err) - - connectionGate := p2p.NewConnectionGate(networkTopology) - host, err := p2p.NewHost(priv, networkTopology, connectionGate, configuration.RelayerConfig.MpcConfig.Port) - panicOnError(err) - log.Info().Str("peerID", host.ID().String()).Msg("Successfully created libp2p host") - - go health.StartHealthEndpoint(configuration.RelayerConfig.HealthPort) - - communication := p2p.NewCommunication(host, "p2p/sygma") - electorFactory := elector.NewCoordinatorElectorFactory(host, configuration.RelayerConfig.BullyConfig) - coordinator := tss.NewCoordinator(host, communication, electorFactory) - - // this is temporary solution related to specifics of aws deployment - // effectively it waits until old instance is killed - var db *lvldb.LVLDB - for { - db, err = lvldb.NewLvlDB(viper.GetString(config.BlockstoreFlagName)) - if err != nil { - log.Error().Err(err).Msg("Unable to connect to blockstore file, retry in 10 seconds") - time.Sleep(10 * time.Second) - } else { - log.Info().Msg("Successfully connected to blockstore file") - break - } - } - blockstore := store.NewBlockStore(db) - keyshareStore := keyshare.NewECDSAKeyshareStore(configuration.RelayerConfig.MpcConfig.KeysharePath) - frostKeyshareStore := keyshare.NewFrostKeyshareStore(configuration.RelayerConfig.MpcConfig.FrostKeysharePath) - propStore := propStore.NewPropStore(db) - - // wait until executions are done and then stop further executions before exiting - exitLock := &sync.RWMutex{} - defer exitLock.Lock() - - mp, err := observability.InitMetricProvider(context.Background(), configuration.RelayerConfig.OpenTelemetryCollectorURL) - if err != nil { - panic(err) - } - defer func() { - if err := mp.Shutdown(context.Background()); err != nil { - log.Error().Msgf("Error shutting down meter provider: %v", err) - } - }() - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - sygmaMetrics, err := metrics.NewSygmaMetrics(ctx, mp.Meter("relayer-metric-provider"), configuration.RelayerConfig.Env, configuration.RelayerConfig.Id, Version) - if err != nil { - panic(err) - } - msgChan := make(chan []*message.Message) - - domains := make(map[uint8]relayer.RelayedChain) - for _, chainConfig := range configuration.ChainConfigs { - switch chainConfig["type"] { - case "evm": - { - config, err := evm.NewEVMConfig(chainConfig) - panicOnError(err) - kp, err := secp256k1.NewKeypairFromString(config.GeneralChainConfig.Key) - panicOnError(err) - - client, err := evmClient.NewEVMClient(config.GeneralChainConfig.Endpoint, kp) - panicOnError(err) - - log.Info().Str("domain", config.String()).Msgf("Registering EVM domain") - - bridgeAddress := common.HexToAddress(config.Bridge) - frostAddress := common.HexToAddress(config.FrostKeygen) - gasPricer := gas.NewLondonGasPriceClient(client, &gas.GasPricerOpts{ - UpperLimitFeePerGas: config.MaxGasPrice, - GasPriceFactor: config.GasMultiplier, - }) - t := monitored.NewMonitoredTransactor(*config.GeneralChainConfig.Id, transaction.NewTransaction, gasPricer, sygmaMetrics, client, config.MaxGasPrice, config.GasIncreasePercentage) - go t.Monitor(ctx, time.Minute*3, time.Minute*10, time.Minute) - bridgeContract := bridge.NewBridgeContract(client, bridgeAddress, t) - - depositHandler := depositHandlers.NewETHDepositHandler(bridgeContract) - for _, handler := range config.Handlers { - switch handler.Type { - case "erc20", "native": - { - depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.Erc20DepositHandler{}) - } - case "permissionlessGeneric": - { - depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.PermissionlessGenericDepositHandler{}) - } - case "erc721": - { - depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.Erc721DepositHandler{}) - } - case "erc1155": - { - depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.Erc1155DepositHandler{}) - } - } - } - depositListener := events.NewListener(client) - tssListener := events.NewListener(client) - eventHandlers := make([]listener.EventHandler, 0) - l := log.With().Str("chain", fmt.Sprintf("%v", config.GeneralChainConfig.Name)).Uint8("domainID", *config.GeneralChainConfig.Id) - - depositEventHandler := evmEventHandlers.NewDepositEventHandler(depositListener, depositHandler, bridgeAddress, *config.GeneralChainConfig.Id, msgChan) - eventHandlers = append(eventHandlers, depositEventHandler) - eventHandlers = append(eventHandlers, evmEventHandlers.NewKeygenEventHandler(l, tssListener, coordinator, host, communication, keyshareStore, bridgeAddress, networkTopology.Threshold)) - eventHandlers = append(eventHandlers, evmEventHandlers.NewFrostKeygenEventHandler(l, tssListener, coordinator, host, communication, frostKeyshareStore, frostAddress, networkTopology.Threshold)) - eventHandlers = append(eventHandlers, evmEventHandlers.NewRefreshEventHandler(l, topologyProvider, topologyStore, tssListener, coordinator, host, communication, connectionGate, keyshareStore, frostKeyshareStore, bridgeAddress)) - eventHandlers = append(eventHandlers, evmEventHandlers.NewRetryV1EventHandler(l, tssListener, depositHandler, propStore, bridgeAddress, *config.GeneralChainConfig.Id, config.BlockConfirmations, msgChan)) - if config.Retry != "" { - eventHandlers = append(eventHandlers, evmEventHandlers.NewRetryV2EventHandler(l, tssListener, common.HexToAddress(config.Retry), *config.GeneralChainConfig.Id, msgChan)) - } - evmListener := listener.NewEVMListener(client, eventHandlers, blockstore, sygmaMetrics, *config.GeneralChainConfig.Id, config.BlockRetryInterval, config.BlockConfirmations, config.BlockInterval) - - mh := message.NewMessageHandler() - mh.RegisterMessageHandler(retry.RetryMessageType, executor.NewRetryMessageHandler(depositEventHandler, client, propStore, config.BlockConfirmations, msgChan)) - mh.RegisterMessageHandler(transfer.TransferMessageType, &executor.TransferMessageHandler{}) - executor := executor.NewExecutor(host, communication, coordinator, bridgeContract, keyshareStore, exitLock, config.GasLimit.Uint64(), config.TransferGas) - - startBlock, err := blockstore.GetStartBlock(*config.GeneralChainConfig.Id, config.StartBlock, config.GeneralChainConfig.LatestBlock, config.GeneralChainConfig.FreshStart) - if err != nil { - panic(err) - } - if startBlock == nil { - head, err := client.LatestBlock() - if err != nil { - panic(err) - } - startBlock = head - } - startBlock, err = chains.CalculateStartingBlock(startBlock, config.BlockInterval) - if err != nil { - panic(err) - } - chain := coreEvm.NewEVMChain(evmListener, mh, executor, *config.GeneralChainConfig.Id, startBlock) - - domains[*config.GeneralChainConfig.Id] = chain - } - case "substrate": - { - config, err := substrate.NewSubstrateConfig(chainConfig) - if err != nil { - panic(err) - } - - conn, err := connection.NewSubstrateConnection(config.GeneralChainConfig.Endpoint) - if err != nil { - panic(err) - } - keyPair, err := signature.KeyringPairFromSecret(config.GeneralChainConfig.Key, config.SubstrateNetwork) - if err != nil { - panic(err) - } - - substrateClient := substrateClient.NewSubstrateClient(conn, &keyPair, config.ChainID, config.Tip) - bridgePallet := substratePallet.NewPallet(substrateClient) - - log.Info().Str("domain", config.String()).Msgf("Registering substrate domain") - - l := log.With().Str("chain", fmt.Sprintf("%v", config.GeneralChainConfig.Name)).Uint8("domainID", *config.GeneralChainConfig.Id) - depositHandler := substrateListener.NewSubstrateDepositHandler() - depositHandler.RegisterDepositHandler(transfer.FungibleTransfer, substrateListener.FungibleTransferHandler) - eventHandlers := make([]coreSubstrateListener.EventHandler, 0) - depositEventHandler := substrateListener.NewFungibleTransferEventHandler(l, *config.GeneralChainConfig.Id, depositHandler, msgChan, conn) - eventHandlers = append(eventHandlers, substrateListener.NewRetryEventHandler(l, conn, depositHandler, *config.GeneralChainConfig.Id, msgChan)) - eventHandlers = append(eventHandlers, depositEventHandler) - substrateListener := coreSubstrateListener.NewSubstrateListener(conn, eventHandlers, blockstore, sygmaMetrics, *config.GeneralChainConfig.Id, config.BlockRetryInterval, config.BlockInterval) - - mh := message.NewMessageHandler() - mh.RegisterMessageHandler(transfer.TransferMessageType, &substrateExecutor.SubstrateMessageHandler{}) - mh.RegisterMessageHandler(retry.RetryMessageType, substrateExecutor.NewRetryMessageHandler(depositEventHandler, conn, propStore, msgChan)) - - sExecutor := substrateExecutor.NewExecutor(host, communication, coordinator, bridgePallet, keyshareStore, conn, exitLock) - - startBlock, err := blockstore.GetStartBlock(*config.GeneralChainConfig.Id, config.StartBlock, config.GeneralChainConfig.LatestBlock, config.GeneralChainConfig.FreshStart) - if err != nil { - panic(err) - } - if startBlock == nil { - head, err := substrateClient.LatestBlock() - if err != nil { - panic(err) - } - startBlock = head - } - startBlock, err = chains.CalculateStartingBlock(startBlock, config.BlockInterval) - if err != nil { - panic(err) - } - substrateChain := coreSubstrate.NewSubstrateChain(substrateListener, mh, sExecutor, *config.GeneralChainConfig.Id, startBlock) - - domains[*config.GeneralChainConfig.Id] = substrateChain - } - case "btc": - { - log.Info().Msgf("Registering btc domain") - config, err := btcConfig.NewBtcConfig(chainConfig) - if err != nil { - panic(err) - } - - conn, err := btcConnection.NewBtcConnection( - config.GeneralChainConfig.Endpoint, - config.Username, - config.Password, - false) - if err != nil { - panic(err) - } - - l := log.With().Str("chain", fmt.Sprintf("%v", config.GeneralChainConfig.Name)).Uint8("domainID", *config.GeneralChainConfig.Id) - resources := make(map[[32]byte]btcConfig.Resource) - for _, resource := range config.Resources { - resources[resource.ResourceID] = resource - } - depositHandler := &btcListener.BtcDepositHandler{} - depositEventHandler := btcListener.NewFungibleTransferEventHandler(l, *config.GeneralChainConfig.Id, depositHandler, msgChan, conn, resources, config.FeeAddress) - eventHandlers := make([]btcListener.EventHandler, 0) - eventHandlers = append(eventHandlers, depositEventHandler) - listener := btcListener.NewBtcListener(conn, eventHandlers, config, blockstore) - - mempool := mempool.NewMempoolAPI(config.MempoolUrl) - mh := message.NewMessageHandler() - mh.RegisterMessageHandler(transfer.TransferMessageType, &btcExecutor.FungibleMessageHandler{}) - mh.RegisterMessageHandler(retry.RetryMessageType, btcExecutor.NewRetryMessageHandler(depositEventHandler, conn, config.BlockConfirmations, propStore, msgChan)) - uploader := uploader.NewIPFSUploader(configuration.RelayerConfig.UploaderConfig) - - executor := btcExecutor.NewExecutor( - propStore, - host, - communication, - coordinator, - frostKeyshareStore, - conn, - mempool, - resources, - config.Network, - exitLock, - uploader) - - btcChain := btc.NewBtcChain(listener, executor, mh, *config.GeneralChainConfig.Id) - domains[*config.GeneralChainConfig.Id] = btcChain - - } - default: - panic(fmt.Errorf("type '%s' not recognized", chainConfig["type"])) - } - } - - go jobs.StartCommunicationHealthCheckJob(host, configuration.RelayerConfig.MpcConfig.CommHealthCheckInterval, sygmaMetrics) - - r := relayer.NewRelayer(domains, sygmaMetrics) - go r.Start(ctx, msgChan) - - sysErr := make(chan os.Signal, 1) - signal.Notify(sysErr, - syscall.SIGTERM, - syscall.SIGINT, - syscall.SIGHUP, - syscall.SIGQUIT) - - relayerName := viper.GetString("name") - log.Info().Msgf("Started relayer: %s with PID: %s. Version: v%s", relayerName, host.ID().Pretty(), Version) - - _, err = keyshareStore.GetKeyshare() - if err != nil { - log.Info().Msg("Relayer not part of MPC. Waiting for refresh event...") - } - - sig := <-sysErr - log.Info().Msgf("terminating got ` [%v] signal", sig) return nil - -} - -func panicOnError(err error) { - if err != nil { - panic(err) - } } diff --git a/audits/haechi-06-09-2022.pdf b/audits/haechi-06-09-2022.pdf deleted file mode 100644 index 8d3ce559..00000000 Binary files a/audits/haechi-06-09-2022.pdf and /dev/null differ diff --git a/audits/least-authority-17-05-2023.pdf b/audits/least-authority-17-05-2023.pdf deleted file mode 100644 index be4d47a2..00000000 Binary files a/audits/least-authority-17-05-2023.pdf and /dev/null differ diff --git a/chains/btc/chain.go b/chains/btc/chain.go deleted file mode 100644 index 3049808f..00000000 --- a/chains/btc/chain.go +++ /dev/null @@ -1,72 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package btc - -import ( - "context" - "math/big" - - "github.com/ChainSafe/sygma-relayer/chains/btc/executor" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" - "github.com/sygmaprotocol/sygma-core/relayer/message" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" -) - -type BatchProposalExecutor interface { - Execute(msgs []*message.Message) error -} -type EventListener interface { - ListenToEvents(ctx context.Context, startBlock *big.Int) -} -type BtcChain struct { - id uint8 - - listener EventListener - executor *executor.Executor - mh *message.MessageHandler - - startBlock *big.Int - logger zerolog.Logger -} - -func NewBtcChain( - listener EventListener, - executor *executor.Executor, - mh *message.MessageHandler, - id uint8, -) *BtcChain { - return &BtcChain{ - listener: listener, - executor: executor, - mh: mh, - id: id, - - logger: log.With().Uint8("domainID", id).Logger()} -} - -func (c *BtcChain) Write(props []*proposal.Proposal) error { - err := c.executor.Execute(props) - if err != nil { - c.logger.Err(err).Str("messageID", props[0].MessageID).Msgf("error writing proposals %+v on network %d", props, c.DomainID()) - return err - } - - return nil -} - -func (c *BtcChain) ReceiveMessage(m *message.Message) (*proposal.Proposal, error) { - return c.mh.HandleMessage(m) -} - -// PollEvents is the goroutine that polls blocks and searches Deposit events in them. -// Events are then sent to eventsChan. -func (c *BtcChain) PollEvents(ctx context.Context) { - c.logger.Info().Str("startBlock", c.startBlock.String()).Msg("Polling Blocks...") - go c.listener.ListenToEvents(ctx, c.startBlock) -} - -func (c *BtcChain) DomainID() uint8 { - return c.id -} diff --git a/chains/btc/config/config.go b/chains/btc/config/config.go deleted file mode 100644 index 6131a06c..00000000 --- a/chains/btc/config/config.go +++ /dev/null @@ -1,172 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package config - -import ( - "encoding/hex" - "fmt" - "math/big" - "time" - - "github.com/ChainSafe/sygma-relayer/config/chain" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/creasty/defaults" - "github.com/mitchellh/mapstructure" -) - -type RawResource struct { - Address string - ResourceID string - FeeAmount string - Tweak string - Script string -} - -type Resource struct { - Address btcutil.Address - FeeAmount *big.Int - ResourceID [32]byte - Tweak string - Script []byte -} - -type RawBtcConfig struct { - chain.GeneralChainConfig `mapstructure:",squash"` - Resources []RawResource `mapstrcture:"resources"` - StartBlock int64 `mapstructure:"startBlock"` - FeeAddress string `mapstructure:"feeAddress"` - Username string `mapstructure:"username"` - Password string `mapstructure:"password"` - BlockInterval int64 `mapstructure:"blockInterval" default:"5"` - BlockRetryInterval uint64 `mapstructure:"blockRetryInterval" default:"5"` - BlockConfirmations int64 `mapstructure:"blockConfirmations" default:"10"` - Network string `mapstructure:"network" default:"mainnet"` - MempoolUrl string `mapstructure:"mempoolUrl"` -} - -func (c *RawBtcConfig) Validate() error { - if err := c.GeneralChainConfig.Validate(); err != nil { - return err - } - - if c.BlockConfirmations < 1 { - return fmt.Errorf("blockConfirmations has to be >=1") - } - - if c.Username == "" { - return fmt.Errorf("required field chain.Username empty for chain %v", *c.Id) - } - - if c.Password == "" { - return fmt.Errorf("required field chain.Password empty for chain %v", *c.Id) - } - return nil -} - -type BtcConfig struct { - GeneralChainConfig chain.GeneralChainConfig - Resources []Resource - FeeAddress btcutil.Address - Username string - Password string - StartBlock *big.Int - BlockInterval *big.Int - BlockRetryInterval time.Duration - BlockConfirmations *big.Int - Tweak string - Script []byte - MempoolUrl string - Network chaincfg.Params -} - -// NewBtcConfig decodes and validates an instance of an BtcConfig from -// raw chain config -func NewBtcConfig(chainConfig map[string]interface{}) (*BtcConfig, error) { - var c RawBtcConfig - err := mapstructure.Decode(chainConfig, &c) - if err != nil { - return nil, err - } - - err = defaults.Set(&c) - if err != nil { - return nil, err - } - - err = c.Validate() - if err != nil { - return nil, err - } - - networkParams, err := networkParams(c.Network) - if err != nil { - return nil, err - } - feeAddress, err := btcutil.DecodeAddress(c.FeeAddress, &networkParams) - if err != nil { - return nil, err - } - resources := make([]Resource, len(c.Resources)) - for i, r := range c.Resources { - scriptBytes, err := hex.DecodeString(r.Script) - if err != nil { - return nil, err - } - - feeAmount, success := new(big.Int).SetString(r.FeeAmount, 10) - if !success { - return nil, fmt.Errorf("error: could not convert string to *big.Int") - } - - address, err := btcutil.DecodeAddress(r.Address, &networkParams) - if err != nil { - return nil, err - } - resourceBytes, err := hex.DecodeString(r.ResourceID[2:]) - if err != nil { - panic(err) - } - var resource32Bytes [32]byte - copy(resource32Bytes[:], resourceBytes) - resources[i] = Resource{ - Address: address, - ResourceID: resource32Bytes, - Script: scriptBytes, - Tweak: r.Tweak, - FeeAmount: feeAmount, - } - } - - c.GeneralChainConfig.ParseFlags() - config := &BtcConfig{ - GeneralChainConfig: c.GeneralChainConfig, - StartBlock: big.NewInt(c.StartBlock), - BlockConfirmations: big.NewInt(c.BlockConfirmations), - BlockInterval: big.NewInt(c.BlockInterval), - BlockRetryInterval: time.Duration(c.BlockRetryInterval) * time.Second, - Username: c.Username, - Password: c.Password, - Network: networkParams, - MempoolUrl: c.MempoolUrl, - FeeAddress: feeAddress, - Resources: resources, - } - return config, nil -} - -func networkParams(network string) (chaincfg.Params, error) { - switch network { - case "mainnet": - return chaincfg.MainNetParams, nil - case "testnet": - return chaincfg.TestNet3Params, nil - case "regtest": - return chaincfg.RegressionNetParams, nil - case "signet": - return chaincfg.SigNetParams, nil - default: - return chaincfg.Params{}, fmt.Errorf("unknown network %s", network) - } -} diff --git a/chains/btc/config/config_test.go b/chains/btc/config/config_test.go deleted file mode 100644 index 78512453..00000000 --- a/chains/btc/config/config_test.go +++ /dev/null @@ -1,147 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package config_test - -import ( - "encoding/hex" - "math/big" - "testing" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/btc/config" - "github.com/ChainSafe/sygma-relayer/chains/btc/listener" - "github.com/ChainSafe/sygma-relayer/config/chain" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/suite" -) - -type NewBtcConfigTestSuite struct { - suite.Suite -} - -func TestRunNewBtcConfigTestSuite(t *testing.T) { - suite.Run(t, new(NewBtcConfigTestSuite)) -} - -func (s *NewBtcConfigTestSuite) Test_FailedDecode() { - _, err := config.NewBtcConfig(map[string]interface{}{ - "gasLimit": "invalid", - }) - - s.NotNil(err) -} - -func (s *NewBtcConfigTestSuite) Test_FailedGeneralConfigValidation() { - _, err := config.NewBtcConfig(map[string]interface{}{}) - - s.NotNil(err) -} - -func (s *NewBtcConfigTestSuite) Test_FailedBtcConfigValidation() { - _, err := config.NewBtcConfig(map[string]interface{}{ - "id": 1, - "endpoint": "", - "name": "btc1", - }) - - s.NotNil(err) -} - -func (s *NewBtcConfigTestSuite) Test_InvalidBlockConfirmation() { - _, err := config.NewBtcConfig(map[string]interface{}{ - "id": 1, - "endpoint": "ws://domain.com", - "name": "btc1", - "blockConfirmations": -1, - }) - - s.NotNil(err) - s.Equal(err.Error(), "blockConfirmations has to be >=1") -} - -func (s *NewBtcConfigTestSuite) Test_InvalidUsername() { - _, err := config.NewBtcConfig(map[string]interface{}{ - "id": 1, - "endpoint": "ws://domain.com", - "name": "btc1", - "password": "pass123", - - "blockConfirmations": 1, - }) - - s.NotNil(err) - s.Equal(err.Error(), "required field chain.Username empty for chain 1") -} - -func (s *NewBtcConfigTestSuite) Test_InvalidPassword() { - _, err := config.NewBtcConfig(map[string]interface{}{ - "id": 1, - "endpoint": "ws://domain.com", - "name": "btc1", - "username": "pass123", - - "blockConfirmations": 1, - }) - - s.NotNil(err) - s.Equal(err.Error(), "required field chain.Password empty for chain 1") -} - -func (s *NewBtcConfigTestSuite) Test_ValidConfig() { - expectedResource := listener.SliceTo32Bytes(common.LeftPadBytes([]byte{3}, 31)) - expectedAddress, _ := btcutil.DecodeAddress("tb1qln69zuhdunc9stwfh6t7adexxrcr04ppy6thgm", &chaincfg.TestNet3Params) - feeAddress, _ := btcutil.DecodeAddress("mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt", &chaincfg.TestNet3Params) - expectedScript, _ := hex.DecodeString("51206a698882348433b57d549d6344f74500fcd13ad8d2200cdf89f8e39e5cafa7d5") - - rawConfig := map[string]interface{}{ - "id": 1, - "endpoint": "ws://domain.com", - "name": "btc1", - "username": "username", - "password": "pass123", - "network": "testnet", - "feeAddress": "mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt", - "resources": []interface{}{ - config.RawResource{ - Address: "tb1qln69zuhdunc9stwfh6t7adexxrcr04ppy6thgm", - FeeAmount: "10000000", - ResourceID: "0x0000000000000000000000000000000000000000000000000000000000000300", - Script: "51206a698882348433b57d549d6344f74500fcd13ad8d2200cdf89f8e39e5cafa7d5", - Tweak: "tweak", - }, - }, - } - - actualConfig, err := config.NewBtcConfig(rawConfig) - - id := new(uint8) - *id = 1 - s.Nil(err) - s.Equal(*actualConfig, config.BtcConfig{ - GeneralChainConfig: chain.GeneralChainConfig{ - Name: "btc1", - Endpoint: "ws://domain.com", - Id: id, - }, - Username: "username", - Password: "pass123", - StartBlock: big.NewInt(0), - BlockConfirmations: big.NewInt(10), - BlockInterval: big.NewInt(5), - BlockRetryInterval: time.Duration(5) * time.Second, - Network: chaincfg.TestNet3Params, - FeeAddress: feeAddress, - Resources: []config.Resource{ - { - Address: expectedAddress, - ResourceID: expectedResource, - Script: expectedScript, - Tweak: "tweak", - FeeAmount: big.NewInt(10000000), - }, - }, - }) -} diff --git a/chains/btc/connection/connection.go b/chains/btc/connection/connection.go deleted file mode 100644 index 99fe9262..00000000 --- a/chains/btc/connection/connection.go +++ /dev/null @@ -1,39 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package connection - -import ( - "github.com/btcsuite/btcd/rpcclient" - "github.com/rs/zerolog/log" -) - -type Connection struct { - *rpcclient.Client -} - -func NewBtcConnection(url string, username string, password string, disableTLS bool) (*Connection, error) { - // Connect to a Bitcoin node using RPC - connConfig := &rpcclient.ConnConfig{ - HTTPPostMode: true, - Host: url, - User: username, - Pass: password, - DisableTLS: disableTLS, - } - - client, err := rpcclient.New(connConfig, nil) - if err != nil { - return nil, err - } - - info, err := client.GetBlockChainInfo() - if err != nil { - return nil, err - } - log.Debug().Msgf("Connected to bitcoin node %s ", info.Chain) - - return &Connection{ - Client: client, - }, nil -} diff --git a/chains/btc/executor/executor.go b/chains/btc/executor/executor.go deleted file mode 100644 index 17d1383d..00000000 --- a/chains/btc/executor/executor.go +++ /dev/null @@ -1,430 +0,0 @@ -package executor - -import ( - "context" - "encoding/hex" - "fmt" - "sync" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/btc/config" - "github.com/ChainSafe/sygma-relayer/chains/btc/connection" - "github.com/ChainSafe/sygma-relayer/chains/btc/mempool" - "github.com/ChainSafe/sygma-relayer/chains/btc/uploader" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/store" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/frost/signing" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/txscript" - "github.com/btcsuite/btcd/wire" - "github.com/libp2p/go-libp2p/core/host" - "github.com/rs/zerolog/log" - "github.com/sourcegraph/conc/pool" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" - "github.com/taurusgroup/multi-party-sig/pkg/taproot" - "go.uber.org/zap/buffer" -) - -var ( - signingTimeout = 30 * time.Minute - - INPUT_SIZE uint64 = 180 - OUTPUT_SIZE uint64 = 34 - FEE_ROUNDING_FACTOR uint64 = 5 -) - -type MempoolAPI interface { - RecommendedFee() (*mempool.Fee, error) - Utxos(address string) ([]mempool.Utxo, error) -} - -type Executor struct { - coordinator *tss.Coordinator - host host.Host - comm comm.Communication - - conn *connection.Connection - resources map[[32]byte]config.Resource - chainCfg chaincfg.Params - mempool MempoolAPI - fetcher signing.SaveDataFetcher - - propStorer PropStorer - propMutex sync.Mutex - - exitLock *sync.RWMutex - uploader uploader.Uploader -} - -func NewExecutor( - propStorer PropStorer, - host host.Host, - comm comm.Communication, - coordinator *tss.Coordinator, - fetcher signing.SaveDataFetcher, - conn *connection.Connection, - mempool MempoolAPI, - resources map[[32]byte]config.Resource, - chainCfg chaincfg.Params, - exitLock *sync.RWMutex, - uploader uploader.Uploader, -) *Executor { - return &Executor{ - propStorer: propStorer, - host: host, - comm: comm, - coordinator: coordinator, - exitLock: exitLock, - fetcher: fetcher, - conn: conn, - resources: resources, - mempool: mempool, - chainCfg: chainCfg, - uploader: uploader, - } -} - -// Execute starts a signing process and executes proposals when signature is generated -func (e *Executor) Execute(proposals []*proposal.Proposal) error { - e.exitLock.RLock() - defer e.exitLock.RUnlock() - - messageID := proposals[0].MessageID - props, err := e.proposalsForExecution(proposals, messageID) - if err != nil { - return err - } - if len(props) == 0 { - return nil - } - - propsPerResource := make(map[[32]byte][]*BtcTransferProposal) - for _, prop := range props { - propsPerResource[prop.Data.ResourceId] = append(propsPerResource[prop.Data.ResourceId], prop) - } - - p := pool.New().WithErrors() - for resourceID, props := range propsPerResource { - resourceID := resourceID - props := props - - p.Go(func() error { - resource, ok := e.resources[resourceID] - if !ok { - return fmt.Errorf("no resource for ID %s", hex.EncodeToString(resourceID[:])) - } - - return e.executeResourceProps(props, resource, messageID) - }) - } - return p.Wait() -} - -func (e *Executor) executeResourceProps(props []*BtcTransferProposal, resource config.Resource, messageID string) error { - log.Info().Str("messageID", messageID).Msgf("Executing proposals %+v for resource %s", props, hex.EncodeToString(resource.ResourceID[:])) - - tx, utxos, err := e.rawTx(props, resource) - if err != nil { - return err - } - - sigChn := make(chan interface{}, len(tx.TxIn)) - p := pool.New().WithErrors() - executionContext, cancelExecution := context.WithCancel(context.Background()) - watchContext, cancelWatch := context.WithCancel(context.Background()) - sessionID := fmt.Sprintf("%s-%s", messageID, hex.EncodeToString(resource.ResourceID[:])) - defer cancelWatch() - p.Go(func() error { - return e.watchExecution(watchContext, cancelExecution, tx, props, sigChn, sessionID, messageID) - }) - prevOuts := make(map[wire.OutPoint]*wire.TxOut) - for _, utxo := range utxos { - txOut := wire.NewTxOut(int64(utxo.Value), resource.Script) - hash, err := chainhash.NewHashFromStr(utxo.TxID) - if err != nil { - return err - } - prevOuts[*wire.NewOutPoint(hash, utxo.Vout)] = txOut - } - prevOutputFetcher := txscript.NewMultiPrevOutFetcher(prevOuts) - sigHashes := txscript.NewTxSigHashes(tx, prevOutputFetcher) - - var buf buffer.Buffer - _ = tx.Serialize(&buf) - bytes := buf.Bytes() - log.Info().Str("messageID", messageID).Msgf("Assembled raw unsigned transaction %s", hex.EncodeToString(bytes)) - - // we need to sign each input individually - tssProcesses := make([]tss.TssProcess, len(tx.TxIn)) - for i := range tx.TxIn { - signingHash, err := txscript.CalcTaprootSignatureHash(sigHashes, txscript.SigHashDefault, tx, i, prevOutputFetcher) - sessionID := hex.EncodeToString(signingHash) - if err != nil { - return err - } - signing, err := signing.NewSigning( - i, - signingHash, - resource.Tweak, - messageID, - sessionID, - e.host, - e.comm, - e.fetcher) - if err != nil { - return err - } - tssProcesses[i] = signing - } - p.Go(func() error { - return e.coordinator.Execute(executionContext, tssProcesses, sigChn) - }) - return p.Wait() -} - -func (e *Executor) watchExecution( - ctx context.Context, - cancelExecution context.CancelFunc, - tx *wire.MsgTx, - proposals []*BtcTransferProposal, - sigChn chan interface{}, - sessionID string, - messageID string) error { - timeout := time.NewTicker(signingTimeout) - defer timeout.Stop() - defer cancelExecution() - signatures := make([]taproot.Signature, len(tx.TxIn)) - - for { - select { - case sigResult := <-sigChn: - { - if sigResult == nil { - continue - } - signatureData := sigResult.(signing.Signature) - signatures[signatureData.Id] = signatureData.Signature - if !e.signaturesFilled(signatures) { - continue - } - cancelExecution() - - hash, err := e.sendTx(tx, signatures, messageID) - if err != nil { - _ = e.comm.Broadcast(e.host.Peerstore().Peers(), []byte{}, comm.TssFailMsg, sessionID) - e.storeProposalsStatus(proposals, store.FailedProp) - return err - } - - e.storeProposalsStatus(proposals, store.ExecutedProp) - log.Info().Str("messageID", messageID).Msgf("Sent proposals execution with hash: %s", hash) - return nil - } - case <-timeout.C: - { - return fmt.Errorf("execution timed out in %s", signingTimeout) - } - case <-ctx.Done(): - { - return nil - } - } - } -} - -func (e *Executor) rawTx(proposals []*BtcTransferProposal, resource config.Resource) (*wire.MsgTx, []mempool.Utxo, error) { - tx := wire.NewMsgTx(wire.TxVersion) - outputAmount, err := e.outputs(tx, proposals) - if err != nil { - return nil, nil, err - } - feeEstimate, err := e.fee(uint64(len(proposals)), uint64(len(proposals))) - if err != nil { - return nil, nil, err - } - inputAmount, utxos, err := e.inputs(tx, resource.Address, outputAmount+feeEstimate) - if err != nil { - return nil, nil, err - } - if inputAmount < outputAmount { - return nil, nil, fmt.Errorf("utxo input amount %d less than output amount %d", inputAmount, outputAmount) - } - fee, err := e.fee(uint64(len(utxos)), uint64(len(proposals))+1) - if err != nil { - return nil, nil, err - } - - returnAmount := inputAmount - fee - outputAmount - if returnAmount > 0 { - // return extra funds - returnScript, err := txscript.PayToAddrScript(resource.Address) - if err != nil { - return nil, nil, err - } - txOut := wire.NewTxOut(int64(returnAmount), returnScript) - tx.AddTxOut(txOut) - } - return tx, utxos, err -} - -func (e *Executor) outputs(tx *wire.MsgTx, proposals []*BtcTransferProposal) (uint64, error) { - outputAmount := uint64(0) - var dataToUpload []map[string]interface{} - - for _, prop := range proposals { - addr, err := btcutil.DecodeAddress(prop.Data.Recipient, &e.chainCfg) - if err != nil { - return 0, err - } - destinationAddrByte, err := txscript.PayToAddrScript(addr) - if err != nil { - return 0, err - } - - dataToUpload = append(dataToUpload, map[string]interface{}{ - "sourceDomain": prop.Source, - "depositNonce": prop.Data.DepositNonce, - }) - - txOut := wire.NewTxOut(int64(prop.Data.Amount), destinationAddrByte) - tx.AddTxOut(txOut) - - outputAmount += prop.Data.Amount - } - - // Upload to IPFS - cid, err := e.uploader.Upload(dataToUpload) - if err != nil { - log.Error().Err(err).Msg("Error occured while uploading metadata to ipfs") - return 0, err - } - - // Store the CID in OP_RETURN - opReturnData := []byte("syg_" + cid) - opReturnScript, err := txscript.NullDataScript(opReturnData) - if err != nil { - log.Error().Err(err).Msg("Error occured while constructiong OP_RETURN data") - return 0, err - } - - opReturnOut := wire.NewTxOut(0, opReturnScript) - tx.AddTxOut(opReturnOut) - return outputAmount, nil -} - -func (e *Executor) inputs(tx *wire.MsgTx, address btcutil.Address, outputAmount uint64) (uint64, []mempool.Utxo, error) { - usedUtxos := make([]mempool.Utxo, 0) - inputAmount := uint64(0) - utxos, err := e.mempool.Utxos(address.String()) - if err != nil { - return 0, nil, err - } - for _, utxo := range utxos { - previousTxHash, err := chainhash.NewHashFromStr(utxo.TxID) - if err != nil { - return 0, nil, err - } - outPoint := wire.NewOutPoint(previousTxHash, utxo.Vout) - txIn := wire.NewTxIn(outPoint, nil, nil) - tx.AddTxIn(txIn) - - usedUtxos = append(usedUtxos, utxo) - inputAmount += uint64(utxo.Value) - if inputAmount > outputAmount { - break - } - } - return inputAmount, usedUtxos, nil -} - -func (e *Executor) fee(numOfInputs, numOfOutputs uint64) (uint64, error) { - recommendedFee, err := e.mempool.RecommendedFee() - if err != nil { - return 0, err - } - - return (numOfInputs*INPUT_SIZE + numOfOutputs*OUTPUT_SIZE) * ((recommendedFee.EconomyFee/FEE_ROUNDING_FACTOR)*FEE_ROUNDING_FACTOR + FEE_ROUNDING_FACTOR), nil -} - -func (e *Executor) sendTx(tx *wire.MsgTx, signatures []taproot.Signature, messageID string) (*chainhash.Hash, error) { - for i, sig := range signatures { - tx.TxIn[i].Witness = wire.TxWitness{sig} - } - - var buf buffer.Buffer - err := tx.Serialize(&buf) - if err != nil { - return nil, err - } - bytes := buf.Bytes() - log.Debug().Str("messageID", messageID).Msgf("Assembled raw transaction %s", hex.EncodeToString(bytes)) - return e.conn.SendRawTransaction(tx, true) -} - -func (e *Executor) signaturesFilled(signatures []taproot.Signature) bool { - for _, signature := range signatures { - if len([]byte(signature)) == 0 { - return false - } - } - - return true -} - -func (e *Executor) proposalsForExecution(proposals []*proposal.Proposal, messageID string) ([]*BtcTransferProposal, error) { - e.propMutex.Lock() - props := make([]*BtcTransferProposal, 0) - for _, prop := range proposals { - executed, err := e.isExecuted(prop) - if err != nil { - return props, err - } - - if executed { - log.Warn().Str("messageID", messageID).Msgf("Proposal %s already executed", fmt.Sprintf("%d-%d-%d", prop.Source, prop.Destination, prop.Data.(BtcTransferProposalData).DepositNonce)) - continue - } - - err = e.propStorer.StorePropStatus(prop.Source, prop.Destination, prop.Data.(BtcTransferProposalData).DepositNonce, store.PendingProp) - if err != nil { - return props, err - } - props = append(props, &BtcTransferProposal{ - Source: prop.Source, - Destination: prop.Destination, - Data: prop.Data.(BtcTransferProposalData), - }) - } - e.propMutex.Unlock() - return props, nil -} - -func (e *Executor) isExecuted(prop *proposal.Proposal) (bool, error) { - status, err := e.propStorer.PropStatus(prop.Source, prop.Destination, prop.Data.(BtcTransferProposalData).DepositNonce) - if err != nil { - return true, err - } - - if status == store.MissingProp || status == store.FailedProp { - return false, nil - } - return true, err -} - -func (e *Executor) storeProposalsStatus(props []*BtcTransferProposal, status store.PropStatus) { - e.propMutex.Lock() - for _, prop := range props { - err := e.propStorer.StorePropStatus( - prop.Source, - prop.Destination, - prop.Data.DepositNonce, - status) - if err != nil { - log.Err(err).Msgf("Failed storing proposal %+v status %s", prop, status) - } - } - e.propMutex.Unlock() -} diff --git a/chains/btc/executor/message-handler.go b/chains/btc/executor/message-handler.go deleted file mode 100644 index 8c1d66fc..00000000 --- a/chains/btc/executor/message-handler.go +++ /dev/null @@ -1,149 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package executor - -import ( - "errors" - "fmt" - "math/big" - - "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/sygmaprotocol/sygma-core/relayer/message" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" - - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ChainSafe/sygma-relayer/store" -) - -type BtcTransferProposalData struct { - Amount uint64 - Recipient string - DepositNonce uint64 - ResourceId [32]byte -} - -type BtcTransferProposal struct { - Source uint8 - Destination uint8 - Data BtcTransferProposalData -} - -type FungibleMessageHandler struct{} - -func (h *FungibleMessageHandler) HandleMessage(msg *message.Message) (*proposal.Proposal, error) { - transferMessage := &transfer.TransferMessage{ - Source: msg.Source, - Destination: msg.Destination, - Data: msg.Data.(transfer.TransferMessageData), - Type: msg.Type, - ID: msg.ID, - } - - switch transferMessage.Data.Type { - case transfer.FungibleTransfer: - return ERC20MessageHandler(transferMessage) - } - return nil, errors.New("wrong message type passed while handling message") -} - -func ERC20MessageHandler(msg *transfer.TransferMessage) (*proposal.Proposal, error) { - if len(msg.Data.Payload) != 2 { - return nil, errors.New("malformed payload. Len of payload should be 2") - } - amount, ok := msg.Data.Payload[0].([]byte) - if !ok { - return nil, errors.New("wrong payload amount format") - } - recipient, ok := msg.Data.Payload[1].([]byte) - if !ok { - return nil, errors.New("wrong payload recipient format") - } - bigAmount := new(big.Int).SetBytes(amount) - - // remove 10 decimal places to match Bitcoin network - divisor := new(big.Int) - divisor.Exp(big.NewInt(10), big.NewInt(10), nil) - bigAmount.Div(bigAmount, divisor) - - return proposal.NewProposal(msg.Source, msg.Destination, BtcTransferProposalData{ - Amount: bigAmount.Uint64(), - Recipient: string(recipient), - DepositNonce: msg.Data.DepositNonce, - ResourceId: msg.Data.ResourceId, - }, msg.ID, transfer.TransferProposalType), nil -} - -type BlockFetcher interface { - GetBlockVerboseTx(*chainhash.Hash) (*btcjson.GetBlockVerboseTxResult, error) - GetBestBlockHash() (*chainhash.Hash, error) -} - -type PropStorer interface { - StorePropStatus(source, destination uint8, depositNonce uint64, status store.PropStatus) error - PropStatus(source, destination uint8, depositNonce uint64) (store.PropStatus, error) -} - -type DepositProcessor interface { - ProcessDeposits(blockNumber *big.Int) (map[uint8][]*message.Message, error) -} - -type RetryMessageHandler struct { - depositProcessor DepositProcessor - blockFetcher BlockFetcher - blockConfirmations *big.Int - propStorer PropStorer - msgChan chan []*message.Message -} - -func NewRetryMessageHandler( - depositProcessor DepositProcessor, - blockFetcher BlockFetcher, - blockConfirmations *big.Int, - propStorer PropStorer, - msgChan chan []*message.Message) *RetryMessageHandler { - return &RetryMessageHandler{ - depositProcessor: depositProcessor, - blockFetcher: blockFetcher, - blockConfirmations: blockConfirmations, - propStorer: propStorer, - msgChan: msgChan, - } -} - -func (h *RetryMessageHandler) HandleMessage(msg *message.Message) (*proposal.Proposal, error) { - retryData := msg.Data.(retry.RetryMessageData) - hash, err := h.blockFetcher.GetBestBlockHash() - if err != nil { - return nil, err - } - block, err := h.blockFetcher.GetBlockVerboseTx(hash) - if err != nil { - return nil, err - } - latestBlock := big.NewInt(block.Height) - if latestBlock.Cmp(new(big.Int).Add(retryData.BlockHeight, h.blockConfirmations)) != 1 { - return nil, fmt.Errorf( - "latest block %s higher than receipt block number + block confirmations %s", - latestBlock, - new(big.Int).Add(retryData.BlockHeight, h.blockConfirmations), - ) - } - - domainDeposits, err := h.depositProcessor.ProcessDeposits(retryData.BlockHeight) - if err != nil { - return nil, err - } - filteredDeposits, err := retry.FilterDeposits(h.propStorer, domainDeposits, retryData.ResourceID, retryData.DestinationDomainID) - if err != nil { - return nil, err - } - if len(filteredDeposits) == 0 { - return nil, nil - } - - h.msgChan <- filteredDeposits - return nil, nil -} diff --git a/chains/btc/executor/message-handler_test.go b/chains/btc/executor/message-handler_test.go deleted file mode 100644 index 28538c3d..00000000 --- a/chains/btc/executor/message-handler_test.go +++ /dev/null @@ -1,338 +0,0 @@ -package executor_test - -import ( - "math/big" - "testing" - - "github.com/ChainSafe/sygma-relayer/chains/btc/executor" - mock_executor "github.com/ChainSafe/sygma-relayer/chains/btc/executor/mock" - "github.com/ChainSafe/sygma-relayer/e2e/evm" - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ChainSafe/sygma-relayer/store" - "github.com/btcsuite/btcd/btcjson" - "github.com/ethereum/go-ethereum/common" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/suite" - "github.com/sygmaprotocol/sygma-core/relayer/message" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" -) - -type BtcMessageHandlerTestSuite struct { - suite.Suite -} - -func TestRunBtcMessageHandlerTestSuite(t *testing.T) { - suite.Run(t, new(BtcMessageHandlerTestSuite)) -} - -func (s *BtcMessageHandlerTestSuite) Test_ERC20HandleMessage_ValidMessage() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - big.NewInt(100000045678).Bytes(), // amount - []byte("tb1pffdrehs8455lgnwquggf4dzf6jduz8v7d2usflyujq4ggh4jaapqpfjj83"), - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.FungibleMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(err) - s.NotNil(prop) - s.Equal(prop, &proposal.Proposal{ - Source: 1, - Destination: 0, - Data: executor.BtcTransferProposalData{ - Amount: 10, - Recipient: "tb1pffdrehs8455lgnwquggf4dzf6jduz8v7d2usflyujq4ggh4jaapqpfjj83", - DepositNonce: 1, - }, - Type: transfer.TransferProposalType, - }) -} - -func (s *BtcMessageHandlerTestSuite) Test_ERC20HandleMessage_ValidMessage_Dust() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - big.NewInt(1).Bytes(), // amount - []byte("tb1pffdrehs8455lgnwquggf4dzf6jduz8v7d2usflyujq4ggh4jaapqpfjj83"), - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.FungibleMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(err) - s.NotNil(prop) - s.Equal(prop, &proposal.Proposal{ - Source: 1, - Destination: 0, - Data: executor.BtcTransferProposalData{ - Amount: 0, - Recipient: "tb1pffdrehs8455lgnwquggf4dzf6jduz8v7d2usflyujq4ggh4jaapqpfjj83", - DepositNonce: 1, - }, - Type: transfer.TransferProposalType, - }) -} - -func (s *BtcMessageHandlerTestSuite) Test_ERC20HandleMessage_IncorrectDataLen() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.FungibleMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) -} - -func (s *BtcMessageHandlerTestSuite) Test_ERC20HandleMessage_IncorrectAmount() { - - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - "incorrectAmount", // amount - []byte{241, 229, 143, 177, 119, 4, 194, 218, 132, 121, 165, 51, 249, 250, 212, 173, 9, 147, 202, 107}, // recipientAddress - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.FungibleMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) -} - -func (s *BtcMessageHandlerTestSuite) Test_ERC20HandleMessage_IncorrectRecipient() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - "incorrectRecipient", // recipientAddress - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.FungibleMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) -} - -func (s *BtcMessageHandlerTestSuite) Test_HandleMessage_InvalidType() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - "incorrectRecipient", // recipientAddress - }, - Type: transfer.NonFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.FungibleMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) -} - -type RetryMessageHandlerTestSuite struct { - suite.Suite - - messageHandler *executor.RetryMessageHandler - mockBlockFetcher *mock_executor.MockBlockFetcher - mockDepositProcessor *mock_executor.MockDepositProcessor - mockPropStorer *mock_executor.MockPropStorer - msgChan chan []*message.Message -} - -func TestRunRetryMessageHandlerTestSuite(t *testing.T) { - suite.Run(t, new(RetryMessageHandlerTestSuite)) -} - -func (s *RetryMessageHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.mockBlockFetcher = mock_executor.NewMockBlockFetcher(ctrl) - s.mockDepositProcessor = mock_executor.NewMockDepositProcessor(ctrl) - s.mockPropStorer = mock_executor.NewMockPropStorer(ctrl) - s.msgChan = make(chan []*message.Message, 1) - s.messageHandler = executor.NewRetryMessageHandler( - s.mockDepositProcessor, - s.mockBlockFetcher, - big.NewInt(5), - s.mockPropStorer, - s.msgChan) -} - -func (s *RetryMessageHandlerTestSuite) Test_HandleMessage_RetryTooNew() { - s.mockBlockFetcher.EXPECT().GetBestBlockHash().Return(nil, nil) - s.mockBlockFetcher.EXPECT().GetBlockVerboseTx(gomock.Any()).Return(&btcjson.GetBlockVerboseTxResult{ - Height: 105, - }, nil) - - message := &message.Message{ - Source: 1, - Destination: 3, - Data: retry.RetryMessageData{ - SourceDomainID: 3, - DestinationDomainID: 4, - BlockHeight: big.NewInt(100), - ResourceID: [32]byte{}, - }, - Type: transfer.TransferMessageType, - } - - prop, err := s.messageHandler.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) -} - -func (s *RetryMessageHandlerTestSuite) Test_HandleMessage_NoDeposits() { - s.mockBlockFetcher.EXPECT().GetBestBlockHash().Return(nil, nil) - s.mockBlockFetcher.EXPECT().GetBlockVerboseTx(gomock.Any()).Return(&btcjson.GetBlockVerboseTxResult{ - Height: 106, - }, nil) - s.mockDepositProcessor.EXPECT().ProcessDeposits(big.NewInt(100)).Return(make(map[uint8][]*message.Message), nil) - - message := &message.Message{ - Source: 1, - Destination: 3, - Data: retry.RetryMessageData{ - SourceDomainID: 3, - DestinationDomainID: 4, - BlockHeight: big.NewInt(100), - ResourceID: [32]byte{}, - }, - Type: transfer.TransferMessageType, - } - - prop, err := s.messageHandler.HandleMessage(message) - - s.Nil(prop) - s.Nil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *RetryMessageHandlerTestSuite) Test_HandleMessage_ValidDeposits() { - s.mockBlockFetcher.EXPECT().GetBestBlockHash().Return(nil, nil) - s.mockBlockFetcher.EXPECT().GetBlockVerboseTx(gomock.Any()).Return(&btcjson.GetBlockVerboseTxResult{ - Height: 106, - }, nil) - - validResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{3}, 31)) - invalidResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{4}, 31)) - invalidDomain := uint8(3) - validDomain := uint8(4) - - executedNonce := uint64(1) - failedNonce := uint64(3) - - deposits := make(map[uint8][]*message.Message) - deposits[invalidDomain] = []*message.Message{ - { - Destination: invalidDomain, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: validResource, - }, - }, - } - deposits[validDomain] = []*message.Message{ - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: executedNonce, - ResourceId: validResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: 2, - ResourceId: invalidResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: failedNonce, - ResourceId: validResource, - }, - }, - } - s.mockDepositProcessor.EXPECT().ProcessDeposits(big.NewInt(100)).Return(deposits, nil) - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, executedNonce).Return(store.ExecutedProp, nil) - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, failedNonce).Return(store.FailedProp, nil) - - message := &message.Message{ - Source: 1, - Destination: 3, - Data: retry.RetryMessageData{ - SourceDomainID: invalidDomain, - DestinationDomainID: validDomain, - BlockHeight: big.NewInt(100), - ResourceID: validResource, - }, - Type: transfer.TransferMessageType, - } - - prop, err := s.messageHandler.HandleMessage(message) - - s.Nil(prop) - s.Nil(err) - msgs := <-s.msgChan - s.Equal(msgs[0].Data.(transfer.TransferMessageData).DepositNonce, failedNonce) - s.Equal(msgs[0].Destination, validDomain) -} diff --git a/chains/btc/executor/mock/message-handler.go b/chains/btc/executor/mock/message-handler.go deleted file mode 100644 index d32d2355..00000000 --- a/chains/btc/executor/mock/message-handler.go +++ /dev/null @@ -1,159 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./chains/btc/executor/message-handler.go - -// Package mock_executor is a generated GoMock package. -package mock_executor - -import ( - big "math/big" - reflect "reflect" - - store "github.com/ChainSafe/sygma-relayer/store" - btcjson "github.com/btcsuite/btcd/btcjson" - chainhash "github.com/btcsuite/btcd/chaincfg/chainhash" - gomock "github.com/golang/mock/gomock" - message "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -// MockBlockFetcher is a mock of BlockFetcher interface. -type MockBlockFetcher struct { - ctrl *gomock.Controller - recorder *MockBlockFetcherMockRecorder -} - -// MockBlockFetcherMockRecorder is the mock recorder for MockBlockFetcher. -type MockBlockFetcherMockRecorder struct { - mock *MockBlockFetcher -} - -// NewMockBlockFetcher creates a new mock instance. -func NewMockBlockFetcher(ctrl *gomock.Controller) *MockBlockFetcher { - mock := &MockBlockFetcher{ctrl: ctrl} - mock.recorder = &MockBlockFetcherMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockBlockFetcher) EXPECT() *MockBlockFetcherMockRecorder { - return m.recorder -} - -// GetBestBlockHash mocks base method. -func (m *MockBlockFetcher) GetBestBlockHash() (*chainhash.Hash, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBestBlockHash") - ret0, _ := ret[0].(*chainhash.Hash) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBestBlockHash indicates an expected call of GetBestBlockHash. -func (mr *MockBlockFetcherMockRecorder) GetBestBlockHash() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBestBlockHash", reflect.TypeOf((*MockBlockFetcher)(nil).GetBestBlockHash)) -} - -// GetBlockVerboseTx mocks base method. -func (m *MockBlockFetcher) GetBlockVerboseTx(arg0 *chainhash.Hash) (*btcjson.GetBlockVerboseTxResult, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlockVerboseTx", arg0) - ret0, _ := ret[0].(*btcjson.GetBlockVerboseTxResult) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlockVerboseTx indicates an expected call of GetBlockVerboseTx. -func (mr *MockBlockFetcherMockRecorder) GetBlockVerboseTx(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlockVerboseTx", reflect.TypeOf((*MockBlockFetcher)(nil).GetBlockVerboseTx), arg0) -} - -// MockPropStorer is a mock of PropStorer interface. -type MockPropStorer struct { - ctrl *gomock.Controller - recorder *MockPropStorerMockRecorder -} - -// MockPropStorerMockRecorder is the mock recorder for MockPropStorer. -type MockPropStorerMockRecorder struct { - mock *MockPropStorer -} - -// NewMockPropStorer creates a new mock instance. -func NewMockPropStorer(ctrl *gomock.Controller) *MockPropStorer { - mock := &MockPropStorer{ctrl: ctrl} - mock.recorder = &MockPropStorerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockPropStorer) EXPECT() *MockPropStorerMockRecorder { - return m.recorder -} - -// PropStatus mocks base method. -func (m *MockPropStorer) PropStatus(source, destination uint8, depositNonce uint64) (store.PropStatus, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PropStatus", source, destination, depositNonce) - ret0, _ := ret[0].(store.PropStatus) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// PropStatus indicates an expected call of PropStatus. -func (mr *MockPropStorerMockRecorder) PropStatus(source, destination, depositNonce interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropStatus", reflect.TypeOf((*MockPropStorer)(nil).PropStatus), source, destination, depositNonce) -} - -// StorePropStatus mocks base method. -func (m *MockPropStorer) StorePropStatus(source, destination uint8, depositNonce uint64, status store.PropStatus) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorePropStatus", source, destination, depositNonce, status) - ret0, _ := ret[0].(error) - return ret0 -} - -// StorePropStatus indicates an expected call of StorePropStatus. -func (mr *MockPropStorerMockRecorder) StorePropStatus(source, destination, depositNonce, status interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorePropStatus", reflect.TypeOf((*MockPropStorer)(nil).StorePropStatus), source, destination, depositNonce, status) -} - -// MockDepositProcessor is a mock of DepositProcessor interface. -type MockDepositProcessor struct { - ctrl *gomock.Controller - recorder *MockDepositProcessorMockRecorder -} - -// MockDepositProcessorMockRecorder is the mock recorder for MockDepositProcessor. -type MockDepositProcessorMockRecorder struct { - mock *MockDepositProcessor -} - -// NewMockDepositProcessor creates a new mock instance. -func NewMockDepositProcessor(ctrl *gomock.Controller) *MockDepositProcessor { - mock := &MockDepositProcessor{ctrl: ctrl} - mock.recorder = &MockDepositProcessorMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDepositProcessor) EXPECT() *MockDepositProcessorMockRecorder { - return m.recorder -} - -// ProcessDeposits mocks base method. -func (m *MockDepositProcessor) ProcessDeposits(blockNumber *big.Int) (map[uint8][]*message.Message, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ProcessDeposits", blockNumber) - ret0, _ := ret[0].(map[uint8][]*message.Message) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ProcessDeposits indicates an expected call of ProcessDeposits. -func (mr *MockDepositProcessorMockRecorder) ProcessDeposits(blockNumber interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProcessDeposits", reflect.TypeOf((*MockDepositProcessor)(nil).ProcessDeposits), blockNumber) -} diff --git a/chains/btc/listener/deposit-handler.go b/chains/btc/listener/deposit-handler.go deleted file mode 100644 index b343dcaf..00000000 --- a/chains/btc/listener/deposit-handler.go +++ /dev/null @@ -1,63 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener - -import ( - "fmt" - "math/big" - "strconv" - "strings" - "time" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ethereum/go-ethereum/common" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type BtcDepositHandler struct{} - -// NewBtcDepositHandler creates an instance of BtcDepositHandler that contains -// handler functions for processing deposit events -func NewBtcDepositHandler() *BtcDepositHandler { - return &BtcDepositHandler{} -} - -func (e *BtcDepositHandler) HandleDeposit( - sourceID uint8, - depositNonce uint64, - resourceID [32]byte, - amount *big.Int, - data string, - blockNumber *big.Int, - timestamp time.Time, -) (*message.Message, error) { - // data is composed of recieverEVMAddress_destinationDomainID - parsedData := strings.Split(data, "_") - evmAdd := common.HexToAddress(parsedData[0]).Bytes() - destDomainID, err := strconv.ParseUint(parsedData[1], 10, 8) - if err != nil { - return nil, err - } - - // add 10 decimal places (8->18) - multiplier := new(big.Int) - multiplier.Exp(big.NewInt(10), big.NewInt(10), nil) - amount.Mul(amount, multiplier) - payload := []interface{}{ - amount.Bytes(), - evmAdd, - } - - messageID := fmt.Sprintf("%d-%d-%d", sourceID, destDomainID, blockNumber) - return message.NewMessage(sourceID, uint8(destDomainID), transfer.TransferMessageData{ - DepositNonce: depositNonce, - ResourceId: resourceID, - Metadata: nil, - Payload: payload, - Type: transfer.FungibleTransfer, - }, - messageID, - transfer.TransferMessageType, - timestamp), nil -} diff --git a/chains/btc/listener/deposit-handler_test.go b/chains/btc/listener/deposit-handler_test.go deleted file mode 100644 index f3aa3545..00000000 --- a/chains/btc/listener/deposit-handler_test.go +++ /dev/null @@ -1,92 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener_test - -import ( - "fmt" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/sygmaprotocol/sygma-core/relayer/message" - - "math/big" - "testing" - - "github.com/ChainSafe/sygma-relayer/chains/btc/listener" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/stretchr/testify/suite" -) - -type Erc20HandlerTestSuite struct { - suite.Suite -} - -func TestRunErc20HandlerTestSuite(t *testing.T) { - suite.Run(t, new(Erc20HandlerTestSuite)) -} - -func (s *Erc20HandlerTestSuite) Test_Erc20HandleEvent() { - deposit := &listener.Deposit{ - SenderAddress: "senderAddress", - ResourceID: [32]byte{0}, - Amount: big.NewInt(100), - Data: "0x1c3A03D04c026b1f4B4208D2ce053c5686E6FB8d_1", - } - - sourceID := uint8(1) - - expectedAmount := big.NewInt(1000000000000) - blockNumber := big.NewInt(100) - depositNonce := uint64(1) - dat := strings.Split(deposit.Data, "_") - evmAdd := common.HexToAddress(dat[0]).Bytes() - messageID := fmt.Sprintf("%d-%d-%d", sourceID, 1, blockNumber) - - timestamp := time.Now() - expected := &message.Message{ - Source: sourceID, - Destination: uint8(1), - Data: transfer.TransferMessageData{ - DepositNonce: depositNonce, - ResourceId: deposit.ResourceID, - Payload: []interface{}{ - expectedAmount.Bytes(), - evmAdd, - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - ID: messageID, - Timestamp: timestamp, - } - - btcDepositHandler := listener.NewBtcDepositHandler() - message, err := btcDepositHandler.HandleDeposit(sourceID, depositNonce, deposit.ResourceID, deposit.Amount, deposit.Data, blockNumber, timestamp) - - s.Nil(err) - s.NotNil(message) - s.Equal(message, expected) -} - -func (s *Erc20HandlerTestSuite) Test_Erc20HandleEvent_InvalidDestinationDomainID() { - - deposit := &listener.Deposit{ - SenderAddress: "senderAddress", - ResourceID: [32]byte{0}, - Amount: big.NewInt(100), - Data: "0x1c3A03D04c026b1f4B4208D2ce053c5686E6FB8d_InvalidDestinationDomainID", - } - - sourceID := uint8(1) - - blockNumber := big.NewInt(100) - depositNonce := uint64(1) - - btcDepositHandler := listener.NewBtcDepositHandler() - message, err := btcDepositHandler.HandleDeposit(sourceID, depositNonce, deposit.ResourceID, deposit.Amount, deposit.Data, blockNumber, time.Now()) - - s.Nil(message) - s.NotNil(err) -} diff --git a/chains/btc/listener/event-handlers.go b/chains/btc/listener/event-handlers.go deleted file mode 100644 index 42d85858..00000000 --- a/chains/btc/listener/event-handlers.go +++ /dev/null @@ -1,165 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener - -import ( - "crypto/sha256" - "encoding/binary" - "math/big" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/btc/config" - "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcd/btcutil" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type Deposit struct { - // ID of the resource that is transfered - ResourceID [32]byte - // Address of sender (msg.sender: user) - SenderAddress string - // Additional data to be passed to specified handler - Amount *big.Int - Data string -} - -type DepositHandler interface { - HandleDeposit( - sourceID uint8, - depositNonce uint64, - resourceID [32]byte, - amount *big.Int, - data string, - blockNumber *big.Int, - timestamp time.Time, - ) (*message.Message, error) -} - -type FungibleTransferEventHandler struct { - depositHandler DepositHandler - domainID uint8 - feeAddress btcutil.Address - log zerolog.Logger - conn Connection - msgChan chan []*message.Message - resources map[[32]byte]config.Resource -} - -func NewFungibleTransferEventHandler( - logC zerolog.Context, - domainID uint8, - depositHandler DepositHandler, - msgChan chan []*message.Message, - conn Connection, - resources map[[32]byte]config.Resource, - feeAddress btcutil.Address) *FungibleTransferEventHandler { - return &FungibleTransferEventHandler{ - depositHandler: depositHandler, - domainID: domainID, - feeAddress: feeAddress, - log: logC.Logger(), - conn: conn, - msgChan: msgChan, - resources: resources, - } -} - -func (eh *FungibleTransferEventHandler) HandleEvents(blockNumber *big.Int) error { - domainDeposits, err := eh.ProcessDeposits(blockNumber) - if err != nil { - return err - } - - for _, deposits := range domainDeposits { - go func(d []*message.Message) { - eh.msgChan <- d - }(deposits) - } - return nil -} - -func (eh *FungibleTransferEventHandler) ProcessDeposits(blockNumber *big.Int) (map[uint8][]*message.Message, error) { - domainDeposits := make(map[uint8][]*message.Message) - evts, err := eh.FetchEvents(blockNumber) - if err != nil { - return nil, err - } - for _, evt := range evts { - err := func(evt btcjson.TxRawResult) error { - defer func() { - if r := recover(); r != nil { - log.Error().Msgf("panic occured while handling deposit %+v", evt) - } - }() - - for _, resource := range eh.resources { - d, isDeposit, err := DecodeDepositEvent(evt, resource, eh.feeAddress) - if err != nil { - return err - } - - if !isDeposit { - continue - } - nonce, err := eh.CalculateNonce(blockNumber, evt.Hash) - if err != nil { - return err - } - - m, err := eh.depositHandler.HandleDeposit(eh.domainID, nonce, d.ResourceID, d.Amount, d.Data, blockNumber, time.Unix(evt.Blocktime, 0)) - if err != nil { - return err - } - - log.Debug().Str("messageID", m.ID).Msgf("Resolved message %+v in block: %s", m, blockNumber.String()) - domainDeposits[m.Destination] = append(domainDeposits[m.Destination], m) - return nil - } - return nil - }(evt) - if err != nil { - log.Error().Err(err).Msgf("Failed processing Bitcoin deposit %v", evt) - } - } - return domainDeposits, nil -} - -func (eh *FungibleTransferEventHandler) FetchEvents(startBlock *big.Int) ([]btcjson.TxRawResult, error) { - blockHash, err := eh.conn.GetBlockHash(startBlock.Int64()) - if err != nil { - return nil, err - } - - // Fetch block details in verbose mode - block, err := eh.conn.GetBlockVerboseTx(blockHash) - if err != nil { - return nil, err - } - return block.Tx, nil -} - -func (eh *FungibleTransferEventHandler) CalculateNonce(blockNumber *big.Int, transactionHash string) (uint64, error) { - // Convert blockNumber to string - blockNumberStr := blockNumber.String() - - // Concatenate blockNumberStr and transactionHash with a separator - concatenatedStr := blockNumberStr + "-" + transactionHash - - // Calculate SHA-256 hash of the concatenated string - hash := sha256.New() - hash.Write([]byte(concatenatedStr)) - hashBytes := hash.Sum(nil) - - // XOR fold the hash to get a 64-bit value - var result uint64 - for i := 0; i < 4; i++ { - part := binary.BigEndian.Uint64(hashBytes[i*8 : (i+1)*8]) - result ^= part - } - - return result, nil -} diff --git a/chains/btc/listener/event-handlers_test.go b/chains/btc/listener/event-handlers_test.go deleted file mode 100644 index c6db4604..00000000 --- a/chains/btc/listener/event-handlers_test.go +++ /dev/null @@ -1,192 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener_test - -import ( - "fmt" - "math/big" - "strings" - - "github.com/ChainSafe/sygma-relayer/chains/btc/config" - "github.com/ChainSafe/sygma-relayer/chains/btc/listener" - mock_listener "github.com/ChainSafe/sygma-relayer/chains/btc/listener/mock" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/ethereum/go-ethereum/common" - "github.com/rs/zerolog" - "github.com/sygmaprotocol/sygma-core/relayer/message" - - "testing" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/suite" -) - -type DepositHandlerTestSuite struct { - suite.Suite - fungibleTransferEventHandler *listener.FungibleTransferEventHandler - mockDepositHandler *mock_listener.MockDepositHandler - domainID uint8 - resources map[[32]byte]config.Resource - msgChan chan []*message.Message - mockConn *mock_listener.MockConnection - feeAddress btcutil.Address -} - -func TestRunDepositHandlerTestSuite(t *testing.T) { - suite.Run(t, new(DepositHandlerTestSuite)) -} - -func (s *DepositHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.domainID = 1 - address1, _ := btcutil.DecodeAddress("tb1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2slafjvv", &chaincfg.TestNet3Params) - address2, _ := btcutil.DecodeAddress("tb1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2slafjvc", &chaincfg.TestNet3Params) - s.feeAddress, _ = btcutil.DecodeAddress("tb1qln69zuhdunc9stwfh6t7adexxrcr04ppy6thgm", &chaincfg.TestNet3Params) - - s.resources = make(map[[32]byte]config.Resource) - s.resources[[32]byte{1}] = config.Resource{Address: address1, ResourceID: [32]byte{1}, FeeAmount: big.NewInt(10000)} - s.resources[[32]byte{2}] = config.Resource{Address: address2, ResourceID: [32]byte{2}, FeeAmount: big.NewInt(10001)} - s.mockDepositHandler = mock_listener.NewMockDepositHandler(ctrl) - s.msgChan = make(chan []*message.Message, 2) - s.mockConn = mock_listener.NewMockConnection(ctrl) - s.fungibleTransferEventHandler = listener.NewFungibleTransferEventHandler(zerolog.Context{}, s.domainID, s.mockDepositHandler, s.msgChan, s.mockConn, s.resources, s.feeAddress) -} - -func (s *DepositHandlerTestSuite) Test_FetchDepositFails_GetBlockHashError() { - s.mockConn.EXPECT().GetBlockHash(int64(100)).Return(nil, fmt.Errorf("error")) - err := s.fungibleTransferEventHandler.HandleEvents(big.NewInt(100)) - - s.NotNil(err) -} - -func (s *DepositHandlerTestSuite) Test_FetchDepositFails_GetBlockVerboseTxError() { - hash, _ := chainhash.NewHashFromStr("00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc") - s.mockConn.EXPECT().GetBlockHash(int64(100)).Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(nil, fmt.Errorf("error")) - - err := s.fungibleTransferEventHandler.HandleEvents(big.NewInt(100)) - s.NotNil(err) -} - -func (s *DepositHandlerTestSuite) Test_CalculateNonce() { - blockNumber := big.NewInt(850000) - nonce, err := s.fungibleTransferEventHandler.CalculateNonce(blockNumber, "a3f1e4d8b3c5e2a1f6d3c7e4b8a9f3e2c1d4a6b7c8e3f1d2c4b5a6e7") - fmt.Println(nonce) - s.Equal(nonce, uint64(12849897320021645821)) - s.Nil(err) -} - -func (s *DepositHandlerTestSuite) Test_HandleDepositFails_ExecutionContinue() { - blockNumber := big.NewInt(100) - data2 := map[string]any{ - "deposit_nonce": uint64(8228687738678474667), - "resource_id": [32]byte{1}, - "amount": big.NewInt(19000), - "deposit_data": "0xe9f23A8289764280697a03aC06795eA92a170e42_1", - } - - dat := strings.Split("0xe9f23A8289764280697a03aC06795eA92a170e42_1", "_") - evmAdd := common.HexToAddress(dat[0]).Bytes() - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - data2["deposit_nonce"], - data2["resource_id"], - data2["amount"], - data2["deposit_data"], - blockNumber, - gomock.Any(), - ).Return(&message.Message{ - Source: s.domainID, - Destination: uint8(1), - Data: []interface{}{ - big.NewInt(19000).Bytes(), - evmAdd, - }, - Type: transfer.TransferMessageType, - ID: "messageid", - }, nil) - - d2 := btcjson.TxRawResult{ - Vin: []btcjson.Vin{ - - { - Txid: "00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc", - }, - }, - Vout: []btcjson.Vout{ - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "nulldata", - Hex: "6a2c3078653966323341383238393736343238303639376130336143303637393565413932613137306534325f31", - }, - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "tb1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2slafjvv", - }, - Value: float64(0.00019), - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "tb1qln69zuhdunc9stwfh6t7adexxrcr04ppy6thgm", - }, - Value: float64(0.0002), - }, - }, - } - - d1 := btcjson.TxRawResult{ - Vin: []btcjson.Vin{ - - { - Txid: "00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc", - }, - }, - Vout: []btcjson.Vout{ - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "nulldata", - Hex: "6a2c3078653966323341383238393736343238303639376130336143303637393565413932613137306534325f31", - }, - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "invalidBridgeAddressuhdunc9stwfh6t7adexxrcr04ppy6thgm", - }, - Value: float64(0.00019), - }, - }, - } - - evts := []btcjson.TxRawResult{d1, d2} - hash, _ := chainhash.NewHashFromStr("00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc") - sampleResult := &btcjson.GetBlockVerboseTxResult{ - Hash: "00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc", - Height: 100, - Tx: evts, - } - - s.mockConn.EXPECT().GetBlockHash(int64(100)).Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(sampleResult, nil) - - err := s.fungibleTransferEventHandler.HandleEvents(blockNumber) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Source: s.domainID, - Destination: 1, - Data: []interface{}{ - big.NewInt(19000).Bytes(), - evmAdd, - }, - Type: transfer.TransferMessageType, - ID: "messageid"}}) -} diff --git a/chains/btc/listener/listener.go b/chains/btc/listener/listener.go deleted file mode 100644 index f2123315..00000000 --- a/chains/btc/listener/listener.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2021 ChainSafe Systems -// SPDX-License-Identifier: LGPL-3.0-only - -package listener - -import ( - "context" - "math/big" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/btc/config" - "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" -) - -type EventHandler interface { - HandleEvents(startBlock *big.Int) error -} -type BlockStorer interface { - StoreBlock(block *big.Int, domainID uint8) error -} -type Connection interface { - GetRawTransactionVerbose(*chainhash.Hash) (*btcjson.TxRawResult, error) - GetBlockHash(int64) (*chainhash.Hash, error) - GetBlockVerboseTx(*chainhash.Hash) (*btcjson.GetBlockVerboseTxResult, error) - GetBestBlockHash() (*chainhash.Hash, error) -} -type BtcListener struct { - conn Connection - - eventHandlers []EventHandler - blockRetryInterval time.Duration - blockConfirmations *big.Int - blockstore BlockStorer - - log zerolog.Logger - domainID uint8 -} - -// NewBtcListener creates an BtcListener that listens to deposit events on chain -// and calls event handler when one occurs -func NewBtcListener(connection Connection, eventHandlers []EventHandler, config *config.BtcConfig, blockstore BlockStorer, -) *BtcListener { - return &BtcListener{ - log: log.With().Uint8("domainID", *config.GeneralChainConfig.Id).Logger(), - conn: connection, - eventHandlers: eventHandlers, - blockRetryInterval: config.BlockRetryInterval, - blockConfirmations: config.BlockConfirmations, - blockstore: blockstore, - domainID: *config.GeneralChainConfig.Id, - } -} - -// ListenToEvents goes block by block of a network and executes event handlers that are -// configured for the listener. -func (l *BtcListener) ListenToEvents(ctx context.Context, startBlock *big.Int) { -loop: - for { - select { - case <-ctx.Done(): - return - default: - // Get the hash of the most recent block - bestBlockHash, err := l.conn.GetBestBlockHash() - if err != nil { - l.log.Warn().Err(err).Msg("Unable to get latest block") - time.Sleep(l.blockRetryInterval) - continue - } - - // Fetch the most recent block in verbose mode to get additional information including height - block, err := l.conn.GetBlockVerboseTx(bestBlockHash) - if err != nil { - l.log.Warn().Err(err).Msg("Unable to get latest block") - time.Sleep(l.blockRetryInterval) - continue - } - - head := big.NewInt(block.Height) - if startBlock == nil { - startBlock = head - } - - // Sleep if startBlock is higher then head - if new(big.Int).Sub(head, startBlock).Cmp(l.blockConfirmations) == -1 { - time.Sleep(l.blockRetryInterval) - continue - } - - log.Debug().Msgf("Fetching btc events for block %d", startBlock) - - for _, handler := range l.eventHandlers { - err := handler.HandleEvents(startBlock) - if err != nil { - l.log.Warn().Err(err).Msgf("Unable to handle events") - continue loop - } - } - - //Write to block store. Not a critical operation, no need to retry - err = l.blockstore.StoreBlock(startBlock, l.domainID) - if err != nil { - l.log.Error().Str("block", startBlock.String()).Err(err).Msg("Failed to write latest block to blockstore") - } - startBlock.Add(startBlock, big.NewInt(1)) - } - } -} diff --git a/chains/btc/listener/listener_test.go b/chains/btc/listener/listener_test.go deleted file mode 100644 index bc95228b..00000000 --- a/chains/btc/listener/listener_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package listener_test - -import ( - "context" - "fmt" - "math/big" - "testing" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/btc/config" - "github.com/ChainSafe/sygma-relayer/chains/btc/listener" - mock_listener "github.com/ChainSafe/sygma-relayer/chains/btc/listener/mock" - "github.com/ChainSafe/sygma-relayer/config/chain" - "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/suite" -) - -type ListenerTestSuite struct { - suite.Suite - listener *listener.BtcListener - mockConn *mock_listener.MockConnection - mockEventHandler *mock_listener.MockEventHandler - mockBlockStorer *mock_listener.MockBlockStorer - domainID uint8 -} - -func TestRunTestSuite(t *testing.T) { - suite.Run(t, new(ListenerTestSuite)) -} - -func (s *ListenerTestSuite) SetupTest() { - s.domainID = 1 - btcConfig := config.BtcConfig{ - GeneralChainConfig: chain.GeneralChainConfig{ - Id: &s.domainID, - }, - BlockRetryInterval: time.Millisecond * 75, - BlockConfirmations: big.NewInt(5), - } - - ctrl := gomock.NewController(s.T()) - s.mockBlockStorer = mock_listener.NewMockBlockStorer(ctrl) - - s.mockConn = mock_listener.NewMockConnection(ctrl) - s.mockEventHandler = mock_listener.NewMockEventHandler(ctrl) - - s.listener = listener.NewBtcListener( - s.mockConn, - []listener.EventHandler{s.mockEventHandler, s.mockEventHandler}, - &btcConfig, - s.mockBlockStorer, - ) -} - -func (s *ListenerTestSuite) Test_ListenToEvents_RetriesIfFinalizedHeadUnavailable() { - s.mockConn.EXPECT().GetBestBlockHash().Return(nil, fmt.Errorf("error")) - - ctx, cancel := context.WithCancel(context.Background()) - go s.listener.ListenToEvents(ctx, big.NewInt(100)) - - time.Sleep(time.Millisecond * 50) - cancel() - -} - -func (s *ListenerTestSuite) Test_ListenToEvents_GetVerboseTxError() { - hash, _ := chainhash.NewHashFromStr("00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc") - s.mockConn.EXPECT().GetBestBlockHash().Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(nil, fmt.Errorf("error")) - - ctx, cancel := context.WithCancel(context.Background()) - go s.listener.ListenToEvents(ctx, big.NewInt(100)) - - time.Sleep(time.Millisecond * 50) - cancel() -} - -func (s *ListenerTestSuite) Test_ListenToEvents_SleepsIfBlockTooNew() { - hash, _ := chainhash.NewHashFromStr("00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc") - s.mockConn.EXPECT().GetBestBlockHash().Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(&btcjson.GetBlockVerboseTxResult{Height: int64(102)}, nil) - - ctx, cancel := context.WithCancel(context.Background()) - go s.listener.ListenToEvents(ctx, big.NewInt(100)) - - time.Sleep(time.Millisecond * 50) - cancel() -} - -func (s *ListenerTestSuite) Test_ListenToEvents_RetriesInCaseOfHandlerFailure() { - startBlock := big.NewInt(105) - head := int64(110) - - // First pass - hash, _ := chainhash.NewHashFromStr("00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc") - s.mockConn.EXPECT().GetBestBlockHash().Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(&btcjson.GetBlockVerboseTxResult{Height: head}, nil) - s.mockEventHandler.EXPECT().HandleEvents(startBlock).Return(fmt.Errorf("error")) - // Second pass - s.mockConn.EXPECT().GetBestBlockHash().Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(&btcjson.GetBlockVerboseTxResult{Height: head}, nil) - s.mockEventHandler.EXPECT().HandleEvents(startBlock).Return(nil) - s.mockEventHandler.EXPECT().HandleEvents(startBlock).Return(nil) - - s.mockBlockStorer.EXPECT().StoreBlock(startBlock, s.domainID).Return(nil) - // third pass - s.mockConn.EXPECT().GetBestBlockHash().Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(&btcjson.GetBlockVerboseTxResult{Height: head}, nil) - - ctx, cancel := context.WithCancel(context.Background()) - - go s.listener.ListenToEvents(ctx, big.NewInt(105)) - - time.Sleep(time.Millisecond * 50) - cancel() -} - -func (s *ListenerTestSuite) Test_ListenToEvents_UsesHeadAsStartBlockIfNilPassed() { - startBlock := big.NewInt(100) - oldHead := int64(100) - newHead := int64(106) - hash, _ := chainhash.NewHashFromStr("00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc") - s.mockConn.EXPECT().GetBestBlockHash().Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(&btcjson.GetBlockVerboseTxResult{Height: oldHead}, nil) - - s.mockConn.EXPECT().GetBestBlockHash().Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(&btcjson.GetBlockVerboseTxResult{Height: newHead}, nil) - - s.mockConn.EXPECT().GetBestBlockHash().Return(hash, nil) - s.mockConn.EXPECT().GetBlockVerboseTx(hash).Return(&btcjson.GetBlockVerboseTxResult{Height: int64(50)}, nil) - - s.mockEventHandler.EXPECT().HandleEvents(startBlock).Return(nil) - s.mockEventHandler.EXPECT().HandleEvents(startBlock).Return(nil) - - s.mockBlockStorer.EXPECT().StoreBlock(startBlock, s.domainID).Return(nil) - - ctx, cancel := context.WithCancel(context.Background()) - - go s.listener.ListenToEvents(ctx, nil) - - time.Sleep(time.Millisecond * 100) - cancel() -} diff --git a/chains/btc/listener/mock/handlers.go b/chains/btc/listener/mock/handlers.go deleted file mode 100644 index e3ffca41..00000000 --- a/chains/btc/listener/mock/handlers.go +++ /dev/null @@ -1,52 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./chains/btc/listener/event-handlers.go - -// Package mock_listener is a generated GoMock package. -package mock_listener - -import ( - big "math/big" - reflect "reflect" - time "time" - - gomock "github.com/golang/mock/gomock" - message "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -// MockDepositHandler is a mock of DepositHandler interface. -type MockDepositHandler struct { - ctrl *gomock.Controller - recorder *MockDepositHandlerMockRecorder -} - -// MockDepositHandlerMockRecorder is the mock recorder for MockDepositHandler. -type MockDepositHandlerMockRecorder struct { - mock *MockDepositHandler -} - -// NewMockDepositHandler creates a new mock instance. -func NewMockDepositHandler(ctrl *gomock.Controller) *MockDepositHandler { - mock := &MockDepositHandler{ctrl: ctrl} - mock.recorder = &MockDepositHandlerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDepositHandler) EXPECT() *MockDepositHandlerMockRecorder { - return m.recorder -} - -// HandleDeposit mocks base method. -func (m *MockDepositHandler) HandleDeposit(sourceID uint8, depositNonce uint64, resourceID [32]byte, amount *big.Int, data string, blockNumber *big.Int, timestamp time.Time) (*message.Message, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HandleDeposit", sourceID, depositNonce, resourceID, amount, data, blockNumber, timestamp) - ret0, _ := ret[0].(*message.Message) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// HandleDeposit indicates an expected call of HandleDeposit. -func (mr *MockDepositHandlerMockRecorder) HandleDeposit(sourceID, depositNonce, resourceID, amount, data, blockNumber, timestamp interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HandleDeposit", reflect.TypeOf((*MockDepositHandler)(nil).HandleDeposit), sourceID, depositNonce, resourceID, amount, data, blockNumber, timestamp) -} diff --git a/chains/btc/listener/mock/listener.go b/chains/btc/listener/mock/listener.go deleted file mode 100644 index bef0280e..00000000 --- a/chains/btc/listener/mock/listener.go +++ /dev/null @@ -1,171 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./chains/btc/listener/listener.go - -// Package mock_listener is a generated GoMock package. -package mock_listener - -import ( - big "math/big" - reflect "reflect" - - btcjson "github.com/btcsuite/btcd/btcjson" - chainhash "github.com/btcsuite/btcd/chaincfg/chainhash" - gomock "github.com/golang/mock/gomock" -) - -// MockEventHandler is a mock of EventHandler interface. -type MockEventHandler struct { - ctrl *gomock.Controller - recorder *MockEventHandlerMockRecorder -} - -// MockEventHandlerMockRecorder is the mock recorder for MockEventHandler. -type MockEventHandlerMockRecorder struct { - mock *MockEventHandler -} - -// NewMockEventHandler creates a new mock instance. -func NewMockEventHandler(ctrl *gomock.Controller) *MockEventHandler { - mock := &MockEventHandler{ctrl: ctrl} - mock.recorder = &MockEventHandlerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockEventHandler) EXPECT() *MockEventHandlerMockRecorder { - return m.recorder -} - -// HandleEvents mocks base method. -func (m *MockEventHandler) HandleEvents(startBlock *big.Int) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HandleEvents", startBlock) - ret0, _ := ret[0].(error) - return ret0 -} - -// HandleEvents indicates an expected call of HandleEvents. -func (mr *MockEventHandlerMockRecorder) HandleEvents(startBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HandleEvents", reflect.TypeOf((*MockEventHandler)(nil).HandleEvents), startBlock) -} - -// MockBlockStorer is a mock of BlockStorer interface. -type MockBlockStorer struct { - ctrl *gomock.Controller - recorder *MockBlockStorerMockRecorder -} - -// MockBlockStorerMockRecorder is the mock recorder for MockBlockStorer. -type MockBlockStorerMockRecorder struct { - mock *MockBlockStorer -} - -// NewMockBlockStorer creates a new mock instance. -func NewMockBlockStorer(ctrl *gomock.Controller) *MockBlockStorer { - mock := &MockBlockStorer{ctrl: ctrl} - mock.recorder = &MockBlockStorerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockBlockStorer) EXPECT() *MockBlockStorerMockRecorder { - return m.recorder -} - -// StoreBlock mocks base method. -func (m *MockBlockStorer) StoreBlock(block *big.Int, domainID uint8) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StoreBlock", block, domainID) - ret0, _ := ret[0].(error) - return ret0 -} - -// StoreBlock indicates an expected call of StoreBlock. -func (mr *MockBlockStorerMockRecorder) StoreBlock(block, domainID interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoreBlock", reflect.TypeOf((*MockBlockStorer)(nil).StoreBlock), block, domainID) -} - -// MockConnection is a mock of Connection interface. -type MockConnection struct { - ctrl *gomock.Controller - recorder *MockConnectionMockRecorder -} - -// MockConnectionMockRecorder is the mock recorder for MockConnection. -type MockConnectionMockRecorder struct { - mock *MockConnection -} - -// NewMockConnection creates a new mock instance. -func NewMockConnection(ctrl *gomock.Controller) *MockConnection { - mock := &MockConnection{ctrl: ctrl} - mock.recorder = &MockConnectionMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockConnection) EXPECT() *MockConnectionMockRecorder { - return m.recorder -} - -// GetBestBlockHash mocks base method. -func (m *MockConnection) GetBestBlockHash() (*chainhash.Hash, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBestBlockHash") - ret0, _ := ret[0].(*chainhash.Hash) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBestBlockHash indicates an expected call of GetBestBlockHash. -func (mr *MockConnectionMockRecorder) GetBestBlockHash() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBestBlockHash", reflect.TypeOf((*MockConnection)(nil).GetBestBlockHash)) -} - -// GetBlockHash mocks base method. -func (m *MockConnection) GetBlockHash(arg0 int64) (*chainhash.Hash, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlockHash", arg0) - ret0, _ := ret[0].(*chainhash.Hash) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlockHash indicates an expected call of GetBlockHash. -func (mr *MockConnectionMockRecorder) GetBlockHash(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlockHash", reflect.TypeOf((*MockConnection)(nil).GetBlockHash), arg0) -} - -// GetBlockVerboseTx mocks base method. -func (m *MockConnection) GetBlockVerboseTx(arg0 *chainhash.Hash) (*btcjson.GetBlockVerboseTxResult, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlockVerboseTx", arg0) - ret0, _ := ret[0].(*btcjson.GetBlockVerboseTxResult) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlockVerboseTx indicates an expected call of GetBlockVerboseTx. -func (mr *MockConnectionMockRecorder) GetBlockVerboseTx(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlockVerboseTx", reflect.TypeOf((*MockConnection)(nil).GetBlockVerboseTx), arg0) -} - -// GetRawTransactionVerbose mocks base method. -func (m *MockConnection) GetRawTransactionVerbose(arg0 *chainhash.Hash) (*btcjson.TxRawResult, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetRawTransactionVerbose", arg0) - ret0, _ := ret[0].(*btcjson.TxRawResult) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetRawTransactionVerbose indicates an expected call of GetRawTransactionVerbose. -func (mr *MockConnectionMockRecorder) GetRawTransactionVerbose(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRawTransactionVerbose", reflect.TypeOf((*MockConnection)(nil).GetRawTransactionVerbose), arg0) -} diff --git a/chains/btc/listener/util.go b/chains/btc/listener/util.go deleted file mode 100644 index d41a5146..00000000 --- a/chains/btc/listener/util.go +++ /dev/null @@ -1,65 +0,0 @@ -package listener - -import ( - "encoding/hex" - "math/big" - - "github.com/ChainSafe/sygma-relayer/chains/btc/config" - "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcd/btcutil" -) - -const ( - WitnessV1Taproot = "witness_v1_taproot" - OP_RETURN = "nulldata" -) - -func DecodeDepositEvent(evt btcjson.TxRawResult, resource config.Resource, feeAddress btcutil.Address) (Deposit, bool, error) { - amount := big.NewInt(0) - feeAmount := big.NewInt(0) - - isBridgeDeposit := false - sender := "" - data := "" - resourceID := [32]byte{} - for _, vout := range evt.Vout { - // read the OP_RETURN data - if vout.ScriptPubKey.Type == OP_RETURN { - opReturnData, err := hex.DecodeString(vout.ScriptPubKey.Hex) - if err != nil { - return Deposit{}, true, err - } - // Extract OP_RETURN data (excluding OP_RETURN prefix) - data = string(opReturnData[2:]) - } - - if resource.Address.String() == vout.ScriptPubKey.Address { - isBridgeDeposit = true - resourceID = resource.ResourceID - if vout.ScriptPubKey.Type == WitnessV1Taproot { - amount.Add(amount, big.NewInt(int64(vout.Value*1e8))) - } - } - - if feeAddress.String() == vout.ScriptPubKey.Address { - feeAmount.Add(feeAmount, big.NewInt(int64(vout.Value*1e8))) - } - } - - if !isBridgeDeposit || (feeAmount.Cmp(resource.FeeAmount) == -1) { - return Deposit{}, false, nil - } - - return Deposit{ - ResourceID: resourceID, - SenderAddress: sender, - Amount: amount, - Data: data, - }, true, nil -} - -func SliceTo32Bytes(in []byte) [32]byte { - var res [32]byte - copy(res[:], in) - return res -} diff --git a/chains/btc/listener/util_test.go b/chains/btc/listener/util_test.go deleted file mode 100644 index 4dd12ed0..00000000 --- a/chains/btc/listener/util_test.go +++ /dev/null @@ -1,208 +0,0 @@ -package listener_test - -import ( - "math/big" - "testing" - - "github.com/ChainSafe/sygma-relayer/chains/btc/config" - "github.com/ChainSafe/sygma-relayer/chains/btc/listener" - mock_listener "github.com/ChainSafe/sygma-relayer/chains/btc/listener/mock" - "github.com/btcsuite/btcd/btcjson" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/suite" -) - -type DecodeEventsSuite struct { - suite.Suite - mockConn *mock_listener.MockConnection - resource config.Resource - feeAddress btcutil.Address -} - -func TestRunDecodeDepositEventsSuite(t *testing.T) { - suite.Run(t, new(DecodeEventsSuite)) -} - -func (s *DecodeEventsSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - address, _ := btcutil.DecodeAddress("tb1qln69zuhdunc9stwfh6t7adexxrcr04ppy6thgm", &chaincfg.TestNet3Params) - s.resource = config.Resource{Address: address, ResourceID: [32]byte{}, FeeAmount: big.NewInt(100000000)} - s.feeAddress, _ = btcutil.DecodeAddress("tb1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2slafjvv", &chaincfg.TestNet3Params) - s.mockConn = mock_listener.NewMockConnection(ctrl) -} - -func (s *DecodeEventsSuite) Test_DecodeDepositEvent_ErrorDecodingOPRETURNData() { - d1 := btcjson.TxRawResult{ - Vin: []btcjson.Vin{ - - { - Txid: "00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc", - }, - }, - Vout: []btcjson.Vout{ - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "nulldata", - Hex: "InvalidCharć", - }, - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "tb1qln69zuhdunc9stwfh6t7adexxrcr04ppy6thgm", - }, - Value: float64(0.00019), - }, - }, - } - - deposit, isDeposit, err := listener.DecodeDepositEvent(d1, s.resource, s.feeAddress) - s.Equal(isDeposit, true) - s.NotNil(err) - s.Equal(deposit, listener.Deposit{}) -} - -func (s *DecodeEventsSuite) Test_DecodeDepositEvent() { - d1 := btcjson.TxRawResult{ - Vin: []btcjson.Vin{ - - { - Txid: "00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc", - }, - }, - Vout: []btcjson.Vout{ - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "nulldata", - Hex: "6a2c3078653966323341383238393736343238303639376130336143303637393565413932613137306534325f31", - }, - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "tb1qln69zuhdunc9stwfh6t7adexxrcr04ppy6thgm", - }, - Value: float64(0.00019), - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "tb1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2slafjvv", - }, - Value: float64(1), - }, - }, - } - deposit, isDeposit, err := listener.DecodeDepositEvent(d1, s.resource, s.feeAddress) - s.Equal(isDeposit, true) - s.Nil(err) - s.Equal(deposit, listener.Deposit{ - ResourceID: [32]byte{}, - Amount: big.NewInt(int64(d1.Vout[1].Value * 1e8)), - Data: "0xe9f23A8289764280697a03aC06795eA92a170e42_1", - }) -} - -func (s *DecodeEventsSuite) Test_DecodeDepositEvent_FeeNotSent() { - d1 := btcjson.TxRawResult{ - Vin: []btcjson.Vin{ - { - Txid: "00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc", - }, - }, - Vout: []btcjson.Vout{ - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "nulldata", - Hex: "6a2c3078653966323341383238393736343238303639376130336143303637393565413932613137306534325f31", - }, - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "tb1qln69zuhdunc9stwfh6t7adexxrcr04ppy6thgm", - }, - Value: float64(0.00019), - }, - }, - } - deposit, isDeposit, err := listener.DecodeDepositEvent(d1, s.resource, s.feeAddress) - s.Equal(isDeposit, false) - s.Nil(err) - s.Equal(deposit, listener.Deposit{}) -} - -func (s *DecodeEventsSuite) Test_DecodeDepositEvent_NotEnoughFeeSent() { - d1 := btcjson.TxRawResult{ - Vin: []btcjson.Vin{ - { - Txid: "00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc", - }, - }, - Vout: []btcjson.Vout{ - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "nulldata", - Hex: "6a2c3078653966323341383238393736343238303639376130336143303637393565413932613137306534325f31", - }, - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "tb1qln69zuhdunc9stwfh6t7adexxrcr04ppy6thgm", - }, - Value: float64(0.00019), - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "tb1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2slafjvv", - }, - Value: float64(0.9), - }, - }, - } - deposit, isDeposit, err := listener.DecodeDepositEvent(d1, s.resource, s.feeAddress) - s.Equal(isDeposit, false) - s.Nil(err) - s.Equal(deposit, listener.Deposit{}) -} - -func (s *DecodeEventsSuite) Test_DecodeDepositEvent_NotBridgeDepositTx() { - d1 := btcjson.TxRawResult{ - Vin: []btcjson.Vin{ - - { - Txid: "00000000000000000008bba5a6ff31fdb9bb1d4147905b5b3c47a07a07235bfc", - }, - }, - Vout: []btcjson.Vout{ - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "nulldata", - Hex: "6a2c3078653966323341383238393736343238303639376130336143303637393565413932613137306534325f31", - }, - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "NotBridgeAddress", - }, - Value: float64(0.00019), - }, - { - ScriptPubKey: btcjson.ScriptPubKeyResult{ - Type: "witness_v1_taproot", - Address: "tb1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2slafjvv", - }, - Value: float64(1), - }, - }, - } - deposit, isDeposit, err := listener.DecodeDepositEvent(d1, s.resource, s.feeAddress) - s.Equal(isDeposit, false) - s.Nil(err) - s.Equal(deposit, listener.Deposit{}) -} diff --git a/chains/btc/mempool/mempool.go b/chains/btc/mempool/mempool.go deleted file mode 100644 index 814bfeb0..00000000 --- a/chains/btc/mempool/mempool.go +++ /dev/null @@ -1,88 +0,0 @@ -package mempool - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "sort" -) - -type Status struct { - Confirmed bool - BlockHeight uint64 `json:"block_height"` - BlockHash string `json:"block_hash"` - BlockTime uint64 `json:"block_time"` -} - -type Utxo struct { - TxID string `json:"txid"` - Vout uint32 `json:"vout"` - Value uint64 `json:"value"` - Status Status `json:"status"` -} - -type Fee struct { - FastestFee uint64 - HalfHourFee uint64 - MinimumFee uint64 - EconomyFee uint64 - HourFee uint64 -} - -type MempoolAPI struct { - url string -} - -func NewMempoolAPI(url string) *MempoolAPI { - return &MempoolAPI{ - url: url, - } -} - -func (a *MempoolAPI) RecommendedFee() (*Fee, error) { - resp, err := http.Get(fmt.Sprintf("%s/api/v1/fees/recommended", a.url)) - if err != nil { - return nil, err - } - - var fee *Fee - defer resp.Body.Close() - data, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - err = json.Unmarshal(data, &fee) - if err != nil { - return nil, err - } - - return fee, nil -} - -func (a *MempoolAPI) Utxos(address string) ([]Utxo, error) { - resp, err := http.Get(fmt.Sprintf("%s/api/address/%s/utxo", a.url, address)) - if err != nil { - return nil, err - } - - var utxos []Utxo - defer resp.Body.Close() - data, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - err = json.Unmarshal(data, &utxos) - if err != nil { - return nil, err - } - sort.Slice(utxos, func(i int, j int) bool { - if utxos[i].Status.BlockTime == utxos[j].Status.BlockTime { - return utxos[i].TxID < utxos[j].TxID - } else { - return utxos[i].Status.BlockTime < utxos[j].Status.BlockTime - } - }) - - return utxos, nil -} diff --git a/chains/btc/mempool/mempool_test.go b/chains/btc/mempool/mempool_test.go deleted file mode 100644 index 20c068b1..00000000 --- a/chains/btc/mempool/mempool_test.go +++ /dev/null @@ -1,106 +0,0 @@ -package mempool_test - -import ( - "net/http" - "net/http/httptest" - "os" - "testing" - - "github.com/ChainSafe/sygma-relayer/chains/btc/mempool" - "github.com/stretchr/testify/suite" -) - -func jsonFileToBytes(filename string) []byte { - file, _ := os.ReadFile(filename) - return file -} - -type MempoolTestSuite struct { - suite.Suite - mempoolAPI *mempool.MempoolAPI - server *httptest.Server -} - -func TestMempoolTestSuite(t *testing.T) { - suite.Run(t, new(MempoolTestSuite)) -} - -func (s *MempoolTestSuite) SetupTest() { - s.server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path == "/api/address/testaddress/utxo" { - w.WriteHeader(http.StatusOK) - _, _ = w.Write(jsonFileToBytes("./test-data/successful-utxo.json")) - } else if r.URL.Path == "/api/v1/fees/recommended" { - w.WriteHeader(http.StatusOK) - _, _ = w.Write(jsonFileToBytes("./test-data/successful-fee.json")) - } else { - w.WriteHeader(http.StatusNotFound) - _, _ = w.Write([]byte("{\"status\":\"Not found\"}")) - } - })) - s.mempoolAPI = mempool.NewMempoolAPI(s.server.URL) -} -func (s *MempoolTestSuite) TeardownTest() { - s.server.Close() -} - -func (s *MempoolTestSuite) Test_Utxo_SuccessfulFetch() { - utxos, err := s.mempoolAPI.Utxos("testaddress") - - s.Nil(err) - s.Equal(utxos, []mempool.Utxo{ - { - TxID: "28154e2008912d27978225c096c22ffe2ea65e1d55bf440ee41c21f9489c7fe1", - Vout: 0, - Value: 11197, - Status: mempool.Status{ - Confirmed: true, - BlockHeight: 2812826, - BlockHash: "000000000000001a01d4058773384f2c23aed5a7e5ede252f99e290fa58324a3", - BlockTime: 1715083122, - }, - }, - { - TxID: "28154e2008912d27978225c096c22ffe2ea65e1d55bf440ee41c21f9489c7fe2", - Vout: 0, - Value: 11197, - Status: mempool.Status{ - Confirmed: true, - BlockHeight: 2812826, - BlockHash: "000000000000001a01d4058773384f2c23aed5a7e5ede252f99e290fa58324a3", - BlockTime: 1715083122, - }, - }, - { - TxID: "28154e2008912d27978225c096c22ffe2ea65e1d55bf440ee41c21f9489c7fe9", - Vout: 0, - Value: 11198, - Status: mempool.Status{ - Confirmed: true, - BlockHeight: 2812827, - BlockHash: "000000000000001a01d4058773384f2c23aed5a7e5ede252f99e290fa58324a5", - BlockTime: 1715083123, - }, - }, - }) -} - -func (s *MempoolTestSuite) Test_Utxo_NotFound() { - _, err := s.mempoolAPI.Utxos("invalid") - - s.NotNil(err) -} - -func (s *MempoolTestSuite) Test_RecommendedFee_SuccessfulFetch() { - recommendedFee, err := s.mempoolAPI.RecommendedFee() - - s.Nil(err) - s.Equal(recommendedFee, &mempool.Fee{ - FastestFee: 1, - HalfHourFee: 2, - HourFee: 3, - EconomyFee: 4, - MinimumFee: 5, - }) - -} diff --git a/chains/btc/mempool/test-data/successful-fee.json b/chains/btc/mempool/test-data/successful-fee.json deleted file mode 100644 index 6eb1d675..00000000 --- a/chains/btc/mempool/test-data/successful-fee.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "fastestFee": 1, - "halfHourFee": 2, - "hourFee": 3, - "economyFee": 4, - "minimumFee": 5 -} \ No newline at end of file diff --git a/chains/btc/mempool/test-data/successful-utxo.json b/chains/btc/mempool/test-data/successful-utxo.json deleted file mode 100644 index d47aceb3..00000000 --- a/chains/btc/mempool/test-data/successful-utxo.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - {"txid":"28154e2008912d27978225c096c22ffe2ea65e1d55bf440ee41c21f9489c7fe9","vout":0,"status":{"confirmed":true,"block_height":2812827,"block_hash":"000000000000001a01d4058773384f2c23aed5a7e5ede252f99e290fa58324a5","block_time":1715083123},"value":11198}, - {"txid":"28154e2008912d27978225c096c22ffe2ea65e1d55bf440ee41c21f9489c7fe2","vout":0,"status":{"confirmed":true,"block_height":2812826,"block_hash":"000000000000001a01d4058773384f2c23aed5a7e5ede252f99e290fa58324a3","block_time":1715083122},"value":11197}, - {"txid":"28154e2008912d27978225c096c22ffe2ea65e1d55bf440ee41c21f9489c7fe1","vout":0,"status":{"confirmed":true,"block_height":2812826,"block_hash":"000000000000001a01d4058773384f2c23aed5a7e5ede252f99e290fa58324a3","block_time":1715083122},"value":11197} -] \ No newline at end of file diff --git a/chains/btc/uploader/ipfs.go b/chains/btc/uploader/ipfs.go deleted file mode 100644 index 20737e19..00000000 --- a/chains/btc/uploader/ipfs.go +++ /dev/null @@ -1,103 +0,0 @@ -package uploader - -import ( - "bytes" - "encoding/json" - "errors" - "io" - "mime/multipart" - "net/http" - "time" - - "github.com/rs/zerolog/log" - - "github.com/ChainSafe/sygma-relayer/config/relayer" - "github.com/cenkalti/backoff/v4" -) - -type Uploader interface { - Upload(proposals []map[string]interface{}) (string, error) -} - -type IPFSUploader struct { - config relayer.UploaderConfig -} - -func NewIPFSUploader(config relayer.UploaderConfig) *IPFSUploader { - return &IPFSUploader{config: config} -} - -type IPFSResponse struct { - IpfsHash string `json:"IpfsHash"` -} - -func (i *IPFSUploader) Upload(dataToUpload []map[string]interface{}) (string, error) { - jsonData, err := json.Marshal(dataToUpload) - if err != nil { - return "", err - } - - body := new(bytes.Buffer) - writer := multipart.NewWriter(body) - part, err := writer.CreateFormFile("file", "metadata.json") - if err != nil { - return "", err - } - _, err = part.Write(jsonData) - if err != nil { - return "", err - } - writer.Close() - - req, err := http.NewRequest("POST", i.config.URL, body) - if err != nil { - return "", err - } - - req.Header.Add("Authorization", "Bearer "+i.config.AuthToken) - req.Header.Add("Content-Type", writer.FormDataContentType()) - - var ipfsResponse IPFSResponse - - // Define the operation to be retried - operation := func() error { - return i.performRequest(req, &ipfsResponse) - } - expBackoff := backoff.NewExponentialBackOff() - expBackoff.MaxElapsedTime = i.config.MaxElapsedTime - - notify := func(err error, duration time.Duration) { - log.Warn().Err(err).Msg("Unable to upload metadata to ipfs") - } - - err = backoff.RetryNotify(operation, backoff.WithMaxRetries(expBackoff, i.config.MaxRetries), notify) - if err != nil { - return "", err - } - - return ipfsResponse.IpfsHash, nil -} - -func (i *IPFSUploader) performRequest(req *http.Request, ipfsResponse *IPFSResponse) error { - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - if resp.StatusCode != 200 { - return errors.New("received non-200 status code") - } - - respBody, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - if err := json.Unmarshal(respBody, &ipfsResponse); err != nil { - return err - } - - return nil -} diff --git a/chains/evm/calls/consts/retry.go b/chains/evm/calls/consts/retry.go deleted file mode 100644 index 6e801348..00000000 --- a/chains/evm/calls/consts/retry.go +++ /dev/null @@ -1,117 +0,0 @@ -package consts - -const RetryABI = ` -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "sourceDomainID", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint8", - "name": "destinationDomainID", - "type": "uint8" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "blockHeight", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "resourceID", - "type": "bytes32" - } - ], - "name": "Retry", - "type": "event" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "sourceDomainID", - "type": "uint8" - }, - { - "internalType": "uint8", - "name": "destinationDomainID", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "blockHeight", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "resourceID", - "type": "bytes32" - } - ], - "name": "retry", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] -` diff --git a/chains/evm/calls/contracts/bridge/bridge.go b/chains/evm/calls/contracts/bridge/bridge.go deleted file mode 100644 index 47eab036..00000000 --- a/chains/evm/calls/contracts/bridge/bridge.go +++ /dev/null @@ -1,132 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package bridge - -import ( - "context" - "math/big" - "strconv" - "strings" - - "github.com/ChainSafe/sygma-relayer/chains" - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/consts" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/rs/zerolog/log" - - "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/contracts" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" -) - -const bridgeVersion = "3.1.0" - -type BridgeProposal struct { - OriginDomainID uint8 - ResourceID [32]byte - DepositNonce uint64 - Data []byte -} - -type ChainClient interface { - client.Client - ChainID(ctx context.Context) (*big.Int, error) -} - -type BridgeContract struct { - contracts.Contract - client ChainClient -} - -func NewBridgeContract( - client ChainClient, - bridgeContractAddress common.Address, - transactor transactor.Transactor, -) *BridgeContract { - a, _ := abi.JSON(strings.NewReader(consts.BridgeABI)) - return &BridgeContract{ - Contract: contracts.NewContract(bridgeContractAddress, a, nil, client, transactor), - client: client, - } -} - -func (c *BridgeContract) ExecuteProposal( - proposal *transfer.TransferProposal, - signature []byte, - opts transactor.TransactOptions, -) (*common.Hash, error) { - log.Debug(). - Str("depositNonce", strconv.FormatUint(proposal.Data.DepositNonce, 10)). - Str("resourceID", hexutil.Encode(proposal.Data.ResourceId[:])). - Msgf("Execute proposal") - return c.ExecuteTransaction( - "executeProposal", - opts, - proposal.Source, proposal.Data.DepositNonce, proposal.Data, proposal.Data.ResourceId, signature, - ) -} - -func (c *BridgeContract) ExecuteProposals( - proposals []*transfer.TransferProposal, - signature []byte, - opts transactor.TransactOptions, -) (*common.Hash, error) { - bridgeProposals := make([]BridgeProposal, 0) - for _, prop := range proposals { - - bridgeProposals = append(bridgeProposals, BridgeProposal{ - OriginDomainID: prop.Source, - ResourceID: prop.Data.ResourceId, - DepositNonce: prop.Data.DepositNonce, - Data: prop.Data.Data, - }) - } - return c.ExecuteTransaction( - "executeProposals", - opts, - bridgeProposals, - signature, - ) -} - -func (c *BridgeContract) ProposalsHash(proposals []*transfer.TransferProposal) ([]byte, error) { - chainID, err := c.client.ChainID(context.Background()) - if err != nil { - return []byte{}, err - } - return chains.ProposalsHash(proposals, chainID.Int64(), c.ContractAddress().Hex(), bridgeVersion) -} - -func (c *BridgeContract) IsProposalExecuted(p *transfer.TransferProposal) (bool, error) { - - log.Debug(). - Str("depositNonce", strconv.FormatUint(p.Data.DepositNonce, 10)). - Str("resourceID", hexutil.Encode(p.Data.ResourceId[:])). - Msg("Getting is proposal executed") - res, err := c.CallContract("isProposalExecuted", p.Source, new(big.Int).SetUint64(p.Data.DepositNonce)) - if err != nil { - return false, err - } - out := *abi.ConvertType(res[0], new(bool)).(*bool) - return out, nil -} - -func (c *BridgeContract) GetHandlerAddressForResourceID( - resourceID [32]byte, -) (common.Address, error) { - log.Debug().Msgf("Getting handler address for resource %s", hexutil.Encode(resourceID[:])) - res, err := c.CallContract("_resourceIDToHandlerAddress", resourceID) - if err != nil { - return common.Address{}, err - } - out := *abi.ConvertType(res[0], new(common.Address)).(*common.Address) - return out, nil -} - -func (c *BridgeContract) Retry(hash common.Hash, opts transactor.TransactOptions) (*common.Hash, error) { - log.Debug().Msgf("Retrying deposit from transaction: %s", hash.Hex()) - return c.ExecuteTransaction("retry", opts, hash.Hex()) -} diff --git a/chains/evm/calls/events/events.go b/chains/evm/calls/events/events.go index 199203ef..85962764 100644 --- a/chains/evm/calls/events/events.go +++ b/chains/evm/calls/events/events.go @@ -4,9 +4,6 @@ package events import ( - "math/big" - "time" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" ) @@ -18,15 +15,8 @@ func (es EventSig) GetTopic() common.Hash { } const ( - DepositSig EventSig = "Deposit(uint8,bytes32,uint64,address,bytes,bytes)" - StartKeygenSig EventSig = "StartKeygen()" - StartFrostKeygenSig EventSig = "StartedFROSTKeygen()" - KeyRefreshSig EventSig = "KeyRefresh(string)" - ProposalExecutionSig EventSig = "ProposalExecution(uint8,uint64,bytes32,bytes)" - FeeChangedSig EventSig = "FeeChanged(uint256)" - RetryV2Sig EventSig = "Retry(uint8,uint8,uint256,bytes32)" - RetryV1Sig EventSig = "Retry(string)" - FeeHandlerChanged EventSig = "FeeHandlerChanged(address)" + StartKeygenSig EventSig = "StartKeygen()" + KeyRefreshSig EventSig = "KeyRefresh(string)" ) // Refresh struct holds key refresh event data @@ -34,33 +24,3 @@ type Refresh struct { // SHA1 hash of topology file Hash string } - -type RetryV1Event struct { - TxHash string -} - -type RetryV2Event struct { - SourceDomainID uint8 - DestinationDomainID uint8 - BlockHeight *big.Int - ResourceID [32]byte -} - -type Deposit struct { - // ID of chain deposit will be bridged to - DestinationDomainID uint8 - // ResourceID used to find address of handler to be used for deposit - ResourceID [32]byte - // Nonce of deposit - DepositNonce uint64 - // Address of sender (msg.sender: user) - SenderAddress common.Address - // Additional data to be passed to specified handler - Data []byte - // ERC20Handler: responds with empty data - // ERC721Handler: responds with deposited token metadata acquired by calling a tokenURI method in the token contract - // GenericHandler: responds with the raw bytes returned from the call to the target contract - HandlerResponse []byte - // Timestamp is the timestamp of the block that the deposit event is in - Timestamp time.Time -} diff --git a/chains/evm/calls/events/listener.go b/chains/evm/calls/events/listener.go index 04e0205e..e3e0f21e 100644 --- a/chains/evm/calls/events/listener.go +++ b/chains/evm/calls/events/listener.go @@ -5,17 +5,15 @@ package events import ( "context" - "fmt" "math/big" "strings" - "time" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" ethTypes "github.com/ethereum/go-ethereum/core/types" "github.com/rs/zerolog/log" - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/consts" + "github.com/sprintertech/sprinter-signing/chains/evm/calls/consts" ) type ChainClient interface { @@ -26,142 +24,18 @@ type ChainClient interface { } type Listener struct { - client ChainClient - abi abi.ABI - retryAbi abi.ABI + client ChainClient + abi abi.ABI } func NewListener(client ChainClient) *Listener { - retryAbi, _ := abi.JSON(strings.NewReader(consts.RetryABI)) abi, _ := abi.JSON(strings.NewReader(consts.BridgeABI)) return &Listener{ - client: client, - abi: abi, - retryAbi: retryAbi, + client: client, + abi: abi, } } -func (l *Listener) FetchDeposits(ctx context.Context, contractAddress common.Address, startBlock *big.Int, endBlock *big.Int) ([]*Deposit, error) { - logs, err := l.client.FetchEventLogs(ctx, contractAddress, string(DepositSig), startBlock, endBlock) - if err != nil { - return nil, err - } - deposits := make([]*Deposit, 0) - - for _, dl := range logs { - d, err := l.parseDeposit(ctx, dl) - if err != nil { - log.Error().Msgf("failed unpacking deposit event log: %v", err) - continue - } - - log.Debug().Msgf("Found deposit log in block: %d, TxHash: %s, contractAddress: %s, sender: %s", dl.BlockNumber, dl.TxHash, dl.Address, d.SenderAddress) - deposits = append(deposits, d) - } - - return deposits, nil -} - -func (l *Listener) parseDeposit(ctx context.Context, dl ethTypes.Log) (*Deposit, error) { - var d Deposit - err := l.abi.UnpackIntoInterface(&d, "Deposit", dl.Data) - if err != nil { - return &Deposit{}, err - } - - d.SenderAddress = common.BytesToAddress(dl.Topics[1].Bytes()) - block, err := l.client.BlockByNumber(ctx, new(big.Int).SetUint64(dl.BlockNumber)) - if err == nil { - d.Timestamp = time.Unix(int64(block.Time()), 0) - } else { - log.Warn().Msgf("Failed fetching block with number %d because of: %+v", dl.BlockNumber, err) - d.Timestamp = time.Now() - } - - return &d, nil -} - -func (l *Listener) FetchRetryDepositEvents(event RetryV1Event, bridgeAddress common.Address, blockConfirmations *big.Int) ([]Deposit, error) { - depositEvents := make([]Deposit, 0) - retryDepositTxHash := common.HexToHash(event.TxHash) - receipt, err := l.client.WaitAndReturnTxReceipt(retryDepositTxHash) - if err != nil { - return depositEvents, fmt.Errorf( - "unable to fetch logs for retried deposit %s, because of: %+v", retryDepositTxHash.Hex(), err, - ) - } - latestBlock, err := l.client.LatestBlock() - if err != nil { - return depositEvents, err - } - if latestBlock.Cmp(receipt.BlockNumber.Add(receipt.BlockNumber, blockConfirmations)) != 1 { - return depositEvents, fmt.Errorf( - "latest block %s higher than receipt block number + block confirmations %s", - latestBlock, - receipt.BlockNumber.Add(receipt.BlockNumber, blockConfirmations), - ) - } - - for _, lg := range receipt.Logs { - if lg.Address != bridgeAddress { - continue - } - - d, err := l.parseDeposit(context.Background(), *lg) - if err != nil { - log.Error().Msgf("failed unpacking deposit event log: %v", err) - continue - } - depositEvents = append(depositEvents, *d) - } - - return depositEvents, nil -} - -func (l *Listener) FetchRetryV1Events(ctx context.Context, contractAddress common.Address, startBlock *big.Int, endBlock *big.Int) ([]RetryV1Event, error) { - logs, err := l.client.FetchEventLogs(ctx, contractAddress, string(RetryV1Sig), startBlock, endBlock) - if err != nil { - return nil, err - } - - var retryEvents []RetryV1Event - for _, dl := range logs { - var event RetryV1Event - err = l.abi.UnpackIntoInterface(&event, "Retry", dl.Data) - if err != nil { - log.Error().Msgf( - "failed unpacking retry event with txhash %s, because of: %+v", dl.TxHash.Hex(), err, - ) - continue - } - retryEvents = append(retryEvents, event) - } - - return retryEvents, nil -} - -func (l *Listener) FetchRetryV2Events(ctx context.Context, contractAddress common.Address, startBlock *big.Int, endBlock *big.Int) ([]RetryV2Event, error) { - logs, err := l.client.FetchEventLogs(ctx, contractAddress, string(RetryV2Sig), startBlock, endBlock) - if err != nil { - return nil, err - } - - var retryEvents []RetryV2Event - for _, dl := range logs { - var event RetryV2Event - err = l.retryAbi.UnpackIntoInterface(&event, "Retry", dl.Data) - if err != nil { - log.Error().Msgf( - "failed unpacking retry event with txhash %s, because of: %+v", dl.TxHash.Hex(), err, - ) - continue - } - retryEvents = append(retryEvents, event) - } - - return retryEvents, nil -} - func (l *Listener) FetchKeygenEvents(ctx context.Context, contractAddress common.Address, startBlock *big.Int, endBlock *big.Int) ([]ethTypes.Log, error) { logs, err := l.client.FetchEventLogs(ctx, contractAddress, string(StartKeygenSig), startBlock, endBlock) if err != nil { @@ -171,15 +45,6 @@ func (l *Listener) FetchKeygenEvents(ctx context.Context, contractAddress common return logs, nil } -func (l *Listener) FetchFrostKeygenEvents(ctx context.Context, contractAddress common.Address, startBlock *big.Int, endBlock *big.Int) ([]ethTypes.Log, error) { - logs, err := l.client.FetchEventLogs(ctx, contractAddress, string(StartFrostKeygenSig), startBlock, endBlock) - if err != nil { - return nil, err - } - - return logs, nil -} - func (l *Listener) FetchRefreshEvents(ctx context.Context, contractAddress common.Address, startBlock *big.Int, endBlock *big.Int) ([]*Refresh, error) { logs, err := l.client.FetchEventLogs(ctx, contractAddress, string(KeyRefreshSig), startBlock, endBlock) if err != nil { diff --git a/chains/evm/calls/events/listener_test.go b/chains/evm/calls/events/listener_test.go deleted file mode 100644 index c6686f58..00000000 --- a/chains/evm/calls/events/listener_test.go +++ /dev/null @@ -1,137 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package events_test - -import ( - "fmt" - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/suite" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - mock_listener "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events/mock" -) - -type ListenerTestSuite struct { - suite.Suite - mockClient *mock_listener.MockChainClient - listener *events.Listener -} - -func TestRunListenerTestSuite(t *testing.T) { - suite.Run(t, new(ListenerTestSuite)) -} - -func (s *ListenerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.mockClient = mock_listener.NewMockChainClient(ctrl) - s.listener = events.NewListener(s.mockClient) -} - -func (s *ListenerTestSuite) Test_FetchRetryDepositEvents_FetchingTxFails() { - s.mockClient.EXPECT().WaitAndReturnTxReceipt(common.HexToHash("0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c")).Return(nil, fmt.Errorf("error")) - - _, err := s.listener.FetchRetryDepositEvents(events.RetryV1Event{TxHash: "0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c"}, common.Address{}, big.NewInt(5)) - - s.NotNil(err) -} - -func (s *ListenerTestSuite) Test_FetchRetryDepositEvents_EventTooNew() { - s.mockClient.EXPECT().WaitAndReturnTxReceipt(common.HexToHash("0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c")).Return(&types.Receipt{ - BlockNumber: big.NewInt(14), - }, nil) - s.mockClient.EXPECT().LatestBlock().Return(big.NewInt(10), nil) - - _, err := s.listener.FetchRetryDepositEvents( - events.RetryV1Event{TxHash: "0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c"}, - common.HexToAddress("0x5798e01f4b1d8f6a5d91167414f3a915d021bc4a"), - big.NewInt(5), - ) - - s.NotNil(err) -} - -func (s *ListenerTestSuite) Test_FetchRetryDepositEvents_NoDepositEvent() { - s.mockClient.EXPECT().WaitAndReturnTxReceipt(common.HexToHash("0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c")).Return(&types.Receipt{ - BlockNumber: big.NewInt(14), - }, nil) - s.mockClient.EXPECT().LatestBlock().Return(big.NewInt(20), nil) - - deposits, err := s.listener.FetchRetryDepositEvents( - events.RetryV1Event{TxHash: "0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c"}, - common.HexToAddress("0x5798e01f4b1d8f6a5d91167414f3a915d021bc4a"), - big.NewInt(5), - ) - - s.Nil(err) - s.Equal(deposits, []events.Deposit{}) -} - -func (s *ListenerTestSuite) Test_FetchRetryDepositEvents_NoMatchingEvent() { - s.mockClient.EXPECT().WaitAndReturnTxReceipt(common.HexToHash("0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c")).Return(&types.Receipt{ - BlockNumber: big.NewInt(14), - Logs: []*types.Log{ - { - Address: common.HexToAddress("0x1ec6b294902d42fee964d29fa962e5976e71e67d"), - Data: []byte{}, - }, - { - Address: common.HexToAddress("0x5798e01f4b1d8f6a5d91167414f3a915d021bc4a"), - Data: []byte{}, - }, - }, - }, nil) - s.mockClient.EXPECT().LatestBlock().Return(big.NewInt(20), nil) - - deposits, err := s.listener.FetchRetryDepositEvents( - events.RetryV1Event{TxHash: "0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c"}, - common.HexToAddress("0x5798e01f4b1d8f6a5d91167414f3a915d021bc4a"), - big.NewInt(5), - ) - - s.Nil(err) - s.Equal(deposits, []events.Deposit{}) -} - -func (s *ListenerTestSuite) Test_FetchRetryDepositEvents_ValidEvent() { - depositEvent := common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000000000148e0a907331554af72563bd8d43051c2e64be5d350102000000000000000000000000000000000000000000000000000000000000000000000000000000000000") - s.mockClient.EXPECT().WaitAndReturnTxReceipt(common.HexToHash("0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c")).Return(&types.Receipt{ - BlockNumber: big.NewInt(14), - Logs: []*types.Log{ - { - Address: common.HexToAddress("0x1ec6b294902d42fee964d29fa962e5976e71e67d"), - Data: depositEvent, - Topics: []common.Hash{ - {}, - {}, - }, - BlockNumber: 14, - }, - { - Address: common.HexToAddress("0x5798e01f4b1d8f6a5d91167414f3a915d021bc4a"), - Data: depositEvent, - Topics: []common.Hash{ - {}, - {}, - }, - BlockNumber: 14, - }, - }, - }, nil) - s.mockClient.EXPECT().LatestBlock().Return(big.NewInt(20), nil) - s.mockClient.EXPECT().BlockByNumber(gomock.Any(), big.NewInt(14)).Return(nil, fmt.Errorf("error")) - - deposits, err := s.listener.FetchRetryDepositEvents( - events.RetryV1Event{TxHash: "0xf25ed4a14bf7ad20354b46fe38d7d4525f2ea3042db9a9954ef8d73c558b500c"}, - common.HexToAddress("0x5798e01f4b1d8f6a5d91167414f3a915d021bc4a"), - big.NewInt(5), - ) - - s.Nil(err) - s.Equal(deposits[0].DestinationDomainID, uint8(2)) -} diff --git a/chains/evm/config.go b/chains/evm/config.go index 139e178b..72c5510d 100644 --- a/chains/evm/config.go +++ b/chains/evm/config.go @@ -9,11 +9,9 @@ import ( "time" "github.com/creasty/defaults" - "github.com/ethereum/go-ethereum/crypto" "github.com/mitchellh/mapstructure" - "github.com/ChainSafe/sygma-relayer/config/chain" - "github.com/sygmaprotocol/sygma-core/crypto/secp256k1" + "github.com/sprintertech/sprinter-signing/config/chain" ) type HandlerConfig struct { @@ -22,70 +20,27 @@ type HandlerConfig struct { } type EVMConfig struct { - GeneralChainConfig chain.GeneralChainConfig - Bridge string - Retry string - FrostKeygen string - Handlers []HandlerConfig - MaxGasPrice *big.Int - GasMultiplier *big.Float - GasLimit *big.Int - TransferGas uint64 - GasIncreasePercentage *big.Int - StartBlock *big.Int - BlockConfirmations *big.Int - BlockInterval *big.Int - BlockRetryInterval time.Duration -} - -func (c *EVMConfig) String() string { - privateKey, _ := crypto.HexToECDSA(c.GeneralChainConfig.Key) - kp := secp256k1.NewKeypair(*privateKey) - return fmt.Sprintf(`Name: '%s', Id: '%d', Type: '%s', BlockstorePath: '%s', FreshStart: '%t', LatestBlock: '%t', Key address: '%s', Bridge: '%s', Retry: '%s', Handlers: %+v, MaxGasPrice: '%s', GasMultiplier: '%s', GasLimit: '%s', TransferGas: '%d', StartBlock: '%s', BlockConfirmations: '%s', BlockInterval: '%s', BlockRetryInterval: '%s'`, - c.GeneralChainConfig.Name, - *c.GeneralChainConfig.Id, - c.GeneralChainConfig.Type, - c.GeneralChainConfig.BlockstorePath, - c.GeneralChainConfig.FreshStart, - c.GeneralChainConfig.LatestBlock, - kp.Address(), - c.Bridge, - c.Retry, - c.Handlers, - c.MaxGasPrice, - c.GasMultiplier, - c.GasLimit, - c.TransferGas, - c.StartBlock, - c.BlockConfirmations, - c.BlockInterval, - c.BlockRetryInterval, - ) + GeneralChainConfig chain.GeneralChainConfig + Admin string + BlockConfirmations *big.Int + BlockInterval *big.Int + BlockRetryInterval time.Duration } type RawEVMConfig struct { chain.GeneralChainConfig `mapstructure:",squash"` - Bridge string `mapstructure:"bridge"` - Retry string `mapstructure:"retry"` - FrostKeygen string `mapstructure:"frostKeygen"` - Handlers []HandlerConfig `mapstrcture:"handlers"` - MaxGasPrice int64 `mapstructure:"maxGasPrice" default:"500000000000"` - GasMultiplier float64 `mapstructure:"gasMultiplier" default:"1"` - GasIncreasePercentage int64 `mapstructure:"gasIncreasePercentage" default:"15"` - GasLimit int64 `mapstructure:"gasLimit" default:"15000000"` - TransferGas uint64 `mapstructure:"transferGas" default:"250000"` - StartBlock int64 `mapstructure:"startBlock"` - BlockConfirmations int64 `mapstructure:"blockConfirmations" default:"10"` - BlockInterval int64 `mapstructure:"blockInterval" default:"5"` - BlockRetryInterval uint64 `mapstructure:"blockRetryInterval" default:"5"` + Admin string `mapstructure:"admin"` + BlockConfirmations int64 `mapstructure:"blockConfirmations" default:"10"` + BlockInterval int64 `mapstructure:"blockInterval" default:"5"` + BlockRetryInterval uint64 `mapstructure:"blockRetryInterval" default:"5"` } func (c *RawEVMConfig) Validate() error { if err := c.GeneralChainConfig.Validate(); err != nil { return err } - if c.Bridge == "" { - return fmt.Errorf("required field chain.Bridge empty for chain %v", *c.Id) + if c.Admin == "" { + return fmt.Errorf("required field chain.Admin empty for chain %v", *c.Id) } if c.BlockConfirmations < 1 { return fmt.Errorf("blockConfirmations has to be >=1") @@ -114,20 +69,11 @@ func NewEVMConfig(chainConfig map[string]interface{}) (*EVMConfig, error) { c.GeneralChainConfig.ParseFlags() config := &EVMConfig{ - GeneralChainConfig: c.GeneralChainConfig, - Handlers: c.Handlers, - Bridge: c.Bridge, - Retry: c.Retry, - FrostKeygen: c.FrostKeygen, - BlockRetryInterval: time.Duration(c.BlockRetryInterval) * time.Second, - GasLimit: big.NewInt(c.GasLimit), - TransferGas: c.TransferGas, - MaxGasPrice: big.NewInt(c.MaxGasPrice), - GasIncreasePercentage: big.NewInt(c.GasIncreasePercentage), - GasMultiplier: big.NewFloat(c.GasMultiplier), - StartBlock: big.NewInt(c.StartBlock), - BlockConfirmations: big.NewInt(c.BlockConfirmations), - BlockInterval: big.NewInt(c.BlockInterval), + GeneralChainConfig: c.GeneralChainConfig, + Admin: c.Admin, + BlockRetryInterval: time.Duration(c.BlockRetryInterval) * time.Second, + BlockConfirmations: big.NewInt(c.BlockConfirmations), + BlockInterval: big.NewInt(c.BlockInterval), } return config, nil diff --git a/chains/evm/config_test.go b/chains/evm/config_test.go index 292c4a0b..1885dc62 100644 --- a/chains/evm/config_test.go +++ b/chains/evm/config_test.go @@ -8,8 +8,8 @@ import ( "testing" "time" - "github.com/ChainSafe/sygma-relayer/chains/evm" - "github.com/ChainSafe/sygma-relayer/config/chain" + "github.com/sprintertech/sprinter-signing/chains/evm" + "github.com/sprintertech/sprinter-signing/config/chain" "github.com/stretchr/testify/suite" ) @@ -52,7 +52,7 @@ func (s *NewEVMConfigTestSuite) Test_InvalidBlockConfirmation() { "endpoint": "ws://domain.com", "name": "evm1", "from": "address", - "bridge": "bridgeAddress", + "admin": "bridgeAddress", "blockConfirmations": -1, }) @@ -67,6 +67,7 @@ func (s *NewEVMConfigTestSuite) Test_ValidConfig() { "name": "evm1", "from": "address", "bridge": "bridgeAddress", + "admin": "adminAddress", "frostKeygen": "frostKeygen", } @@ -81,17 +82,10 @@ func (s *NewEVMConfigTestSuite) Test_ValidConfig() { Endpoint: "ws://domain.com", Id: id, }, - Bridge: "bridgeAddress", - FrostKeygen: "frostKeygen", - GasLimit: big.NewInt(15000000), - TransferGas: 250000, - MaxGasPrice: big.NewInt(500000000000), - GasMultiplier: big.NewFloat(1), - GasIncreasePercentage: big.NewInt(15), - StartBlock: big.NewInt(0), - BlockConfirmations: big.NewInt(10), - BlockInterval: big.NewInt(5), - BlockRetryInterval: time.Duration(5) * time.Second, + BlockConfirmations: big.NewInt(10), + BlockInterval: big.NewInt(5), + BlockRetryInterval: time.Duration(5) * time.Second, + Admin: "adminAddress", }) } @@ -102,6 +96,7 @@ func (s *NewEVMConfigTestSuite) Test_ValidConfigWithCustomTxParams() { "name": "evm1", "from": "address", "bridge": "bridgeAddress", + "admin": "adminAddress", "retry": "retryAddress", "frostKeygen": "frostKeygen", "handlers": []evm.HandlerConfig{ @@ -136,27 +131,9 @@ func (s *NewEVMConfigTestSuite) Test_ValidConfigWithCustomTxParams() { Endpoint: "ws://domain.com", Id: id, }, - Bridge: "bridgeAddress", - Retry: "retryAddress", - FrostKeygen: "frostKeygen", - Handlers: []evm.HandlerConfig{ - { - Type: "erc20", - Address: "address1", - }, - { - Type: "erc721", - Address: "address2", - }, - }, - GasLimit: big.NewInt(1000), - TransferGas: 300000, - MaxGasPrice: big.NewInt(1000), - GasMultiplier: big.NewFloat(1000), - GasIncreasePercentage: big.NewInt(20), - StartBlock: big.NewInt(1000), - BlockConfirmations: big.NewInt(10), - BlockInterval: big.NewInt(2), - BlockRetryInterval: time.Duration(10) * time.Second, + BlockConfirmations: big.NewInt(10), + BlockInterval: big.NewInt(2), + BlockRetryInterval: time.Duration(10) * time.Second, + Admin: "adminAddress", }) } diff --git a/chains/evm/executor/executor.go b/chains/evm/executor/executor.go deleted file mode 100644 index 5a597c96..00000000 --- a/chains/evm/executor/executor.go +++ /dev/null @@ -1,261 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package executor - -import ( - "context" - "fmt" - "math/big" - "sync" - "time" - - "github.com/binance-chain/tss-lib/common" - "github.com/sourcegraph/conc/pool" - - ethCommon "github.com/ethereum/go-ethereum/common" - "github.com/libp2p/go-libp2p/core/host" - "github.com/rs/zerolog/log" - - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/signing" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" -) - -type Batch struct { - proposals []*transfer.TransferProposal - gasLimit uint64 -} - -var ( - executionCheckPeriod = time.Minute - signingTimeout = 30 * time.Minute -) - -type BridgeContract interface { - IsProposalExecuted(p *transfer.TransferProposal) (bool, error) - ExecuteProposals(proposals []*transfer.TransferProposal, signature []byte, opts transactor.TransactOptions) (*ethCommon.Hash, error) - ProposalsHash(proposals []*transfer.TransferProposal) ([]byte, error) -} - -type Executor struct { - coordinator *tss.Coordinator - host host.Host - comm comm.Communication - fetcher signing.SaveDataFetcher - bridge BridgeContract - exitLock *sync.RWMutex - transactionMaxGas uint64 - transferGasCost uint64 -} - -func NewExecutor( - host host.Host, - comm comm.Communication, - coordinator *tss.Coordinator, - bridgeContract BridgeContract, - fetcher signing.SaveDataFetcher, - exitLock *sync.RWMutex, - transactionMaxGas uint64, - transferGasCost uint64, -) *Executor { - return &Executor{ - host: host, - comm: comm, - coordinator: coordinator, - bridge: bridgeContract, - fetcher: fetcher, - exitLock: exitLock, - transactionMaxGas: transactionMaxGas, - transferGasCost: transferGasCost, - } -} - -// Execute starts a signing process and executes proposals when signature is generated -func (e *Executor) Execute(proposals []*proposal.Proposal) error { - e.exitLock.RLock() - defer e.exitLock.RUnlock() - batches, err := e.proposalBatches(proposals) - if err != nil { - return err - } - - p := pool.New().WithErrors() - for i, batch := range batches { - if len(batch.proposals) == 0 { - continue - } - messageID := batch.proposals[0].MessageID - - b := batch - p.Go(func() error { - propHash, err := e.bridge.ProposalsHash(b.proposals) - if err != nil { - return err - } - - sessionID := fmt.Sprintf("%s-%d", messageID, i) - log.Info().Str("messageID", batch.proposals[0].MessageID).Msgf("Starting session with ID: %s", sessionID) - - msg := big.NewInt(0) - msg.SetBytes(propHash) - signing, err := signing.NewSigning( - msg, - messageID, - sessionID, - e.host, - e.comm, - e.fetcher) - if err != nil { - return err - } - - sigChn := make(chan interface{}) - executionContext, cancelExecution := context.WithCancel(context.Background()) - watchContext, cancelWatch := context.WithCancel(context.Background()) - ep := pool.New().WithErrors() - ep.Go(func() error { - err := e.coordinator.Execute(executionContext, []tss.TssProcess{signing}, sigChn) - if err != nil { - cancelWatch() - } - - return err - }) - ep.Go(func() error { return e.watchExecution(watchContext, cancelExecution, b, sigChn, sessionID, messageID) }) - return ep.Wait() - }) - } - return p.Wait() -} - -func (e *Executor) watchExecution( - ctx context.Context, - cancelExecution context.CancelFunc, - batch *Batch, - sigChn chan interface{}, - sessionID string, - messageID string) error { - ticker := time.NewTicker(executionCheckPeriod) - timeout := time.NewTicker(signingTimeout) - defer ticker.Stop() - defer timeout.Stop() - defer cancelExecution() - - for { - select { - case sigResult := <-sigChn: - { - cancelExecution() - if sigResult == nil { - continue - } - - signatureData := sigResult.(*common.SignatureData) - hash, err := e.executeBatch(batch, signatureData) - if err != nil { - _ = e.comm.Broadcast(e.host.Peerstore().Peers(), []byte{}, comm.TssFailMsg, sessionID) - return err - } - - log.Info().Str("messageID", messageID).Msgf("Sent proposals execution with hash: %s", hash) - } - case <-ticker.C: - { - if !e.areProposalsExecuted(batch.proposals) { - continue - } - - log.Info().Str("messageID", messageID).Msgf("Successfully executed proposals") - return nil - } - case <-timeout.C: - { - return fmt.Errorf("execution timed out in %s", signingTimeout) - } - case <-ctx.Done(): - { - return nil - } - } - } -} - -func (e *Executor) proposalBatches(proposals []*proposal.Proposal) ([]*Batch, error) { - batches := make([]*Batch, 1) - currentBatch := &Batch{ - proposals: make([]*transfer.TransferProposal, 0), - gasLimit: 0, - } - batches[0] = currentBatch - - for _, prop := range proposals { - transferProposal := &transfer.TransferProposal{ - Source: prop.Source, - Destination: prop.Destination, - Data: prop.Data.(transfer.TransferProposalData), - Type: prop.Type, - MessageID: prop.MessageID, - } - - isExecuted, err := e.bridge.IsProposalExecuted(transferProposal) - if err != nil { - return nil, err - } - if isExecuted { - log.Info().Str("messageID", transferProposal.MessageID).Msgf("Proposal %p already executed", transferProposal) - continue - } - - var propGasLimit uint64 - l, ok := transferProposal.Data.Metadata["gasLimit"] - if ok { - propGasLimit = l.(uint64) + e.transferGasCost - } else { - propGasLimit = e.transferGasCost - } - currentBatch.gasLimit += propGasLimit - if currentBatch.gasLimit >= e.transactionMaxGas { - currentBatch = &Batch{ - proposals: make([]*transfer.TransferProposal, 0), - gasLimit: 0, - } - batches = append(batches, currentBatch) - } - - currentBatch.proposals = append(currentBatch.proposals, transferProposal) - } - - return batches, nil -} - -func (e *Executor) executeBatch(batch *Batch, signatureData *common.SignatureData) (*ethCommon.Hash, error) { - sig := []byte{} - sig = append(sig[:], ethCommon.LeftPadBytes(signatureData.R, 32)...) - sig = append(sig[:], ethCommon.LeftPadBytes(signatureData.S, 32)...) - sig = append(sig[:], signatureData.SignatureRecovery...) - sig[len(sig)-1] += 27 // Transform V from 0/1 to 27/28 - - hash, err := e.bridge.ExecuteProposals(batch.proposals, sig, transactor.TransactOptions{ - GasLimit: batch.gasLimit, - }) - if err != nil { - return nil, err - } - - return hash, err -} - -func (e *Executor) areProposalsExecuted(proposals []*transfer.TransferProposal) bool { - for _, prop := range proposals { - isExecuted, err := e.bridge.IsProposalExecuted(prop) - if err != nil || !isExecuted { - return false - } - } - - return true -} diff --git a/chains/evm/executor/message-handler.go b/chains/evm/executor/message-handler.go deleted file mode 100644 index 496c6768..00000000 --- a/chains/evm/executor/message-handler.go +++ /dev/null @@ -1,285 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package executor - -import ( - "bytes" - "errors" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/common" - - "github.com/sygmaprotocol/sygma-core/relayer/message" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" - - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/depositHandlers" - "github.com/ChainSafe/sygma-relayer/store" - - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" -) - -type TransferMessageHandler struct{} - -func (h *TransferMessageHandler) HandleMessage(msg *message.Message) (*proposal.Proposal, error) { - transferMessage := &transfer.TransferMessage{ - Source: msg.Source, - Destination: msg.Destination, - Data: msg.Data.(transfer.TransferMessageData), - Type: msg.Type, - ID: msg.ID, - } - - switch transferMessage.Data.Type { - case transfer.FungibleTransfer: - return ERC20MessageHandler(transferMessage) - case transfer.SemiFungibleTransfer: - return ERC1155MessageHandler(transferMessage) - case transfer.NonFungibleTransfer: - return ERC721MessageHandler(transferMessage) - case transfer.PermissionedGenericTransfer: - return GenericMessageHandler(transferMessage) - case transfer.PermissionlessGenericTransfer: - return PermissionlessGenericMessageHandler(transferMessage) - } - return nil, errors.New("wrong message type passed while handling message") -} - -func PermissionlessGenericMessageHandler(msg *transfer.TransferMessage) (*proposal.Proposal, error) { - executeFunctionSignature, ok := msg.Data.Payload[0].([]byte) - if !ok { - return nil, errors.New("wrong function signature format") - } - executeContractAddress, ok := msg.Data.Payload[1].([]byte) - if !ok { - return nil, errors.New("wrong contract address format") - } - maxFee, ok := msg.Data.Payload[2].([]byte) - if !ok { - return nil, errors.New("wrong max fee format") - } - depositor, ok := msg.Data.Payload[3].([]byte) - if !ok { - return nil, errors.New("wrong depositor data format") - } - executionData, ok := msg.Data.Payload[4].([]byte) - if !ok { - return nil, errors.New("wrong execution data format") - } - - data := bytes.Buffer{} - data.Write(common.LeftPadBytes(maxFee, 32)) - - data.Write(common.LeftPadBytes(big.NewInt(int64(len(executeFunctionSignature))).Bytes(), 2)) - data.Write(executeFunctionSignature) - - data.Write([]byte{byte(len(executeContractAddress))}) - data.Write(executeContractAddress) - - data.Write([]byte{byte(len(depositor))}) - data.Write(depositor) - - data.Write(executionData) - return proposal.NewProposal(msg.Source, msg.Destination, transfer.TransferProposalData{ - DepositNonce: msg.Data.DepositNonce, - ResourceId: msg.Data.ResourceId, - Metadata: msg.Data.Metadata, - Data: data.Bytes(), - }, msg.ID, transfer.TransferProposalType), nil -} - -func ERC20MessageHandler(msg *transfer.TransferMessage) (*proposal.Proposal, error) { - if len(msg.Data.Payload) != 2 && len(msg.Data.Payload) != 3 { - return nil, fmt.Errorf("wrong payload length %d", len(msg.Data.Payload)) - } - amount, ok := msg.Data.Payload[0].([]byte) - if !ok { - return nil, errors.New("wrong payload amount format") - } - recipient, ok := msg.Data.Payload[1].([]byte) - if !ok { - return nil, errors.New("wrong payload recipient format") - } - var data []byte - data = append(data, common.LeftPadBytes(amount, 32)...) // amount (uint256) - recipientLen := big.NewInt(int64(len(recipient))).Bytes() - data = append(data, common.LeftPadBytes(recipientLen, 32)...) // length of recipient (uint256) - data = append(data, recipient...) // recipient ([]byte) - if len(msg.Data.Payload) == 3 { - optionalMessage, ok := msg.Data.Payload[2].([]byte) - if !ok { - return nil, errors.New("wrong optional message format") - } - - data = append(data, optionalMessage...) - } - - return proposal.NewProposal(msg.Source, msg.Destination, transfer.TransferProposalData{ - DepositNonce: msg.Data.DepositNonce, - ResourceId: msg.Data.ResourceId, - Metadata: msg.Data.Metadata, - Data: data, - }, msg.ID, transfer.TransferProposalType), nil -} - -func ERC721MessageHandler(msg *transfer.TransferMessage) (*proposal.Proposal, error) { - if len(msg.Data.Payload) != 3 { - return nil, errors.New("malformed payload. Len of payload should be 3") - } - tokenID, ok := msg.Data.Payload[0].([]byte) - if !ok { - return nil, errors.New("wrong payload tokenID format") - } - recipient, ok := msg.Data.Payload[1].([]byte) - if !ok { - return nil, errors.New("wrong payload recipient format") - } - metadata, ok := msg.Data.Payload[2].([]byte) - if !ok { - return nil, errors.New("wrong payload metadata format") - } - data := bytes.Buffer{} - data.Write(common.LeftPadBytes(tokenID, 32)) - recipientLen := big.NewInt(int64(len(recipient))).Bytes() - data.Write(common.LeftPadBytes(recipientLen, 32)) - data.Write(recipient) - metadataLen := big.NewInt(int64(len(metadata))).Bytes() - data.Write(common.LeftPadBytes(metadataLen, 32)) - data.Write(metadata) - return proposal.NewProposal(msg.Source, msg.Destination, transfer.TransferProposalData{ - DepositNonce: msg.Data.DepositNonce, - ResourceId: msg.Data.ResourceId, - Metadata: msg.Data.Metadata, - Data: data.Bytes(), - }, msg.ID, transfer.TransferProposalType), nil -} - -func ERC1155MessageHandler(msg *transfer.TransferMessage) (*proposal.Proposal, error) { - if len(msg.Data.Payload) != 4 { - return nil, errors.New("malformed payload. Len of payload should be 4") - } - _, ok := msg.Data.Payload[0].([]*big.Int) - if !ok { - return nil, errors.New("wrong payload tokenID format") - } - _, ok = msg.Data.Payload[1].([]*big.Int) - if !ok { - return nil, errors.New("wrong payload amount format") - } - _, ok = msg.Data.Payload[2].([]byte) - if !ok { - return nil, errors.New("wrong payload recipient format") - } - if len(msg.Data.Payload[2].([]byte)) != 20 { - return nil, errors.New("malformed payload. Len of recipient should be 20") - } - _, ok = msg.Data.Payload[3].([]byte) - if !ok { - return nil, errors.New("wrong payload transferData format") - } - - erc1155Type, err := depositHandlers.GetErc1155Type() - if err != nil { - return nil, err - } - - data, err := erc1155Type.PackValues(msg.Data.Payload) - if err != nil { - return nil, err - } - - return proposal.NewProposal(msg.Source, msg.Destination, transfer.TransferProposalData{ - DepositNonce: msg.Data.DepositNonce, - ResourceId: msg.Data.ResourceId, - Metadata: msg.Data.Metadata, - Data: data, - }, msg.ID, transfer.TransferProposalType), nil -} - -func GenericMessageHandler(msg *transfer.TransferMessage) (*proposal.Proposal, error) { - if len(msg.Data.Payload) != 1 { - return nil, errors.New("malformed payload. Len of payload should be 1") - } - metadata, ok := msg.Data.Payload[0].([]byte) - if !ok { - return nil, errors.New("wrong payload metadata format") - } - data := bytes.Buffer{} - metadataLen := big.NewInt(int64(len(metadata))).Bytes() - data.Write(common.LeftPadBytes(metadataLen, 32)) // length of metadata (uint256) - data.Write(metadata) - return proposal.NewProposal(msg.Source, msg.Destination, transfer.TransferProposalData{ - DepositNonce: msg.Data.DepositNonce, - ResourceId: msg.Data.ResourceId, - Metadata: msg.Data.Metadata, - Data: data.Bytes(), - }, msg.ID, transfer.TransferProposalType), nil -} - -type BlockFetcher interface { - LatestBlock() (*big.Int, error) -} - -type PropStorer interface { - StorePropStatus(source, destination uint8, depositNonce uint64, status store.PropStatus) error - PropStatus(source, destination uint8, depositNonce uint64) (store.PropStatus, error) -} - -type DepositProcessor interface { - ProcessDeposits(startBlock *big.Int, endBlock *big.Int) (map[uint8][]*message.Message, error) -} - -type RetryMessageHandler struct { - depositProcessor DepositProcessor - blockConfirmations *big.Int - blockFetcher BlockFetcher - propStorer PropStorer - msgChan chan []*message.Message -} - -func NewRetryMessageHandler( - depositProcessor DepositProcessor, - blockFetcher BlockFetcher, - propStorer PropStorer, - blockConfirmations *big.Int, - msgChan chan []*message.Message) *RetryMessageHandler { - return &RetryMessageHandler{ - depositProcessor: depositProcessor, - blockFetcher: blockFetcher, - propStorer: propStorer, - blockConfirmations: blockConfirmations, - msgChan: msgChan, - } -} - -func (h *RetryMessageHandler) HandleMessage(msg *message.Message) (*proposal.Proposal, error) { - retryData := msg.Data.(retry.RetryMessageData) - latestBlock, err := h.blockFetcher.LatestBlock() - if err != nil { - return nil, err - } - if latestBlock.Cmp(new(big.Int).Add(retryData.BlockHeight, h.blockConfirmations)) != 1 { - return nil, fmt.Errorf( - "latest block %s higher than receipt block number + block confirmations %s", - latestBlock, - new(big.Int).Add(retryData.BlockHeight, h.blockConfirmations), - ) - } - - domainDeposits, err := h.depositProcessor.ProcessDeposits(retryData.BlockHeight, retryData.BlockHeight) - if err != nil { - return nil, err - } - filteredDeposits, err := retry.FilterDeposits(h.propStorer, domainDeposits, retryData.ResourceID, retryData.DestinationDomainID) - if err != nil { - return nil, err - } - if len(filteredDeposits) == 0 { - return nil, nil - } - - h.msgChan <- filteredDeposits - return nil, nil -} diff --git a/chains/evm/executor/message-handler_test.go b/chains/evm/executor/message-handler_test.go deleted file mode 100644 index db012ecd..00000000 --- a/chains/evm/executor/message-handler_test.go +++ /dev/null @@ -1,826 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package executor_test - -import ( - "encoding/hex" - "errors" - "math/big" - "testing" - - mock_executor "github.com/ChainSafe/sygma-relayer/chains/evm/executor/mock" - "github.com/ChainSafe/sygma-relayer/store" - "github.com/golang/mock/gomock" - "github.com/sygmaprotocol/sygma-core/relayer/message" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/chains/evm/executor" - "github.com/ChainSafe/sygma-relayer/e2e/evm" - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/suite" -) - -var errIncorrectERC20PayloadLen = errors.New("wrong payload length 1") -var errIncorrectERC721PayloadLen = errors.New("malformed payload. Len of payload should be 3") -var errIncorrectGenericPayloadLen = errors.New("malformed payload. Len of payload should be 1") -var errIncorrectERC1155PayloadLen = errors.New("malformed payload. Len of payload should be 4") - -var errIncorrectAmount = errors.New("wrong payload amount format") -var errIncorrectRecipient = errors.New("wrong payload recipient format") -var errIncorrectRecipientLen = errors.New("malformed payload. Len of recipient should be 20") -var errIncorrectTransferData = errors.New("wrong payload transferData format") -var errIncorrectTokenID = errors.New("wrong payload tokenID format") -var errIncorrectMetadata = errors.New("wrong payload metadata format") - -// ERC20 -type ERC20HandlerTestSuite struct { - suite.Suite -} - -func TestRunERC20HandlerTestSuite(t *testing.T) { - suite.Run(t, new(ERC20HandlerTestSuite)) -} - -func (s *ERC20HandlerTestSuite) SetupSuite() {} -func (s *ERC20HandlerTestSuite) TearDownSuite() {} -func (s *ERC20HandlerTestSuite) SetupTest() {} -func (s *ERC20HandlerTestSuite) TearDownTest() {} - -func (s *ERC20HandlerTestSuite) TestERC20HandleMessage() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - []byte{241, 229, 143, 177, 119, 4, 194, 218, 132, 121, 165, 51, 249, 250, 212, 173, 9, 147, 202, 107}, // recipientAddress - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(err) - s.NotNil(prop) -} - -func (s *ERC20HandlerTestSuite) TestERC20HandleMessage_WithOptionalMessage() { - amount := []byte{2} - recipient := []byte{241, 229, 143, 177, 119, 4, 194, 218, 132, 121, 165, 51, 249, 250, 212, 173, 9, 147, 202, 107} - optionalMessage := []byte("optionalMessage") - - expectedData := common.LeftPadBytes(amount, 32) - expectedData = append(expectedData, common.LeftPadBytes(big.NewInt(int64(len(recipient))).Bytes(), 32)...) - expectedData = append(expectedData, recipient...) - expectedData = append(expectedData, optionalMessage...) - - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - amount, - recipient, - optionalMessage, - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(err) - s.NotNil(prop) - s.Equal(prop.Data.(transfer.TransferProposalData).Data, expectedData) -} - -func (s *ERC20HandlerTestSuite) TestERC20HandleMessageIncorrectDataLen() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectERC20PayloadLen.Error()) -} - -func (s *ERC20HandlerTestSuite) TestERC20HandleMessageIncorrectAmount() { - - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - "incorrectAmount", // amount - []byte{241, 229, 143, 177, 119, 4, 194, 218, 132, 121, 165, 51, 249, 250, 212, 173, 9, 147, 202, 107}, // recipientAddress - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectAmount.Error()) -} - -func (s *ERC20HandlerTestSuite) TestERC20HandleMessageIncorrectRecipient() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - "incorrectRecipient", // recipientAddress - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectRecipient.Error()) -} - -// ERC721 -type ERC721HandlerTestSuite struct { - suite.Suite -} - -func TestRunERC721HandlerTestSuite(t *testing.T) { - suite.Run(t, new(ERC721HandlerTestSuite)) -} - -func (s *ERC721HandlerTestSuite) SetupSuite() {} -func (s *ERC721HandlerTestSuite) TearDownSuite() {} -func (s *ERC721HandlerTestSuite) SetupTest() {} -func (s *ERC721HandlerTestSuite) TearDownTest() {} - -func (s *ERC721HandlerTestSuite) TestERC721MessageHandlerEmptyMetadata() { - - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // tokenID - []byte{241, 229, 143, 177, 119, 4, 194, 218, 132, 121, 165, 51, 249, 250, 212, 173, 9, 147, 202, 107}, // recipientAddress - []byte{}, // metadata - }, - Type: transfer.NonFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(err) - s.NotNil(prop) -} - -func (s *ERC721HandlerTestSuite) TestERC721MessageHandlerIncorrectDataLen() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // tokenID - }, - Type: transfer.NonFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectERC721PayloadLen.Error()) -} - -func (s *ERC721HandlerTestSuite) TestERC721MessageHandlerIncorrectAmount() { - - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - "incorrectAmount", // tokenID - []byte{241, 229, 143, 177, 119, 4, 194, 218, 132, 121, 165, 51, 249, 250, 212, 173, 9, 147, 202, 107}, // recipientAddress - []byte{}, // metadata - }, - Type: transfer.NonFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectTokenID.Error()) -} - -func (s *ERC721HandlerTestSuite) TestERC721MessageHandlerIncorrectRecipient() { - - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - "incorrectRecipient", - []byte{}, // metadata - }, - Type: transfer.NonFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectRecipient.Error()) -} - -func (s *ERC721HandlerTestSuite) TestERC721MessageHandlerIncorrectMetadata() { - - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - []byte{241, 229, 143, 177, 119, 4, 194, 218, 132, 121, 165, 51, 249, 250, 212, 173, 9, 147, 202, 107}, // recipientAddress - "incorrectMetadata", // metadata - }, - Type: transfer.NonFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectMetadata.Error()) -} - -// GENERIC -type GenericHandlerTestSuite struct { - suite.Suite -} - -func TestRunGenericHandlerTestSuite(t *testing.T) { - suite.Run(t, new(GenericHandlerTestSuite)) -} - -func (s *GenericHandlerTestSuite) SetupSuite() {} -func (s *GenericHandlerTestSuite) TearDownSuite() {} -func (s *GenericHandlerTestSuite) SetupTest() {} -func (s *GenericHandlerTestSuite) TearDownTest() {} -func (s *GenericHandlerTestSuite) TestGenericHandleEvent() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{}, // metadata - }, - Type: transfer.PermissionedGenericTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(err) - s.NotNil(prop) -} - -func (s *GenericHandlerTestSuite) TestGenericHandleEventIncorrectDataLen() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{}, - Type: transfer.PermissionedGenericTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectGenericPayloadLen.Error()) -} - -func (s *GenericHandlerTestSuite) TestGenericHandleEventIncorrectMetadata() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - "incorrectMetadata", // metadata - }, - Type: transfer.PermissionedGenericTransfer, - }, - Type: transfer.TransferMessageType, - } - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectMetadata.Error()) -} - -// Permissionless -type PermissionlessGenericHandlerTestSuite struct { - suite.Suite -} - -func TestRunPermissionlessGenericHandlerTestSuite(t *testing.T) { - suite.Run(t, new(PermissionlessGenericHandlerTestSuite)) -} - -func (s *PermissionlessGenericHandlerTestSuite) Test_HandleMessage() { - hash := []byte("0xhash") - functionSig, _ := hex.DecodeString("0x654cf88c") - contractAddress := common.HexToAddress("0x02091EefF969b33A5CE8A729DaE325879bf76f90") - depositor := common.HexToAddress("0x5C1F5961696BaD2e73f73417f07EF55C62a2dC5b") - maxFee := big.NewInt(200000) - var metadata []byte - metadata = append(metadata, hash[:]...) - calldata := evm.ConstructPermissionlessGenericDepositData( - metadata, - functionSig, - contractAddress.Bytes(), - depositor.Bytes(), - maxFee, - ) - depositLog := &events.Deposit{ - DestinationDomainID: 0, - ResourceID: [32]byte{0}, - DepositNonce: 1, - SenderAddress: common.HexToAddress("0x5C1F5961696BaD2e73f73417f07EF55C62a2dC5b"), - Data: calldata, - HandlerResponse: []byte{}, - } - sourceID := uint8(1) - message := &message.Message{ - Source: sourceID, - Destination: depositLog.DestinationDomainID, - Data: transfer.TransferMessageData{ - DepositNonce: depositLog.DepositNonce, - ResourceId: depositLog.ResourceID, - Payload: []interface{}{ - functionSig, - contractAddress.Bytes(), - common.LeftPadBytes(maxFee.Bytes(), 32), - depositor.Bytes(), - hash, - }, - Type: transfer.PermissionlessGenericTransfer, - }, - Type: transfer.TransferMessageType, - ID: "messageID", - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - expectedData, _ := hex.DecodeString("0000000000000000000000000000000000000000000000000000000000030d4000001402091eeff969b33a5ce8a729dae325879bf76f90145c1f5961696bad2e73f73417f07ef55c62a2dc5b307868617368") - expected := proposal.NewProposal( - message.Source, - message.Destination, - transfer.TransferProposalData{ - DepositNonce: message.Data.(transfer.TransferMessageData).DepositNonce, - ResourceId: message.Data.(transfer.TransferMessageData).ResourceId, - Metadata: message.Data.(transfer.TransferMessageData).Metadata, - Data: expectedData, - }, - "messageID", - transfer.TransferProposalType, - ) - s.Nil(err) - s.Equal(expected, prop) -} - -// Erc1155 -type Erc1155HandlerTestSuite struct { - suite.Suite -} - -func TestRunErc1155HandlerTestSuite(t *testing.T) { - suite.Run(t, new(Erc1155HandlerTestSuite)) -} - -func (s *Erc1155HandlerTestSuite) SetupSuite() {} -func (s *Erc1155HandlerTestSuite) TearDownSuite() {} -func (s *Erc1155HandlerTestSuite) SetupTest() {} -func (s *Erc1155HandlerTestSuite) TearDownTest() {} - -func (s *Erc1155HandlerTestSuite) Test_HandleErc1155Message() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []*big.Int{ - big.NewInt(2), - }, - []*big.Int{ - big.NewInt(3), - }, - []byte{28, 58, 3, 208, 76, 2, 107, 31, 75, 66, 8, 210, 206, 5, 60, 86, 134, 230, 251, 141}, - []byte{}, - }, - Type: transfer.SemiFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(err) - s.NotNil(prop) -} - -func (s *Erc1155HandlerTestSuite) Test_HandleErc1155Message_InvalidPayloadLen() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []*big.Int{ - big.NewInt(2), - }, - []*big.Int{ - big.NewInt(3), - }, - []byte{28, 58, 3, 208, 76, 2, 107, 31, 75, 66, 8, 210, 206, 5, 60, 86, 134, 230, 251, 141}, - }, - Type: transfer.SemiFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.EqualError(err, errIncorrectERC1155PayloadLen.Error()) -} - -func (s *Erc1155HandlerTestSuite) Test_HandleErc1155Message_InvalidTokenIDs() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - 2, - []*big.Int{ - big.NewInt(3), - }, - []byte{28, 58, 3, 208, 76, 2, 107, 31, 75, 66, 8, 210, 206, 5, 60, 86, 134, 230, 251, 141}, - []byte{}, - }, - Type: transfer.SemiFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.EqualError(err, errIncorrectTokenID.Error()) -} - -func (s *Erc1155HandlerTestSuite) Test_HandleErc1155Message_InvalidAmounts() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []*big.Int{ - big.NewInt(2), - }, - 3, - []byte{28, 58, 3, 208, 76, 2, 107, 31, 75, 66, 8, 210, 206, 5, 60, 86, 134, 230, 251, 141}, - []byte{}, - }, - Type: transfer.SemiFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.EqualError(err, errIncorrectAmount.Error()) -} - -func (s *Erc1155HandlerTestSuite) Test_HandleErc1155Message_InvalidRecipient() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []*big.Int{ - big.NewInt(2), - }, - []*big.Int{ - big.NewInt(3), - }, - "invalidRecipient", - []byte{}, - }, - Type: transfer.SemiFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.EqualError(err, errIncorrectRecipient.Error()) -} - -func (s *Erc1155HandlerTestSuite) Test_HandleErc1155Message_InvalidRecipientLen() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []*big.Int{ - big.NewInt(2), - }, - []*big.Int{ - big.NewInt(3), - }, - []byte{28, 58, 3, 208, 76, 2, 107, 31, 75, 66, 8, 210, 206, 5, 60, 86, 134, 230, 251}, - []byte{}, - }, - Type: transfer.SemiFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.EqualError(err, errIncorrectRecipientLen.Error()) -} - -func (s *Erc1155HandlerTestSuite) Test_HandleErc1155Message_InvalidTransferData() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []*big.Int{ - big.NewInt(2), - }, - []*big.Int{ - big.NewInt(3), - }, - []byte{28, 58, 3, 208, 76, 2, 107, 31, 75, 66, 8, 210, 206, 5, 60, 86, 134, 230, 251, 141}, - "invalidTransferData", - }, - Type: transfer.SemiFungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - - mh := executor.TransferMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.EqualError(err, errIncorrectTransferData.Error()) -} - -type RetryMessageHandlerTestSuite struct { - suite.Suite - - messageHandler *executor.RetryMessageHandler - mockBlockFetcher *mock_executor.MockBlockFetcher - mockDepositProcessor *mock_executor.MockDepositProcessor - mockPropStorer *mock_executor.MockPropStorer - msgChan chan []*message.Message -} - -func TestRunRetryMessageHandlerTestSuite(t *testing.T) { - suite.Run(t, new(RetryMessageHandlerTestSuite)) -} - -func (s *RetryMessageHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.mockBlockFetcher = mock_executor.NewMockBlockFetcher(ctrl) - s.mockDepositProcessor = mock_executor.NewMockDepositProcessor(ctrl) - s.mockPropStorer = mock_executor.NewMockPropStorer(ctrl) - s.msgChan = make(chan []*message.Message, 1) - s.messageHandler = executor.NewRetryMessageHandler( - s.mockDepositProcessor, - s.mockBlockFetcher, - s.mockPropStorer, - big.NewInt(5), - s.msgChan) -} - -func (s *RetryMessageHandlerTestSuite) Test_HandleMessage_RetryTooNew() { - s.mockBlockFetcher.EXPECT().LatestBlock().Return(big.NewInt(105), nil) - - message := &message.Message{ - Source: 1, - Destination: 3, - Data: retry.RetryMessageData{ - SourceDomainID: 3, - DestinationDomainID: 4, - BlockHeight: big.NewInt(100), - ResourceID: [32]byte{}, - }, - Type: transfer.TransferMessageType, - } - - prop, err := s.messageHandler.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) -} - -func (s *RetryMessageHandlerTestSuite) Test_HandleMessage_NoDeposits() { - s.mockBlockFetcher.EXPECT().LatestBlock().Return(big.NewInt(106), nil) - s.mockDepositProcessor.EXPECT().ProcessDeposits(big.NewInt(100), big.NewInt(100)).Return(make(map[uint8][]*message.Message), nil) - - message := &message.Message{ - Source: 1, - Destination: 3, - Data: retry.RetryMessageData{ - SourceDomainID: 3, - DestinationDomainID: 4, - BlockHeight: big.NewInt(100), - ResourceID: [32]byte{}, - }, - Type: transfer.TransferMessageType, - } - - prop, err := s.messageHandler.HandleMessage(message) - - s.Nil(prop) - s.Nil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *RetryMessageHandlerTestSuite) Test_HandleMessage_ValidDeposits() { - s.mockBlockFetcher.EXPECT().LatestBlock().Return(big.NewInt(106), nil) - - validResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{3}, 31)) - invalidResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{4}, 31)) - invalidDomain := uint8(3) - validDomain := uint8(4) - - executedNonce := uint64(1) - failedNonce := uint64(3) - - deposits := make(map[uint8][]*message.Message) - deposits[invalidDomain] = []*message.Message{ - { - Destination: invalidDomain, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: validResource, - }, - }, - } - deposits[validDomain] = []*message.Message{ - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: executedNonce, - ResourceId: validResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: 2, - ResourceId: invalidResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: failedNonce, - ResourceId: validResource, - }, - }, - } - s.mockDepositProcessor.EXPECT().ProcessDeposits(big.NewInt(100), big.NewInt(100)).Return(deposits, nil) - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, executedNonce).Return(store.ExecutedProp, nil) - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, failedNonce).Return(store.FailedProp, nil) - - message := &message.Message{ - Source: 1, - Destination: 3, - Data: retry.RetryMessageData{ - SourceDomainID: invalidDomain, - DestinationDomainID: validDomain, - BlockHeight: big.NewInt(100), - ResourceID: validResource, - }, - Type: transfer.TransferMessageType, - } - - prop, err := s.messageHandler.HandleMessage(message) - - s.Nil(prop) - s.Nil(err) - msgs := <-s.msgChan - s.Equal(msgs[0].Data.(transfer.TransferMessageData).DepositNonce, failedNonce) - s.Equal(msgs[0].Destination, validDomain) -} diff --git a/chains/evm/executor/mock/message-handler.go b/chains/evm/executor/mock/message-handler.go deleted file mode 100644 index d2eb1412..00000000 --- a/chains/evm/executor/mock/message-handler.go +++ /dev/null @@ -1,142 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./chains/evm/executor/message-handler.go - -// Package mock_executor is a generated GoMock package. -package mock_executor - -import ( - big "math/big" - reflect "reflect" - - store "github.com/ChainSafe/sygma-relayer/store" - gomock "github.com/golang/mock/gomock" - message "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -// MockBlockFetcher is a mock of BlockFetcher interface. -type MockBlockFetcher struct { - ctrl *gomock.Controller - recorder *MockBlockFetcherMockRecorder -} - -// MockBlockFetcherMockRecorder is the mock recorder for MockBlockFetcher. -type MockBlockFetcherMockRecorder struct { - mock *MockBlockFetcher -} - -// NewMockBlockFetcher creates a new mock instance. -func NewMockBlockFetcher(ctrl *gomock.Controller) *MockBlockFetcher { - mock := &MockBlockFetcher{ctrl: ctrl} - mock.recorder = &MockBlockFetcherMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockBlockFetcher) EXPECT() *MockBlockFetcherMockRecorder { - return m.recorder -} - -// LatestBlock mocks base method. -func (m *MockBlockFetcher) LatestBlock() (*big.Int, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "LatestBlock") - ret0, _ := ret[0].(*big.Int) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// LatestBlock indicates an expected call of LatestBlock. -func (mr *MockBlockFetcherMockRecorder) LatestBlock() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LatestBlock", reflect.TypeOf((*MockBlockFetcher)(nil).LatestBlock)) -} - -// MockPropStorer is a mock of PropStorer interface. -type MockPropStorer struct { - ctrl *gomock.Controller - recorder *MockPropStorerMockRecorder -} - -// MockPropStorerMockRecorder is the mock recorder for MockPropStorer. -type MockPropStorerMockRecorder struct { - mock *MockPropStorer -} - -// NewMockPropStorer creates a new mock instance. -func NewMockPropStorer(ctrl *gomock.Controller) *MockPropStorer { - mock := &MockPropStorer{ctrl: ctrl} - mock.recorder = &MockPropStorerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockPropStorer) EXPECT() *MockPropStorerMockRecorder { - return m.recorder -} - -// PropStatus mocks base method. -func (m *MockPropStorer) PropStatus(source, destination uint8, depositNonce uint64) (store.PropStatus, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PropStatus", source, destination, depositNonce) - ret0, _ := ret[0].(store.PropStatus) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// PropStatus indicates an expected call of PropStatus. -func (mr *MockPropStorerMockRecorder) PropStatus(source, destination, depositNonce interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropStatus", reflect.TypeOf((*MockPropStorer)(nil).PropStatus), source, destination, depositNonce) -} - -// StorePropStatus mocks base method. -func (m *MockPropStorer) StorePropStatus(source, destination uint8, depositNonce uint64, status store.PropStatus) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorePropStatus", source, destination, depositNonce, status) - ret0, _ := ret[0].(error) - return ret0 -} - -// StorePropStatus indicates an expected call of StorePropStatus. -func (mr *MockPropStorerMockRecorder) StorePropStatus(source, destination, depositNonce, status interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorePropStatus", reflect.TypeOf((*MockPropStorer)(nil).StorePropStatus), source, destination, depositNonce, status) -} - -// MockDepositProcessor is a mock of DepositProcessor interface. -type MockDepositProcessor struct { - ctrl *gomock.Controller - recorder *MockDepositProcessorMockRecorder -} - -// MockDepositProcessorMockRecorder is the mock recorder for MockDepositProcessor. -type MockDepositProcessorMockRecorder struct { - mock *MockDepositProcessor -} - -// NewMockDepositProcessor creates a new mock instance. -func NewMockDepositProcessor(ctrl *gomock.Controller) *MockDepositProcessor { - mock := &MockDepositProcessor{ctrl: ctrl} - mock.recorder = &MockDepositProcessorMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDepositProcessor) EXPECT() *MockDepositProcessorMockRecorder { - return m.recorder -} - -// ProcessDeposits mocks base method. -func (m *MockDepositProcessor) ProcessDeposits(startBlock, endBlock *big.Int) (map[uint8][]*message.Message, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ProcessDeposits", startBlock, endBlock) - ret0, _ := ret[0].(map[uint8][]*message.Message) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ProcessDeposits indicates an expected call of ProcessDeposits. -func (mr *MockDepositProcessorMockRecorder) ProcessDeposits(startBlock, endBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProcessDeposits", reflect.TypeOf((*MockDepositProcessor)(nil).ProcessDeposits), startBlock, endBlock) -} diff --git a/chains/evm/listener/depositHandlers/deposit-handler.go b/chains/evm/listener/depositHandlers/deposit-handler.go deleted file mode 100644 index adb9122e..00000000 --- a/chains/evm/listener/depositHandlers/deposit-handler.go +++ /dev/null @@ -1,74 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package depositHandlers - -import ( - "errors" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/eventHandlers" - "github.com/ethereum/go-ethereum/common" - "github.com/rs/zerolog/log" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type DepositHandlers map[common.Address]eventHandlers.DepositHandler -type HandlerMatcher interface { - GetHandlerAddressForResourceID(resourceID [32]byte) (common.Address, error) -} - -type ETHDepositHandler struct { - handlerMatcher HandlerMatcher - depositHandlers DepositHandlers -} - -// NewETHDepositHandler creates an instance of ETHDepositHandler that contains -// handler functions for processing deposit events -func NewETHDepositHandler(handlerMatcher HandlerMatcher) *ETHDepositHandler { - return ÐDepositHandler{ - handlerMatcher: handlerMatcher, - depositHandlers: make(map[common.Address]eventHandlers.DepositHandler), - } -} - -func (e *ETHDepositHandler) HandleDeposit( - sourceID, - destID uint8, - depositNonce uint64, - resourceID [32]byte, - calldata, - handlerResponse []byte, - messageID string, - timestamp time.Time) (*message.Message, error) { - handlerAddr, err := e.handlerMatcher.GetHandlerAddressForResourceID(resourceID) - if err != nil { - return nil, err - } - - depositHandler, err := e.matchAddressWithHandlerFunc(handlerAddr) - if err != nil { - return nil, err - } - - return depositHandler.HandleDeposit(sourceID, destID, depositNonce, resourceID, calldata, handlerResponse, messageID, timestamp) -} - -// matchAddressWithHandlerFunc matches a handler address with an associated handler function -func (e *ETHDepositHandler) matchAddressWithHandlerFunc(handlerAddress common.Address) (eventHandlers.DepositHandler, error) { - hf, ok := e.depositHandlers[handlerAddress] - if !ok { - return nil, errors.New("no corresponding deposit handler for this address exists") - } - return hf, nil -} - -// RegisterDepositHandler registers an event handler by associating a handler function to a specified address -func (e *ETHDepositHandler) RegisterDepositHandler(handlerAddress string, handler eventHandlers.DepositHandler) { - if handlerAddress == "" { - return - } - - log.Debug().Msgf("Registered deposit handler for address %s", handlerAddress) - e.depositHandlers[common.HexToAddress(handlerAddress)] = handler -} diff --git a/chains/evm/listener/depositHandlers/erc1155.go b/chains/evm/listener/depositHandlers/erc1155.go deleted file mode 100644 index a6daf200..00000000 --- a/chains/evm/listener/depositHandlers/erc1155.go +++ /dev/null @@ -1,85 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package depositHandlers - -import ( - "time" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type Erc1155DepositHandler struct{} - -func (dh *Erc1155DepositHandler) HandleDeposit( - sourceID, - destID uint8, - nonce uint64, - resourceID [32]byte, - calldata, handlerResponse []byte, - messageID string, - timestamp time.Time) (*message.Message, error) { - erc1155Type, err := GetErc1155Type() - if err != nil { - return nil, err - } - - decodedCallData, err := erc1155Type.UnpackValues(calldata) - if err != nil { - return nil, err - } - - payload := []interface{}{ - decodedCallData[0], - decodedCallData[1], - decodedCallData[2], - decodedCallData[3], - } - - return message.NewMessage( - sourceID, - destID, - transfer.TransferMessageData{ - DepositNonce: nonce, - ResourceId: resourceID, - Metadata: nil, - Payload: payload, - Type: transfer.SemiFungibleTransfer, - }, - messageID, - transfer.TransferMessageType, - timestamp, - ), nil -} - -func GetErc1155Type() (abi.Arguments, error) { - tokenIDsType, err := abi.NewType("uint256[]", "", nil) - if err != nil { - return nil, err - } - - amountsType, err := abi.NewType("uint256[]", "", nil) - if err != nil { - return nil, err - } - - recipientType, err := abi.NewType("bytes", "", nil) - if err != nil { - return nil, err - } - - transferDataType, err := abi.NewType("bytes", "", nil) - if err != nil { - return nil, err - } - - // Define the arguments using the created types - return abi.Arguments{ - abi.Argument{Name: "tokenIDs", Type: tokenIDsType, Indexed: false}, - abi.Argument{Name: "amounts", Type: amountsType, Indexed: false}, - abi.Argument{Name: "recipient", Type: recipientType, Indexed: false}, - abi.Argument{Name: "transferData", Type: transferDataType, Indexed: false}, - }, nil -} diff --git a/chains/evm/listener/depositHandlers/erc1155_test.go b/chains/evm/listener/depositHandlers/erc1155_test.go deleted file mode 100644 index 45d3fa59..00000000 --- a/chains/evm/listener/depositHandlers/erc1155_test.go +++ /dev/null @@ -1,108 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package depositHandlers_test - -import ( - "math/big" - "testing" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/depositHandlers" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/suite" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type Erc1155HandlerTestSuite struct { - suite.Suite -} - -func TestRunErc1155HandlerTestSuite(t *testing.T) { - suite.Run(t, new(Erc1155HandlerTestSuite)) -} - -func (s *Erc1155HandlerTestSuite) Test_Erc1155HandleEvent() { - callData := []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, 128, 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, 192, 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, 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, 64, 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, 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, 2, 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, 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, 3, 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, 20, 28, 58, 3, 208, 76, 2, 107, 31, 75, 66, 8, 210, 206, 5, 60, 86, 134, 230, 251, 141, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - - timestamp := time.Now() - depositLog := &events.Deposit{ - DestinationDomainID: 2, - ResourceID: [32]byte{0}, - DepositNonce: 1, - SenderAddress: common.HexToAddress("0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485"), - Data: callData, - HandlerResponse: []byte{}, - Timestamp: timestamp, - } - sourceID := uint8(1) - - expected := &message.Message{ - Source: sourceID, - Destination: depositLog.DestinationDomainID, - Data: transfer.TransferMessageData{ - DepositNonce: depositLog.DepositNonce, - ResourceId: depositLog.ResourceID, - Payload: []interface{}{ - []*big.Int{ - big.NewInt(2), - }, - []*big.Int{ - big.NewInt(3), - }, - []byte{28, 58, 3, 208, 76, 2, 107, 31, 75, 66, 8, 210, 206, 5, 60, 86, 134, 230, 251, 141}, - []byte{}, - }, - Type: transfer.SemiFungibleTransfer, - }, - Type: transfer.TransferMessageType, - ID: "messageID", - Timestamp: timestamp, - } - erc1155DepositHandler := depositHandlers.Erc1155DepositHandler{} - message, err := erc1155DepositHandler.HandleDeposit( - sourceID, - depositLog.DestinationDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.Data, - depositLog.HandlerResponse, - "messageID", - timestamp) - - s.Nil(err) - s.NotNil(message) - s.Equal(message, expected) -} - -func (s *Erc1155HandlerTestSuite) Test_Erc1155HandleEvent_ErrInvalidCallData() { - callData := []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 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, 192, 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, 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, 64, 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, 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, 2, 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, 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, 3, 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, 20, 28, 58, 3, 208, 76, 2, 107, 31, 75, 66, 8, 210, 206, 5, 60, 86, 134, 230, 251, 141, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - - timestamp := time.Now() - depositLog := &events.Deposit{ - DestinationDomainID: 2, - ResourceID: [32]byte{0}, - DepositNonce: 1, - SenderAddress: common.HexToAddress("0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485"), - Data: callData, - HandlerResponse: []byte{}, - Timestamp: timestamp, - } - sourceID := uint8(1) - - erc1155DepositHandler := depositHandlers.Erc1155DepositHandler{} - message, err := erc1155DepositHandler.HandleDeposit( - sourceID, - depositLog.DestinationDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.Data, - depositLog.HandlerResponse, - "messageID", - timestamp) - - s.Nil(message) - s.NotNil(err) -} diff --git a/chains/evm/listener/depositHandlers/erc20.go b/chains/evm/listener/depositHandlers/erc20.go deleted file mode 100644 index d52d3cb4..00000000 --- a/chains/evm/listener/depositHandlers/erc20.go +++ /dev/null @@ -1,76 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package depositHandlers - -import ( - "errors" - "math/big" - "time" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ethereum/go-ethereum/common" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -const OPTIONAL_REVERT_GAS = 100000 - -type Erc20DepositHandler struct{} - -// Erc20DepositHandler converts data pulled from event logs into message -// handlerResponse can be an empty slice -func (dh *Erc20DepositHandler) HandleDeposit( - sourceID, - destID uint8, - nonce uint64, - resourceID [32]byte, - calldata, - handlerResponse []byte, - messageID string, - timestamp time.Time) (*message.Message, error) { - if len(calldata) < 84 { - err := errors.New("invalid calldata length: less than 84 bytes") - return nil, err - } - - // amount: first 32 bytes of calldata - // handlerResponse: 32 bytes amount if handler converted amounts - var amount []byte - if len(handlerResponse) > 0 { - amount = handlerResponse[:32] - } else { - amount = calldata[:32] - } - - recipientAddressLength := big.NewInt(0).SetBytes(calldata[32:64]) - recipientAddress := calldata[64:(64 + recipientAddressLength.Int64())] - payload := []interface{}{ - amount, - recipientAddress, - } - - metadata := make(map[string]interface{}) - // append optional message if it exists - if len(calldata) > int(96+recipientAddressLength.Int64()) { - maxFee := new(big.Int).Add(new(big.Int).SetBytes(calldata[64+recipientAddressLength.Int64():96+recipientAddressLength.Int64()]), big.NewInt(OPTIONAL_REVERT_GAS)) - metadata["gasLimit"] = maxFee.Uint64() - - copy(calldata[64+recipientAddressLength.Int64():96+recipientAddressLength.Int64()], common.LeftPadBytes(maxFee.Bytes(), 32)) - payload = append(payload, calldata[64+recipientAddressLength.Int64():]) - } - - return message.NewMessage( - sourceID, - destID, - transfer.TransferMessageData{ - DepositNonce: nonce, - ResourceId: resourceID, - Metadata: metadata, - Payload: payload, - Type: transfer.FungibleTransfer, - }, - messageID, - transfer.TransferMessageType, - timestamp, - ), nil -} diff --git a/chains/evm/listener/depositHandlers/erc20_test.go b/chains/evm/listener/depositHandlers/erc20_test.go deleted file mode 100644 index 167077e3..00000000 --- a/chains/evm/listener/depositHandlers/erc20_test.go +++ /dev/null @@ -1,129 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package depositHandlers_test - -import ( - "errors" - "math/big" - "testing" - "time" - - "github.com/ChainSafe/sygma-relayer/e2e/evm" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/sygmaprotocol/sygma-core/relayer/message" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/depositHandlers" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" - "github.com/stretchr/testify/suite" -) - -var errIncorrectDataLen = errors.New("invalid calldata length: less than 84 bytes") - -type Erc20HandlerTestSuite struct { - suite.Suite -} - -func TestRunErc20HandlerTestSuite(t *testing.T) { - suite.Run(t, new(Erc20HandlerTestSuite)) -} - -func (s *Erc20HandlerTestSuite) TestErc20HandleEvent() { - // 0xf1e58fb17704c2da8479a533f9fad4ad0993ca6b - recipientByteSlice := []byte{241, 229, 143, 177, 119, 4, 194, 218, 132, 121, 165, 51, 249, 250, 212, 173, 9, 147, 202, 107} - maxFee := big.NewInt(200000) - optionalMessage := common.LeftPadBytes(maxFee.Bytes(), 32) - optionalMessage = append(optionalMessage, []byte("optionalMessage")...) - - optionalMessageWithRevertGas := common.LeftPadBytes(new(big.Int).Add(maxFee, big.NewInt(depositHandlers.OPTIONAL_REVERT_GAS)).Bytes(), 32) - optionalMessageWithRevertGas = append(optionalMessageWithRevertGas, []byte("optionalMessage")...) - - metadata := make(map[string]interface{}) - metadata["gasLimit"] = uint64(300000) - - calldata := evm.ConstructErc20DepositData(recipientByteSlice, big.NewInt(2)) - calldata = append(calldata, optionalMessage...) - depositLog := &events.Deposit{ - DestinationDomainID: 0, - ResourceID: [32]byte{0}, - DepositNonce: 1, - SenderAddress: common.HexToAddress("0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485"), - Data: calldata, - HandlerResponse: []byte{}, - } - - sourceID := uint8(1) - amountParsed := calldata[:32] - recipientAddressParsed := calldata[64 : 64+len(recipientByteSlice)] - - timestamp := time.Now() - expected := &message.Message{ - Source: sourceID, - Destination: depositLog.DestinationDomainID, - Data: transfer.TransferMessageData{ - DepositNonce: depositLog.DepositNonce, - ResourceId: depositLog.ResourceID, - Payload: []interface{}{ - amountParsed, - recipientAddressParsed, - optionalMessageWithRevertGas, - }, - Type: transfer.FungibleTransfer, - Metadata: metadata, - }, - Type: transfer.TransferMessageType, - ID: "messageID", - Timestamp: timestamp, - } - erc20DepositHandler := depositHandlers.Erc20DepositHandler{} - message, err := erc20DepositHandler.HandleDeposit( - sourceID, - depositLog.DestinationDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.Data, - depositLog.HandlerResponse, - "messageID", - timestamp, - ) - - s.Nil(err) - s.NotNil(message) - s.Equal(message, expected) -} - -func (s *Erc20HandlerTestSuite) TestErc20HandleEventIncorrectDataLen() { - metadata := []byte("0xdeadbeef") - - var calldata []byte - calldata = append(calldata, math.PaddedBigBytes(big.NewInt(int64(len(metadata))), 32)...) - calldata = append(calldata, metadata...) - - depositLog := &events.Deposit{ - DestinationDomainID: 0, - ResourceID: [32]byte{0}, - DepositNonce: 1, - SenderAddress: common.HexToAddress("0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485"), - Data: calldata, - HandlerResponse: []byte{}, - } - - sourceID := uint8(1) - - erc20DepositHandler := depositHandlers.Erc20DepositHandler{} - message, err := erc20DepositHandler.HandleDeposit( - sourceID, - depositLog.DestinationDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.Data, - depositLog.HandlerResponse, - "messageID", - time.Now(), - ) - - s.Nil(message) - s.EqualError(err, errIncorrectDataLen.Error()) -} diff --git a/chains/evm/listener/depositHandlers/erc721.go b/chains/evm/listener/depositHandlers/erc721.go deleted file mode 100644 index 354039cb..00000000 --- a/chains/evm/listener/depositHandlers/erc721.go +++ /dev/null @@ -1,75 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package depositHandlers - -import ( - "errors" - "math/big" - "time" - - "github.com/sygmaprotocol/sygma-core/relayer/message" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" -) - -type Erc721DepositHandler struct{} - -// Erc721DepositHandler converts data pulled from ERC721 deposit event logs into message -func (dh *Erc721DepositHandler) HandleDeposit( - sourceID, - destID uint8, - nonce uint64, - resourceID [32]byte, - calldata, handlerResponse []byte, - messageID string, - timestamp time.Time) (*message.Message, error) { - if len(calldata) < 64 { - err := errors.New("invalid calldata length: less than 84 bytes") - return nil, err - } - - // first 32 bytes are tokenId - tokenId := calldata[:32] - - // 32 - 64 is recipient address length - recipientAddressLength := big.NewInt(0).SetBytes(calldata[32:64]) - - // 64 - (64 + recipient address length) is recipient address - recipientAddress := calldata[64:(64 + recipientAddressLength.Int64())] - - // (64 + recipient address length) - ((64 + recipient address length) + 32) is metadata length - metadataLength := big.NewInt(0).SetBytes( - calldata[(64 + recipientAddressLength.Int64()):((64 + recipientAddressLength.Int64()) + 32)], - ) - // ((64 + recipient address length) + 32) - ((64 + recipient address length) + 32 + metadata length) is metadata - var metadata []byte - var metadataStart int64 - if metadataLength.Cmp(big.NewInt(0)) == 1 { - metadataStart = (64 + recipientAddressLength.Int64()) + 32 - metadata = calldata[metadataStart : metadataStart+metadataLength.Int64()] - } - // arbitrary metadata that will be most likely be used by the relayer - var meta map[string]interface{} - - payload := []interface{}{ - tokenId, - recipientAddress, - metadata, - } - - return message.NewMessage( - sourceID, - destID, - transfer.TransferMessageData{ - DepositNonce: nonce, - ResourceId: resourceID, - Metadata: meta, - Payload: payload, - Type: transfer.NonFungibleTransfer, - }, - messageID, - transfer.TransferMessageType, - timestamp, - ), nil -} diff --git a/chains/evm/listener/depositHandlers/erc721_test.go b/chains/evm/listener/depositHandlers/erc721_test.go deleted file mode 100644 index cab7669c..00000000 --- a/chains/evm/listener/depositHandlers/erc721_test.go +++ /dev/null @@ -1,169 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package depositHandlers_test - -import ( - "math/big" - "testing" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/depositHandlers" - "github.com/ChainSafe/sygma-relayer/e2e/evm" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" - "github.com/stretchr/testify/suite" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type Erc721HandlerTestSuite struct { - suite.Suite -} - -func TestRunErc721HandlerTestSuite(t *testing.T) { - suite.Run(t, new(Erc721HandlerTestSuite)) -} - -func (s *Erc721HandlerTestSuite) TestErc721DepositHandlerEmptyMetadata() { - recipient := common.HexToAddress("0xf1e58fb17704c2da8479a533f9fad4ad0993ca6b") - - calldata := evm.ConstructErc721DepositData(recipient.Bytes(), big.NewInt(2), []byte{}) - timestamp := time.Now() - depositLog := &events.Deposit{ - DestinationDomainID: 0, - ResourceID: [32]byte{0}, - DepositNonce: 1, - Data: calldata, - HandlerResponse: []byte{}, - Timestamp: timestamp, - } - - sourceID := uint8(1) - tokenId := calldata[:32] - recipientAddressParsed := calldata[64:84] - var metadata []byte - - expected := &message.Message{ - Source: sourceID, - Destination: depositLog.DestinationDomainID, - Data: transfer.TransferMessageData{ - DepositNonce: depositLog.DepositNonce, - ResourceId: depositLog.ResourceID, - Payload: []interface{}{ - tokenId, - recipientAddressParsed, - metadata, - }, - Type: transfer.NonFungibleTransfer, - }, - - Type: transfer.TransferMessageType, - ID: "messageID", - Timestamp: timestamp, - } - - erc721DepositHandler := depositHandlers.Erc721DepositHandler{} - m, err := erc721DepositHandler.HandleDeposit( - sourceID, - depositLog.DestinationDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.Data, - depositLog.HandlerResponse, - "messageID", - timestamp) - - s.Nil(err) - s.NotNil(m) - s.Equal(expected, m) -} - -func (s *Erc721HandlerTestSuite) TestErc721DepositHandlerIncorrectDataLen() { - metadata := []byte("0xdeadbeef") - - var calldata []byte - calldata = append(calldata, math.PaddedBigBytes(big.NewInt(int64(len(metadata))), 16)...) - calldata = append(calldata, metadata...) - - timestamp := time.Now() - depositLog := &events.Deposit{ - DestinationDomainID: 0, - ResourceID: [32]byte{0}, - DepositNonce: 1, - SenderAddress: common.HexToAddress("0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485"), - Data: calldata, - HandlerResponse: []byte{}, - Timestamp: timestamp, - } - - sourceID := uint8(1) - - erc721DepositHandler := depositHandlers.Erc721DepositHandler{} - m, err := erc721DepositHandler.HandleDeposit( - sourceID, - depositLog.DestinationDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.Data, - depositLog.HandlerResponse, - "messageID", - timestamp) - s.Nil(m) - s.EqualError(err, "invalid calldata length: less than 84 bytes") -} - -func (s *Erc721HandlerTestSuite) TestErc721DepositHandler() { - recipient := common.HexToAddress("0xf1e58fb17704c2da8479a533f9fad4ad0993ca6b") - metadata := []byte("metadata.url") - - calldata := evm.ConstructErc721DepositData(recipient.Bytes(), big.NewInt(2), metadata) - timestamp := time.Now() - depositLog := &events.Deposit{ - DestinationDomainID: 0, - ResourceID: [32]byte{0}, - DepositNonce: 1, - Data: calldata, - HandlerResponse: []byte{}, - Timestamp: timestamp, - } - - sourceID := uint8(1) - tokenId := calldata[:32] - recipientAddressParsed := calldata[64:84] - parsedMetadata := calldata[116:128] - - expected := &message.Message{ - Source: sourceID, - Destination: depositLog.DestinationDomainID, - Data: transfer.TransferMessageData{ - DepositNonce: depositLog.DepositNonce, - ResourceId: depositLog.ResourceID, - Payload: []interface{}{ - tokenId, - recipientAddressParsed, - parsedMetadata, - }, - Type: transfer.NonFungibleTransfer, - }, - - Type: transfer.TransferMessageType, - ID: "messageID", - Timestamp: timestamp, - } - - erc721DepositHandler := depositHandlers.Erc721DepositHandler{} - m, err := erc721DepositHandler.HandleDeposit( - sourceID, - depositLog.DestinationDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.Data, - depositLog.HandlerResponse, - "messageID", - timestamp) - s.Nil(err) - s.NotNil(m) - s.Equal(expected, m) -} diff --git a/chains/evm/listener/depositHandlers/permissionless.go b/chains/evm/listener/depositHandlers/permissionless.go deleted file mode 100644 index a0ae7433..00000000 --- a/chains/evm/listener/depositHandlers/permissionless.go +++ /dev/null @@ -1,71 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package depositHandlers - -import ( - "errors" - "math/big" - "time" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type PermissionlessGenericDepositHandler struct{} - -// GenericDepositHandler converts data pulled from generic deposit event logs into message -func (dh *PermissionlessGenericDepositHandler) HandleDeposit( - sourceID, destID uint8, - nonce uint64, - resourceID [32]byte, - calldata, handlerResponse []byte, - messageID string, - timestamp time.Time) (*message.Message, error) { - if len(calldata) < 76 { - err := errors.New("invalid calldata length: less than 76 bytes") - return nil, err - } - - maxFee := calldata[:32] - - functionSigLen := big.NewInt(0).SetBytes(calldata[32:34]) - functionSigEnd := 34 + functionSigLen.Int64() - functionSig := calldata[34:functionSigEnd] - - contractAddressLen := big.NewInt(0).SetBytes(calldata[functionSigEnd : functionSigEnd+1]) - contractAddressEnd := functionSigEnd + 1 + contractAddressLen.Int64() - contractAddress := calldata[functionSigEnd+1 : contractAddressEnd] - - depositorLen := big.NewInt(0).SetBytes(calldata[contractAddressEnd : contractAddressEnd+1]) - depositorEnd := contractAddressEnd + 1 + depositorLen.Int64() - depositorAddress := calldata[contractAddressEnd+1 : depositorEnd] - executionData := calldata[depositorEnd:] - - payload := []interface{}{ - functionSig, - contractAddress, - maxFee, - depositorAddress, - executionData, - } - - metadata := make(map[string]interface{}) - - metadata["gasLimit"] = uint64(big.NewInt(0).SetBytes(maxFee).Int64()) - - return message.NewMessage( - sourceID, - destID, - transfer.TransferMessageData{ - DepositNonce: nonce, - ResourceId: resourceID, - Metadata: metadata, - Payload: payload, - Type: transfer.PermissionlessGenericTransfer, - }, - messageID, - transfer.TransferMessageType, - timestamp, - ), nil -} diff --git a/chains/evm/listener/depositHandlers/permissionless_test.go b/chains/evm/listener/depositHandlers/permissionless_test.go deleted file mode 100644 index 0084c800..00000000 --- a/chains/evm/listener/depositHandlers/permissionless_test.go +++ /dev/null @@ -1,131 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package depositHandlers_test - -import ( - "encoding/hex" - "math/big" - "testing" - "time" - - "github.com/sygmaprotocol/sygma-core/relayer/message" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/e2e/evm" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/depositHandlers" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" - "github.com/stretchr/testify/suite" -) - -type PermissionlessGenericHandlerTestSuite struct { - suite.Suite -} - -func TestRunPermissionlessGenericHandlerTestSuite(t *testing.T) { - suite.Run(t, new(PermissionlessGenericHandlerTestSuite)) -} - -func (s *PermissionlessGenericHandlerTestSuite) TestHandleEvent() { - hash := []byte("0xhash") - functionSig, _ := hex.DecodeString("654cf88c") - contractAddress := common.HexToAddress("0x02091EefF969b33A5CE8A729DaE325879bf76f90") - depositor := common.HexToAddress("0x5C1F5961696BaD2e73f73417f07EF55C62a2dC5b") - maxFee := big.NewInt(200000) - var executionData []byte - executionData = append(executionData, hash[:]...) - metadata := make(map[string]interface{}) - metadata["gasLimit"] = uint64(200000) - - calldata := evm.ConstructPermissionlessGenericDepositData( - hash[:], - functionSig, - contractAddress.Bytes(), - depositor.Bytes(), - maxFee, - ) - timestamp := time.Now() - depositLog := &events.Deposit{ - DestinationDomainID: 0, - ResourceID: [32]byte{0}, - DepositNonce: 1, - SenderAddress: common.HexToAddress("0x5C1F5961696BaD2e73f73417f07EF55C62a2dC5b"), - Data: calldata, - HandlerResponse: []byte{}, - Timestamp: timestamp, - } - - sourceID := uint8(1) - expected := &message.Message{ - Source: sourceID, - Destination: depositLog.DestinationDomainID, - Data: transfer.TransferMessageData{ - DepositNonce: depositLog.DepositNonce, - ResourceId: depositLog.ResourceID, - Payload: []interface{}{ - functionSig, - contractAddress.Bytes(), - common.LeftPadBytes(maxFee.Bytes(), 32), - depositor.Bytes(), - executionData, - }, - Metadata: metadata, - Type: transfer.PermissionlessGenericTransfer, - }, - Type: transfer.TransferMessageType, - ID: "messageID", - Timestamp: timestamp, - } - - permissionlessGenericHandler := depositHandlers.PermissionlessGenericDepositHandler{} - - message, err := permissionlessGenericHandler.HandleDeposit( - sourceID, - depositLog.DestinationDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.Data, - depositLog.HandlerResponse, - "messageID", - timestamp, - ) - - s.Nil(err) - s.NotNil(message) - s.Equal(message, expected) -} - -func (s *PermissionlessGenericHandlerTestSuite) Test_HandleEvent_IncorrectDataLen() { - metadata := make(map[string]interface{}) - metadata["gasLimit"] = uint64(200000) - var calldata []byte - calldata = append(calldata, math.PaddedBigBytes(big.NewInt(int64(len(metadata))), 32)...) - timestamp := time.Now() - depositLog := &events.Deposit{ - DestinationDomainID: 0, - ResourceID: [32]byte{0}, - DepositNonce: 1, - SenderAddress: common.HexToAddress("0x5C1F5961696BaD2e73f73417f07EF55C62a2dC5b"), - Data: calldata, - HandlerResponse: []byte{}, - Timestamp: timestamp, - } - - sourceID := uint8(1) - - permissionlessGenericHandler := depositHandlers.PermissionlessGenericDepositHandler{} - _, err := permissionlessGenericHandler.HandleDeposit( - sourceID, - depositLog.DestinationDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.Data, - depositLog.HandlerResponse, - "messageID", - timestamp) - - s.NotNil(err) -} diff --git a/chains/evm/listener/eventHandlers/deposit.go b/chains/evm/listener/eventHandlers/deposit.go deleted file mode 100644 index 67dabecd..00000000 --- a/chains/evm/listener/eventHandlers/deposit.go +++ /dev/null @@ -1,91 +0,0 @@ -package eventHandlers - -import ( - "context" - "fmt" - "math/big" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/rs/zerolog/log" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type EventListener interface { - FetchKeygenEvents(ctx context.Context, address common.Address, startBlock *big.Int, endBlock *big.Int) ([]types.Log, error) - FetchFrostKeygenEvents(ctx context.Context, address common.Address, startBlock *big.Int, endBlock *big.Int) ([]types.Log, error) - FetchRefreshEvents(ctx context.Context, address common.Address, startBlock *big.Int, endBlock *big.Int) ([]*events.Refresh, error) - FetchDeposits(ctx context.Context, address common.Address, startBlock *big.Int, endBlock *big.Int) ([]*events.Deposit, error) - FetchRetryV1Events(ctx context.Context, contractAddress common.Address, startBlock *big.Int, endBlock *big.Int) ([]events.RetryV1Event, error) - FetchRetryV2Events(ctx context.Context, contractAddress common.Address, startBlock *big.Int, endBlock *big.Int) ([]events.RetryV2Event, error) - FetchRetryDepositEvents(event events.RetryV1Event, bridgeAddress common.Address, blockConfirmations *big.Int) ([]events.Deposit, error) -} - -type DepositHandler interface { - HandleDeposit(sourceID, destID uint8, nonce uint64, resourceID [32]byte, calldata, handlerResponse []byte, messageID string, timestamp time.Time) (*message.Message, error) -} - -type DepositEventHandler struct { - eventListener EventListener - depositHandler DepositHandler - bridgeAddress common.Address - domainID uint8 - msgChan chan []*message.Message -} - -func NewDepositEventHandler(eventListener EventListener, depositHandler DepositHandler, bridgeAddress common.Address, domainID uint8, msgChan chan []*message.Message) *DepositEventHandler { - return &DepositEventHandler{ - eventListener: eventListener, - depositHandler: depositHandler, - bridgeAddress: bridgeAddress, - domainID: domainID, - msgChan: msgChan, - } -} - -func (eh *DepositEventHandler) HandleEvents(startBlock *big.Int, endBlock *big.Int) error { - domainDeposits, err := eh.ProcessDeposits(startBlock, endBlock) - if err != nil { - return err - } - - for _, deposits := range domainDeposits { - go func(d []*message.Message) { - eh.msgChan <- d - }(deposits) - } - - return nil -} - -func (eh *DepositEventHandler) ProcessDeposits(startBlock *big.Int, endBlock *big.Int) (map[uint8][]*message.Message, error) { - deposits, err := eh.eventListener.FetchDeposits(context.Background(), eh.bridgeAddress, startBlock, endBlock) - if err != nil { - return nil, fmt.Errorf("unable to fetch deposit events because of: %+v", err) - } - - domainDeposits := make(map[uint8][]*message.Message) - for _, d := range deposits { - func(d *events.Deposit) { - defer func() { - if r := recover(); r != nil { - log.Error().Err(err).Msgf("panic occured while handling deposit %+v", d) - } - }() - - messageID := fmt.Sprintf("%d-%d-%d-%d", eh.domainID, d.DestinationDomainID, startBlock, endBlock) - m, err := eh.depositHandler.HandleDeposit(eh.domainID, d.DestinationDomainID, d.DepositNonce, d.ResourceID, d.Data, d.HandlerResponse, messageID, d.Timestamp) - if err != nil { - log.Error().Err(err).Str("start block", startBlock.String()).Str("end block", endBlock.String()).Uint8("domainID", eh.domainID).Msgf("%v", err) - return - } - - log.Info().Str("messageID", m.ID).Msgf("Resolved message %+v in block range: %s-%s", m, startBlock.String(), endBlock.String()) - domainDeposits[m.Destination] = append(domainDeposits[m.Destination], m) - }(d) - } - - return domainDeposits, nil -} diff --git a/chains/evm/listener/eventHandlers/deposit_test.go b/chains/evm/listener/eventHandlers/deposit_test.go deleted file mode 100644 index bd1946fd..00000000 --- a/chains/evm/listener/eventHandlers/deposit_test.go +++ /dev/null @@ -1,211 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package eventHandlers_test - -import ( - "fmt" - "math/big" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/suite" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/eventHandlers" - mock_listener "github.com/ChainSafe/sygma-relayer/chains/evm/listener/eventHandlers/mock" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type DepositHandlerTestSuite struct { - suite.Suite - depositEventHandler *eventHandlers.DepositEventHandler - mockDepositHandler *mock_listener.MockDepositHandler - mockEventListener *mock_listener.MockEventListener - domainID uint8 - msgChan chan []*message.Message -} - -func TestRunDepositHandlerTestSuite(t *testing.T) { - suite.Run(t, new(DepositHandlerTestSuite)) -} - -func (s *DepositHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.domainID = 1 - s.mockEventListener = mock_listener.NewMockEventListener(ctrl) - s.mockDepositHandler = mock_listener.NewMockDepositHandler(ctrl) - s.msgChan = make(chan []*message.Message, 2) - s.depositEventHandler = eventHandlers.NewDepositEventHandler(s.mockEventListener, s.mockDepositHandler, common.Address{}, s.domainID, s.msgChan) -} - -func (s *DepositHandlerTestSuite) Test_FetchDepositFails() { - s.mockEventListener.EXPECT().FetchDeposits(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]*events.Deposit{}, fmt.Errorf("error")) - - err := s.depositEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - - s.NotNil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *DepositHandlerTestSuite) Test_HandleDepositFails_ExecutionContinue() { - timestamp := time.Now() - d1 := &events.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - Timestamp: timestamp, - } - d2 := &events.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - Timestamp: timestamp, - } - deposits := []*events.Deposit{d1, d2} - s.mockEventListener.EXPECT().FetchDeposits(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(deposits, nil) - msgID := fmt.Sprintf("%d-%d-%d-%d", 1, 2, 0, 5) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - msgID, - d1.Timestamp, - ).Return(&message.Message{}, fmt.Errorf("error")) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - msgID, - d2.Timestamp, - ).Return( - &message.Message{ - Data: transfer.TransferMessageData{ - DepositNonce: 2, - }, - }, - nil, - ) - - err := s.depositEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{DepositNonce: 2}}}) -} - -func (s *DepositHandlerTestSuite) Test_HandleDepositPanis_ExecutionContinues() { - d1 := &events.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d2 := &events.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - deposits := []*events.Deposit{d1, d2} - s.mockEventListener.EXPECT().FetchDeposits(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(deposits, nil) - msgID := fmt.Sprintf("%d-%d-%d-%d", 1, 2, 0, 5) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - msgID, - gomock.Any(), - ).Do(func(sourceID, destID, nonce, resourceID, calldata, handlerResponse, msgID, timestamp interface{}) { - panic("error") - }) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 2}}, - nil, - ) - - err := s.depositEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{DepositNonce: 2}}}) -} - -func (s *DepositHandlerTestSuite) Test_SuccessfulHandleDeposit() { - d1 := &events.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d2 := &events.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - deposits := []*events.Deposit{d1, d2} - s.mockEventListener.EXPECT().FetchDeposits(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(deposits, nil) - msgID := fmt.Sprintf("%d-%d-%d-%d", 1, 2, 0, 5) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 1}}, - nil, - ) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 2}}, - nil, - ) - - err := s.depositEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{DepositNonce: 1}}, {Data: transfer.TransferMessageData{DepositNonce: 2}}}) -} diff --git a/chains/evm/listener/eventHandlers/mock/listener.go b/chains/evm/listener/eventHandlers/mock/listener.go deleted file mode 100644 index b2c41951..00000000 --- a/chains/evm/listener/eventHandlers/mock/listener.go +++ /dev/null @@ -1,184 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./chains/evm/listener/eventHandlers/deposit.go - -// Package mock_eventHandlers is a generated GoMock package. -package mock_eventHandlers - -import ( - context "context" - big "math/big" - reflect "reflect" - time "time" - - events "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - common "github.com/ethereum/go-ethereum/common" - types "github.com/ethereum/go-ethereum/core/types" - gomock "github.com/golang/mock/gomock" - message "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -// MockEventListener is a mock of EventListener interface. -type MockEventListener struct { - ctrl *gomock.Controller - recorder *MockEventListenerMockRecorder -} - -// MockEventListenerMockRecorder is the mock recorder for MockEventListener. -type MockEventListenerMockRecorder struct { - mock *MockEventListener -} - -// NewMockEventListener creates a new mock instance. -func NewMockEventListener(ctrl *gomock.Controller) *MockEventListener { - mock := &MockEventListener{ctrl: ctrl} - mock.recorder = &MockEventListenerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockEventListener) EXPECT() *MockEventListenerMockRecorder { - return m.recorder -} - -// FetchDeposits mocks base method. -func (m *MockEventListener) FetchDeposits(ctx context.Context, address common.Address, startBlock, endBlock *big.Int) ([]*events.Deposit, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchDeposits", ctx, address, startBlock, endBlock) - ret0, _ := ret[0].([]*events.Deposit) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchDeposits indicates an expected call of FetchDeposits. -func (mr *MockEventListenerMockRecorder) FetchDeposits(ctx, address, startBlock, endBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchDeposits", reflect.TypeOf((*MockEventListener)(nil).FetchDeposits), ctx, address, startBlock, endBlock) -} - -// FetchFrostKeygenEvents mocks base method. -func (m *MockEventListener) FetchFrostKeygenEvents(ctx context.Context, address common.Address, startBlock, endBlock *big.Int) ([]types.Log, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchFrostKeygenEvents", ctx, address, startBlock, endBlock) - ret0, _ := ret[0].([]types.Log) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchFrostKeygenEvents indicates an expected call of FetchFrostKeygenEvents. -func (mr *MockEventListenerMockRecorder) FetchFrostKeygenEvents(ctx, address, startBlock, endBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchFrostKeygenEvents", reflect.TypeOf((*MockEventListener)(nil).FetchFrostKeygenEvents), ctx, address, startBlock, endBlock) -} - -// FetchKeygenEvents mocks base method. -func (m *MockEventListener) FetchKeygenEvents(ctx context.Context, address common.Address, startBlock, endBlock *big.Int) ([]types.Log, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchKeygenEvents", ctx, address, startBlock, endBlock) - ret0, _ := ret[0].([]types.Log) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchKeygenEvents indicates an expected call of FetchKeygenEvents. -func (mr *MockEventListenerMockRecorder) FetchKeygenEvents(ctx, address, startBlock, endBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchKeygenEvents", reflect.TypeOf((*MockEventListener)(nil).FetchKeygenEvents), ctx, address, startBlock, endBlock) -} - -// FetchRefreshEvents mocks base method. -func (m *MockEventListener) FetchRefreshEvents(ctx context.Context, address common.Address, startBlock, endBlock *big.Int) ([]*events.Refresh, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchRefreshEvents", ctx, address, startBlock, endBlock) - ret0, _ := ret[0].([]*events.Refresh) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchRefreshEvents indicates an expected call of FetchRefreshEvents. -func (mr *MockEventListenerMockRecorder) FetchRefreshEvents(ctx, address, startBlock, endBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRefreshEvents", reflect.TypeOf((*MockEventListener)(nil).FetchRefreshEvents), ctx, address, startBlock, endBlock) -} - -// FetchRetryDepositEvents mocks base method. -func (m *MockEventListener) FetchRetryDepositEvents(event events.RetryV1Event, bridgeAddress common.Address, blockConfirmations *big.Int) ([]events.Deposit, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchRetryDepositEvents", event, bridgeAddress, blockConfirmations) - ret0, _ := ret[0].([]events.Deposit) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchRetryDepositEvents indicates an expected call of FetchRetryDepositEvents. -func (mr *MockEventListenerMockRecorder) FetchRetryDepositEvents(event, bridgeAddress, blockConfirmations interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRetryDepositEvents", reflect.TypeOf((*MockEventListener)(nil).FetchRetryDepositEvents), event, bridgeAddress, blockConfirmations) -} - -// FetchRetryV1Events mocks base method. -func (m *MockEventListener) FetchRetryV1Events(ctx context.Context, contractAddress common.Address, startBlock, endBlock *big.Int) ([]events.RetryV1Event, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchRetryV1Events", ctx, contractAddress, startBlock, endBlock) - ret0, _ := ret[0].([]events.RetryV1Event) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchRetryV1Events indicates an expected call of FetchRetryV1Events. -func (mr *MockEventListenerMockRecorder) FetchRetryV1Events(ctx, contractAddress, startBlock, endBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRetryV1Events", reflect.TypeOf((*MockEventListener)(nil).FetchRetryV1Events), ctx, contractAddress, startBlock, endBlock) -} - -// FetchRetryV2Events mocks base method. -func (m *MockEventListener) FetchRetryV2Events(ctx context.Context, contractAddress common.Address, startBlock, endBlock *big.Int) ([]events.RetryV2Event, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchRetryV2Events", ctx, contractAddress, startBlock, endBlock) - ret0, _ := ret[0].([]events.RetryV2Event) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchRetryV2Events indicates an expected call of FetchRetryV2Events. -func (mr *MockEventListenerMockRecorder) FetchRetryV2Events(ctx, contractAddress, startBlock, endBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRetryV2Events", reflect.TypeOf((*MockEventListener)(nil).FetchRetryV2Events), ctx, contractAddress, startBlock, endBlock) -} - -// MockDepositHandler is a mock of DepositHandler interface. -type MockDepositHandler struct { - ctrl *gomock.Controller - recorder *MockDepositHandlerMockRecorder -} - -// MockDepositHandlerMockRecorder is the mock recorder for MockDepositHandler. -type MockDepositHandlerMockRecorder struct { - mock *MockDepositHandler -} - -// NewMockDepositHandler creates a new mock instance. -func NewMockDepositHandler(ctrl *gomock.Controller) *MockDepositHandler { - mock := &MockDepositHandler{ctrl: ctrl} - mock.recorder = &MockDepositHandlerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDepositHandler) EXPECT() *MockDepositHandlerMockRecorder { - return m.recorder -} - -// HandleDeposit mocks base method. -func (m *MockDepositHandler) HandleDeposit(sourceID, destID uint8, nonce uint64, resourceID [32]byte, calldata, handlerResponse []byte, messageID string, timestamp time.Time) (*message.Message, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HandleDeposit", sourceID, destID, nonce, resourceID, calldata, handlerResponse, messageID, timestamp) - ret0, _ := ret[0].(*message.Message) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// HandleDeposit indicates an expected call of HandleDeposit. -func (mr *MockDepositHandlerMockRecorder) HandleDeposit(sourceID, destID, nonce, resourceID, calldata, handlerResponse, messageID, timestamp interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HandleDeposit", reflect.TypeOf((*MockDepositHandler)(nil).HandleDeposit), sourceID, destID, nonce, resourceID, calldata, handlerResponse, messageID, timestamp) -} diff --git a/chains/evm/listener/eventHandlers/mock/retry.go b/chains/evm/listener/eventHandlers/mock/retry.go deleted file mode 100644 index 8773760d..00000000 --- a/chains/evm/listener/eventHandlers/mock/retry.go +++ /dev/null @@ -1,64 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./chains/evm/listener/eventHandlers/retry.go - -// Package mock_eventHandlers is a generated GoMock package. -package mock_eventHandlers - -import ( - reflect "reflect" - - store "github.com/ChainSafe/sygma-relayer/store" - gomock "github.com/golang/mock/gomock" -) - -// MockPropStorer is a mock of PropStorer interface. -type MockPropStorer struct { - ctrl *gomock.Controller - recorder *MockPropStorerMockRecorder -} - -// MockPropStorerMockRecorder is the mock recorder for MockPropStorer. -type MockPropStorerMockRecorder struct { - mock *MockPropStorer -} - -// NewMockPropStorer creates a new mock instance. -func NewMockPropStorer(ctrl *gomock.Controller) *MockPropStorer { - mock := &MockPropStorer{ctrl: ctrl} - mock.recorder = &MockPropStorerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockPropStorer) EXPECT() *MockPropStorerMockRecorder { - return m.recorder -} - -// PropStatus mocks base method. -func (m *MockPropStorer) PropStatus(source, destination uint8, depositNonce uint64) (store.PropStatus, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PropStatus", source, destination, depositNonce) - ret0, _ := ret[0].(store.PropStatus) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// PropStatus indicates an expected call of PropStatus. -func (mr *MockPropStorerMockRecorder) PropStatus(source, destination, depositNonce interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropStatus", reflect.TypeOf((*MockPropStorer)(nil).PropStatus), source, destination, depositNonce) -} - -// StorePropStatus mocks base method. -func (m *MockPropStorer) StorePropStatus(source, destination uint8, depositNonce uint64, status store.PropStatus) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorePropStatus", source, destination, depositNonce, status) - ret0, _ := ret[0].(error) - return ret0 -} - -// StorePropStatus indicates an expected call of StorePropStatus. -func (mr *MockPropStorerMockRecorder) StorePropStatus(source, destination, depositNonce, status interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorePropStatus", reflect.TypeOf((*MockPropStorer)(nil).StorePropStatus), source, destination, depositNonce, status) -} diff --git a/chains/evm/listener/eventHandlers/retry.go b/chains/evm/listener/eventHandlers/retry.go deleted file mode 100644 index 11b7ba3c..00000000 --- a/chains/evm/listener/eventHandlers/retry.go +++ /dev/null @@ -1,201 +0,0 @@ -package eventHandlers - -import ( - "context" - "fmt" - "math/big" - "strings" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/consts" - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ChainSafe/sygma-relayer/store" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/rs/zerolog" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type RetryV2EventHandler struct { - log zerolog.Logger - eventListener EventListener - retryAddress common.Address - domainID uint8 - msgChan chan []*message.Message -} - -func NewRetryV2EventHandler( - logC zerolog.Context, - eventListener EventListener, - retryAddress common.Address, - domainID uint8, - msgChan chan []*message.Message, -) *RetryV2EventHandler { - return &RetryV2EventHandler{ - log: logC.Logger(), - eventListener: eventListener, - retryAddress: retryAddress, - domainID: domainID, - msgChan: msgChan, - } -} - -func (eh *RetryV2EventHandler) HandleEvents( - startBlock *big.Int, - endBlock *big.Int, -) error { - retryEvents, err := eh.eventListener.FetchRetryV2Events(context.Background(), eh.retryAddress, startBlock, endBlock) - if err != nil { - return fmt.Errorf("unable to fetch retry v2 events because of: %+v", err) - } - - for _, e := range retryEvents { - messageID := fmt.Sprintf("retry-%d-%d", e.SourceDomainID, e.DestinationDomainID) - msg := message.NewMessage( - eh.domainID, - e.SourceDomainID, - retry.RetryMessageData{ - SourceDomainID: e.SourceDomainID, - DestinationDomainID: e.DestinationDomainID, - BlockHeight: e.BlockHeight, - ResourceID: e.ResourceID, - }, - messageID, - retry.RetryMessageType, - time.Now(), - ) - - eh.log.Info().Str("messageID", messageID).Msgf( - "Resolved retry message %+v in block range: %s-%s", msg, startBlock.String(), endBlock.String(), - ) - go func() { eh.msgChan <- []*message.Message{msg} }() - } - return nil -} - -type PropStorer interface { - StorePropStatus(source, destination uint8, depositNonce uint64, status store.PropStatus) error - PropStatus(source, destination uint8, depositNonce uint64) (store.PropStatus, error) -} - -type RetryV1EventHandler struct { - log zerolog.Logger - eventListener EventListener - depositHandler DepositHandler - propStorer PropStorer - bridgeAddress common.Address - bridgeABI abi.ABI - domainID uint8 - blockConfirmations *big.Int - msgChan chan []*message.Message -} - -func NewRetryV1EventHandler( - logC zerolog.Context, - eventListener EventListener, - depositHandler DepositHandler, - propStorer PropStorer, - bridgeAddress common.Address, - domainID uint8, - blockConfirmations *big.Int, - msgChan chan []*message.Message, -) *RetryV1EventHandler { - bridgeABI, _ := abi.JSON(strings.NewReader(consts.BridgeABI)) - return &RetryV1EventHandler{ - log: logC.Logger(), - eventListener: eventListener, - depositHandler: depositHandler, - propStorer: propStorer, - bridgeAddress: bridgeAddress, - bridgeABI: bridgeABI, - domainID: domainID, - blockConfirmations: blockConfirmations, - msgChan: msgChan, - } -} - -func (eh *RetryV1EventHandler) HandleEvents( - startBlock *big.Int, - endBlock *big.Int, -) error { - retryEvents, err := eh.eventListener.FetchRetryV1Events(context.Background(), eh.bridgeAddress, startBlock, endBlock) - if err != nil { - return fmt.Errorf("unable to fetch retry events because of: %+v", err) - } - - retriesByDomain := make(map[uint8][]*message.Message) - for _, event := range retryEvents { - func(event events.RetryV1Event) { - defer func() { - if r := recover(); r != nil { - eh.log.Error().Err(err).Msgf("panic occured while handling retry event %+v", event) - } - }() - - deposits, err := eh.eventListener.FetchRetryDepositEvents(event, eh.bridgeAddress, eh.blockConfirmations) - if err != nil { - eh.log.Error().Err(err).Msgf("Unable to fetch deposit events from event %+v", event) - return - } - - for _, d := range deposits { - messageID := fmt.Sprintf("retry-%d-%d-%d-%d", eh.domainID, d.DestinationDomainID, startBlock, endBlock) - msg, err := eh.depositHandler.HandleDeposit( - eh.domainID, d.DestinationDomainID, d.DepositNonce, - d.ResourceID, d.Data, d.HandlerResponse, messageID, d.Timestamp, - ) - if err != nil { - eh.log.Err(err).Str("messageID", msg.ID).Msgf("Failed handling deposit %+v", d) - continue - } - isExecuted, err := eh.isExecuted(msg) - if err != nil { - eh.log.Err(err).Str("messageID", msg.ID).Msgf("Failed checking if deposit executed %+v", d) - continue - } - if isExecuted { - eh.log.Debug().Str("messageID", msg.ID).Msgf("Deposit marked as executed %+v", d) - continue - } - - eh.log.Info().Str("messageID", msg.ID).Msgf( - "Resolved retry message %+v in block range: %s-%s", msg, startBlock.String(), endBlock.String(), - ) - retriesByDomain[msg.Destination] = append(retriesByDomain[msg.Destination], msg) - } - }(event) - } - - for _, retries := range retriesByDomain { - eh.msgChan <- retries - } - - return nil -} - -func (eh *RetryV1EventHandler) isExecuted(msg *message.Message) (bool, error) { - var err error - propStatus, err := eh.propStorer.PropStatus( - msg.Source, - msg.Destination, - msg.Data.(transfer.TransferMessageData).DepositNonce) - if err != nil { - return true, err - } - - if propStatus == store.ExecutedProp { - return true, nil - } - - // change the status to failed if proposal is stuck to be able to retry it - if propStatus == store.PendingProp { - err = eh.propStorer.StorePropStatus( - msg.Source, - msg.Destination, - msg.Data.(transfer.TransferMessageData).DepositNonce, - store.FailedProp) - } - return false, err -} diff --git a/chains/evm/listener/eventHandlers/retry_test.go b/chains/evm/listener/eventHandlers/retry_test.go deleted file mode 100644 index 2956b7df..00000000 --- a/chains/evm/listener/eventHandlers/retry_test.go +++ /dev/null @@ -1,392 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package eventHandlers_test - -import ( - "fmt" - "math/big" - "testing" - - "github.com/rs/zerolog/log" - - "github.com/ethereum/go-ethereum/common" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/suite" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/eventHandlers" - mock_listener "github.com/ChainSafe/sygma-relayer/chains/evm/listener/eventHandlers/mock" - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ChainSafe/sygma-relayer/store" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type RetryV2EventHandlerTestSuite struct { - suite.Suite - retryEventHandler *eventHandlers.RetryV2EventHandler - mockEventListener *mock_listener.MockEventListener - domainID uint8 - msgChan chan []*message.Message -} - -func TestRunRetryEventHandlerTestSuite(t *testing.T) { - suite.Run(t, new(RetryV2EventHandlerTestSuite)) -} - -func (s *RetryV2EventHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.domainID = 1 - s.mockEventListener = mock_listener.NewMockEventListener(ctrl) - s.msgChan = make(chan []*message.Message, 1) - s.retryEventHandler = eventHandlers.NewRetryV2EventHandler( - log.With(), - s.mockEventListener, - common.Address{}, - s.domainID, - s.msgChan) -} - -func (s *RetryV2EventHandlerTestSuite) Test_FetchRetryEventsFails() { - s.mockEventListener.EXPECT().FetchRetryV2Events(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]events.RetryV2Event{}, fmt.Errorf("error")) - - err := s.retryEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - - s.NotNil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *RetryV2EventHandlerTestSuite) Test_FetchRetryEvents_ValidRetry() { - s.mockEventListener.EXPECT().FetchRetryV2Events( - gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), - ).Return([]events.RetryV2Event{ - {SourceDomainID: 2, DestinationDomainID: 3, ResourceID: [32]byte{1}, BlockHeight: big.NewInt(100)}, - {SourceDomainID: 3, DestinationDomainID: 4, ResourceID: [32]byte{2}, BlockHeight: big.NewInt(101)}, - }, nil) - - err := s.retryEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - msgs2 := <-s.msgChan - msgs1 := <-s.msgChan - - s.Nil(err) - s.Equal(msgs1[0].Data, retry.RetryMessageData{ - SourceDomainID: 2, DestinationDomainID: 3, ResourceID: [32]byte{1}, BlockHeight: big.NewInt(100), - }) - s.Equal(msgs1[0].Destination, uint8(2)) - s.Equal(msgs1[0].Source, s.domainID) - - s.Equal(msgs2[0].Data, retry.RetryMessageData{ - SourceDomainID: 3, DestinationDomainID: 4, ResourceID: [32]byte{2}, BlockHeight: big.NewInt(101), - }) - s.Equal(msgs2[0].Destination, uint8(3)) - s.Equal(msgs2[0].Source, s.domainID) -} - -type RetryV1EventHandlerTestSuite struct { - suite.Suite - retryEventHandler *eventHandlers.RetryV1EventHandler - mockDepositHandler *mock_listener.MockDepositHandler - mockPropStorer *mock_listener.MockPropStorer - mockEventListener *mock_listener.MockEventListener - domainID uint8 - msgChan chan []*message.Message -} - -func TestRunRetryV1EventHandlerTestSuite(t *testing.T) { - suite.Run(t, new(RetryV1EventHandlerTestSuite)) -} - -func (s *RetryV1EventHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.domainID = 1 - s.mockEventListener = mock_listener.NewMockEventListener(ctrl) - s.mockDepositHandler = mock_listener.NewMockDepositHandler(ctrl) - s.mockPropStorer = mock_listener.NewMockPropStorer(ctrl) - s.msgChan = make(chan []*message.Message, 1) - s.retryEventHandler = eventHandlers.NewRetryV1EventHandler( - log.With(), - s.mockEventListener, - s.mockDepositHandler, - s.mockPropStorer, - common.Address{}, - s.domainID, - big.NewInt(5), - s.msgChan) -} - -func (s *RetryV1EventHandlerTestSuite) Test_FetchDepositFails() { - s.mockEventListener.EXPECT().FetchRetryV1Events(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return([]events.RetryV1Event{}, fmt.Errorf("error")) - - err := s.retryEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - - s.NotNil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *RetryV1EventHandlerTestSuite) Test_FetchDepositFails_ExecutionContinues() { - d := events.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - msgID := fmt.Sprintf("retry-%d-%d-%d-%d", 1, 2, 0, 5) - s.mockEventListener.EXPECT().FetchRetryV1Events( - gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), - ).Return([]events.RetryV1Event{{TxHash: "event1"}, {TxHash: "event2"}}, nil) - s.mockEventListener.EXPECT().FetchRetryDepositEvents(events.RetryV1Event{TxHash: "event1"}, gomock.Any(), big.NewInt(5)).Return([]events.Deposit{}, fmt.Errorf("error")) - s.mockEventListener.EXPECT().FetchRetryDepositEvents(events.RetryV1Event{TxHash: "event2"}, gomock.Any(), big.NewInt(5)).Return([]events.Deposit{d}, nil) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d.DestinationDomainID, - d.DepositNonce, - d.ResourceID, - d.Data, - d.HandlerResponse, - msgID, - gomock.Any(), - ).Return(&message.Message{ - Data: transfer.TransferMessageData{ - DepositNonce: 2, - }, - }, nil) - s.mockPropStorer.EXPECT().PropStatus(gomock.Any(), gomock.Any(), gomock.Any()).Return(store.MissingProp, nil) - - err := s.retryEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{ - DepositNonce: 2, - }}}) -} - -func (s *RetryV1EventHandlerTestSuite) Test_HandleDepositFails_ExecutionContinues() { - d1 := events.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d2 := events.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - msgID := fmt.Sprintf("retry-%d-%d-%d-%d", 1, 2, 0, 5) - s.mockEventListener.EXPECT().FetchRetryV1Events( - gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), - ).Return([]events.RetryV1Event{{TxHash: "event1"}, {TxHash: "event2"}}, nil) - s.mockEventListener.EXPECT().FetchRetryDepositEvents(events.RetryV1Event{TxHash: "event1"}, gomock.Any(), big.NewInt(5)).Return([]events.Deposit{d1}, nil) - s.mockEventListener.EXPECT().FetchRetryDepositEvents(events.RetryV1Event{TxHash: "event2"}, gomock.Any(), big.NewInt(5)).Return([]events.Deposit{d2}, nil) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - msgID, - gomock.Any(), - ).Return(&message.Message{Data: transfer.TransferMessageData{ - DepositNonce: 1, - }}, fmt.Errorf("error")) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - msgID, - gomock.Any(), - ).Return(&message.Message{Data: transfer.TransferMessageData{ - DepositNonce: 2, - }}, nil) - s.mockPropStorer.EXPECT().PropStatus(gomock.Any(), gomock.Any(), gomock.Any()).Return(store.MissingProp, nil) - - err := s.retryEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{DepositNonce: 2}}}) -} - -func (s *RetryV1EventHandlerTestSuite) Test_HandlingRetryPanics_ExecutionContinue() { - d1 := events.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d2 := events.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - s.mockEventListener.EXPECT().FetchRetryV1Events( - gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), - ).Return([]events.RetryV1Event{{TxHash: "event1"}, {TxHash: "event2"}}, nil) - s.mockEventListener.EXPECT().FetchRetryDepositEvents(events.RetryV1Event{TxHash: "event1"}, gomock.Any(), big.NewInt(5)).Return([]events.Deposit{d1}, nil) - s.mockEventListener.EXPECT().FetchRetryDepositEvents(events.RetryV1Event{TxHash: "event2"}, gomock.Any(), big.NewInt(5)).Return([]events.Deposit{d2}, nil) - msgID := fmt.Sprintf("retry-%d-%d-%d-%d", 1, 2, 0, 5) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - msgID, - gomock.Any(), - ).Do(func(sourceID, destID, nonce, resourceID, calldata, handlerResponse, msgID, timestamp interface{}) { - panic("error") - }) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - msgID, - gomock.Any(), - ).Return(&message.Message{Data: transfer.TransferMessageData{ - DepositNonce: 2, - }}, nil) - s.mockPropStorer.EXPECT().PropStatus(gomock.Any(), gomock.Any(), gomock.Any()).Return(store.MissingProp, nil) - - err := s.retryEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{ - DepositNonce: 2, - }}}) -} - -func (s *RetryV1EventHandlerTestSuite) Test_MultipleDeposits() { - d1 := events.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d2 := events.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - s.mockEventListener.EXPECT().FetchRetryV1Events( - gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), - ).Return([]events.RetryV1Event{{TxHash: "event1"}}, nil) - s.mockEventListener.EXPECT().FetchRetryDepositEvents(events.RetryV1Event{TxHash: "event1"}, gomock.Any(), big.NewInt(5)).Return([]events.Deposit{d1, d2}, nil) - msgID := fmt.Sprintf("retry-%d-%d-%d-%d", 1, 2, 0, 5) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - msgID, - gomock.Any(), - ).Return(&message.Message{Data: transfer.TransferMessageData{ - DepositNonce: 1, - }}, nil) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - msgID, - gomock.Any(), - ).Return(&message.Message{Data: transfer.TransferMessageData{ - DepositNonce: 2, - }}, nil) - s.mockPropStorer.EXPECT().PropStatus(gomock.Any(), gomock.Any(), gomock.Any()).Return(store.MissingProp, nil).Times(2) - - err := s.retryEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{ - DepositNonce: 1, - }}, {Data: transfer.TransferMessageData{ - DepositNonce: 2, - }}}) -} - -func (s *RetryV1EventHandlerTestSuite) Test_MultipleDeposits_ExecutedIgnored() { - d1 := events.Deposit{ - DepositNonce: 1, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - d2 := events.Deposit{ - DepositNonce: 2, - DestinationDomainID: 2, - ResourceID: [32]byte{}, - HandlerResponse: []byte{}, - Data: []byte{}, - } - s.mockEventListener.EXPECT().FetchRetryV1Events( - gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), - ).Return([]events.RetryV1Event{{TxHash: "event1"}}, nil) - s.mockEventListener.EXPECT().FetchRetryDepositEvents(events.RetryV1Event{TxHash: "event1"}, gomock.Any(), big.NewInt(5)).Return([]events.Deposit{d1, d2}, nil) - msgID := fmt.Sprintf("retry-%d-%d-%d-%d", 1, 2, 0, 5) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1.DestinationDomainID, - d1.DepositNonce, - d1.ResourceID, - d1.Data, - d1.HandlerResponse, - msgID, - gomock.Any(), - ).Return(&message.Message{Data: transfer.TransferMessageData{ - DepositNonce: 1, - }}, nil) - s.mockPropStorer.EXPECT().PropStatus(gomock.Any(), gomock.Any(), gomock.Any()).Return(store.ExecutedProp, nil) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2.DestinationDomainID, - d2.DepositNonce, - d2.ResourceID, - d2.Data, - d2.HandlerResponse, - msgID, - gomock.Any(), - ).Return(&message.Message{Data: transfer.TransferMessageData{ - DepositNonce: 2, - }}, nil) - s.mockPropStorer.EXPECT().PropStatus(gomock.Any(), gomock.Any(), gomock.Any()).Return(store.PendingProp, nil) - s.mockPropStorer.EXPECT().StorePropStatus(gomock.Any(), gomock.Any(), gomock.Any(), store.FailedProp).Return(nil) - - err := s.retryEventHandler.HandleEvents(big.NewInt(0), big.NewInt(5)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{ - { - Data: transfer.TransferMessageData{ - DepositNonce: 2, - }, - }, - }) -} diff --git a/chains/evm/listener/eventHandlers/tss.go b/chains/evm/listener/eventHandlers/tss.go index 26ba7e0e..4fe59244 100644 --- a/chains/evm/listener/eventHandlers/tss.go +++ b/chains/evm/listener/eventHandlers/tss.go @@ -11,18 +11,23 @@ import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/p2p" - "github.com/ChainSafe/sygma-relayer/topology" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/keygen" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/resharing" - frostKeygen "github.com/ChainSafe/sygma-relayer/tss/frost/keygen" - frostResharing "github.com/ChainSafe/sygma-relayer/tss/frost/resharing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/libp2p/go-libp2p/core/host" + "github.com/sprintertech/sprinter-signing/chains/evm/calls/events" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/comm/p2p" + "github.com/sprintertech/sprinter-signing/topology" + "github.com/sprintertech/sprinter-signing/tss" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/keygen" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/resharing" ) +type EventListener interface { + FetchKeygenEvents(ctx context.Context, address common.Address, startBlock *big.Int, endBlock *big.Int) ([]types.Log, error) + FetchRefreshEvents(ctx context.Context, address common.Address, startBlock *big.Int, endBlock *big.Int) ([]*events.Refresh, error) +} + type KeygenEventHandler struct { log zerolog.Logger eventListener EventListener @@ -92,71 +97,6 @@ func (eh *KeygenEventHandler) sessionID(block *big.Int) string { return fmt.Sprintf("keygen-%s", block.String()) } -type FrostKeygenEventHandler struct { - log zerolog.Logger - eventListener EventListener - coordinator *tss.Coordinator - host host.Host - communication comm.Communication - storer frostKeygen.FrostKeyshareStorer - contractAddress common.Address - threshold int -} - -func NewFrostKeygenEventHandler( - logC zerolog.Context, - eventListener EventListener, - coordinator *tss.Coordinator, - host host.Host, - communication comm.Communication, - storer frostKeygen.FrostKeyshareStorer, - contractAddress common.Address, - threshold int, -) *FrostKeygenEventHandler { - return &FrostKeygenEventHandler{ - log: logC.Logger(), - eventListener: eventListener, - coordinator: coordinator, - host: host, - communication: communication, - storer: storer, - contractAddress: contractAddress, - threshold: threshold, - } -} - -func (eh *FrostKeygenEventHandler) HandleEvents( - startBlock *big.Int, - endBlock *big.Int, -) error { - keygenEvents, err := eh.eventListener.FetchFrostKeygenEvents( - context.Background(), eh.contractAddress, startBlock, endBlock, - ) - if err != nil { - return fmt.Errorf("unable to fetch keygen events because of: %+v", err) - } - - if len(keygenEvents) == 0 { - return nil - } - - eh.log.Info().Msgf( - "Resolved FROST keygen message in block range: %s-%s", startBlock.String(), endBlock.String(), - ) - - keygenBlockNumber := big.NewInt(0).SetUint64(keygenEvents[0].BlockNumber) - keygen := frostKeygen.NewKeygen(eh.sessionID(keygenBlockNumber), eh.threshold, eh.host, eh.communication, eh.storer) - err = eh.coordinator.Execute(context.Background(), []tss.TssProcess{keygen}, make(chan interface{}, 1)) - if err != nil { - log.Err(err).Msgf("Failed executing keygen") - } - return nil -} - -func (eh *FrostKeygenEventHandler) sessionID(block *big.Int) string { - return fmt.Sprintf("frost-keygen-%s", block.String()) -} - type RefreshEventHandler struct { log zerolog.Logger topologyProvider topology.NetworkTopologyProvider @@ -168,7 +108,6 @@ type RefreshEventHandler struct { communication comm.Communication connectionGate *p2p.ConnectionGate ecdsaStorer resharing.SaveDataStorer - frostStorer frostResharing.FrostKeyshareStorer } func NewRefreshEventHandler( @@ -181,7 +120,6 @@ func NewRefreshEventHandler( communication comm.Communication, connectionGate *p2p.ConnectionGate, ecdsaStorer resharing.SaveDataStorer, - frostStorer frostResharing.FrostKeyshareStorer, bridgeAddress common.Address, ) *RefreshEventHandler { return &RefreshEventHandler{ @@ -193,7 +131,6 @@ func NewRefreshEventHandler( host: host, communication: communication, ecdsaStorer: ecdsaStorer, - frostStorer: frostStorer, connectionGate: connectionGate, bridgeAddress: bridgeAddress, } diff --git a/chains/proposal.go b/chains/proposal.go deleted file mode 100644 index 0a8a72eb..00000000 --- a/chains/proposal.go +++ /dev/null @@ -1,68 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package chains - -import ( - "fmt" - "math/big" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/signer/core/apitypes" -) - -func ProposalsHash(proposals []*transfer.TransferProposal, chainID int64, verifContract string, bridgeVersion string) ([]byte, error) { - formattedProps := make([]interface{}, len(proposals)) - for i, prop := range proposals { - formattedProps[i] = map[string]interface{}{ - "originDomainID": big.NewInt(int64(prop.Source)), - "depositNonce": new(big.Int).SetUint64(prop.Data.DepositNonce), - "resourceID": hexutil.Encode(prop.Data.ResourceId[:]), - "data": prop.Data.Data, - } - } - message := apitypes.TypedDataMessage{ - "proposals": formattedProps, - } - typedData := apitypes.TypedData{ - Types: apitypes.Types{ - "EIP712Domain": []apitypes.Type{ - {Name: "name", Type: "string"}, - {Name: "version", Type: "string"}, - {Name: "chainId", Type: "uint256"}, - {Name: "verifyingContract", Type: "address"}, - }, - "Proposal": []apitypes.Type{ - {Name: "originDomainID", Type: "uint8"}, - {Name: "depositNonce", Type: "uint64"}, - {Name: "resourceID", Type: "bytes32"}, - {Name: "data", Type: "bytes"}, - }, - "Proposals": []apitypes.Type{ - {Name: "proposals", Type: "Proposal[]"}, - }, - }, - PrimaryType: "Proposals", - Domain: apitypes.TypedDataDomain{ - Name: "Bridge", - ChainId: math.NewHexOrDecimal256(chainID), - Version: bridgeVersion, - VerifyingContract: verifContract, - }, - Message: message, - } - domainSeparator, err := typedData.HashStruct("EIP712Domain", typedData.Domain.Map()) - if err != nil { - return []byte{}, err - } - - typedDataHash, err := typedData.HashStruct(typedData.PrimaryType, typedData.Message) - if err != nil { - return []byte{}, err - } - rawData := []byte(fmt.Sprintf("\x19\x01%s%s", string(domainSeparator), string(typedDataHash))) - return crypto.Keccak256(rawData), nil -} diff --git a/chains/proposal_test.go b/chains/proposal_test.go deleted file mode 100644 index 9b685686..00000000 --- a/chains/proposal_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package chains - -import ( - "testing" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/stretchr/testify/suite" -) - -const bridgeVersion = "3.1.0" -const verifyingContract = "6CdE2Cd82a4F8B74693Ff5e194c19CA08c2d1c68" - -type ProposalTestSuite struct { - suite.Suite -} - -func TestRunProposalTestSuite(t *testing.T) { - suite.Run(t, new(ProposalTestSuite)) -} - -func (s *ProposalTestSuite) Test_ProposalsHash() { - data := []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, 90, 243, 16, 122, 64, 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, 0, 36, 0, 1, 1, 0, 212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125} - - prop := []*transfer.TransferProposal{{ - Source: 1, - Destination: 2, - Data: transfer.TransferProposalData{ - DepositNonce: 15078986465725403975, - ResourceId: [32]byte{3}, - Metadata: nil, - Data: data, - }, - }} - correctRes := []byte{0xde, 0x7b, 0x5c, 0x9e, 0x8, 0x7a, 0xb4, 0xf5, 0xfb, 0xe, 0x9f, 0x73, 0xa7, 0xe5, 0xbd, 0xb, 0xdf, 0x9e, 0xeb, 0x4, 0xaa, 0xbb, 0xd0, 0xe8, 0xf8, 0xde, 0x58, 0xa2, 0x4, 0xa3, 0x3e, 0x55} - - res, err := ProposalsHash(prop, 5, verifyingContract, bridgeVersion) - s.Nil(err) - s.Equal(correctRes, res) -} diff --git a/chains/substrate/config.go b/chains/substrate/config.go deleted file mode 100644 index a88ff7dd..00000000 --- a/chains/substrate/config.go +++ /dev/null @@ -1,98 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package substrate - -import ( - "fmt" - "math/big" - "time" - - "github.com/centrifuge/go-substrate-rpc-client/v4/signature" - "github.com/creasty/defaults" - "github.com/mitchellh/mapstructure" - - "github.com/ChainSafe/sygma-relayer/config/chain" -) - -type RawSubstrateConfig struct { - chain.GeneralChainConfig `mapstructure:",squash"` - ChainID int64 `mapstructure:"chainID"` - StartBlock int64 `mapstructure:"startBlock"` - BlockInterval int64 `mapstructure:"blockInterval" default:"5"` - BlockRetryInterval uint64 `mapstructure:"blockRetryInterval" default:"5"` - SubstrateNetwork int64 `mapstructure:"substrateNetwork"` - Tip uint64 `mapstructure:"tip"` -} - -type SubstrateConfig struct { - GeneralChainConfig chain.GeneralChainConfig - ChainID *big.Int - StartBlock *big.Int - BlockInterval *big.Int - BlockRetryInterval time.Duration - SubstrateNetwork uint16 - Tip uint64 -} - -func (c *SubstrateConfig) String() string { - kp, _ := signature.KeyringPairFromSecret(c.GeneralChainConfig.Key, c.SubstrateNetwork) - return fmt.Sprintf(`Name: '%s', Id: '%d', Type: '%s', BlockstorePath: '%s', FreshStart: '%t', - LatestBlock: '%t', Key address: '%s', StartBlock: '%s', BlockInterval: '%s', - BlockRetryInterval: '%s', ChainID: '%d', Tip: '%d', SubstrateNetworkPrefix: "%d"`, - c.GeneralChainConfig.Name, - *c.GeneralChainConfig.Id, - c.GeneralChainConfig.Type, - c.GeneralChainConfig.BlockstorePath, - c.GeneralChainConfig.FreshStart, - c.GeneralChainConfig.LatestBlock, - kp.Address, - c.StartBlock, - c.BlockInterval, - c.BlockRetryInterval, - c.ChainID, - c.Tip, - c.SubstrateNetwork, - ) -} - -func (c *RawSubstrateConfig) Validate() error { - if err := c.GeneralChainConfig.Validate(); err != nil { - return err - } - - return nil -} - -// NewSubstrateConfig decodes and validates an instance of an SubstrateConfig from -// raw chain config -func NewSubstrateConfig(chainConfig map[string]interface{}) (*SubstrateConfig, error) { - var c RawSubstrateConfig - err := mapstructure.Decode(chainConfig, &c) - if err != nil { - return nil, err - } - - err = defaults.Set(&c) - if err != nil { - return nil, err - } - - err = c.Validate() - if err != nil { - return nil, err - } - - c.GeneralChainConfig.ParseFlags() - config := &SubstrateConfig{ - GeneralChainConfig: c.GeneralChainConfig, - ChainID: big.NewInt(c.ChainID), - BlockRetryInterval: time.Duration(c.BlockRetryInterval) * time.Second, - StartBlock: big.NewInt(c.StartBlock), - BlockInterval: big.NewInt(c.BlockInterval), - SubstrateNetwork: uint16(c.SubstrateNetwork), - Tip: uint64(c.Tip), - } - - return config, nil -} diff --git a/chains/substrate/config_test.go b/chains/substrate/config_test.go deleted file mode 100644 index 068bb514..00000000 --- a/chains/substrate/config_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only -package substrate - -import ( - "math/big" - "testing" - "time" - - "github.com/ChainSafe/sygma-relayer/config/chain" - "github.com/stretchr/testify/suite" -) - -type NewSubstrateConfigTestSuite struct { - suite.Suite -} - -func TestRunNewSubstrateConfigTestSuite(t *testing.T) { - suite.Run(t, new(NewSubstrateConfigTestSuite)) -} - -func (s *NewSubstrateConfigTestSuite) SetupSuite() {} -func (s *NewSubstrateConfigTestSuite) TearDownSuite() {} -func (s *NewSubstrateConfigTestSuite) SetupTest() {} -func (s *NewSubstrateConfigTestSuite) TearDownTest() {} - -func (s *NewSubstrateConfigTestSuite) Test_FailedDecode() { - _, err := NewSubstrateConfig(map[string]interface{}{ - "startBlock": "invalid", - }) - - s.NotNil(err) -} - -func (s *NewSubstrateConfigTestSuite) Test_FailedGeneralConfigValidation() { - _, err := NewSubstrateConfig(map[string]interface{}{}) - - s.NotNil(err) -} -func (s *NewSubstrateConfigTestSuite) Test_ValidConfig() { - rawConfig := map[string]interface{}{ - "id": 1, - "chainID": 5, - "substrateNetwork": 0, - "endpoint": "ws://domain.com", - "name": "substrate1", - } - - actualConfig, err := NewSubstrateConfig(rawConfig) - - id := new(uint8) - *id = 1 - s.Nil(err) - s.Equal(*actualConfig, SubstrateConfig{ - GeneralChainConfig: chain.GeneralChainConfig{ - Name: "substrate1", - Endpoint: "ws://domain.com", - Id: id, - }, - StartBlock: big.NewInt(0), - ChainID: big.NewInt(5), - SubstrateNetwork: uint16(0), - BlockInterval: big.NewInt(5), - BlockRetryInterval: time.Duration(5) * time.Second, - }) -} - -func (s *NewSubstrateConfigTestSuite) Test_ValidConfigWithCustomParams() { - rawConfig := map[string]interface{}{ - "id": 1, - "endpoint": "ws://domain.com", - "name": "substrate1", - "chainID": 5, - "substrateNetwork": 0, - "startBlock": 1000, - "blockRetryInterval": 10, - "blockInterval": 2, - } - - actualConfig, err := NewSubstrateConfig(rawConfig) - - id := new(uint8) - *id = 1 - s.Nil(err) - s.Equal(*actualConfig, SubstrateConfig{ - GeneralChainConfig: chain.GeneralChainConfig{ - Name: "substrate1", - Endpoint: "ws://domain.com", - Id: id, - }, - ChainID: big.NewInt(5), - SubstrateNetwork: uint16(0), - StartBlock: big.NewInt(1000), - BlockInterval: big.NewInt(2), - BlockRetryInterval: time.Duration(10) * time.Second, - }) -} diff --git a/chains/substrate/events/events.go b/chains/substrate/events/events.go deleted file mode 100644 index fe8b765c..00000000 --- a/chains/substrate/events/events.go +++ /dev/null @@ -1,34 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package events - -import ( - "time" - - "github.com/centrifuge/go-substrate-rpc-client/v4/types" -) - -type Deposit struct { - DestDomainID types.U8 `mapstructure:"dest_domain_id"` - ResourceID types.Bytes32 `mapstructure:"resource_id"` - DepositNonce types.U64 `mapstructure:"deposit_nonce"` - TransferType types.U8 `mapstructure:"sygma_traits_TransferType"` - CallData []byte `mapstructure:"deposit_data"` - Handler [1]byte `mapstructure:"handler_response"` - Timestamp time.Time `mapstructure:"block_timestamp"` -} - -type Retry struct { - DepositOnBlockHeight types.U128 `mapstructure:"deposit_on_block_height"` - DestDomainID types.U8 `mapstructure:"dest_domain_id"` -} - -const ( - ParachainUpdatedEvent = "ParachainSystem.ValidationFunctionApplied" - ExtrinsicFailedEvent = "System.ExtrinsicFailed" - ExtrinsicSuccessEvent = "System.ExtrinsicSuccess" - RetryEvent = "SygmaBridge.Retry" - DepositEvent = "SygmaBridge.Deposit" - FailedHandlerExecutionEvent = "SygmaBridge.FailedHandlerExecution" -) diff --git a/chains/substrate/executor/executor.go b/chains/substrate/executor/executor.go deleted file mode 100644 index de22429a..00000000 --- a/chains/substrate/executor/executor.go +++ /dev/null @@ -1,211 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package executor - -import ( - "context" - "fmt" - "math/big" - "sync" - "time" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/binance-chain/tss-lib/common" - "github.com/sourcegraph/conc/pool" - "github.com/sygmaprotocol/sygma-core/chains/substrate/connection" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" - - "github.com/centrifuge/go-substrate-rpc-client/v4/rpc/author" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" - ethCommon "github.com/ethereum/go-ethereum/common" - - "github.com/libp2p/go-libp2p/core/host" - "github.com/rs/zerolog/log" - - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/signing" -) - -var ( - executionCheckPeriod = time.Minute - signingTimeout = 30 * time.Minute -) - -type BridgePallet interface { - IsProposalExecuted(p *transfer.TransferProposal) (bool, error) - ExecuteProposals(proposals []*transfer.TransferProposal, signature []byte) (types.Hash, *author.ExtrinsicStatusSubscription, error) - ProposalsHash(proposals []*transfer.TransferProposal) ([]byte, error) - TrackExtrinsic(extHash types.Hash, sub *author.ExtrinsicStatusSubscription) error -} - -type Executor struct { - coordinator *tss.Coordinator - host host.Host - comm comm.Communication - fetcher signing.SaveDataFetcher - bridge BridgePallet - conn *connection.Connection - exitLock *sync.RWMutex -} - -func NewExecutor( - host host.Host, - comm comm.Communication, - coordinator *tss.Coordinator, - bridgePallet BridgePallet, - fetcher signing.SaveDataFetcher, - conn *connection.Connection, - exitLock *sync.RWMutex, -) *Executor { - return &Executor{ - host: host, - comm: comm, - coordinator: coordinator, - bridge: bridgePallet, - fetcher: fetcher, - conn: conn, - exitLock: exitLock, - } -} - -// Execute starts a signing process and executes proposals when signature is generated -func (e *Executor) Execute(proposals []*proposal.Proposal) error { - e.exitLock.RLock() - defer e.exitLock.RUnlock() - - transferProposals := make([]*transfer.TransferProposal, 0) - for _, prop := range proposals { - transferProposal := &transfer.TransferProposal{ - Source: prop.Source, - Destination: prop.Destination, - Data: prop.Data.(transfer.TransferProposalData), - Type: prop.Type, - MessageID: prop.MessageID, - } - transferProposals = append(transferProposals, transferProposal) - - isExecuted, err := e.bridge.IsProposalExecuted(transferProposal) - if err != nil { - return err - } - if isExecuted { - continue - } - - proposals = append(proposals, prop) - } - if len(proposals) == 0 { - return nil - } - - propHash, err := e.bridge.ProposalsHash(transferProposals) - if err != nil { - return err - } - - messageID := transferProposals[0].MessageID - msg := big.NewInt(0) - msg.SetBytes(propHash) - signing, err := signing.NewSigning( - msg, - messageID, - messageID, - e.host, - e.comm, - e.fetcher) - if err != nil { - return err - } - - sigChn := make(chan interface{}) - executionContext, cancelExecution := context.WithCancel(context.Background()) - watchContext, cancelWatch := context.WithCancel(context.Background()) - - pool := pool.New().WithErrors() - pool.Go(func() error { - err := e.coordinator.Execute(executionContext, []tss.TssProcess{signing}, sigChn) - if err != nil { - cancelWatch() - } - - return err - }) - pool.Go(func() error { - return e.watchExecution(watchContext, cancelExecution, transferProposals, sigChn, messageID) - }) - return pool.Wait() -} - -func (e *Executor) watchExecution(ctx context.Context, cancelExecution context.CancelFunc, proposals []*transfer.TransferProposal, sigChn chan interface{}, sessionID string) error { - ticker := time.NewTicker(executionCheckPeriod) - timeout := time.NewTicker(signingTimeout) - defer ticker.Stop() - defer timeout.Stop() - defer cancelExecution() - - for { - select { - case sigResult := <-sigChn: - { - cancelExecution() - if sigResult == nil { - continue - } - - signatureData := sigResult.(*common.SignatureData) - hash, sub, err := e.executeProposal(proposals, signatureData) - if err != nil { - _ = e.comm.Broadcast(e.host.Peerstore().Peers(), []byte{}, comm.TssFailMsg, sessionID) - return err - } - - return e.bridge.TrackExtrinsic(hash, sub) - } - case <-ticker.C: - { - if !e.areProposalsExecuted(proposals) { - continue - } - - log.Info().Str("messageID", sessionID).Msgf("Successfully executed proposals") - return nil - } - case <-timeout.C: - { - return fmt.Errorf("execution timed out in %s", signingTimeout) - } - case <-ctx.Done(): - { - return nil - } - } - } -} - -func (e *Executor) executeProposal(proposals []*transfer.TransferProposal, signatureData *common.SignatureData) (types.Hash, *author.ExtrinsicStatusSubscription, error) { - sig := []byte{} - sig = append(sig[:], ethCommon.LeftPadBytes(signatureData.R, 32)...) - sig = append(sig[:], ethCommon.LeftPadBytes(signatureData.S, 32)...) - sig = append(sig[:], signatureData.SignatureRecovery...) - sig[len(sig)-1] += 27 // Transform V from 0/1 to 27/28 - - hash, sub, err := e.bridge.ExecuteProposals(proposals, sig) - if err != nil { - return types.Hash{}, nil, err - } - - return hash, sub, err -} - -func (e *Executor) areProposalsExecuted(proposals []*transfer.TransferProposal) bool { - for _, prop := range proposals { - isExecuted, err := e.bridge.IsProposalExecuted(prop) - if err != nil || !isExecuted { - return false - } - } - - return true -} diff --git a/chains/substrate/executor/message-handler.go b/chains/substrate/executor/message-handler.go deleted file mode 100644 index 75613fdf..00000000 --- a/chains/substrate/executor/message-handler.go +++ /dev/null @@ -1,130 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package executor - -import ( - "errors" - "fmt" - "math/big" - - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ChainSafe/sygma-relayer/store" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" - "github.com/ethereum/go-ethereum/common" - "github.com/sygmaprotocol/sygma-core/relayer/message" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" -) - -type SubstrateMessageHandler struct{} - -func (mh *SubstrateMessageHandler) HandleMessage(m *message.Message) (*proposal.Proposal, error) { - transferMessage := &transfer.TransferMessage{ - Source: m.Source, - Destination: m.Destination, - Data: m.Data.(transfer.TransferMessageData), - Type: m.Type, - ID: m.ID, - } - switch transferMessage.Data.Type { - case transfer.FungibleTransfer: - return fungibleTransferMessageHandler(transferMessage) - } - return nil, errors.New("wrong message type passed while handling message") -} - -func fungibleTransferMessageHandler(m *transfer.TransferMessage) (*proposal.Proposal, error) { - if len(m.Data.Payload) != 2 { - return nil, errors.New("malformed payload. Len of payload should be 2") - } - amount, ok := m.Data.Payload[0].([]byte) - if !ok { - return nil, errors.New("wrong payload amount format") - } - recipient, ok := m.Data.Payload[1].([]byte) - if !ok { - return nil, errors.New("wrong payload recipient format") - } - var data []byte - data = append(data, common.LeftPadBytes(amount, 32)...) // amount (uint256) - - recipientLen := big.NewInt(int64(len(recipient))).Bytes() - data = append(data, common.LeftPadBytes(recipientLen, 32)...) - data = append(data, recipient...) - return proposal.NewProposal(m.Source, m.Destination, transfer.TransferProposalData{ - DepositNonce: m.Data.DepositNonce, - ResourceId: m.Data.ResourceId, - Metadata: m.Data.Metadata, - Data: data, - }, m.ID, transfer.TransferProposalType), nil -} - -type PropStorer interface { - StorePropStatus(source, destination uint8, depositNonce uint64, status store.PropStatus) error - PropStatus(source, destination uint8, depositNonce uint64) (store.PropStatus, error) -} - -type BlockFetcher interface { - GetFinalizedHead() (types.Hash, error) - GetBlock(blockHash types.Hash) (*types.SignedBlock, error) -} - -type DepositProcessor interface { - ProcessDeposits(startBlock *big.Int, endBlock *big.Int) (map[uint8][]*message.Message, error) -} - -type RetryMessageHandler struct { - depositProcessor DepositProcessor - blockFetcher BlockFetcher - propStorer PropStorer - msgChan chan []*message.Message -} - -func NewRetryMessageHandler( - depositProcessor DepositProcessor, - blockFetcher BlockFetcher, - propStorer PropStorer, - msgChan chan []*message.Message) *RetryMessageHandler { - return &RetryMessageHandler{ - depositProcessor: depositProcessor, - blockFetcher: blockFetcher, - propStorer: propStorer, - msgChan: msgChan, - } -} - -func (h *RetryMessageHandler) HandleMessage(msg *message.Message) (*proposal.Proposal, error) { - retryData := msg.Data.(retry.RetryMessageData) - hash, err := h.blockFetcher.GetFinalizedHead() - if err != nil { - return nil, err - } - finalized, err := h.blockFetcher.GetBlock(hash) - if err != nil { - return nil, err - } - latestBlock := big.NewInt(int64(finalized.Block.Header.Number)) - if latestBlock.Cmp(retryData.BlockHeight) != 1 { - return nil, fmt.Errorf( - "latest block %s higher than receipt block number %s", - latestBlock, - retryData.BlockHeight, - ) - } - - domainDeposits, err := h.depositProcessor.ProcessDeposits(retryData.BlockHeight, retryData.BlockHeight) - if err != nil { - return nil, err - } - filteredDeposits, err := retry.FilterDeposits(h.propStorer, domainDeposits, retryData.ResourceID, retryData.DestinationDomainID) - if err != nil { - return nil, err - } - if len(filteredDeposits) == 0 { - return nil, nil - } - - h.msgChan <- filteredDeposits - return nil, nil -} diff --git a/chains/substrate/executor/message-handler_test.go b/chains/substrate/executor/message-handler_test.go deleted file mode 100644 index 9314911a..00000000 --- a/chains/substrate/executor/message-handler_test.go +++ /dev/null @@ -1,363 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package executor_test - -import ( - "encoding/hex" - "errors" - "math/big" - "testing" - "unsafe" - - "github.com/ChainSafe/sygma-relayer/chains/substrate/executor" - mock_executor "github.com/ChainSafe/sygma-relayer/chains/substrate/executor/mock" - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ChainSafe/sygma-relayer/store" - "github.com/ethereum/go-ethereum/common" - "github.com/golang/mock/gomock" - - "github.com/ChainSafe/sygma-relayer/e2e/evm" - "github.com/ChainSafe/sygma-relayer/e2e/substrate" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" - "github.com/sygmaprotocol/sygma-core/relayer/message" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" - - "github.com/stretchr/testify/suite" -) - -var errIncorrectFungibleTransferPayloadLen = errors.New("malformed payload. Len of payload should be 2") -var errIncorrectAmount = errors.New("wrong payload amount format") -var errIncorrectRecipient = errors.New("wrong payload recipient format") - -type FungibleTransferHandlerTestSuite struct { - suite.Suite -} - -func TestRunFungibleTransferHandlerTestSuite(t *testing.T) { - suite.Run(t, new(FungibleTransferHandlerTestSuite)) -} - -func (s *FungibleTransferHandlerTestSuite) TestFungibleTransferHandleMessage() { - recipientAddr := *(*[]types.U8)(unsafe.Pointer(&substrate.SubstratePK.PublicKey)) - recipient := substrate.ConstructRecipientData(recipientAddr) - - message := &message.Message{ - Source: 1, - Destination: 2, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{1}, - Payload: []interface{}{ - []byte{2}, // amount - recipient, - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - } - data, _ := hex.DecodeString("0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002400010100d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d") - expectedProp := &proposal.Proposal{ - Source: 1, - Destination: 2, - Data: transfer.TransferProposalData{ - DepositNonce: 1, - ResourceId: [32]byte{1}, - Data: data, - }, - Type: transfer.TransferProposalType, - } - - mh := executor.SubstrateMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(err) - s.Equal(prop, expectedProp) -} - -func (s *FungibleTransferHandlerTestSuite) TestFungibleTransferHandleMessageIncorrectDataLen() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{1}, - Payload: []interface{}{ - []byte{2}, // amount - }, - Type: transfer.FungibleTransfer, - }, - - Type: transfer.TransferMessageType, - } - - mh := executor.SubstrateMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectFungibleTransferPayloadLen.Error()) -} - -func (s *FungibleTransferHandlerTestSuite) TestFungibleTransferHandleMessageIncorrectAmount() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - "incorrectAmount", // amount - []byte{0x8e, 0xaf, 0x4, 0x15, 0x16, 0x87, 0x73, 0x63, 0x26, 0xc9, 0xfe, 0xa1, 0x7e, 0x25, 0xfc, 0x52, 0x87, 0x61, 0x36, 0x93, 0xc9, 0x12, 0x90, 0x9c, 0xb2, 0x26, 0xaa, 0x47, 0x94, 0xf2, 0x6a, 0x48}, // recipientAddress - }, - Type: transfer.FungibleTransfer, - }, - - Type: transfer.TransferMessageType, - } - - mh := executor.SubstrateMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectAmount.Error()) -} - -func (s *FungibleTransferHandlerTestSuite) TestFungibleTransferHandleMessageIncorrectRecipient() { - message := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - "incorrectRecipient", // recipientAddress - }, - Type: transfer.FungibleTransfer, - }, - - Type: transfer.TransferMessageType, - } - - mh := executor.SubstrateMessageHandler{} - prop, err := mh.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) - s.EqualError(err, errIncorrectRecipient.Error()) -} - -func (s *FungibleTransferHandlerTestSuite) TestSuccesfullyRegisterFungibleTransferMessageHandler() { - recipientAddr := *(*[]types.U8)(unsafe.Pointer(&substrate.SubstratePK.PublicKey)) - recipient := substrate.ConstructRecipientData(recipientAddr) - - messageData := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - recipient, - }, - Type: transfer.FungibleTransfer, - }, - - Type: transfer.TransferMessageType, - } - - invalidMessageData := &message.Message{ - Source: 1, - Destination: 0, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: [32]byte{0}, - Payload: []interface{}{ - []byte{2}, // amount - recipient, - }, - }, - - Type: "NonFungibleTransfer", - } - - depositMessageHandler := message.NewMessageHandler() - // Register FungibleTransferMessageHandler function - depositMessageHandler.RegisterMessageHandler(transfer.TransferMessageType, &executor.SubstrateMessageHandler{}) - prop1, err1 := depositMessageHandler.HandleMessage(messageData) - s.Nil(err1) - s.NotNil(prop1) - - // Use unregistered transfer type - prop2, err2 := depositMessageHandler.HandleMessage(invalidMessageData) - s.Nil(prop2) - s.NotNil(err2) -} - -type RetryMessageHandlerTestSuite struct { - suite.Suite - - messageHandler *executor.RetryMessageHandler - mockBlockFetcher *mock_executor.MockBlockFetcher - mockDepositProcessor *mock_executor.MockDepositProcessor - mockPropStorer *mock_executor.MockPropStorer - msgChan chan []*message.Message -} - -func TestRunRetryMessageHandlerTestSuite(t *testing.T) { - suite.Run(t, new(RetryMessageHandlerTestSuite)) -} - -func (s *RetryMessageHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.mockBlockFetcher = mock_executor.NewMockBlockFetcher(ctrl) - s.mockDepositProcessor = mock_executor.NewMockDepositProcessor(ctrl) - s.mockPropStorer = mock_executor.NewMockPropStorer(ctrl) - s.msgChan = make(chan []*message.Message, 1) - s.messageHandler = executor.NewRetryMessageHandler( - s.mockDepositProcessor, - s.mockBlockFetcher, - s.mockPropStorer, - s.msgChan) -} - -func (s *RetryMessageHandlerTestSuite) Test_HandleMessage_RetryNotFinalized() { - s.mockBlockFetcher.EXPECT().GetFinalizedHead().Return(types.Hash{}, nil) - s.mockBlockFetcher.EXPECT().GetBlock(gomock.Any()).Return(&types.SignedBlock{ - Block: types.Block{ - Header: types.Header{ - Number: 99, - }, - }, - }, nil) - - message := &message.Message{ - Source: 1, - Destination: 3, - Data: retry.RetryMessageData{ - SourceDomainID: 3, - DestinationDomainID: 4, - BlockHeight: big.NewInt(100), - ResourceID: [32]byte{}, - }, - Type: transfer.TransferMessageType, - } - - prop, err := s.messageHandler.HandleMessage(message) - - s.Nil(prop) - s.NotNil(err) -} - -func (s *RetryMessageHandlerTestSuite) Test_HandleMessage_NoDeposits() { - s.mockBlockFetcher.EXPECT().GetFinalizedHead().Return(types.Hash{}, nil) - s.mockBlockFetcher.EXPECT().GetBlock(gomock.Any()).Return(&types.SignedBlock{ - Block: types.Block{ - Header: types.Header{ - Number: 101, - }, - }, - }, nil) - s.mockDepositProcessor.EXPECT().ProcessDeposits(big.NewInt(100), big.NewInt(100)).Return(make(map[uint8][]*message.Message), nil) - - message := &message.Message{ - Source: 1, - Destination: 3, - Data: retry.RetryMessageData{ - SourceDomainID: 3, - DestinationDomainID: 4, - BlockHeight: big.NewInt(100), - ResourceID: [32]byte{}, - }, - Type: transfer.TransferMessageType, - } - - prop, err := s.messageHandler.HandleMessage(message) - - s.Nil(prop) - s.Nil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *RetryMessageHandlerTestSuite) Test_HandleMessage_ValidDeposits() { - s.mockBlockFetcher.EXPECT().GetFinalizedHead().Return(types.Hash{}, nil) - s.mockBlockFetcher.EXPECT().GetBlock(gomock.Any()).Return(&types.SignedBlock{ - Block: types.Block{ - Header: types.Header{ - Number: 101, - }, - }, - }, nil) - - validResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{3}, 31)) - invalidResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{4}, 31)) - invalidDomain := uint8(3) - validDomain := uint8(4) - - executedNonce := uint64(1) - failedNonce := uint64(3) - - deposits := make(map[uint8][]*message.Message) - deposits[invalidDomain] = []*message.Message{ - { - Destination: invalidDomain, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: validResource, - }, - }, - } - deposits[validDomain] = []*message.Message{ - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: executedNonce, - ResourceId: validResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: 2, - ResourceId: invalidResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: failedNonce, - ResourceId: validResource, - }, - }, - } - s.mockDepositProcessor.EXPECT().ProcessDeposits(big.NewInt(100), big.NewInt(100)).Return(deposits, nil) - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, executedNonce).Return(store.ExecutedProp, nil) - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, failedNonce).Return(store.FailedProp, nil) - - message := &message.Message{ - Source: 1, - Destination: 3, - Data: retry.RetryMessageData{ - SourceDomainID: invalidDomain, - DestinationDomainID: validDomain, - BlockHeight: big.NewInt(100), - ResourceID: validResource, - }, - Type: transfer.TransferMessageType, - } - - prop, err := s.messageHandler.HandleMessage(message) - - s.Nil(prop) - s.Nil(err) - msgs := <-s.msgChan - s.Equal(msgs[0].Data.(transfer.TransferMessageData).DepositNonce, failedNonce) - s.Equal(msgs[0].Destination, validDomain) -} diff --git a/chains/substrate/executor/mock/message-handler.go b/chains/substrate/executor/mock/message-handler.go deleted file mode 100644 index d476efc7..00000000 --- a/chains/substrate/executor/mock/message-handler.go +++ /dev/null @@ -1,158 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./chains/substrate/executor/message-handler.go - -// Package mock_executor is a generated GoMock package. -package mock_executor - -import ( - big "math/big" - reflect "reflect" - - store "github.com/ChainSafe/sygma-relayer/store" - types "github.com/centrifuge/go-substrate-rpc-client/v4/types" - gomock "github.com/golang/mock/gomock" - message "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -// MockPropStorer is a mock of PropStorer interface. -type MockPropStorer struct { - ctrl *gomock.Controller - recorder *MockPropStorerMockRecorder -} - -// MockPropStorerMockRecorder is the mock recorder for MockPropStorer. -type MockPropStorerMockRecorder struct { - mock *MockPropStorer -} - -// NewMockPropStorer creates a new mock instance. -func NewMockPropStorer(ctrl *gomock.Controller) *MockPropStorer { - mock := &MockPropStorer{ctrl: ctrl} - mock.recorder = &MockPropStorerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockPropStorer) EXPECT() *MockPropStorerMockRecorder { - return m.recorder -} - -// PropStatus mocks base method. -func (m *MockPropStorer) PropStatus(source, destination uint8, depositNonce uint64) (store.PropStatus, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "PropStatus", source, destination, depositNonce) - ret0, _ := ret[0].(store.PropStatus) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// PropStatus indicates an expected call of PropStatus. -func (mr *MockPropStorerMockRecorder) PropStatus(source, destination, depositNonce interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PropStatus", reflect.TypeOf((*MockPropStorer)(nil).PropStatus), source, destination, depositNonce) -} - -// StorePropStatus mocks base method. -func (m *MockPropStorer) StorePropStatus(source, destination uint8, depositNonce uint64, status store.PropStatus) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "StorePropStatus", source, destination, depositNonce, status) - ret0, _ := ret[0].(error) - return ret0 -} - -// StorePropStatus indicates an expected call of StorePropStatus. -func (mr *MockPropStorerMockRecorder) StorePropStatus(source, destination, depositNonce, status interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorePropStatus", reflect.TypeOf((*MockPropStorer)(nil).StorePropStatus), source, destination, depositNonce, status) -} - -// MockBlockFetcher is a mock of BlockFetcher interface. -type MockBlockFetcher struct { - ctrl *gomock.Controller - recorder *MockBlockFetcherMockRecorder -} - -// MockBlockFetcherMockRecorder is the mock recorder for MockBlockFetcher. -type MockBlockFetcherMockRecorder struct { - mock *MockBlockFetcher -} - -// NewMockBlockFetcher creates a new mock instance. -func NewMockBlockFetcher(ctrl *gomock.Controller) *MockBlockFetcher { - mock := &MockBlockFetcher{ctrl: ctrl} - mock.recorder = &MockBlockFetcherMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockBlockFetcher) EXPECT() *MockBlockFetcherMockRecorder { - return m.recorder -} - -// GetBlock mocks base method. -func (m *MockBlockFetcher) GetBlock(blockHash types.Hash) (*types.SignedBlock, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlock", blockHash) - ret0, _ := ret[0].(*types.SignedBlock) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlock indicates an expected call of GetBlock. -func (mr *MockBlockFetcherMockRecorder) GetBlock(blockHash interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlock", reflect.TypeOf((*MockBlockFetcher)(nil).GetBlock), blockHash) -} - -// GetFinalizedHead mocks base method. -func (m *MockBlockFetcher) GetFinalizedHead() (types.Hash, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetFinalizedHead") - ret0, _ := ret[0].(types.Hash) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetFinalizedHead indicates an expected call of GetFinalizedHead. -func (mr *MockBlockFetcherMockRecorder) GetFinalizedHead() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFinalizedHead", reflect.TypeOf((*MockBlockFetcher)(nil).GetFinalizedHead)) -} - -// MockDepositProcessor is a mock of DepositProcessor interface. -type MockDepositProcessor struct { - ctrl *gomock.Controller - recorder *MockDepositProcessorMockRecorder -} - -// MockDepositProcessorMockRecorder is the mock recorder for MockDepositProcessor. -type MockDepositProcessorMockRecorder struct { - mock *MockDepositProcessor -} - -// NewMockDepositProcessor creates a new mock instance. -func NewMockDepositProcessor(ctrl *gomock.Controller) *MockDepositProcessor { - mock := &MockDepositProcessor{ctrl: ctrl} - mock.recorder = &MockDepositProcessorMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDepositProcessor) EXPECT() *MockDepositProcessorMockRecorder { - return m.recorder -} - -// ProcessDeposits mocks base method. -func (m *MockDepositProcessor) ProcessDeposits(startBlock, endBlock *big.Int) (map[uint8][]*message.Message, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ProcessDeposits", startBlock, endBlock) - ret0, _ := ret[0].(map[uint8][]*message.Message) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ProcessDeposits indicates an expected call of ProcessDeposits. -func (mr *MockDepositProcessorMockRecorder) ProcessDeposits(startBlock, endBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProcessDeposits", reflect.TypeOf((*MockDepositProcessor)(nil).ProcessDeposits), startBlock, endBlock) -} diff --git a/chains/substrate/listener/deposit-handler.go b/chains/substrate/listener/deposit-handler.go deleted file mode 100644 index 1f6bb388..00000000 --- a/chains/substrate/listener/deposit-handler.go +++ /dev/null @@ -1,120 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener - -import ( - "errors" - "time" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" - "github.com/rs/zerolog/log" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type DepositHandlers map[transfer.TransferType]DepositHandlerFunc -type DepositHandlerFunc func(sourceID uint8, destId types.U8, nonce types.U64, resourceID types.Bytes32, calldata []byte, messageID string, timestamp time.Time) (*message.Message, error) - -type SubstrateDepositHandler struct { - depositHandlers DepositHandlers -} - -const ( - FungibleTransfer = iota -) - -// NewSubstrateDepositHandler creates an instance of SubstrateDepositHandler that contains -// handler functions for processing deposit events -func NewSubstrateDepositHandler() *SubstrateDepositHandler { - return &SubstrateDepositHandler{ - depositHandlers: make(map[transfer.TransferType]DepositHandlerFunc), - } -} - -func (e *SubstrateDepositHandler) HandleDeposit( - sourceID uint8, - destID types.U8, - depositNonce types.U64, - resourceID types.Bytes32, - calldata []byte, - transferType types.U8, - messageID string, - timestamp time.Time) (*message.Message, error) { - var depositType transfer.TransferType - if transferType == FungibleTransfer { - depositType = transfer.FungibleTransfer - } else { - return nil, errors.New("no corresponding deposit handler for this transfer type exists") - } - - depositHandler, err := e.matchTransferTypeHandlerFunc(depositType) - if err != nil { - return nil, err - } - - return depositHandler(sourceID, destID, depositNonce, resourceID, calldata, messageID, timestamp) -} - -// matchAddressWithHandlerFunc matches a transfer type with an associated handler function -func (e *SubstrateDepositHandler) matchTransferTypeHandlerFunc(transferType transfer.TransferType) (DepositHandlerFunc, error) { - hf, ok := e.depositHandlers[transferType] - if !ok { - return nil, errors.New("no corresponding deposit handler for this transfer type exists") - } - return hf, nil -} - -// RegisterDepositHandler registers an event handler by associating a handler function to a transfer type -func (e *SubstrateDepositHandler) RegisterDepositHandler(transferType transfer.TransferType, handler DepositHandlerFunc) { - if transferType == "" { - return - } - - log.Info().Msgf("Registered deposit handler for transfer type %s", transferType) - e.depositHandlers[transferType] = handler -} - -// FungibleTransferHandler converts data pulled from event logs into message -// handlerResponse can be an empty slice -func FungibleTransferHandler( - sourceID uint8, - destID types.U8, - nonce types.U64, - resourceID types.Bytes32, - calldata []byte, - messageID string, - timestamp time.Time) (*message.Message, error) { - if len(calldata) < 84 { - err := errors.New("invalid calldata length: less than 84 bytes") - return nil, err - } - - // amount: first 32 bytes of calldata - amount := calldata[:32] - - // 32-64 is multiLocation length - recipientAddressLength, _ := types.IntBytesToBigInt(calldata[32:64]) - - // 64 - (64 + multiLocation length) is recipient address - recipientAddress := calldata[64:(64 + recipientAddressLength.Int64())] - - // if there is priority data, parse it and use it - payload := []interface{}{ - amount, - recipientAddress, - } - - return message.NewMessage( - sourceID, - uint8(destID), - transfer.TransferMessageData{ - DepositNonce: uint64(nonce), - ResourceId: resourceID, - Payload: payload, - Type: transfer.FungibleTransfer, - }, - messageID, - transfer.TransferMessageType, - timestamp), nil -} diff --git a/chains/substrate/listener/deposit-handler_test.go b/chains/substrate/listener/deposit-handler_test.go deleted file mode 100644 index 918be8a6..00000000 --- a/chains/substrate/listener/deposit-handler_test.go +++ /dev/null @@ -1,153 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener_test - -import ( - "errors" - "time" - "unsafe" - - "github.com/sygmaprotocol/sygma-core/relayer/message" - - "github.com/centrifuge/go-substrate-rpc-client/v4/types" - - "math/big" - "testing" - - "github.com/ChainSafe/sygma-relayer/chains/substrate/events" - "github.com/ChainSafe/sygma-relayer/chains/substrate/listener" - "github.com/ChainSafe/sygma-relayer/e2e/substrate" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/stretchr/testify/suite" -) - -var errNoCorrespondingDepositHandler = errors.New("no corresponding deposit handler for this transfer type exists") -var errIncorrectDataLen = errors.New("invalid calldata length: less than 84 bytes") - -type Erc20HandlerTestSuite struct { - suite.Suite -} - -func TestRunErc20HandlerTestSuite(t *testing.T) { - suite.Run(t, new(Erc20HandlerTestSuite)) -} - -func (s *Erc20HandlerTestSuite) TestErc20HandleEvent() { - recipientAddr := *(*[]types.U8)(unsafe.Pointer(&substrate.SubstratePK.PublicKey)) - recipient := substrate.ConstructRecipientData(recipientAddr) - - var calldata []byte - amount, _ := types.BigIntToIntBytes(big.NewInt(2), 32) - calldata = append(calldata, amount...) - recipientLen, _ := (types.BigIntToIntBytes(big.NewInt(int64(len(recipient))), 32)) - calldata = append(calldata, recipientLen...) - calldata = append(calldata, types.Bytes(recipient)...) - - timestamp := time.Now() - depositLog := &events.Deposit{ - DestDomainID: types.NewU8(2), - ResourceID: types.Bytes32{1}, - DepositNonce: types.NewU64(1), - TransferType: types.NewU8(0), - CallData: calldata, - Handler: [1]byte{0}, - Timestamp: timestamp, - } - - sourceID := uint8(1) - amountParsed := calldata[:32] - recipientAddressParsed := calldata[64:] - - expected := &message.Message{ - Source: sourceID, - Destination: uint8(depositLog.DestDomainID), - Data: transfer.TransferMessageData{ - DepositNonce: uint64(depositLog.DepositNonce), - ResourceId: depositLog.ResourceID, - Payload: []interface{}{ - amountParsed, - recipientAddressParsed, - }, - Type: transfer.FungibleTransfer, - }, - Type: transfer.TransferMessageType, - ID: "messageID", - Timestamp: timestamp, - } - - message, err := listener.FungibleTransferHandler( - sourceID, - depositLog.DestDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.CallData, - "messageID", - timestamp) - - s.Nil(err) - s.NotNil(message) - s.Equal(message, expected) -} - -func (s *Erc20HandlerTestSuite) TestErc20HandleEventIncorrectdeposit_dataLen() { - var calldata []byte - - depositLog := &events.Deposit{ - DestDomainID: types.NewU8(2), - ResourceID: types.Bytes32{1}, - DepositNonce: types.NewU64(1), - TransferType: types.NewU8(0), - CallData: calldata, - Handler: [1]byte{0}, - } - - sourceID := uint8(1) - - message, err := listener.FungibleTransferHandler( - sourceID, - depositLog.DestDomainID, - depositLog.DepositNonce, - depositLog.ResourceID, - depositLog.CallData, - "messageID", - time.Now()) - s.Nil(message) - s.EqualError(err, errIncorrectDataLen.Error()) -} - -func (s *Erc20HandlerTestSuite) TestSuccesfullyRegisterFungibleTransferHandler() { - recipientAddr := *(*[]types.U8)(unsafe.Pointer(&substrate.SubstratePK.PublicKey)) - recipient := substrate.ConstructRecipientData(recipientAddr) - // Create calldata - var calldata []byte - amount, _ := types.BigIntToIntBytes(big.NewInt(2), 32) - calldata = append(calldata, amount...) - recipientLen, _ := (types.BigIntToIntBytes(big.NewInt(int64(len(recipient))), 32)) - calldata = append(calldata, recipientLen...) - calldata = append(calldata, types.Bytes(recipient)...) - - timestamp := time.Now() - d1 := &events.Deposit{ - DestDomainID: types.NewU8(2), - ResourceID: types.Bytes32{1}, - DepositNonce: types.NewU64(1), - TransferType: types.NewU8(0), - CallData: calldata, - Timestamp: timestamp, - Handler: [1]byte{0}, - } - - depositHandler := listener.NewSubstrateDepositHandler() - // Register FungibleTransferHandler function - depositHandler.RegisterDepositHandler(transfer.FungibleTransfer, listener.FungibleTransferHandler) - message1, err1 := depositHandler.HandleDeposit(1, d1.DestDomainID, d1.DepositNonce, d1.ResourceID, d1.CallData, d1.TransferType, "messageID", d1.Timestamp) - s.Nil(err1) - s.NotNil(message1) - - // Use unregistered transfer type - message2, err2 := depositHandler.HandleDeposit(1, d1.DestDomainID, d1.DepositNonce, d1.ResourceID, d1.CallData, 1, "messageID", d1.Timestamp) - s.Nil(message2) - s.NotNil(err2) - s.EqualError(err2, errNoCorrespondingDepositHandler.Error()) -} diff --git a/chains/substrate/listener/event-handlers.go b/chains/substrate/listener/event-handlers.go deleted file mode 100644 index c91f1a32..00000000 --- a/chains/substrate/listener/event-handlers.go +++ /dev/null @@ -1,240 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener - -import ( - "fmt" - "math/big" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/substrate/events" - "github.com/centrifuge/go-substrate-rpc-client/v4/registry/parser" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type Connection interface { - GetFinalizedHead() (types.Hash, error) - GetBlock(blockHash types.Hash) (*types.SignedBlock, error) - GetBlockHash(blockNumber uint64) (types.Hash, error) - GetBlockEvents(hash types.Hash) ([]*parser.Event, error) - UpdateMetatdata() error - FetchEvents(startBlock, endBlock *big.Int) ([]*parser.Event, error) -} - -type SystemUpdateEventHandler struct { - conn Connection -} - -func NewSystemUpdateEventHandler(conn Connection) *SystemUpdateEventHandler { - return &SystemUpdateEventHandler{ - conn: conn, - } -} - -func (eh *SystemUpdateEventHandler) HandleEvents(startBlock *big.Int, endBlock *big.Int) error { - evts, err := eh.conn.FetchEvents(startBlock, endBlock) - if err != nil { - log.Error().Err(err).Msg("Error fetching events") - return err - } - for _, e := range evts { - if e.Name == events.ParachainUpdatedEvent { - log.Info().Msgf("Updating substrate metadata") - - err := eh.conn.UpdateMetatdata() - if err != nil { - log.Error().Err(err).Msg("Unable to update Metadata") - return err - } - } - } - - return nil -} - -type DepositHandler interface { - HandleDeposit( - sourceID uint8, - destID types.U8, - nonce types.U64, - resourceID types.Bytes32, - calldata []byte, - transferType types.U8, - messageID string, - timestamp time.Time, - ) (*message.Message, error) -} - -type FungibleTransferEventHandler struct { - domainID uint8 - depositHandler DepositHandler - log zerolog.Logger - msgChan chan []*message.Message - conn Connection -} - -func NewFungibleTransferEventHandler(logC zerolog.Context, domainID uint8, depositHandler DepositHandler, msgChan chan []*message.Message, conn Connection) *FungibleTransferEventHandler { - return &FungibleTransferEventHandler{ - depositHandler: depositHandler, - domainID: domainID, - log: logC.Logger(), - msgChan: msgChan, - conn: conn, - } -} - -func (eh *FungibleTransferEventHandler) HandleEvents(startBlock *big.Int, endBlock *big.Int) error { - domainDeposits, err := eh.ProcessDeposits(startBlock, endBlock) - if err != nil { - return err - } - - for _, deposits := range domainDeposits { - go func(d []*message.Message) { - eh.msgChan <- d - }(deposits) - } - return nil -} - -func (eh *FungibleTransferEventHandler) ProcessDeposits(startBlock *big.Int, endBlock *big.Int) (map[uint8][]*message.Message, error) { - evts, err := eh.conn.FetchEvents(startBlock, endBlock) - if err != nil { - log.Error().Err(err).Msg("Error fetching events") - return nil, err - } - - domainDeposits := make(map[uint8][]*message.Message) - - for _, evt := range evts { - if evt.Name == events.DepositEvent { - func(evt parser.Event) { - defer func() { - if r := recover(); r != nil { - log.Error().Msgf("panic occured while handling deposit %+v", evt) - } - }() - d, err := DecodeDepositEvent(evt.Fields) - if err != nil { - log.Error().Err(err).Msgf("%v", err) - return - } - - messageID := fmt.Sprintf("%d-%d-%d-%d", eh.domainID, d.DestDomainID, startBlock, endBlock) - m, err := eh.depositHandler.HandleDeposit( - eh.domainID, d.DestDomainID, d.DepositNonce, d.ResourceID, d.CallData, d.TransferType, messageID, d.Timestamp) - if err != nil { - log.Error().Err(err).Msgf("%v", err) - return - } - - eh.log.Info().Str("messageID", messageID).Msgf("Resolved deposit message %+v", d) - domainDeposits[m.Destination] = append(domainDeposits[m.Destination], m) - }(*evt) - } - } - return domainDeposits, nil -} - -type RetryEventHandler struct { - conn Connection - domainID uint8 - depositHandler DepositHandler - log zerolog.Logger - msgChan chan []*message.Message -} - -func NewRetryEventHandler(logC zerolog.Context, conn Connection, depositHandler DepositHandler, domainID uint8, msgChan chan []*message.Message) *RetryEventHandler { - return &RetryEventHandler{ - depositHandler: depositHandler, - domainID: domainID, - conn: conn, - log: logC.Logger(), - msgChan: msgChan, - } -} - -func (rh *RetryEventHandler) HandleEvents(startBlock *big.Int, endBlock *big.Int) error { - evts, err := rh.conn.FetchEvents(startBlock, endBlock) - if err != nil { - log.Error().Err(err).Msg("Error fetching events") - return err - } - - hash, err := rh.conn.GetFinalizedHead() - if err != nil { - return err - } - finalized, err := rh.conn.GetBlock(hash) - if err != nil { - return err - } - finalizedBlockNumber := big.NewInt(int64(finalized.Block.Header.Number)) - - domainDeposits := make(map[uint8][]*message.Message) - for _, evt := range evts { - if evt.Name == events.RetryEvent { - err := func(evt parser.Event) error { - defer func() { - if r := recover(); r != nil { - log.Error().Msgf("panic occured while handling retry event %+v because %s", evt, r) - } - }() - er, err := DecodeRetryEvent(evt.Fields) - if err != nil { - return err - } - // (latestBlockNumber - event.DepositOnBlockHeight) == blockConfirmations - if big.NewInt(finalizedBlockNumber.Int64()).Cmp(er.DepositOnBlockHeight.Int) == -1 { - log.Warn().Msgf("Retry event for block number %d has not enough confirmations", er.DepositOnBlockHeight) - return nil - } - - bh, err := rh.conn.GetBlockHash(er.DepositOnBlockHeight.Uint64()) - if err != nil { - return err - } - - bEvts, err := rh.conn.GetBlockEvents(bh) - if err != nil { - return err - } - - for _, event := range bEvts { - if event.Name == events.DepositEvent { - d, err := DecodeDepositEvent(event.Fields) - if err != nil { - return err - } - - messageID := fmt.Sprintf("retry-%d-%d-%d-%d", rh.domainID, d.DestDomainID, startBlock, endBlock) - m, err := rh.depositHandler.HandleDeposit( - rh.domainID, d.DestDomainID, d.DepositNonce, d.ResourceID, d.CallData, d.TransferType, messageID, d.Timestamp, - ) - if err != nil { - return err - } - - rh.log.Info().Str("messageID", messageID).Msgf("Resolved retry message %+v", d) - - domainDeposits[m.Destination] = append(domainDeposits[m.Destination], m) - } - } - - return nil - }(*evt) - if err != nil { - return err - } - } - } - - for _, deposits := range domainDeposits { - rh.msgChan <- deposits - } - return nil -} diff --git a/chains/substrate/listener/event-handlers_test.go b/chains/substrate/listener/event-handlers_test.go deleted file mode 100644 index 1875c20f..00000000 --- a/chains/substrate/listener/event-handlers_test.go +++ /dev/null @@ -1,679 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener_test - -import ( - "fmt" - "math/big" - - "github.com/ChainSafe/sygma-relayer/chains/substrate/listener" - mock_events "github.com/ChainSafe/sygma-relayer/chains/substrate/listener/mock" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/rs/zerolog" - "github.com/sygmaprotocol/sygma-core/relayer/message" - - "testing" - - "github.com/centrifuge/go-substrate-rpc-client/v4/registry" - "github.com/centrifuge/go-substrate-rpc-client/v4/registry/parser" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/suite" -) - -type SystemUpdateHandlerTestSuite struct { - suite.Suite - mockConn *mock_events.MockConnection - systemUpdateHandler *listener.SystemUpdateEventHandler -} - -func TestRunSystemUpdateHandlerTestSuite(t *testing.T) { - suite.Run(t, new(SystemUpdateHandlerTestSuite)) -} - -func (s *SystemUpdateHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.mockConn = mock_events.NewMockConnection(ctrl) - s.systemUpdateHandler = listener.NewSystemUpdateEventHandler(s.mockConn) -} - -func (s *SystemUpdateHandlerTestSuite) Test_UpdateMetadataFails() { - s.mockConn.EXPECT().UpdateMetatdata().Return(fmt.Errorf("error")) - evts := []*parser.Event{ - { - Name: "ParachainSystem.ValidationFunctionApplied", - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - - err := s.systemUpdateHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - - s.NotNil(err) -} - -func (s *SystemUpdateHandlerTestSuite) Test_NoMetadataUpdate() { - - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return([]*parser.Event{}, nil) - err := s.systemUpdateHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - s.Nil(err) -} - -func (s *SystemUpdateHandlerTestSuite) Test_SuccesfullMetadataUpdate() { - s.mockConn.EXPECT().UpdateMetatdata().Return(nil) - evts := []*parser.Event{ - { - Name: "ParachainSystem.ValidationFunctionApplied", - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - - err := s.systemUpdateHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - - s.Nil(err) -} - -type DepositHandlerTestSuite struct { - suite.Suite - depositEventHandler *listener.FungibleTransferEventHandler - mockDepositHandler *mock_events.MockDepositHandler - domainID uint8 - msgChan chan []*message.Message - mockConn *mock_events.MockConnection -} - -func TestRunDepositHandlerTestSuite(t *testing.T) { - suite.Run(t, new(DepositHandlerTestSuite)) -} - -func (s *DepositHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.domainID = 1 - s.mockDepositHandler = mock_events.NewMockDepositHandler(ctrl) - s.msgChan = make(chan []*message.Message, 2) - s.mockConn = mock_events.NewMockConnection(ctrl) - s.depositEventHandler = listener.NewFungibleTransferEventHandler(zerolog.Context{}, s.domainID, s.mockDepositHandler, s.msgChan, s.mockConn) -} - -func (s *DepositHandlerTestSuite) Test_HandleDepositFails_ExecutionContinue() { - d1 := map[string]any{ - "dest_domain_id": types.NewU8(2), - "resource_id": types.Bytes32{1}, - "deposit_nonce": types.NewU64(1), - "sygma_traits_TransferType": types.NewU8(0), - "deposit_data": []byte{}, - "handler_response": [1]byte{0}, - } - d2 := map[string]any{ - "dest_domain_id": types.NewU8(2), - "resource_id": types.Bytes32{1}, - "deposit_nonce": types.NewU64(2), - "sygma_traits_TransferType": types.NewU8(0), - "deposit_data": []byte{}, - "handler_response": [1]byte{0}, - } - msgID := fmt.Sprintf("%d-%d-%d-%d", 1, 2, 0, 1) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1["dest_domain_id"], - d1["deposit_nonce"], - d1["resource_id"], - d1["deposit_data"], - d1["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Return(&message.Message{}, fmt.Errorf("error")) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2["dest_domain_id"], - d2["deposit_nonce"], - d2["resource_id"], - d2["deposit_data"], - d2["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 2}}, - nil, - ) - - evts := []*parser.Event{ - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d1["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d1["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d1["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d1["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d1["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d1["handler_response"]}, - }, - }, - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d2["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d2["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d2["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d2["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d2["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d2["handler_response"]}, - }, - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - - err := s.depositEventHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{DepositNonce: 2}}}) -} - -func (s *DepositHandlerTestSuite) Test_SuccessfulHandleDeposit() { - d1 := map[string]any{ - "dest_domain_id": types.NewU8(2), - "deposit_nonce": types.NewU64(1), - "resource_id": types.Bytes32{1}, - "sygma_traits_TransferType": types.NewU8(0), - "handler_response": [1]byte{0}, - "deposit_data": []byte{}, - } - d2 := map[string]any{ - "deposit_nonce": types.NewU64(2), - "dest_domain_id": types.NewU8(2), - "resource_id": types.Bytes32{1}, - "sygma_traits_TransferType": types.NewU8(0), - "handler_response": [1]byte{0}, - "deposit_data": []byte{}, - } - msgID := fmt.Sprintf("%d-%d-%d-%d", 1, 2, 0, 1) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1["dest_domain_id"], - d1["deposit_nonce"], - d1["resource_id"], - d1["deposit_data"], - d1["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 1}}, - nil, - ) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2["dest_domain_id"], - d2["deposit_nonce"], - d2["resource_id"], - d2["deposit_data"], - d2["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 2}}, - nil, - ) - - evts := []*parser.Event{ - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d1["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d1["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d1["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d1["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d1["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d1["handler_response"]}, - }, - }, - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d2["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d2["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d2["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d2["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d2["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d2["handler_response"]}, - }, - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - - err := s.depositEventHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{DepositNonce: 1}}, {Data: transfer.TransferMessageData{DepositNonce: 2}}}) -} - -func (s *DepositHandlerTestSuite) Test_HandleDepositPanics_ExecutionContinues() { - d1 := map[string]any{ - "dest_domain_id": types.NewU8(2), - "deposit_nonce": types.NewU64(1), - "resource_id": types.Bytes32{1}, - "sygma_traits_TransferType": types.NewU8(0), - "handler_response": [1]byte{0}, - "deposit_data": []byte{}, - } - d2 := map[string]any{ - "deposit_nonce": types.NewU64(2), - "dest_domain_id": types.NewU8(2), - "resource_id": types.Bytes32{1}, - "sygma_traits_TransferType": types.NewU8(0), - "handler_response": [1]byte{0}, - "deposit_data": []byte{}, - } - msgID := fmt.Sprintf("%d-%d-%d-%d", 1, 2, 0, 1) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1["dest_domain_id"], - d1["deposit_nonce"], - d1["resource_id"], - d1["deposit_data"], - d1["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Do(func(sourceID, destID, nonce, resourceID, calldata, depositType, msgID, timestamp interface{}) { - panic("error") - }) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2["dest_domain_id"], - d2["deposit_nonce"], - d2["resource_id"], - d2["deposit_data"], - d2["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 2}}, - nil, - ) - - evts := []*parser.Event{ - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d1["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d1["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d1["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d1["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d1["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d1["handler_response"]}, - }, - }, - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d2["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d2["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d2["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d2["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d2["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d2["handler_response"]}, - }, - }, - } - - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - - err := s.depositEventHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{DepositNonce: 2}}}) -} - -type RetryHandlerTestSuite struct { - suite.Suite - retryHandler *listener.RetryEventHandler - mockDepositHandler *mock_events.MockDepositHandler - mockConn *mock_events.MockConnection - domainID uint8 - msgChan chan []*message.Message -} - -func TestRunRetryHandlerTestSuite(t *testing.T) { - suite.Run(t, new(RetryHandlerTestSuite)) -} - -func (s *RetryHandlerTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.domainID = 1 - s.mockDepositHandler = mock_events.NewMockDepositHandler(ctrl) - s.mockConn = mock_events.NewMockConnection(ctrl) - s.msgChan = make(chan []*message.Message, 2) - s.retryHandler = listener.NewRetryEventHandler(zerolog.Context{}, s.mockConn, s.mockDepositHandler, s.domainID, s.msgChan) - -} - -func (s *RetryHandlerTestSuite) Test_CannotFetchLatestBlock() { - - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return([]*parser.Event{}, fmt.Errorf("error")) - - err := s.retryHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - - s.NotNil(err) -} - -func (s *RetryHandlerTestSuite) Test_EventTooNew() { - s.mockConn.EXPECT().GetFinalizedHead().Return(types.Hash{}, nil) - s.mockConn.EXPECT().GetBlock(gomock.Any()).Return(&types.SignedBlock{Block: types.Block{ - Header: types.Header{ - Number: types.BlockNumber(uint32(100)), - }, - }}, nil) - - rtry := map[string]any{ - "deposit_on_block_height": types.NewU128(*big.NewInt(101)), - } - evts := []*parser.Event{ - { - Name: "SygmaBridge.Retry", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "deposit_on_block_height", Value: rtry["deposit_on_block_height"]}, - }, - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - - err := s.retryHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - s.Nil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *RetryHandlerTestSuite) Test_FetchingBlockHashFails() { - s.mockConn.EXPECT().GetFinalizedHead().Return(types.Hash{}, nil) - s.mockConn.EXPECT().GetBlock(gomock.Any()).Return(&types.SignedBlock{Block: types.Block{ - Header: types.Header{ - Number: types.BlockNumber(uint32(100)), - }, - }}, nil) - - s.mockConn.EXPECT().GetBlockHash(uint64(95)).Return(types.Hash{}, fmt.Errorf("error")) - - rtry := map[string]any{ - "deposit_on_block_height": types.NewU128(*big.NewInt(95)), - } - evts := []*parser.Event{ - { - Name: "SygmaBridge.Retry", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "deposit_on_block_height", Value: rtry["deposit_on_block_height"]}, - }, - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - - err := s.retryHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - - s.NotNil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *RetryHandlerTestSuite) Test_FetchingBlockEventsFails() { - s.mockConn.EXPECT().GetFinalizedHead().Return(types.Hash{}, nil) - s.mockConn.EXPECT().GetBlock(gomock.Any()).Return(&types.SignedBlock{Block: types.Block{ - Header: types.Header{ - Number: types.BlockNumber(uint32(100)), - }, - }}, nil) - s.mockConn.EXPECT().GetBlockHash(uint64(95)).Return(types.Hash{}, nil) - - rtry := map[string]any{ - "deposit_on_block_height": types.NewU128(*big.NewInt(95)), - } - evts := []*parser.Event{ - { - Name: "SygmaBridge.Retry", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "deposit_on_block_height", Value: rtry["deposit_on_block_height"]}, - }, - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - s.mockConn.EXPECT().GetBlockEvents(gomock.Any()).Return(nil, fmt.Errorf("error")) - - err := s.retryHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - - s.NotNil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *RetryHandlerTestSuite) Test_NoEvents() { - s.mockConn.EXPECT().GetFinalizedHead().Return(types.Hash{}, nil) - s.mockConn.EXPECT().GetBlock(gomock.Any()).Return(&types.SignedBlock{Block: types.Block{ - Header: types.Header{ - Number: types.BlockNumber(uint32(100)), - }, - }}, nil) - s.mockConn.EXPECT().GetBlockHash(uint64(95)).Return(types.Hash{}, nil) - - rtry := map[string]any{ - "deposit_on_block_height": types.NewU128(*big.NewInt(95)), - } - evts := []*parser.Event{ - { - Name: "SygmaBridge.Retry", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "deposit_on_block_height", Value: rtry["deposit_on_block_height"]}, - }, - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - s.mockConn.EXPECT().GetBlockEvents(gomock.Any()).Return([]*parser.Event{}, nil) - - err := s.retryHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - - s.Nil(err) - s.Equal(len(s.msgChan), 0) -} - -func (s *RetryHandlerTestSuite) Test_ValidEvents() { - s.mockConn.EXPECT().GetFinalizedHead().Return(types.Hash{}, nil) - s.mockConn.EXPECT().GetBlock(gomock.Any()).Return(&types.SignedBlock{Block: types.Block{ - Header: types.Header{ - Number: types.BlockNumber(uint32(100)), - }, - }}, nil) - s.mockConn.EXPECT().GetBlockHash(uint64(95)).Return(types.Hash{}, nil) - d1 := map[string]any{ - "dest_domain_id": types.NewU8(2), - "deposit_nonce": types.NewU64(1), - "resource_id": types.Bytes32{1}, - "sygma_traits_TransferType": types.NewU8(0), - "handler_response": [1]byte{0}, - "deposit_data": []byte{}, - } - d2 := map[string]any{ - "deposit_nonce": types.NewU64(2), - "dest_domain_id": types.NewU8(2), - "resource_id": types.Bytes32{1}, - "sygma_traits_TransferType": types.NewU8(0), - "handler_response": [1]byte{0}, - "deposit_data": []byte{}, - } - blockEvts := []*parser.Event{ - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d1["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d1["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d1["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d1["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d1["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d1["handler_response"]}, - }, - }, - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d2["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d2["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d2["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d2["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d2["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d2["handler_response"]}, - }, - }, - } - msgID := fmt.Sprintf("retry-%d-%d-%d-%d", 1, 2, 0, 1) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1["dest_domain_id"], - d1["deposit_nonce"], - d1["resource_id"], - d1["deposit_data"], - d1["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 1}}, - nil, - ) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2["dest_domain_id"], - d2["deposit_nonce"], - d2["resource_id"], - d2["deposit_data"], - d2["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 2}}, - nil, - ) - - rtry := map[string]any{ - "deposit_on_block_height": types.NewU128(*big.NewInt(95)), - } - evts := []*parser.Event{ - { - Name: "SygmaBridge.Retry", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "deposit_on_block_height", Value: rtry["deposit_on_block_height"]}, - }, - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - s.mockConn.EXPECT().GetBlockEvents(gomock.Any()).Return(blockEvts, nil) - - err := s.retryHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(len(s.msgChan), 0) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{DepositNonce: 1}}, {Data: transfer.TransferMessageData{DepositNonce: 2}}}) -} - -func (s *RetryHandlerTestSuite) Test_EventPanics() { - s.mockConn.EXPECT().GetFinalizedHead().Return(types.Hash{}, nil) - s.mockConn.EXPECT().GetBlock(gomock.Any()).Return(&types.SignedBlock{Block: types.Block{ - Header: types.Header{ - Number: types.BlockNumber(uint32(100)), - }, - }}, nil) - s.mockConn.EXPECT().GetBlockHash(uint64(95)).Return(types.Hash{}, nil) - s.mockConn.EXPECT().GetBlockHash(uint64(95)).Return(types.Hash{}, nil) - d1 := map[string]any{ - "dest_domain_id": types.NewU8(2), - "deposit_nonce": types.NewU64(1), - "resource_id": types.Bytes32{1}, - "sygma_traits_TransferType": types.NewU8(0), - "handler_response": [1]byte{0}, - "deposit_data": []byte{}, - } - d2 := map[string]any{ - "deposit_nonce": types.NewU64(2), - "dest_domain_id": types.NewU8(2), - "resource_id": types.Bytes32{1}, - "sygma_traits_TransferType": types.NewU8(0), - "handler_response": [1]byte{0}, - "deposit_data": []byte{}, - } - - blockEvts1 := []*parser.Event{ - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d1["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d1["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d1["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d1["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d1["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d1["handler_response"]}, - }, - }, - } - blockEvts2 := []*parser.Event{ - { - Name: "SygmaBridge.Deposit", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: d2["dest_domain_id"]}, - ®istry.DecodedField{Name: "resource_id", Value: d2["resource_id"]}, - ®istry.DecodedField{Name: "deposit_nonce", Value: d2["deposit_nonce"]}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: d2["sygma_traits_TransferType"]}, - ®istry.DecodedField{Name: "deposit_data", Value: d2["deposit_data"]}, - ®istry.DecodedField{Name: "handler_response", Value: d2["handler_response"]}, - }, - }, - } - - msgID := fmt.Sprintf("retry-%d-%d-%d-%d", 1, 2, 0, 1) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d1["dest_domain_id"], - d1["deposit_nonce"], - d1["resource_id"], - d1["deposit_data"], - d1["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Do(func(sourceID, destID, nonce, resourceID, calldata, depositType, msgID, timestamp interface{}) { - panic("error") - }) - s.mockDepositHandler.EXPECT().HandleDeposit( - s.domainID, - d2["dest_domain_id"], - d2["deposit_nonce"], - d2["resource_id"], - d2["deposit_data"], - d2["sygma_traits_TransferType"], - msgID, - gomock.Any(), - ).Return( - &message.Message{Data: transfer.TransferMessageData{DepositNonce: 2}}, - nil, - ) - - rtry := map[string]any{ - "deposit_on_block_height": types.NewU128(*big.NewInt(95)), - } - evts := []*parser.Event{ - { - Name: "SygmaBridge.Retry", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "deposit_on_block_height", Value: rtry["deposit_on_block_height"]}, - }, - }, - { - Name: "SygmaBridge.Retry", - Fields: registry.DecodedFields{ - ®istry.DecodedField{Name: "deposit_on_block_height", Value: rtry["deposit_on_block_height"]}, - }, - }, - } - s.mockConn.EXPECT().FetchEvents(gomock.Any(), gomock.Any()).Return(evts, nil) - s.mockConn.EXPECT().GetBlockEvents(gomock.Any()).Return(blockEvts1, nil) - s.mockConn.EXPECT().GetBlockEvents(gomock.Any()).Return(blockEvts2, nil) - - err := s.retryHandler.HandleEvents(big.NewInt(0), big.NewInt(1)) - msgs := <-s.msgChan - - s.Nil(err) - s.Equal(len(s.msgChan), 0) - s.Equal(msgs, []*message.Message{{Data: transfer.TransferMessageData{DepositNonce: 2}}}) -} diff --git a/chains/substrate/listener/mock/handlers.go b/chains/substrate/listener/mock/handlers.go deleted file mode 100644 index 8823bea5..00000000 --- a/chains/substrate/listener/mock/handlers.go +++ /dev/null @@ -1,166 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./chains/substrate/listener/event-handlers.go - -// Package mock_listener is a generated GoMock package. -package mock_listener - -import ( - big "math/big" - reflect "reflect" - time "time" - - parser "github.com/centrifuge/go-substrate-rpc-client/v4/registry/parser" - types "github.com/centrifuge/go-substrate-rpc-client/v4/types" - gomock "github.com/golang/mock/gomock" - message "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -// MockConnection is a mock of Connection interface. -type MockConnection struct { - ctrl *gomock.Controller - recorder *MockConnectionMockRecorder -} - -// MockConnectionMockRecorder is the mock recorder for MockConnection. -type MockConnectionMockRecorder struct { - mock *MockConnection -} - -// NewMockConnection creates a new mock instance. -func NewMockConnection(ctrl *gomock.Controller) *MockConnection { - mock := &MockConnection{ctrl: ctrl} - mock.recorder = &MockConnectionMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockConnection) EXPECT() *MockConnectionMockRecorder { - return m.recorder -} - -// FetchEvents mocks base method. -func (m *MockConnection) FetchEvents(startBlock, endBlock *big.Int) ([]*parser.Event, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "FetchEvents", startBlock, endBlock) - ret0, _ := ret[0].([]*parser.Event) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// FetchEvents indicates an expected call of FetchEvents. -func (mr *MockConnectionMockRecorder) FetchEvents(startBlock, endBlock interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchEvents", reflect.TypeOf((*MockConnection)(nil).FetchEvents), startBlock, endBlock) -} - -// GetBlock mocks base method. -func (m *MockConnection) GetBlock(blockHash types.Hash) (*types.SignedBlock, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlock", blockHash) - ret0, _ := ret[0].(*types.SignedBlock) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlock indicates an expected call of GetBlock. -func (mr *MockConnectionMockRecorder) GetBlock(blockHash interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlock", reflect.TypeOf((*MockConnection)(nil).GetBlock), blockHash) -} - -// GetBlockEvents mocks base method. -func (m *MockConnection) GetBlockEvents(hash types.Hash) ([]*parser.Event, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlockEvents", hash) - ret0, _ := ret[0].([]*parser.Event) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlockEvents indicates an expected call of GetBlockEvents. -func (mr *MockConnectionMockRecorder) GetBlockEvents(hash interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlockEvents", reflect.TypeOf((*MockConnection)(nil).GetBlockEvents), hash) -} - -// GetBlockHash mocks base method. -func (m *MockConnection) GetBlockHash(blockNumber uint64) (types.Hash, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetBlockHash", blockNumber) - ret0, _ := ret[0].(types.Hash) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetBlockHash indicates an expected call of GetBlockHash. -func (mr *MockConnectionMockRecorder) GetBlockHash(blockNumber interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlockHash", reflect.TypeOf((*MockConnection)(nil).GetBlockHash), blockNumber) -} - -// GetFinalizedHead mocks base method. -func (m *MockConnection) GetFinalizedHead() (types.Hash, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetFinalizedHead") - ret0, _ := ret[0].(types.Hash) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetFinalizedHead indicates an expected call of GetFinalizedHead. -func (mr *MockConnectionMockRecorder) GetFinalizedHead() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFinalizedHead", reflect.TypeOf((*MockConnection)(nil).GetFinalizedHead)) -} - -// UpdateMetatdata mocks base method. -func (m *MockConnection) UpdateMetatdata() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateMetatdata") - ret0, _ := ret[0].(error) - return ret0 -} - -// UpdateMetatdata indicates an expected call of UpdateMetatdata. -func (mr *MockConnectionMockRecorder) UpdateMetatdata() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateMetatdata", reflect.TypeOf((*MockConnection)(nil).UpdateMetatdata)) -} - -// MockDepositHandler is a mock of DepositHandler interface. -type MockDepositHandler struct { - ctrl *gomock.Controller - recorder *MockDepositHandlerMockRecorder -} - -// MockDepositHandlerMockRecorder is the mock recorder for MockDepositHandler. -type MockDepositHandlerMockRecorder struct { - mock *MockDepositHandler -} - -// NewMockDepositHandler creates a new mock instance. -func NewMockDepositHandler(ctrl *gomock.Controller) *MockDepositHandler { - mock := &MockDepositHandler{ctrl: ctrl} - mock.recorder = &MockDepositHandlerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockDepositHandler) EXPECT() *MockDepositHandlerMockRecorder { - return m.recorder -} - -// HandleDeposit mocks base method. -func (m *MockDepositHandler) HandleDeposit(sourceID uint8, destID types.U8, nonce types.U64, resourceID types.Bytes32, calldata []byte, transferType types.U8, messageID string, timestamp time.Time) (*message.Message, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HandleDeposit", sourceID, destID, nonce, resourceID, calldata, transferType, messageID, timestamp) - ret0, _ := ret[0].(*message.Message) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// HandleDeposit indicates an expected call of HandleDeposit. -func (mr *MockDepositHandlerMockRecorder) HandleDeposit(sourceID, destID, nonce, resourceID, calldata, transferType, messageID, timestamp interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HandleDeposit", reflect.TypeOf((*MockDepositHandler)(nil).HandleDeposit), sourceID, destID, nonce, resourceID, calldata, transferType, messageID, timestamp) -} diff --git a/chains/substrate/listener/util.go b/chains/substrate/listener/util.go deleted file mode 100644 index aa154265..00000000 --- a/chains/substrate/listener/util.go +++ /dev/null @@ -1,76 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener - -import ( - "github.com/ChainSafe/sygma-relayer/chains/substrate/events" - "github.com/centrifuge/go-substrate-rpc-client/v4/registry" - "github.com/mitchellh/mapstructure" -) - -func DecodeDepositEvent(evtFields registry.DecodedFields) (events.Deposit, error) { - var d events.Deposit - - for _, evtField := range evtFields { - switch evtField.Name { - case "dest_domain_id": - err := mapstructure.Decode(evtField.Value, &d.DestDomainID) - if err != nil { - return events.Deposit{}, err - } - case "resource_id": - err := mapstructure.Decode(evtField.Value, &d.ResourceID) - if err != nil { - return events.Deposit{}, err - } - case "deposit_nonce": - err := mapstructure.Decode(evtField.Value, &d.DepositNonce) - if err != nil { - return events.Deposit{}, err - } - case "sygma_traits_TransferType": - err := mapstructure.Decode(evtField.Value, &d.TransferType) - if err != nil { - return events.Deposit{}, err - } - case "deposit_data": - err := mapstructure.Decode(evtField.Value, &d.CallData) - if err != nil { - return events.Deposit{}, err - } - case "handler_response": - err := mapstructure.Decode(evtField.Value, &d.Handler) - if err != nil { - return events.Deposit{}, err - } - case "block_timestamp": - err := mapstructure.Decode(evtField.Value, &d.Timestamp) - if err != nil { - return events.Deposit{}, err - } - } - } - return d, nil -} - -func DecodeRetryEvent(evtFields registry.DecodedFields) (events.Retry, error) { - var er events.Retry - - for _, evtField := range evtFields { - switch evtField.Name { - case "deposit_on_block_height": - err := mapstructure.Decode(evtField.Value, &er.DepositOnBlockHeight) - if err != nil { - return events.Retry{}, err - } - case "dest_domain_id": - err := mapstructure.Decode(evtField.Value, &er.DestDomainID) - if err != nil { - return events.Retry{}, err - } - } - } - - return er, nil -} diff --git a/chains/substrate/listener/util_test.go b/chains/substrate/listener/util_test.go deleted file mode 100644 index 35eb06a8..00000000 --- a/chains/substrate/listener/util_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package listener_test - -import ( - "math/big" - "testing" - - "github.com/ChainSafe/sygma-relayer/chains/substrate/events" - "github.com/ChainSafe/sygma-relayer/chains/substrate/listener" - "github.com/centrifuge/go-substrate-rpc-client/v4/registry" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" - "github.com/stretchr/testify/suite" -) - -type DecodeEventsSuite struct { - suite.Suite -} - -func TestRunDecodeEventsSuite(t *testing.T) { - suite.Run(t, new(DecodeEventsSuite)) -} - -func (s *DecodeEventsSuite) TestDecodeDepositEvent() { - evtFields := registry.DecodedFields{ - ®istry.DecodedField{Name: "dest_domain_id", Value: 1, LookupIndex: 0}, - ®istry.DecodedField{Name: "resource_id", Value: types.Bytes32{3}, LookupIndex: 0}, - ®istry.DecodedField{Name: "deposit_nonce", Value: 0, LookupIndex: 0}, - ®istry.DecodedField{Name: "sygma_traits_TransferType", Value: 0, LookupIndex: 0}, - ®istry.DecodedField{Name: "deposit_data", Value: []byte{}, LookupIndex: 0}, - ®istry.DecodedField{Name: "handler_response", Value: [1]byte{0}, LookupIndex: 0}, - } - - deposit, err := listener.DecodeDepositEvent(evtFields) - s.Nil(err) - s.Equal(deposit, events.Deposit{DestDomainID: 1, ResourceID: types.Bytes32{3}, DepositNonce: 0, TransferType: 0, CallData: []byte{}, Handler: [1]byte{}}) -} - -func (s *DecodeEventsSuite) TestDecodeRetryEvent() { - evtFields := registry.DecodedFields{ - ®istry.DecodedField{Name: "deposit_on_block_height", Value: types.NewU128(*big.NewInt(1)), LookupIndex: 0}, - ®istry.DecodedField{Name: "dest_domain_id", Value: 2, LookupIndex: 0}, - } - - retry, err := listener.DecodeRetryEvent(evtFields) - s.Nil(err) - s.Equal(retry, events.Retry{DepositOnBlockHeight: types.NewU128(*big.NewInt(1)), DestDomainID: 2}) -} diff --git a/chains/substrate/pallet/pallet.go b/chains/substrate/pallet/pallet.go deleted file mode 100644 index a15bdc5f..00000000 --- a/chains/substrate/pallet/pallet.go +++ /dev/null @@ -1,80 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package pallet - -import ( - "strconv" - - "github.com/ChainSafe/sygma-relayer/chains" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/sygmaprotocol/sygma-core/chains/substrate/client" - - "github.com/centrifuge/go-substrate-rpc-client/v4/rpc/author" - "github.com/centrifuge/go-substrate-rpc-client/v4/types" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/rs/zerolog/log" -) - -const bridgeVersion = "3.1.0" -const verifyingContract = "6CdE2Cd82a4F8B74693Ff5e194c19CA08c2d1c68" - -type BridgeProposal struct { - OriginDomainID uint8 - DepositNonce uint64 - ResourceID [32]byte - Data []byte -} - -type Pallet struct { - *client.SubstrateClient -} - -func NewPallet( - client *client.SubstrateClient, -) *Pallet { - return &Pallet{ - client, - } -} - -func (p *Pallet) ExecuteProposals( - proposals []*transfer.TransferProposal, - signature []byte, -) (types.Hash, *author.ExtrinsicStatusSubscription, error) { - bridgeProposals := make([]BridgeProposal, 0) - for _, prop := range proposals { - bridgeProposals = append(bridgeProposals, BridgeProposal{ - OriginDomainID: prop.Source, - DepositNonce: prop.Data.DepositNonce, - ResourceID: prop.Data.ResourceId, - Data: prop.Data.Data, - }) - } - - return p.Transact( - "SygmaBridge.execute_proposal", - bridgeProposals, - signature, - ) -} - -func (p *Pallet) ProposalsHash(proposals []*transfer.TransferProposal) ([]byte, error) { - return chains.ProposalsHash(proposals, p.ChainID.Int64(), verifyingContract, bridgeVersion) -} - -func (p *Pallet) IsProposalExecuted(prop *transfer.TransferProposal) (bool, error) { - - log.Debug(). - Str("depositNonce", strconv.FormatUint(prop.Data.DepositNonce, 10)). - Str("resourceID", hexutil.Encode(prop.Data.ResourceId[:])). - Msg("Getting is proposal executed") - var res bool - err := p.Conn.Call(&res, "sygma_isProposalExecuted", prop.Data.DepositNonce, prop.Source) - if err != nil { - return false, err - } - - return res, nil -} diff --git a/cli/cli.go b/cli/cli.go index 7d269f02..9097c3f0 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -8,11 +8,11 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "github.com/ChainSafe/sygma-relayer/cli/keygen" - "github.com/ChainSafe/sygma-relayer/cli/peer" - "github.com/ChainSafe/sygma-relayer/cli/topology" - "github.com/ChainSafe/sygma-relayer/cli/utils" - "github.com/ChainSafe/sygma-relayer/config" + "github.com/sprintertech/sprinter-signing/cli/keygen" + "github.com/sprintertech/sprinter-signing/cli/peer" + "github.com/sprintertech/sprinter-signing/cli/topology" + "github.com/sprintertech/sprinter-signing/cli/utils" + "github.com/sprintertech/sprinter-signing/config" ) var ( diff --git a/cli/peer/generateKey.go b/cli/peer/generateKey.go index f0423def..39183e28 100644 --- a/cli/peer/generateKey.go +++ b/cli/peer/generateKey.go @@ -46,7 +46,7 @@ func generateKey(cmd *cobra.Command, args []string) error { LibP2P peer identity: %s \n LibP2P private key: %s `, - peerID.Pretty(), + peerID.String(), encPriv, ) return nil diff --git a/cli/peer/info.go b/cli/peer/info.go index 4edcc819..9be7c3bd 100644 --- a/cli/peer/info.go +++ b/cli/peer/info.go @@ -48,7 +48,7 @@ func peerInfo(cmd *cobra.Command, args []string) error { fmt.Printf(` LibP2P peer identity: %s `, - peerID.Pretty(), + peerID.String(), ) return nil } diff --git a/cli/run.go b/cli/run.go index cd7731db..3841c7f3 100644 --- a/cli/run.go +++ b/cli/run.go @@ -4,8 +4,8 @@ package cli import ( - "github.com/ChainSafe/sygma-relayer/app" "github.com/spf13/cobra" + "github.com/sprintertech/sprinter-signing/app" ) var ( diff --git a/cli/topology/encryptTopology.go b/cli/topology/encryptTopology.go index fb5ce7de..1f5807bd 100644 --- a/cli/topology/encryptTopology.go +++ b/cli/topology/encryptTopology.go @@ -11,7 +11,7 @@ import ( "io" "os" - "github.com/ChainSafe/sygma-relayer/topology" + "github.com/sprintertech/sprinter-signing/topology" "github.com/spf13/cobra" ) diff --git a/cli/topology/testTopology.go b/cli/topology/testTopology.go index 9706ca02..982014dc 100644 --- a/cli/topology/testTopology.go +++ b/cli/topology/testTopology.go @@ -9,8 +9,8 @@ import ( "github.com/spf13/cobra" - "github.com/ChainSafe/sygma-relayer/config/relayer" - "github.com/ChainSafe/sygma-relayer/topology" + "github.com/sprintertech/sprinter-signing/config/relayer" + "github.com/sprintertech/sprinter-signing/topology" ) var ( diff --git a/comm/communication_test.go b/comm/communication_test.go index e4fdb5c0..0a4451f4 100644 --- a/comm/communication_test.go +++ b/comm/communication_test.go @@ -8,15 +8,15 @@ import ( "testing" "time" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/p2p" - "github.com/ChainSafe/sygma-relayer/topology" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peerstore" "github.com/libp2p/go-libp2p/core/protocol" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/comm/p2p" + "github.com/sprintertech/sprinter-signing/topology" "github.com/stretchr/testify/suite" ) @@ -195,7 +195,7 @@ func InitializeHostsAndCommunications(numberOfActors int, protocolID protocol.ID privateKeys = append(privateKeys, privKeyForHost) peerID, _ := peer.IDFromPrivateKey(privKeyForHost) addrInfoForHost, _ := peer.AddrInfoFromString(fmt.Sprintf( - "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+i, peerID.Pretty(), + "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+i, peerID.String(), )) topology.Peers = append(topology.Peers, addrInfoForHost) } @@ -213,7 +213,7 @@ func InitializeHostsAndCommunications(numberOfActors int, protocolID protocol.ID for j := 0; j < numberOfActors; j++ { if i != j { adrInfoForHost, _ := peer.AddrInfoFromString(fmt.Sprintf( - "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+j, testHosts[j].ID().Pretty(), + "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+j, testHosts[j].ID().String(), )) testHosts[i].Peerstore().AddAddr(adrInfoForHost.ID, adrInfoForHost.Addrs[0], peerstore.PermanentAddrTTL) peersAdrInfos[i] = append(peersAdrInfos[i], adrInfoForHost) diff --git a/comm/elector/bully.go b/comm/elector/bully.go index b7836b8a..ceaed896 100644 --- a/comm/elector/bully.go +++ b/comm/elector/bully.go @@ -8,12 +8,12 @@ import ( "sync" "time" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/config/relayer" - "github.com/ChainSafe/sygma-relayer/tss/util" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/rs/zerolog/log" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/config/relayer" + "github.com/sprintertech/sprinter-signing/tss/util" ) // bullyCoordinatorElector is used to execute bully coordinator discovery diff --git a/comm/elector/bully_test.go b/comm/elector/bully_test.go index 16774695..2017f7a5 100644 --- a/comm/elector/bully_test.go +++ b/comm/elector/bully_test.go @@ -9,17 +9,17 @@ import ( "testing" "time" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/tss/util" + "github.com/sprintertech/sprinter-signing/comm/elector" + "github.com/sprintertech/sprinter-signing/tss/util" - "github.com/ChainSafe/sygma-relayer/comm/p2p" - "github.com/ChainSafe/sygma-relayer/config/relayer" - "github.com/ChainSafe/sygma-relayer/topology" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" + "github.com/sprintertech/sprinter-signing/comm/p2p" + "github.com/sprintertech/sprinter-signing/config/relayer" + "github.com/sprintertech/sprinter-signing/topology" "github.com/stretchr/testify/suite" ) @@ -72,7 +72,7 @@ func (s *BullyTestSuite) SetupIndividualTest(c BullyTestCase) ([]elector.Coordin privateKeys = append(privateKeys, privKeyForHost) peerID, _ := peer.IDFromPrivateKey(privKeyForHost) addrInfoForHost, _ := peer.AddrInfoFromString(fmt.Sprintf( - "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+s.portOffset+i, peerID.Pretty(), + "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+s.portOffset+i, peerID.String(), )) topology.Peers = append(topology.Peers, addrInfoForHost) } @@ -110,7 +110,7 @@ func (s *BullyTestSuite) SetupIndividualTest(c BullyTestCase) ([]elector.Coordin PingBackOff: 1 * time.Second, PingInterval: 1 * time.Second, ElectionWaitTime: 2 * time.Second, - BullyWaitTime: 25 * time.Second, + BullyWaitTime: 10 * time.Second, }, com) testBullyCoordinators = append(testBullyCoordinators, b) } @@ -122,121 +122,6 @@ func (s *BullyTestSuite) TearDownTest() {} func (s *BullyTestSuite) TestBully_GetCoordinator_OneDelay() { testCases := []BullyTestCase{ - { - name: "three relayers bully coordination - all relayers starting at the same time", - isLeaderActive: true, - testRelayers: []RelayerTestDescriber{ - { - name: "R1", - index: 0, - initialDelay: 0, - }, - { - name: "R2", - index: 1, - initialDelay: 0, - }, - { - name: "R3", - index: 2, - initialDelay: 0, - }, - }, - }, - { - name: "three relayers bully coordination - one relayer lags", - isLeaderActive: true, - testRelayers: []RelayerTestDescriber{ - { - name: "R1", - index: 0, - initialDelay: 0, - }, - { - name: "R2", - index: 1, - initialDelay: 0, - }, - { - name: "R3", - index: 2, - initialDelay: 2 * time.Second, - }, - }, - }, - { - name: "three relayers bully coordination - two relayer lags for same amount", - isLeaderActive: true, - testRelayers: []RelayerTestDescriber{ - { - name: "R1", - index: 0, - initialDelay: 0, - }, - { - name: "R2", - index: 1, - initialDelay: 2 * time.Second, - }, - { - name: "R3", - index: 2, - initialDelay: 2 * time.Second, - }, - }, - }, - { - name: "three relayers bully coordination - two relayer lag for different amount", - isLeaderActive: true, - testRelayers: []RelayerTestDescriber{ - { - name: "R1", - index: 0, - initialDelay: 0, - }, - { - name: "R2", - index: 1, - initialDelay: 2 * time.Second, - }, - { - name: "R3", - index: 2, - initialDelay: 3 * time.Second, - }, - }, - }, - { - name: "five relayers bully coordination - all relayers starting at the same time", - isLeaderActive: true, - testRelayers: []RelayerTestDescriber{ - { - name: "R1", - index: 0, - initialDelay: 0, - }, - { - name: "R2", - index: 1, - initialDelay: 0, - }, - { - name: "R3", - index: 2, - initialDelay: 0, - }, - { - name: "R4", - index: 3, - initialDelay: 0, - }, - { - name: "R5", - index: 4, - initialDelay: 0, - }, - }, - }, { name: "five relayers bully coordination - multiple lags on relayers", isLeaderActive: true, @@ -329,7 +214,8 @@ func (s *BullyTestSuite) TestBully_GetCoordinator_OneDelay() { } for i := 0; i < numberOfResults; i++ { c := <-resultChan - s.Equal(finalCoordinator, c) + + s.Equal(finalCoordinator.String(), c.String()) } }) diff --git a/comm/elector/elector.go b/comm/elector/elector.go index 575bb833..84c20de8 100644 --- a/comm/elector/elector.go +++ b/comm/elector/elector.go @@ -6,12 +6,12 @@ package elector import ( "context" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/p2p" - "github.com/ChainSafe/sygma-relayer/config/relayer" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/comm/p2p" + "github.com/sprintertech/sprinter-signing/config/relayer" ) type CoordinatorElectorType int diff --git a/comm/elector/static.go b/comm/elector/static.go index 1ac8e24b..141bf468 100644 --- a/comm/elector/static.go +++ b/comm/elector/static.go @@ -6,8 +6,8 @@ package elector import ( "context" - "github.com/ChainSafe/sygma-relayer/tss/util" "github.com/libp2p/go-libp2p/core/peer" + "github.com/sprintertech/sprinter-signing/tss/util" ) type staticCoordinatorElector struct { diff --git a/comm/elector/static_test.go b/comm/elector/static_test.go index f220b1e3..95f6c86c 100644 --- a/comm/elector/static_test.go +++ b/comm/elector/static_test.go @@ -8,14 +8,14 @@ import ( "fmt" "testing" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/comm/p2p" - "github.com/ChainSafe/sygma-relayer/topology" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peerstore" + "github.com/sprintertech/sprinter-signing/comm/elector" + "github.com/sprintertech/sprinter-signing/comm/p2p" + "github.com/sprintertech/sprinter-signing/topology" "github.com/stretchr/testify/suite" ) @@ -56,7 +56,7 @@ func (s *CoordinatorElectorTestSuite) SetupTest() { for j := 0; j < numberOfTestHosts; j++ { if i != j { adrInfoForHost, _ := peer.AddrInfoFromString(fmt.Sprintf( - "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+j, s.testHosts[j].ID().Pretty(), + "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+j, s.testHosts[j].ID().String(), )) s.testHosts[i].Peerstore().AddAddr( adrInfoForHost.ID, adrInfoForHost.Addrs[0], peerstore.PermanentAddrTTL, diff --git a/comm/errors.go b/comm/errors.go index 8b664e07..aba922f8 100644 --- a/comm/errors.go +++ b/comm/errors.go @@ -15,5 +15,5 @@ type CommunicationError struct { } func (ce *CommunicationError) Error() string { - return fmt.Sprintf("failed communicating with peer %s because of: %s", ce.Peer.Pretty(), ce.Err.Error()) + return fmt.Sprintf("failed communicating with peer %s because of: %s", ce.Peer.String(), ce.Err.Error()) } diff --git a/comm/health_test.go b/comm/health_test.go index 1ca4f492..871dd407 100644 --- a/comm/health_test.go +++ b/comm/health_test.go @@ -6,11 +6,11 @@ package comm_test import ( "testing" - "github.com/ChainSafe/sygma-relayer/comm" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" + "github.com/sprintertech/sprinter-signing/comm" "github.com/stretchr/testify/suite" ) diff --git a/comm/mock/communication.go b/comm/mock/communication.go index 2687687e..227a0100 100644 --- a/comm/mock/communication.go +++ b/comm/mock/communication.go @@ -7,9 +7,9 @@ package mock_comm import ( reflect "reflect" - comm "github.com/ChainSafe/sygma-relayer/comm" gomock "github.com/golang/mock/gomock" peer "github.com/libp2p/go-libp2p/core/peer" + comm "github.com/sprintertech/sprinter-signing/comm" ) // MockCommunication is a mock of Communication interface. diff --git a/comm/p2p/gater.go b/comm/p2p/gater.go index 7039c2e9..8d7448e8 100644 --- a/comm/p2p/gater.go +++ b/comm/p2p/gater.go @@ -9,7 +9,7 @@ import ( "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" - "github.com/ChainSafe/sygma-relayer/topology" + "github.com/sprintertech/sprinter-signing/topology" ) // ConnectionGate implements libp2p ConnectionGater to prevent inbound and diff --git a/comm/p2p/host.go b/comm/p2p/host.go index bb8654b9..4652b8d8 100644 --- a/comm/p2p/host.go +++ b/comm/p2p/host.go @@ -7,7 +7,7 @@ import ( "errors" "fmt" - "github.com/ChainSafe/sygma-relayer/topology" + "github.com/sprintertech/sprinter-signing/topology" libp2p "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p/core/crypto" @@ -30,6 +30,7 @@ func NewHost(privKey crypto.PrivKey, networkTopology *topology.NetworkTopology, libp2p.DisableRelay(), libp2p.Security(noise.ID, noise.New), libp2p.ConnectionGater(cg), + libp2p.DisableIdentifyAddressDiscovery(), } h, err := libp2p.New(opts...) @@ -37,7 +38,7 @@ func NewHost(privKey crypto.PrivKey, networkTopology *topology.NetworkTopology, return nil, fmt.Errorf("unable to create libp2p host: %v", err) } - log.Info().Str("peerID", h.ID().Pretty()).Msgf( + log.Info().Str("peerID", h.ID().String()).Msgf( "new libp2p host created with address: %s", h.Addrs()[0].String(), ) diff --git a/comm/p2p/host_test.go b/comm/p2p/host_test.go index bf4902ae..8978f993 100644 --- a/comm/p2p/host_test.go +++ b/comm/p2p/host_test.go @@ -6,12 +6,12 @@ package p2p_test import ( "testing" - "github.com/ChainSafe/sygma-relayer/comm/p2p" - "github.com/ChainSafe/sygma-relayer/topology" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" + "github.com/sprintertech/sprinter-signing/comm/p2p" + "github.com/sprintertech/sprinter-signing/topology" "github.com/stretchr/testify/suite" ) diff --git a/comm/p2p/libp2p.go b/comm/p2p/libp2p.go index d8385ee9..ab3c310b 100644 --- a/comm/p2p/libp2p.go +++ b/comm/p2p/libp2p.go @@ -9,7 +9,6 @@ import ( "encoding/json" "fmt" - comm "github.com/ChainSafe/sygma-relayer/comm" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" @@ -18,6 +17,7 @@ import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log" "github.com/sourcegraph/conc/pool" + comm "github.com/sprintertech/sprinter-signing/comm" ) const ( @@ -33,7 +33,7 @@ type Libp2pCommunication struct { } func NewCommunication(h host.Host, protocolID protocol.ID) Libp2pCommunication { - logger := log.With().Str("Module", "communication").Str("Peer", h.ID().Pretty()).Logger() + logger := log.With().Str("Module", "communication").Str("Peer", h.ID().String()).Logger() c := Libp2pCommunication{ SessionSubscriptionManager: NewSessionSubscriptionManager(), h: h, @@ -195,7 +195,7 @@ func (c Libp2pCommunication) sendMessage( return err } c.logger.Trace().Str( - "To", to.Pretty()).Str( + "To", to.String()).Str( "MsgType", msgType.String()).Str( "SessionID", sessionID).Msg( "message sent", @@ -210,7 +210,7 @@ func (c Libp2pCommunication) resolveDNS(peerID peer.ID) error { return err } if len(pi.Addrs) == 0 { - return fmt.Errorf("peer %s has no defined addresses", peerID.Pretty()) + return fmt.Errorf("peer %s has no defined addresses", peerID.String()) } addr, err := resolver.Resolve(context.Background(), pi.Addrs[0]) diff --git a/comm/p2p/libp2p_test.go b/comm/p2p/libp2p_test.go index c58e9484..613aec67 100644 --- a/comm/p2p/libp2p_test.go +++ b/comm/p2p/libp2p_test.go @@ -8,17 +8,17 @@ import ( "fmt" "testing" - comm "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/p2p" - mock_host "github.com/ChainSafe/sygma-relayer/comm/p2p/mock/host" - mock_network "github.com/ChainSafe/sygma-relayer/comm/p2p/mock/stream" - "github.com/ChainSafe/sygma-relayer/topology" - "github.com/ChainSafe/sygma-relayer/tss/message" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/protocol" + comm "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/comm/p2p" + mock_host "github.com/sprintertech/sprinter-signing/comm/p2p/mock/host" + mock_network "github.com/sprintertech/sprinter-signing/comm/p2p/mock/stream" + "github.com/sprintertech/sprinter-signing/topology" + "github.com/sprintertech/sprinter-signing/tss/message" "github.com/stretchr/testify/suite" ) @@ -156,7 +156,7 @@ func (s *Libp2pCommunicationTestSuite) TestLibp2pCommunication_SendReceiveMessag privateKeys = append(privateKeys, privKeyForHost) peerID, _ := peer.IDFromPrivateKey(privKeyForHost) addrInfoForHost, _ := peer.AddrInfoFromString(fmt.Sprintf( - "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+portOffset+i, peerID.Pretty(), + "/ip4/127.0.0.1/tcp/%d/p2p/%s", 4000+portOffset+i, peerID.String(), )) topology.Peers = append(topology.Peers, addrInfoForHost) } diff --git a/comm/p2p/manager.go b/comm/p2p/manager.go index 6c7fedfa..417735ec 100644 --- a/comm/p2p/manager.go +++ b/comm/p2p/manager.go @@ -41,7 +41,7 @@ func (sm *StreamManager) ReleaseStreams(sessionID string) { for peer, stream := range streams { err := stream.Close() if err != nil { - log.Err(err).Msgf("Cannot close stream to peer %s", peer.Pretty()) + log.Err(err).Msgf("Cannot close stream to peer %s", peer.String()) } } diff --git a/comm/p2p/manager_test.go b/comm/p2p/manager_test.go index 86ddc4ba..1a410139 100644 --- a/comm/p2p/manager_test.go +++ b/comm/p2p/manager_test.go @@ -6,11 +6,11 @@ package p2p_test import ( "testing" - "github.com/ChainSafe/sygma-relayer/comm/p2p" "github.com/libp2p/go-libp2p/core/peer" + "github.com/sprintertech/sprinter-signing/comm/p2p" - mock_network "github.com/ChainSafe/sygma-relayer/comm/p2p/mock/stream" "github.com/golang/mock/gomock" + mock_network "github.com/sprintertech/sprinter-signing/comm/p2p/mock/stream" "github.com/stretchr/testify/suite" ) diff --git a/comm/p2p/mock/conn/conn.go b/comm/p2p/mock/conn/conn.go index 8c408236..a89a0078 100644 --- a/comm/p2p/mock/conn/conn.go +++ b/comm/p2p/mock/conn/conn.go @@ -52,6 +52,20 @@ func (mr *MockConnMockRecorder) Close() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockConn)(nil).Close)) } +// ConnState mocks base method. +func (m *MockConn) ConnState() network.ConnectionState { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConnState") + ret0, _ := ret[0].(network.ConnectionState) + return ret0 +} + +// ConnState indicates an expected call of ConnState. +func (mr *MockConnMockRecorder) ConnState() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConnState", reflect.TypeOf((*MockConn)(nil).ConnState)) +} + // GetStreams mocks base method. func (m *MockConn) GetStreams() []network.Stream { m.ctrl.T.Helper() @@ -80,6 +94,20 @@ func (mr *MockConnMockRecorder) ID() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockConn)(nil).ID)) } +// IsClosed mocks base method. +func (m *MockConn) IsClosed() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsClosed") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsClosed indicates an expected call of IsClosed. +func (mr *MockConnMockRecorder) IsClosed() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsClosed", reflect.TypeOf((*MockConn)(nil).IsClosed)) +} + // LocalMultiaddr mocks base method. func (m *MockConn) LocalMultiaddr() multiaddr.Multiaddr { m.ctrl.T.Helper() @@ -108,20 +136,6 @@ func (mr *MockConnMockRecorder) LocalPeer() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalPeer", reflect.TypeOf((*MockConn)(nil).LocalPeer)) } -// LocalPrivateKey mocks base method. -func (m *MockConn) LocalPrivateKey() crypto.PrivKey { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "LocalPrivateKey") - ret0, _ := ret[0].(crypto.PrivKey) - return ret0 -} - -// LocalPrivateKey indicates an expected call of LocalPrivateKey. -func (mr *MockConnMockRecorder) LocalPrivateKey() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalPrivateKey", reflect.TypeOf((*MockConn)(nil).LocalPrivateKey)) -} - // NewStream mocks base method. func (m *MockConn) NewStream(arg0 context.Context) (network.Stream, error) { m.ctrl.T.Helper() diff --git a/comm/p2p/mock/host/host.go b/comm/p2p/mock/host/host.go index 776c214d..f79869b0 100644 --- a/comm/p2p/mock/host/host.go +++ b/comm/p2p/mock/host/host.go @@ -212,7 +212,7 @@ func (mr *MockHostMockRecorder) SetStreamHandler(arg0, arg1 interface{}) *gomock } // SetStreamHandlerMatch mocks base method. -func (m *MockHost) SetStreamHandlerMatch(arg0 protocol.ID, arg1 func(string) bool, arg2 network.StreamHandler) { +func (m *MockHost) SetStreamHandlerMatch(arg0 protocol.ID, arg1 func(protocol.ID) bool, arg2 network.StreamHandler) { m.ctrl.T.Helper() m.ctrl.Call(m, "SetStreamHandlerMatch", arg0, arg1, arg2) } diff --git a/comm/p2p/mock/stream/conn.go b/comm/p2p/mock/stream/conn.go deleted file mode 100644 index 8c408236..00000000 --- a/comm/p2p/mock/stream/conn.go +++ /dev/null @@ -1,208 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/libp2p/go-libp2p/core/network (interfaces: Conn) - -// Package mock_network is a generated GoMock package. -package mock_network - -import ( - context "context" - reflect "reflect" - - gomock "github.com/golang/mock/gomock" - crypto "github.com/libp2p/go-libp2p/core/crypto" - network "github.com/libp2p/go-libp2p/core/network" - peer "github.com/libp2p/go-libp2p/core/peer" - multiaddr "github.com/multiformats/go-multiaddr" -) - -// MockConn is a mock of Conn interface. -type MockConn struct { - ctrl *gomock.Controller - recorder *MockConnMockRecorder -} - -// MockConnMockRecorder is the mock recorder for MockConn. -type MockConnMockRecorder struct { - mock *MockConn -} - -// NewMockConn creates a new mock instance. -func NewMockConn(ctrl *gomock.Controller) *MockConn { - mock := &MockConn{ctrl: ctrl} - mock.recorder = &MockConnMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockConn) EXPECT() *MockConnMockRecorder { - return m.recorder -} - -// Close mocks base method. -func (m *MockConn) Close() error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Close") - ret0, _ := ret[0].(error) - return ret0 -} - -// Close indicates an expected call of Close. -func (mr *MockConnMockRecorder) Close() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockConn)(nil).Close)) -} - -// GetStreams mocks base method. -func (m *MockConn) GetStreams() []network.Stream { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetStreams") - ret0, _ := ret[0].([]network.Stream) - return ret0 -} - -// GetStreams indicates an expected call of GetStreams. -func (mr *MockConnMockRecorder) GetStreams() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStreams", reflect.TypeOf((*MockConn)(nil).GetStreams)) -} - -// ID mocks base method. -func (m *MockConn) ID() string { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ID") - ret0, _ := ret[0].(string) - return ret0 -} - -// ID indicates an expected call of ID. -func (mr *MockConnMockRecorder) ID() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockConn)(nil).ID)) -} - -// LocalMultiaddr mocks base method. -func (m *MockConn) LocalMultiaddr() multiaddr.Multiaddr { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "LocalMultiaddr") - ret0, _ := ret[0].(multiaddr.Multiaddr) - return ret0 -} - -// LocalMultiaddr indicates an expected call of LocalMultiaddr. -func (mr *MockConnMockRecorder) LocalMultiaddr() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalMultiaddr", reflect.TypeOf((*MockConn)(nil).LocalMultiaddr)) -} - -// LocalPeer mocks base method. -func (m *MockConn) LocalPeer() peer.ID { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "LocalPeer") - ret0, _ := ret[0].(peer.ID) - return ret0 -} - -// LocalPeer indicates an expected call of LocalPeer. -func (mr *MockConnMockRecorder) LocalPeer() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalPeer", reflect.TypeOf((*MockConn)(nil).LocalPeer)) -} - -// LocalPrivateKey mocks base method. -func (m *MockConn) LocalPrivateKey() crypto.PrivKey { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "LocalPrivateKey") - ret0, _ := ret[0].(crypto.PrivKey) - return ret0 -} - -// LocalPrivateKey indicates an expected call of LocalPrivateKey. -func (mr *MockConnMockRecorder) LocalPrivateKey() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalPrivateKey", reflect.TypeOf((*MockConn)(nil).LocalPrivateKey)) -} - -// NewStream mocks base method. -func (m *MockConn) NewStream(arg0 context.Context) (network.Stream, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "NewStream", arg0) - ret0, _ := ret[0].(network.Stream) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// NewStream indicates an expected call of NewStream. -func (mr *MockConnMockRecorder) NewStream(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewStream", reflect.TypeOf((*MockConn)(nil).NewStream), arg0) -} - -// RemoteMultiaddr mocks base method. -func (m *MockConn) RemoteMultiaddr() multiaddr.Multiaddr { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RemoteMultiaddr") - ret0, _ := ret[0].(multiaddr.Multiaddr) - return ret0 -} - -// RemoteMultiaddr indicates an expected call of RemoteMultiaddr. -func (mr *MockConnMockRecorder) RemoteMultiaddr() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoteMultiaddr", reflect.TypeOf((*MockConn)(nil).RemoteMultiaddr)) -} - -// RemotePeer mocks base method. -func (m *MockConn) RemotePeer() peer.ID { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RemotePeer") - ret0, _ := ret[0].(peer.ID) - return ret0 -} - -// RemotePeer indicates an expected call of RemotePeer. -func (mr *MockConnMockRecorder) RemotePeer() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemotePeer", reflect.TypeOf((*MockConn)(nil).RemotePeer)) -} - -// RemotePublicKey mocks base method. -func (m *MockConn) RemotePublicKey() crypto.PubKey { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RemotePublicKey") - ret0, _ := ret[0].(crypto.PubKey) - return ret0 -} - -// RemotePublicKey indicates an expected call of RemotePublicKey. -func (mr *MockConnMockRecorder) RemotePublicKey() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemotePublicKey", reflect.TypeOf((*MockConn)(nil).RemotePublicKey)) -} - -// Scope mocks base method. -func (m *MockConn) Scope() network.ConnScope { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Scope") - ret0, _ := ret[0].(network.ConnScope) - return ret0 -} - -// Scope indicates an expected call of Scope. -func (mr *MockConnMockRecorder) Scope() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Scope", reflect.TypeOf((*MockConn)(nil).Scope)) -} - -// Stat mocks base method. -func (m *MockConn) Stat() network.ConnStats { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Stat") - ret0, _ := ret[0].(network.ConnStats) - return ret0 -} - -// Stat indicates an expected call of Stat. -func (mr *MockConnMockRecorder) Stat() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stat", reflect.TypeOf((*MockConn)(nil).Stat)) -} diff --git a/comm/p2p/mock/stream/stream.go b/comm/p2p/mock/stream/stream.go index 74051e7b..255ed15d 100644 --- a/comm/p2p/mock/stream/stream.go +++ b/comm/p2p/mock/stream/stream.go @@ -1,16 +1,20 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/libp2p/go-libp2p/core/network (interfaces: Stream) +// Source: github.com/libp2p/go-libp2p/core/network (interfaces: Stream,Conn) // Package mock_network is a generated GoMock package. package mock_network import ( + context "context" reflect "reflect" time "time" gomock "github.com/golang/mock/gomock" + crypto "github.com/libp2p/go-libp2p/core/crypto" network "github.com/libp2p/go-libp2p/core/network" + peer "github.com/libp2p/go-libp2p/core/peer" protocol "github.com/libp2p/go-libp2p/core/protocol" + multiaddr "github.com/multiformats/go-multiaddr" ) // MockStream is a mock of Stream interface. @@ -247,3 +251,209 @@ func (mr *MockStreamMockRecorder) Write(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*MockStream)(nil).Write), arg0) } + +// MockConn is a mock of Conn interface. +type MockConn struct { + ctrl *gomock.Controller + recorder *MockConnMockRecorder +} + +// MockConnMockRecorder is the mock recorder for MockConn. +type MockConnMockRecorder struct { + mock *MockConn +} + +// NewMockConn creates a new mock instance. +func NewMockConn(ctrl *gomock.Controller) *MockConn { + mock := &MockConn{ctrl: ctrl} + mock.recorder = &MockConnMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockConn) EXPECT() *MockConnMockRecorder { + return m.recorder +} + +// Close mocks base method. +func (m *MockConn) Close() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Close") + ret0, _ := ret[0].(error) + return ret0 +} + +// Close indicates an expected call of Close. +func (mr *MockConnMockRecorder) Close() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockConn)(nil).Close)) +} + +// ConnState mocks base method. +func (m *MockConn) ConnState() network.ConnectionState { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConnState") + ret0, _ := ret[0].(network.ConnectionState) + return ret0 +} + +// ConnState indicates an expected call of ConnState. +func (mr *MockConnMockRecorder) ConnState() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConnState", reflect.TypeOf((*MockConn)(nil).ConnState)) +} + +// GetStreams mocks base method. +func (m *MockConn) GetStreams() []network.Stream { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetStreams") + ret0, _ := ret[0].([]network.Stream) + return ret0 +} + +// GetStreams indicates an expected call of GetStreams. +func (mr *MockConnMockRecorder) GetStreams() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStreams", reflect.TypeOf((*MockConn)(nil).GetStreams)) +} + +// ID mocks base method. +func (m *MockConn) ID() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID") + ret0, _ := ret[0].(string) + return ret0 +} + +// ID indicates an expected call of ID. +func (mr *MockConnMockRecorder) ID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockConn)(nil).ID)) +} + +// IsClosed mocks base method. +func (m *MockConn) IsClosed() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsClosed") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsClosed indicates an expected call of IsClosed. +func (mr *MockConnMockRecorder) IsClosed() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsClosed", reflect.TypeOf((*MockConn)(nil).IsClosed)) +} + +// LocalMultiaddr mocks base method. +func (m *MockConn) LocalMultiaddr() multiaddr.Multiaddr { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LocalMultiaddr") + ret0, _ := ret[0].(multiaddr.Multiaddr) + return ret0 +} + +// LocalMultiaddr indicates an expected call of LocalMultiaddr. +func (mr *MockConnMockRecorder) LocalMultiaddr() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalMultiaddr", reflect.TypeOf((*MockConn)(nil).LocalMultiaddr)) +} + +// LocalPeer mocks base method. +func (m *MockConn) LocalPeer() peer.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LocalPeer") + ret0, _ := ret[0].(peer.ID) + return ret0 +} + +// LocalPeer indicates an expected call of LocalPeer. +func (mr *MockConnMockRecorder) LocalPeer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalPeer", reflect.TypeOf((*MockConn)(nil).LocalPeer)) +} + +// NewStream mocks base method. +func (m *MockConn) NewStream(arg0 context.Context) (network.Stream, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NewStream", arg0) + ret0, _ := ret[0].(network.Stream) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NewStream indicates an expected call of NewStream. +func (mr *MockConnMockRecorder) NewStream(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewStream", reflect.TypeOf((*MockConn)(nil).NewStream), arg0) +} + +// RemoteMultiaddr mocks base method. +func (m *MockConn) RemoteMultiaddr() multiaddr.Multiaddr { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemoteMultiaddr") + ret0, _ := ret[0].(multiaddr.Multiaddr) + return ret0 +} + +// RemoteMultiaddr indicates an expected call of RemoteMultiaddr. +func (mr *MockConnMockRecorder) RemoteMultiaddr() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoteMultiaddr", reflect.TypeOf((*MockConn)(nil).RemoteMultiaddr)) +} + +// RemotePeer mocks base method. +func (m *MockConn) RemotePeer() peer.ID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemotePeer") + ret0, _ := ret[0].(peer.ID) + return ret0 +} + +// RemotePeer indicates an expected call of RemotePeer. +func (mr *MockConnMockRecorder) RemotePeer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemotePeer", reflect.TypeOf((*MockConn)(nil).RemotePeer)) +} + +// RemotePublicKey mocks base method. +func (m *MockConn) RemotePublicKey() crypto.PubKey { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RemotePublicKey") + ret0, _ := ret[0].(crypto.PubKey) + return ret0 +} + +// RemotePublicKey indicates an expected call of RemotePublicKey. +func (mr *MockConnMockRecorder) RemotePublicKey() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemotePublicKey", reflect.TypeOf((*MockConn)(nil).RemotePublicKey)) +} + +// Scope mocks base method. +func (m *MockConn) Scope() network.ConnScope { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Scope") + ret0, _ := ret[0].(network.ConnScope) + return ret0 +} + +// Scope indicates an expected call of Scope. +func (mr *MockConnMockRecorder) Scope() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Scope", reflect.TypeOf((*MockConn)(nil).Scope)) +} + +// Stat mocks base method. +func (m *MockConn) Stat() network.ConnStats { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stat") + ret0, _ := ret[0].(network.ConnStats) + return ret0 +} + +// Stat indicates an expected call of Stat. +func (mr *MockConnMockRecorder) Stat() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stat", reflect.TypeOf((*MockConn)(nil).Stat)) +} diff --git a/comm/p2p/subscription.go b/comm/p2p/subscription.go index c19758d7..9b883e4b 100644 --- a/comm/p2p/subscription.go +++ b/comm/p2p/subscription.go @@ -6,7 +6,7 @@ package p2p import ( "sync" - comm "github.com/ChainSafe/sygma-relayer/comm" + comm "github.com/sprintertech/sprinter-signing/comm" ) // SessionSubscriptionManager manages channel subscriptions by comm.SessionID diff --git a/comm/p2p/subscription_test.go b/comm/p2p/subscription_test.go index 8999b1ce..81a0b4a2 100644 --- a/comm/p2p/subscription_test.go +++ b/comm/p2p/subscription_test.go @@ -4,10 +4,10 @@ package p2p_test import ( - "github.com/ChainSafe/sygma-relayer/comm/p2p" + "github.com/sprintertech/sprinter-signing/comm/p2p" "testing" - comm "github.com/ChainSafe/sygma-relayer/comm" + comm "github.com/sprintertech/sprinter-signing/comm" "github.com/stretchr/testify/suite" ) diff --git a/config/chain/config.go b/config/chain/config.go index 9330f5e7..338749ba 100644 --- a/config/chain/config.go +++ b/config/chain/config.go @@ -6,8 +6,8 @@ package chain import ( "fmt" - "github.com/ChainSafe/sygma-relayer/config" "github.com/spf13/viper" + "github.com/sprintertech/sprinter-signing/config" ) type GeneralChainConfig struct { diff --git a/config/config.go b/config/config.go index 3b447599..3dfff7cc 100644 --- a/config/config.go +++ b/config/config.go @@ -9,9 +9,9 @@ import ( "io" "net/http" - "github.com/ChainSafe/sygma-relayer/config/relayer" "github.com/creasty/defaults" "github.com/imdario/mergo" + "github.com/sprintertech/sprinter-signing/config/relayer" "github.com/spf13/cobra" "github.com/spf13/viper" diff --git a/config/config_test.go b/config/config_test.go index f615bc29..5991b5bb 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -9,8 +9,8 @@ import ( "testing" "time" - "github.com/ChainSafe/sygma-relayer/config" - "github.com/ChainSafe/sygma-relayer/config/relayer" + "github.com/sprintertech/sprinter-signing/config" + "github.com/sprintertech/sprinter-signing/config/relayer" "github.com/stretchr/testify/suite" ) diff --git a/config/env_test.go b/config/env_test.go index 78a4fe36..0e0431e1 100644 --- a/config/env_test.go +++ b/config/env_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/suite" - "github.com/ChainSafe/sygma-relayer/config/relayer" + "github.com/sprintertech/sprinter-signing/config/relayer" ) type LoadFromEnvTestSuite struct { diff --git a/docs/Home.md b/docs/Home.md deleted file mode 100644 index 5fd2ae6b..00000000 --- a/docs/Home.md +++ /dev/null @@ -1,13 +0,0 @@ -# Relayers - -_Relayers are entities that ensure bridge decentralization and execute asset bridging._ - -## Abstract - -At the core of Sygma exists a set of relayers that are distributed among several legal entities and operate under a -trusted federation model. Spreading the relayer set across several legal entities creates a distribution of -responsibilities and mitigates risk by disincentivizing relayers in the set to act in an unfair manner. -Each relayer within the set listens to both the source and destination chains that are being bridged by Sygma. Based on -events that are emitted, these relayers then execute relevant actions. -This multi-relayer set is responsible for relaying messages from a source network to a destination network. Relayers are -operating with private key share and execution happens on the destination network with MPC private key. diff --git a/docs/general/Arhitecture.md b/docs/general/Arhitecture.md deleted file mode 100644 index 9242eca6..00000000 --- a/docs/general/Arhitecture.md +++ /dev/null @@ -1,12 +0,0 @@ -# Sygma Architecture - -![](/docs/resources/sygma-arhitecture.png) - -## Components - -- **[CLI commands](/docs/general/CLI.md)** - overview of CLI commands -- **[Deposit](/docs/general/Deposit.md)** - Deposit data overview -- **[Fees](/docs/general/Fees.md)** - high-level overview of handling fees -- **[Relayers](/docs/Home.md)** - relayer technical documentation -- **[Topology Map](/docs/general/Topology.md)** - overview of topology map usage -- **[Shared Configuration](https://github.com/sygmaprotocol/sygma-shared-configuration)** - Shared configuration overview diff --git a/docs/general/CLI.md b/docs/general/CLI.md deleted file mode 100644 index 27439f35..00000000 --- a/docs/general/CLI.md +++ /dev/null @@ -1,77 +0,0 @@ -# Sygma Relayer CLI Guide - -### Introduction - -This guide details specific Command Line Interface (CLI) commands for the Sygma relayer, focusing on functionalities provided in the `topology`, `peer`, `keygen` and `utils` modules. - -## Topology commands - -### Encrypt Topology Command (topology) - -#### Usage: -`./sygma-relayer topology encrypt --path [path] --encryption-key [key]` - -#### Description: -Encrypt the provided topology with AES CTR. Outputs IV and ciphertext in hex. - -#### Flags: -- `--path`: Path to JSON file with network topology. -- `--encryption-key`: Password to encrypt topology. - -### Test Topology Command (topology) - -#### Usage: -`./sygma-relayer topology test --url [url] --decryption-key [key] --hash [hash]` - -#### Description: -Test if the provided URL contains a topology that can be decrypted with the provided password and parsed accordingly. - -#### Flags: -- `--decryption-key`: Password to decrypt topology. -- `--url`: URL to fetch topology. -- `--hash`: Hash of the topology. - -## Libp2p (peer) commands - -### Generate Key Command (peer) - -#### Usage: -`./sygma-relayer peer gen-key` - -#### Description: -Generate a libp2p identity key using RSA with a key length of 2048 bits. - -### Peer Info Command (peer) - -#### Usage: -`./sygma-relayer peer info --private-key [key]` - -#### Description: -Calculate a libp2p peer ID from the provided base64 encoded libp2p private key. - -#### Flags: -- `--private-key`: Base64 encoded libp2p private key. - -## Keygen commands - -### Generate ECDSA keypair - -#### Usage: -`./sygma-relayer keygen gen-key` - -#### Description: -Generate a 256-bit ECDSA keypair and print it out. This keypair can be used as a relayer's execution keypair. - -## Other util commands - -### Derivate SS58 Command (utils) - -#### Usage: -`./sygma-relayer utils derivateSS58 --privateKey [key] --networkID [id]` - -#### Description: -Print an SS58 formatted address (Polkadot) for a given PrivateKey in hex. - -#### Flags: -- `--privateKey`: Hex encoded private key. -- `--networkID`: Network ID for a checksum, as per the registry. diff --git a/docs/general/Deposit.md b/docs/general/Deposit.md deleted file mode 100644 index 404dbddf..00000000 --- a/docs/general/Deposit.md +++ /dev/null @@ -1,17 +0,0 @@ -# Deposit -This document describes the expected format of the deposit for different networks -## BTC Deposit -## Format - -### OP_RETURN Output - -- **Purpose**: Stores arbitrary data within the transaction. -- **Requirements**: - - There should be at most one output with a `ScriptPubKey.Type` of `OP_RETURN`. - - The `OP_RETURN` data must be formatted as `receiverEVMAddress_destinationDomainID`. - - -### Amount Calculation - -- The total deposit amount is calculated by summing the values of the outputs that match the resource address. -- Only outputs with script types of `witness_v1_taproot` are considered for the amount calculation. diff --git a/docs/general/Fees.md b/docs/general/Fees.md deleted file mode 100644 index 7fd4bae2..00000000 --- a/docs/general/Fees.md +++ /dev/null @@ -1,67 +0,0 @@ -# Fees - -Sygma allows granular control of handling fees for each resource. Although specific implementations differ based on chain architecture, the general functionality is the same. Each resource is assigned a fee strategy for every potential destination domain, and this mapping also outlines all potential bridging routes for a given resource. - -### Deposit flow - -1. **Calculate the final fee** - - Call the contract to calculate the fee. This call, under the hood, fetches information on price from the on-chain oracle (for dynamic fee strategy) or uses predefined rules for fixed and percentage-based strategies. -2. **Execute deposit** - - Send the appropriate amount based on the calculated final fee when executing the deposit. - -## Fee strategies - -Fee strategy defines a set of rules on how fees should be charged when executing deposits on the source chain. - -### Dynamic fee strategy (EVM only) -_Supported on: **EVM**_ | _Fee can be paid in:_ **Native asset** - -This strategy utilizes the on-chain `TwapOracle` contract to pull price information and calculate fees. The final fee is calculated based on the execution cost for the destination chain and can be paid in the native currency of the source chain. - -Calculated fee consists out of two parts: -`fee = execution cost + protocol fee` -- **execution cost**: price of executing destination transaction - - `destination_network_gasprice * gas_used * destination_coin_price_from_twap` - - -- **protocol fee**: fee that the protocol takes for maintenance costs - - _fixed:_ constant amount of native tokens added on top of the execution cost - - _percentage:_ percentage of the execution cost added on top of the execution cost - - _** it is possible for some routes for protocol fee to be 0_ - -Based on route type, there are two concrete implementations of dynamic fees fee handlers: - -- **For asset transfers**: `TwapNativeTokenFeeHandler.sol` - - Parameter `gas_used` is fixed and configured in the contract (generally, transactions transferring specific type of asset use a fixed amount of gas) - - -- **For GMP (generic message) transfers**: `TwapGenericFeeHandler.sol` - - Parameter `gas_used` is provided by the user with deposit data. This value will be set by the relayer executing this transaction, so the user must understand what they are executing. - -#### TwapOracle -The TwapOracle is a wrapper contract around the Uniswap TWAP oracle system. Based on the configuration, this contract will either pull the price of the destination gas token periodically from Uniswap or use the configured fixed price of the destination gas token. - -### Fixed fee strategy -_Supported on: **EVM**, **Substrate**_ | _Fee can be paid in:_ **Native asset** - -This strategy always requires a predefined fixed fee amount per deposit. **EVM implementation can only collect fees in the native currency of the source chain, while Substrate implementation allows for fees to be collected in any configured asset**. - -### Percentage-based fee strategy -_Supported on: **EVM**, **Substrate**_ | _Fee can be paid in:_ **Transferred asset** - -This strategy calculates the fee amount based on the amount of token being transferred. It always collects fees in the token that is being transferred, so it only makes sense for fungible token routes. - - - -## Architecture overview -*On the diagram below, we use [Sygma SDK](https://github.com/sygmaprotocol/sygma-sdk) for interaction with all services.* - -![](/docs/resources/fees-diagram.png) - -### EVM - -Check out the [solidity documentation](https://github.com/sygmaprotocol/sygma-solidity/blob/master/docs/Home.md) for details on EVM implementation. - -### Substrate - -Check out the [substrate pallet documentation](https://github.com/sygmaprotocol/sygma-substrate-pallets/blob/master/docs/Home.md) for details on Substrate implementation. diff --git a/docs/general/Metrics.md b/docs/general/Metrics.md deleted file mode 100644 index 2e8b12de..00000000 --- a/docs/general/Metrics.md +++ /dev/null @@ -1,19 +0,0 @@ -# Metrics -Metrics are implemented via the OpenTelemetry [stack](https://opentelemetry.io/) and exported to the Opentelemetry [collector](https://opentelemetry.io/docs/collector/) which then be configured to export to supported metrics tools like Datadog. - -## Exported metrics -The following metrics are exported: -``` -relayer.DepositEventCount (counter) - count of indexed deposits -relayer.ExecutionErrorCount (counter) - count of executions that failed -relayer.ExecutionLatencyPerRoute (histogram) - latency between indexing event and executing it per route -relayer.ExecutionLatency (histogram) - latency between indexing event and executing it across all routes -relayer.TotalRelayers (gauge) - number of relayers currently in the subset for MPC -relayer.availableRelayers (gauge) - number of currently available relayers from the subset -relayer.BlockDelta (gauge) - "Difference between chain head and current indexed block per domain -``` - -## Env variables -- SYG_RELAYER_OPENTELEMETRYCOLLECTORURL - url of the opentelemetry collector application that collects metrics -- SYG_RELAYER_ID - Set as a metrics tag (relayerid:0). Used to distinguish one Relayer from another. NOTE: should be unique and if you are planning to run Sygma relayer please agree on your relayerID with the team -- SYG_RELAYER_ENV - Set as a metrics tag (env:test). Used to distinguish Relayer environment diff --git a/docs/general/Topology.md b/docs/general/Topology.md deleted file mode 100644 index bdd1a41c..00000000 --- a/docs/general/Topology.md +++ /dev/null @@ -1,42 +0,0 @@ -# Topology map -A topology map is a configuration file that contains information about each relayer address so that relayers can communicate with each other. It also holds threshold information that is used in the tss process. - -## Topology map initialization -The topology map has the following structure: -``` -{ - "peers": [ - {"peerAddress": "/dns1/relayer-0.relayer-0-STAGE/tcp/9000/p2p/QmVuMSb6unWs2m22sgEQF97XvShbrd9JAkX7Kh2xQ9EYGC"}, - {"peerAddress": "/dns1/relayer-1.relayer-1-STAGE/tcp/9000/p2p/QmcLn2tXGcYA1FUUWsRQoRGmWN17SncGuvjFL3h9azMRgB"}, - {"peerAddress": "/dns1/relayer-2.relayer-2-STAGE/tcp/9000/p2p/QmVF5HpD7oPkRGFF62pJC6w2QQgD5fZ6qVAzupamugjsTC"}, - {"peerAddress": "/dns1/relayer-3.relayer-3-STAGE/tcp/9000/p2p/QmZG9c35vUBehEDTkG1mLhw2J4jHG3VsYcJAuY1kqevohE"}, - ], - "threshold": "2" -} -``` - -After the topology map file is created, the file needs to be encrypted and uploaded to a remote service(ipfs). -On startup, relayers are fetching the topology map from the remote service, and store the data in a local file. - -## Topology map update -To update the topology map, the map on the remote service needs to be updated. After we updated the topology map on ipfs, the `refreshKey` function needs to be called on the [bridge smart contract](https://github.com/sygmaprotocol/sygma-solidity/blob/master/contracts/Bridge.sol) (only Admin is allowed to trigger this function). `refreshKey` function is implemented only on the evm chain. The `refreshKey` function is called with the topology map hash. This hash is used to prevent relayers using invalid or compromised topology when updating it. Relayers will start using the new, updated topology only when the `KeyRefresh` event is processed which is emitted by the `refreshKey` function. - -## Env variables -- SYG_RELAYER_MPCCONFIG_TOPOLOGYCONFIGURATION_ENCRYPTIONKEY - the key that is used to encrypt the topology map -- SYG_RELAYER_MPCCONFIG_TOPOLOGYCONFIGURATION_URL - topology map location -- SYG_RELAYER_MPCCONFIG_TOPOLOGYCONFIGURATION_PATH - local file where the topology map is stored after the download from the remote service - -## Topology encryption/decryption details -Topology should be encrypted with AES using CTR mode. -IPFS should return hex formatted IV + data. To help you there are 2 utility CLI described below. - -## Utility CLI -For more details on all CLI commands you can check out [CLI commands page](/docs/general/CLI.md). - -`./relayer topology encrypt --path ./topology.json --encryptionKey 123` -This command will encrypt provided topology and output corresponding hash and encrypted toplogy in hex representation (iv + data) - -`./relayer topology test --hash 123 --url https://cloudflare-ipfs.com/ipfs/123 --decryptionKey 321` -This command will fetch topology from IPFS and test it according to Relayers topology initialization flow. -This allows to test correctnes of topology before actually calling `RefreshKey` - diff --git a/docs/resources/fee-router-general.png b/docs/resources/fee-router-general.png deleted file mode 100644 index 4efd6c2e..00000000 Binary files a/docs/resources/fee-router-general.png and /dev/null differ diff --git a/docs/resources/fees-diagram.png b/docs/resources/fees-diagram.png deleted file mode 100644 index 746e26b2..00000000 Binary files a/docs/resources/fees-diagram.png and /dev/null differ diff --git a/docs/resources/percentage-formula-general.png b/docs/resources/percentage-formula-general.png deleted file mode 100644 index 21293bd9..00000000 Binary files a/docs/resources/percentage-formula-general.png and /dev/null differ diff --git a/docs/resources/sygma-arhitecture.png b/docs/resources/sygma-arhitecture.png deleted file mode 100644 index e5919d83..00000000 Binary files a/docs/resources/sygma-arhitecture.png and /dev/null differ diff --git a/e2e/btc/btc_test.go b/e2e/btc/btc_test.go deleted file mode 100644 index 945bc01f..00000000 --- a/e2e/btc/btc_test.go +++ /dev/null @@ -1,250 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package btc_test - -import ( - "context" - "encoding/hex" - "math" - - "github.com/btcsuite/btcd/btcec/v2" - "github.com/btcsuite/btcd/btcutil" - "github.com/btcsuite/btcd/chaincfg" - "github.com/btcsuite/btcd/chaincfg/chainhash" - "github.com/btcsuite/btcd/txscript" - "github.com/btcsuite/btcd/wire" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - evmClient "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/gas" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/signAndSend" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/transaction" - - "math/big" - "testing" - - "github.com/ChainSafe/sygma-relayer/chains/btc/connection" - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/contracts/bridge" - - "github.com/ChainSafe/sygma-relayer/e2e/btc" - "github.com/ChainSafe/sygma-relayer/e2e/evm" - "github.com/ChainSafe/sygma-relayer/e2e/evm/contracts/erc20" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/suite" -) - -var amountToDeposit = big.NewInt(100000000) - -type TestClient interface { - evm.EVMClient - LatestBlock() (*big.Int, error) - CodeAt(ctx context.Context, contractAddress common.Address, block *big.Int) ([]byte, error) - FetchEventLogs(ctx context.Context, contractAddress common.Address, event string, startBlock *big.Int, endBlock *big.Int) ([]types.Log, error) - SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) - TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) - BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) -} - -func Test_EVMBtc(t *testing.T) { - evmConfig := evm.DEFAULT_CONFIG - evmConfig.Erc20LockReleaseAddr = common.HexToAddress("0xb61bd8740F60e0Bfc1b5C3fA2Bb9810e4AEf8938") - evmConfig.Erc20LockReleaseResourceID = evm.SliceTo32Bytes(common.LeftPadBytes([]byte{0x10}, 31)) - - ethClient, err := evmClient.NewEVMClient(evm.ETHEndpoint1, evm.AdminAccount) - if err != nil { - panic(err) - } - gasPricer := gas.NewStaticGasPriceDeterminant(ethClient, nil) - - suite.Run( - t, - NewEVMBtcTestSuite( - transaction.NewTransaction, - ethClient, - gasPricer, - evmConfig, - ), - ) -} - -func NewEVMBtcTestSuite( - fabric transaction.TxFabric, - evmClient TestClient, - gasPricer signAndSend.GasPricer, - evmConfig evm.BridgeConfig, -) *IntegrationTestSuite { - return &IntegrationTestSuite{ - fabric: fabric, - evmClient: evmClient, - gasPricer: gasPricer, - evmConfig: evmConfig, - } -} - -type IntegrationTestSuite struct { - suite.Suite - fabric transaction.TxFabric - evmClient TestClient - gasPricer signAndSend.GasPricer - evmConfig evm.BridgeConfig -} - -func (s *IntegrationTestSuite) SetupSuite() { - // EVM side preparation - evmTransactor := signAndSend.NewSignAndSendTransactor(s.fabric, s.gasPricer, s.evmClient) - mintTo := s.evmClient.From() - amountToMint := big.NewInt(0).Mul(big.NewInt(5000000000000000), big.NewInt(0).Exp(big.NewInt(10), big.NewInt(18), nil)) - amountToApprove := big.NewInt(0).Mul(big.NewInt(100000), big.NewInt(0).Exp(big.NewInt(10), big.NewInt(18), nil)) - erc20LRContract := erc20.NewERC20Contract(s.evmClient, s.evmConfig.Erc20LockReleaseAddr, evmTransactor) - _, err := erc20LRContract.MintTokens(mintTo, amountToMint, transactor.TransactOptions{}) - if err != nil { - panic(err) - } - _, err = erc20LRContract.ApproveTokens(s.evmConfig.Erc20LockReleaseHandlerAddr, amountToApprove, transactor.TransactOptions{}) - if err != nil { - panic(err) - } -} - -func (s *IntegrationTestSuite) Test_Erc20Deposit_EVM_to_Btc() { - conn, err := connection.NewBtcConnection(btc.BtcEndpoint, "user", "password", true) - s.Nil(err) - - addr, err := btcutil.DecodeAddress("bcrt1pja8aknn7te4empmghnyqnrtjqn0lyg5zy3p5jsdp4le930wnpnxsrtd3ht", &chaincfg.RegressionNetParams) - s.Nil(err) - balanceBefore, err := conn.ListUnspentMinMaxAddresses(0, 1000, []btcutil.Address{addr}) - s.Nil(err) - s.Equal(len(balanceBefore), 0) - - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric, s.gasPricer, s.evmClient) - bridgeContract1 := bridge.NewBridgeContract(s.evmClient, s.evmConfig.BridgeAddr, transactor1) - erc20DepositData := evm.ConstructErc20DepositData([]byte("bcrt1pja8aknn7te4empmghnyqnrtjqn0lyg5zy3p5jsdp4le930wnpnxsrtd3ht"), amountToDeposit) - _, err = bridgeContract1.ExecuteTransaction("deposit", transactor.TransactOptions{Value: s.evmConfig.BasicFee}, uint8(4), s.evmConfig.Erc20LockReleaseResourceID, erc20DepositData, []byte{}) - s.Nil(err) - - err = btc.WaitForProposalExecuted(conn, addr) - s.Nil(err) - - balanceAfter, err := conn.ListUnspentMinMaxAddresses(0, 1000, []btcutil.Address{addr}) - s.Nil(err) - s.Equal(balanceAfter[0].Amount*100000000, float64(amountToDeposit.Int64())) - -} - -func (s *IntegrationTestSuite) Test_Erc20Deposit_Btc_to_EVM() { - pk, _ := crypto.HexToECDSA("8df766a778b57d58c2ad239ed98ec0e611a9bfbdc328b61755ebc40cf20c0f3f") - dstAddr := crypto.PubkeyToAddress(pk.PublicKey) - - conn, err := connection.NewBtcConnection(btc.BtcEndpoint, "user", "password", true) - s.Nil(err) - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric, s.gasPricer, s.evmClient) - erc20Contract2 := erc20.NewERC20Contract(s.evmClient, s.evmConfig.Erc20LockReleaseAddr, transactor1) - destBalanceBefore, err := erc20Contract2.GetBalance(dstAddr) - - // Your Bitcoin address - add, _ := btcutil.DecodeAddress("mrheH3ouZNyUbpp9LtWP28xqv1yhNQAsfC", &chaincfg.RegressionNetParams) - s.Nil(err) - - recipientAddress, err := btcutil.DecodeAddress("bcrt1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2sjyr5ek", &chaincfg.RegressionNetParams) - s.Nil(err) - - feeAddress, err := btcutil.DecodeAddress("mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt", &chaincfg.RegressionNetParams) - s.Nil(err) - - // Define the private key as a hexadecimal string - privateKeyHex := "ccfa495d2ae193eeec53db12971bdedfe500603ec53f98a6138f0abe932be84f" - - // Decode the hexadecimal string into a byte slice - privateKeyBytes, err := hex.DecodeString(privateKeyHex) - s.Nil(err) - - // Create a new private key instance - privateKey, _ := btcec.PrivKeyFromBytes(privateKeyBytes) - - // Fetch unspent transaction outputs (UTXOs) associated with your Bitcoin address - unspent, err := conn.Client.ListUnspentMinMaxAddresses(1, 9999999, []btcutil.Address{add}) - s.Nil(err) - - // Create the PkScript for the recipient address - recipientPkScript, err := txscript.PayToAddrScript(recipientAddress) - s.Nil(err) - - // Create the PkScript for the recipient address - feeAddressPkScript, err := txscript.PayToAddrScript(feeAddress) - s.Nil(err) - - // Define data for the OP_RETURN output - opReturnData := []byte("0x1c3A03D04c026b1f4B4208D2ce053c5686E6FB8d_01") - opReturnScript, err := txscript.NullDataScript(opReturnData) - s.Nil(err) - - // Create transaction inputs - var txInputs []*wire.TxIn - hash, _ := chainhash.NewHashFromStr(unspent[0].TxID) - txInput := wire.NewTxIn(&wire.OutPoint{ - Hash: *hash, - Index: unspent[0].Vout, - }, nil, nil) - - hash2, _ := chainhash.NewHashFromStr(unspent[1].TxID) - txInput2 := wire.NewTxIn(&wire.OutPoint{ - Hash: *hash2, - Index: unspent[1].Vout, - }, nil, nil) - - txInputs = append(txInputs, txInput) - txInputs = append(txInputs, txInput2) - - // Create transaction outputs - txOutputs := []*wire.TxOut{ - { - Value: int64(unspent[0].Amount*math.Pow(10, 8)) - 10000000, - PkScript: recipientPkScript, - }, - { - Value: int64(unspent[1].Amount*math.Pow(10, 8)) - 10000000, - PkScript: feeAddressPkScript, - }, - { - Value: 0, - PkScript: opReturnScript, - }, - } - // Create transaction - tx := wire.NewMsgTx(wire.TxVersion) - - // Add inputs to the transaction - tx.TxIn = txInputs - // Add outputs to the transaction - for _, txOut := range txOutputs { - tx.AddTxOut(txOut) - } - - for i, txIn := range tx.TxIn { - subscript, err := hex.DecodeString(unspent[i].ScriptPubKey) - s.Nil(err) - sigScript, err := txscript.SignatureScript(tx, i, subscript, txscript.SigHashAll, privateKey, true) - s.Nil(err) - txIn.SignatureScript = sigScript - } - - _, err = conn.Client.SendRawTransaction(tx, true) - s.Nil(err) - - // Generate blocks to confirm the transaction - _, err = conn.Client.GenerateToAddress(2, add, nil) - s.Nil(err) - - err = evm.WaitForProposalExecuted(s.evmClient, s.evmConfig.BridgeAddr) - s.Nil(err) - - destBalanceAfter, err := erc20Contract2.GetBalance(dstAddr) - s.Nil(err) - - //Balance has increased - s.Equal(1, destBalanceAfter.Cmp(destBalanceBefore)) -} diff --git a/e2e/btc/util.go b/e2e/btc/util.go deleted file mode 100644 index 4d185ae6..00000000 --- a/e2e/btc/util.go +++ /dev/null @@ -1,38 +0,0 @@ -package btc - -import ( - "errors" - "time" - - "github.com/ChainSafe/sygma-relayer/chains/btc/connection" - "github.com/btcsuite/btcd/btcutil" -) - -const ( - BtcEndpoint = "localhost:18443" -) - -var TestTimeout = time.Minute * 3 - -func WaitForProposalExecuted(conn *connection.Connection, addr btcutil.Address) error { - timeout := time.After(TestTimeout) - ticker := time.NewTicker(5 * time.Second) - - for { - select { - case <-ticker.C: - balance, err := conn.ListUnspentMinMaxAddresses(0, 1000, []btcutil.Address{addr}) - if err != nil { - ticker.Stop() - return err - } - if len(balance) > 0 { - ticker.Stop() - return nil - } - case <-timeout: - ticker.Stop() - return errors.New("test timed out waiting for proposal execution event") - } - } -} diff --git a/e2e/evm/contracts/centrifuge/assetStore.go b/e2e/evm/contracts/centrifuge/assetStore.go deleted file mode 100644 index 6e896b36..00000000 --- a/e2e/evm/contracts/centrifuge/assetStore.go +++ /dev/null @@ -1,44 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package centrifuge - -import ( - "strings" - - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/rs/zerolog/log" - "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/contracts" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" -) - -type AssetStoreContract struct { - contracts.Contract -} - -func NewAssetStoreContract( - client client.Client, - assetStoreContractAddress common.Address, - transactor transactor.Transactor, -) *AssetStoreContract { - a, _ := abi.JSON(strings.NewReader(CentrifugeAssetStoreABI)) - b := common.FromHex(CentrifugeAssetStoreBin) - return &AssetStoreContract{contracts.NewContract(assetStoreContractAddress, a, b, client, transactor)} -} - -func (c *AssetStoreContract) IsCentrifugeAssetStored(hash [32]byte) (bool, error) { - log.Debug(). - Str("hash", hexutil.Encode(hash[:])). - Msgf("Getting is centrifuge asset stored") - res, err := c.CallContract("_assetsStored", hash) - if err != nil { - return false, err - } - - isAssetStored := *abi.ConvertType(res[0], new(bool)).(*bool) - return isAssetStored, nil -} diff --git a/e2e/evm/contracts/centrifuge/consts.go b/e2e/evm/contracts/centrifuge/consts.go deleted file mode 100644 index cdfbb578..00000000 --- a/e2e/evm/contracts/centrifuge/consts.go +++ /dev/null @@ -1,7 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package centrifuge - -const CentrifugeAssetStoreABI = `[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"asset","type":"bytes32"}],"name":"AssetStored","type":"event"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"_assetsStored","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"asset","type":"bytes32"}],"name":"store","outputs":[],"stateMutability":"nonpayable","type":"function"}]` -const CentrifugeAssetStoreBin = "0x608060405234801561001057600080fd5b5061017c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063654cf88c1461003b57806396add60014610050575b600080fd5b61004e61004936600461012d565b610087565b005b61007361005e36600461012d565b60006020819052908152604090205460ff1681565b604051901515815260200160405180910390f35b60008181526020819052604090205460ff16156100ea5760405162461bcd60e51b815260206004820152601760248201527f617373657420697320616c72656164792073746f726564000000000000000000604482015260640160405180910390fd5b600081815260208190526040808220805460ff191660011790555182917f08ae553713effae7116be03743b167b8b803449ee8fb912c2ec43dc2c824f53591a250565b60006020828403121561013f57600080fd5b503591905056fea26469706673582212209c9d6578770cabe853461fb518f0de90a3d20c6312f7b412a9005d3860abce0764736f6c634300080b0033" diff --git a/e2e/evm/contracts/erc1155/consts.go b/e2e/evm/contracts/erc1155/consts.go deleted file mode 100644 index 6dd13018..00000000 --- a/e2e/evm/contracts/erc1155/consts.go +++ /dev/null @@ -1,6 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package erc1155 - -const ERC1155PresetMinterPauserABI = `[{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]` diff --git a/e2e/evm/contracts/erc1155/erc1155.go b/e2e/evm/contracts/erc1155/erc1155.go deleted file mode 100644 index 9948df54..00000000 --- a/e2e/evm/contracts/erc1155/erc1155.go +++ /dev/null @@ -1,55 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package erc1155 - -import ( - "math/big" - "strings" - - "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/contracts" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/rs/zerolog/log" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" -) - -type ERC1155Contract struct { - contracts.Contract -} - -func NewErc1155Contract( - client client.Client, - erc1155ContractAddress common.Address, - t transactor.Transactor, -) *ERC1155Contract { - a, _ := abi.JSON(strings.NewReader(ERC1155PresetMinterPauserABI)) - b := common.FromHex(ERC1155PresetMinterPauserABI) - return &ERC1155Contract{contracts.NewContract(erc1155ContractAddress, a, b, client, t)} -} - -func (c *ERC1155Contract) Approve( - tokenId *big.Int, recipient common.Address, opts transactor.TransactOptions, -) (*common.Hash, error) { - log.Debug().Msgf("Approving %s token for %s", tokenId.String(), recipient.String()) - return c.ExecuteTransaction("setApprovalForAll", opts, recipient, true) -} - -func (c *ERC1155Contract) Mint( - tokenId *big.Int, amount *big.Int, metadata []byte, destination common.Address, opts transactor.TransactOptions, -) (*common.Hash, error) { - log.Debug().Msgf("Minting tokens %s to %s", tokenId.String(), destination.String()) - return c.ExecuteTransaction("mint", opts, destination, tokenId, amount, metadata) -} - -func (c *ERC1155Contract) BalanceOf(account common.Address, id *big.Int) (*big.Int, error) { - res, err := c.CallContract("balanceOf", account, id) - if err != nil { - return nil, err - } - - amount := abi.ConvertType(res[0], new(big.Int)).(*big.Int) - return amount, nil -} diff --git a/e2e/evm/contracts/erc20/consts.go b/e2e/evm/contracts/erc20/consts.go deleted file mode 100644 index bd9e95d6..00000000 --- a/e2e/evm/contracts/erc20/consts.go +++ /dev/null @@ -1,7 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package erc20 - -const ERC20PresetMinterPauserABI = `[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]` -const ERC20PresetMinterPauserBin = "0x60806040523480156200001157600080fd5b5060405162001d9538038062001d958339810160408190526200003491620003b5565b8151829082906200004d90600590602085019062000242565b5080516200006390600690602084019062000242565b50506007805460ff19169055506200007d600033620000dd565b620000a97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000dd565b620000d57f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620000dd565b50506200045c565b620000e98282620000ed565b5050565b6200010482826200013060201b6200096e1760201c565b60008281526001602090815260409091206200012b918390620009f2620001d0821b17901c565b505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620000e9576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200018c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000620001e7836001600160a01b038416620001f0565b90505b92915050565b60008181526001830160205260408120546200023957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620001ea565b506000620001ea565b82805462000250906200041f565b90600052602060002090601f016020900481019282620002745760008555620002bf565b82601f106200028f57805160ff1916838001178555620002bf565b82800160010185558215620002bf579182015b82811115620002bf578251825591602001919060010190620002a2565b50620002cd929150620002d1565b5090565b5b80821115620002cd5760008155600101620002d2565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200031057600080fd5b81516001600160401b03808211156200032d576200032d620002e8565b604051601f8301601f19908116603f01168101908282118183101715620003585762000358620002e8565b816040528381526020925086838588010111156200037557600080fd5b600091505b838210156200039957858201830151818301840152908201906200037a565b83821115620003ab5760008385830101525b9695505050505050565b60008060408385031215620003c957600080fd5b82516001600160401b0380821115620003e157600080fd5b620003ef86838701620002fe565b935060208501519150808211156200040657600080fd5b506200041585828601620002fe565b9150509250929050565b600181811c908216806200043457607f821691505b602082108114156200045657634e487b7160e01b600052602260045260246000fd5b50919050565b611929806200046c6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a457c2d711610097578063d539139311610071578063d5391393146103af578063d547741f146103d6578063dd62ed3e146103e9578063e63ab1e91461042257600080fd5b8063a457c2d714610376578063a9059cbb14610389578063ca15c8731461039c57600080fd5b80639010d07c116100d35780639010d07c1461032857806391d148541461035357806395d89b4114610366578063a217fddf1461036e57600080fd5b806370a08231146102e457806379cc67901461030d5780638456cb591461032057600080fd5b8063313ce567116101665780633f4ba83a116101405780633f4ba83a146102ab57806340c10f19146102b357806342966c68146102c65780635c975abb146102d957600080fd5b8063313ce5671461027657806336568abe14610285578063395093511461029857600080fd5b806318160ddd116101a257806318160ddd1461021957806323b872dd1461022b578063248a9ca31461023e5780632f2ff15d1461026157600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063095ea7b314610206575b600080fd5b6101dc6101d73660046115cf565b610449565b60405190151581526020015b60405180910390f35b6101f9610474565b6040516101e89190611625565b6101dc610214366004611674565b610506565b6004545b6040519081526020016101e8565b6101dc61023936600461169e565b61051e565b61021d61024c3660046116da565b60009081526020819052604090206001015490565b61027461026f3660046116f3565b610542565b005b604051601281526020016101e8565b6102746102933660046116f3565b61056d565b6101dc6102a6366004611674565b6105f0565b61027461062f565b6102746102c1366004611674565b6106d5565b6102746102d43660046116da565b610774565b60075460ff166101dc565b61021d6102f236600461171f565b6001600160a01b031660009081526002602052604090205490565b61027461031b366004611674565b610781565b610274610796565b61033b61033636600461173a565b61083a565b6040516001600160a01b0390911681526020016101e8565b6101dc6103613660046116f3565b610859565b6101f9610882565b61021d600081565b6101dc610384366004611674565b610891565b6101dc610397366004611674565b610923565b61021d6103aa3660046116da565b610931565b61021d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102746103e43660046116f3565b610948565b61021d6103f736600461175c565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61021d7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60006001600160e01b03198216635a05180f60e01b148061046e575061046e82610a07565b92915050565b60606005805461048390611786565b80601f01602080910402602001604051908101604052809291908181526020018280546104af90611786565b80156104fc5780601f106104d1576101008083540402835291602001916104fc565b820191906000526020600020905b8154815290600101906020018083116104df57829003601f168201915b5050505050905090565b600033610514818585610a3c565b5060019392505050565b60003361052c858285610b60565b610537858585610bf2565b506001949350505050565b60008281526020819052604090206001015461055e8133610dcb565b6105688383610e2f565b505050565b6001600160a01b03811633146105e25760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6105ec8282610e51565b5050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909190610514908290869061062a9087906117d7565b610a3c565b6106597f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610859565b6106cb5760405162461bcd60e51b815260206004820152603960248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20756e70617573650000000000000060648201526084016105d9565b6106d3610e73565b565b6106ff7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610859565b61076a5760405162461bcd60e51b815260206004820152603660248201527f45524332305072657365744d696e7465725061757365723a206d7573742068616044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b60648201526084016105d9565b6105ec8282610f06565b61077e3382610ff1565b50565b61078c823383610b60565b6105ec8282610ff1565b6107c07f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610859565b6108325760405162461bcd60e51b815260206004820152603760248201527f45524332305072657365744d696e7465725061757365723a206d75737420686160448201527f76652070617573657220726f6c6520746f20706175736500000000000000000060648201526084016105d9565b6106d361114b565b600082815260016020526040812061085290836111c6565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606006805461048390611786565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909190838110156109165760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105d9565b6105378286868403610a3c565b600033610514818585610bf2565b600081815260016020526040812061046e906111d2565b6000828152602081905260409020600101546109648133610dcb565b6105688383610e51565b6109788282610859565b6105ec576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556109ae3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610852836001600160a01b0384166111dc565b60006001600160e01b03198216637965db0b60e01b148061046e57506301ffc9a760e01b6001600160e01b031983161461046e565b6001600160a01b038316610a9e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105d9565b6001600160a01b038216610aff5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105d9565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381166000908152600360209081526040808320938616835292905220546000198114610bec5781811015610bdf5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105d9565b610bec8484848403610a3c565b50505050565b6001600160a01b038316610c565760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105d9565b6001600160a01b038216610cb85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105d9565b610cc383838361122b565b6001600160a01b03831660009081526002602052604090205481811015610d3b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105d9565b6001600160a01b03808516600090815260026020526040808220858503905591851681529081208054849290610d729084906117d7565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610dbe91815260200190565b60405180910390a3610bec565b610dd58282610859565b6105ec57610ded816001600160a01b03166014611236565b610df8836020611236565b604051602001610e099291906117ef565b60408051601f198184030181529082905262461bcd60e51b82526105d991600401611625565b610e39828261096e565b600082815260016020526040902061056890826109f2565b610e5b82826113d2565b60008281526001602052604090206105689082611437565b60075460ff16610ebc5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105d9565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038216610f5c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105d9565b610f686000838361122b565b8060046000828254610f7a91906117d7565b90915550506001600160a01b03821660009081526002602052604081208054839290610fa79084906117d7565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166110515760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105d9565b61105d8260008361122b565b6001600160a01b038216600090815260026020526040902054818110156110d15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105d9565b6001600160a01b0383166000908152600260205260408120838303905560048054849290611100908490611864565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60075460ff16156111915760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105d9565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ee93390565b6000610852838361144c565b600061046e825490565b60008181526001830160205260408120546112235750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561046e565b50600061046e565b610568838383611476565b6060600061124583600261187b565b6112509060026117d7565b67ffffffffffffffff8111156112685761126861189a565b6040519080825280601f01601f191660200182016040528015611292576020820181803683370190505b509050600360fc1b816000815181106112ad576112ad6118b0565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106112dc576112dc6118b0565b60200101906001600160f81b031916908160001a905350600061130084600261187b565b61130b9060016117d7565b90505b6001811115611383576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061133f5761133f6118b0565b1a60f81b828281518110611355576113556118b0565b60200101906001600160f81b031916908160001a90535060049490941c9361137c816118c6565b905061130e565b5083156108525760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105d9565b6113dc8282610859565b156105ec576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610852836001600160a01b0384166114dc565b6000826000018281548110611463576114636118b0565b9060005260206000200154905092915050565b60075460ff16156105685760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b60648201526084016105d9565b600081815260018301602052604081205480156115c5576000611500600183611864565b855490915060009061151490600190611864565b9050818114611579576000866000018281548110611534576115346118b0565b9060005260206000200154905080876000018481548110611557576115576118b0565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061158a5761158a6118dd565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061046e565b600091505061046e565b6000602082840312156115e157600080fd5b81356001600160e01b03198116811461085257600080fd5b60005b838110156116145781810151838201526020016115fc565b83811115610bec5750506000910152565b60208152600082518060208401526116448160408501602087016115f9565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461166f57600080fd5b919050565b6000806040838503121561168757600080fd5b61169083611658565b946020939093013593505050565b6000806000606084860312156116b357600080fd5b6116bc84611658565b92506116ca60208501611658565b9150604084013590509250925092565b6000602082840312156116ec57600080fd5b5035919050565b6000806040838503121561170657600080fd5b8235915061171660208401611658565b90509250929050565b60006020828403121561173157600080fd5b61085282611658565b6000806040838503121561174d57600080fd5b50508035926020909101359150565b6000806040838503121561176f57600080fd5b61177883611658565b915061171660208401611658565b600181811c9082168061179a57607f821691505b602082108114156117bb57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156117ea576117ea6117c1565b500190565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516118278160178501602088016115f9565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516118588160288401602088016115f9565b01602801949350505050565b600082821015611876576118766117c1565b500390565b6000816000190483118215151615611895576118956117c1565b500290565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000816118d5576118d56117c1565b506000190190565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220bae3c8fa2cbf779ea7b42e35284a76579a8a5958ffcec2fe816eda805f8e039d64736f6c634300080b0033" diff --git a/e2e/evm/contracts/erc20/erc20.go b/e2e/evm/contracts/erc20/erc20.go deleted file mode 100644 index d6842abc..00000000 --- a/e2e/evm/contracts/erc20/erc20.go +++ /dev/null @@ -1,80 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package erc20 - -import ( - "math/big" - "strings" - - "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/contracts" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/rs/zerolog/log" -) - -type ERC20Contract struct { - contracts.Contract -} - -func NewERC20Contract( - client client.Client, - erc20ContractAddress common.Address, - transactor transactor.Transactor, -) *ERC20Contract { - a, _ := abi.JSON(strings.NewReader(ERC20PresetMinterPauserABI)) - b := common.FromHex(ERC20PresetMinterPauserBin) - return &ERC20Contract{contracts.NewContract(erc20ContractAddress, a, b, client, transactor)} -} - -func (c *ERC20Contract) GetBalance(address common.Address) (*big.Int, error) { - log.Debug().Msgf("Getting balance for %s", address.String()) - res, err := c.CallContract("balanceOf", address) - if err != nil { - return nil, err - } - b := abi.ConvertType(res[0], new(big.Int)).(*big.Int) - return b, nil -} - -func (c *ERC20Contract) MintTokens( - to common.Address, - amount *big.Int, - opts transactor.TransactOptions, -) (*common.Hash, error) { - log.Debug().Msgf("Minting %s tokens to %s", amount.String(), to.String()) - return c.ExecuteTransaction("mint", opts, to, amount) -} - -func (c *ERC20Contract) ApproveTokens( - target common.Address, - amount *big.Int, - opts transactor.TransactOptions, -) (*common.Hash, error) { - log.Debug().Msgf("Approving %s tokens for %s", target.String(), amount.String()) - return c.ExecuteTransaction("approve", opts, target, amount) -} - -func (c *ERC20Contract) MinterRole() ([32]byte, error) { - res, err := c.CallContract("MINTER_ROLE") - if err != nil { - return [32]byte{}, err - } - out := *abi.ConvertType(res[0], new([32]byte)).(*[32]byte) - return out, nil -} - -func (c *ERC20Contract) AddMinter( - minter common.Address, - opts transactor.TransactOptions, -) (*common.Hash, error) { - log.Debug().Msgf("Adding new minter %s", minter.String()) - role, err := c.MinterRole() - if err != nil { - return nil, err - } - return c.ExecuteTransaction("grantRole", opts, role, minter) -} diff --git a/e2e/evm/contracts/erc721/consts.go b/e2e/evm/contracts/erc721/consts.go deleted file mode 100644 index c7d7362f..00000000 --- a/e2e/evm/contracts/erc721/consts.go +++ /dev/null @@ -1,7 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package erc721 - -const ERC721PresetMinterPauserABI = `[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"getRoleMemberIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_data","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]` -const ERC721PresetMinterPauserBin = "0x60806040523480156200001157600080fd5b506040516200279f3803806200279f83398101604081905262000034916200035a565b8251839083906200004d906001906020850190620001e7565b50805162000063906002906020840190620001e7565b50506007805460ff19169055506200007d600033620000e9565b620000a97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000e9565b620000d57f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620000e9565b620000e081620000f9565b50505062000428565b620000f582826200010e565b5050565b8051620000f5906009906020840190620001e7565b6000828152602081815260409091206200013391839062000da762000175821b17901c565b15620000f55760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60006200018c836001600160a01b03841662000195565b90505b92915050565b6000818152600183016020526040812054620001de575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200018f565b5060006200018f565b828054620001f590620003eb565b90600052602060002090601f01602090048101928262000219576000855562000264565b82601f106200023457805160ff191683800117855562000264565b8280016001018555821562000264579182015b828111156200026457825182559160200191906001019062000247565b506200027292915062000276565b5090565b5b8082111562000272576000815560010162000277565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002b557600080fd5b81516001600160401b0380821115620002d257620002d26200028d565b604051601f8301601f19908116603f01168101908282118183101715620002fd57620002fd6200028d565b816040528381526020925086838588010111156200031a57600080fd5b600091505b838210156200033e57858201830151818301840152908201906200031f565b83821115620003505760008385830101525b9695505050505050565b6000806000606084860312156200037057600080fd5b83516001600160401b03808211156200038857600080fd5b6200039687838801620002a3565b94506020860151915080821115620003ad57600080fd5b620003bb87838801620002a3565b93506040860151915080821115620003d257600080fd5b50620003e186828701620002a3565b9150509250925092565b600181811c908216806200040057607f821691505b602082108114156200042257634e487b7160e01b600052602260045260246000fd5b50919050565b61236780620004386000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063b88d4fde116100a2578063d539139311610071578063d539139314610402578063d547741f14610429578063e63ab1e91461043c578063e985e9c51461046357600080fd5b8063b88d4fde146103b6578063c87b56dd146103c9578063ca15c873146103dc578063d3fc9864146103ef57600080fd5b806391d14854116100de57806391d148541461038057806395d89b4114610393578063a217fddf1461039b578063a22cb465146103a357600080fd5b806370a08231146103525780638456cb59146103655780639010d07c1461036d57600080fd5b806336568abe1161017c5780634e0df3f61161014b5780634e0df3f6146102f45780635c975abb1461032c5780636352211e146103375780636c0360eb1461034a57600080fd5b806336568abe146102b35780633f4ba83a146102c657806342842e0e146102ce57806342966c68146102e157600080fd5b8063095ea7b3116101b8578063095ea7b31461024757806323b872dd1461025c578063248a9ca31461026f5780632f2ff15d146102a057600080fd5b806301ffc9a7146101df57806306fdde0314610207578063081812fc1461021c575b600080fd5b6101f26101ed366004611d9b565b61049f565b60405190151581526020015b60405180910390f35b61020f6104f1565b6040516101fe9190611e10565b61022f61022a366004611e23565b610583565b6040516001600160a01b0390911681526020016101fe565b61025a610255366004611e58565b610610565b005b61025a61026a366004611e82565b610726565b61029261027d366004611e23565b60009081526020819052604090206002015490565b6040519081526020016101fe565b61025a6102ae366004611ebe565b610758565b61025a6102c1366004611ebe565b6107e6565b61025a610860565b61025a6102dc366004611e82565b610906565b61025a6102ef366004611e23565b610921565b610292610302366004611ebe565b6000828152602081815260408083206001600160a01b038516845260010190915290205492915050565b60075460ff166101f2565b61022f610345366004611e23565b61099b565b61020f610a12565b610292610360366004611eea565b610aa0565b61025a610b27565b61022f61037b366004611f05565b610bcb565b6101f261038e366004611ebe565b610bea565b61020f610c02565b610292600081565b61025a6103b1366004611f27565b610c11565b61025a6103c4366004611fef565b610c1c565b61020f6103d7366004611e23565b610c54565b6102926103ea366004611e23565b610c5f565b61025a6103fd36600461206b565b610c76565b6102927f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61025a610437366004611ebe565b610d26565b6102927f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6101f26104713660046120d6565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b60006001600160e01b031982166380ac58cd60e01b14806104d057506001600160e01b03198216635b5e139f60e01b145b806104eb57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461050090612100565b80601f016020809104026020016040519081016040528092919081815260200182805461052c90612100565b80156105795780601f1061054e57610100808354040283529160200191610579565b820191906000526020600020905b81548152906001019060200180831161055c57829003601f168201915b5050505050905090565b600061058e82610dbc565b6105f45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061061b8261099b565b9050806001600160a01b0316836001600160a01b031614156106895760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105eb565b336001600160a01b03821614806106a557506106a58133610471565b6107175760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105eb565b6107218383610dd9565b505050565b610731335b82610e47565b61074d5760405162461bcd60e51b81526004016105eb9061213b565b610721838383610f31565b6000828152602081905260409020600201546107749033610bea565b6107d85760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526e0818591b5a5b881d1bc819dc985b9d608a1b60648201526084016105eb565b6107e282826110d8565b5050565b6001600160a01b03811633146108565760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105eb565b6107e28282611131565b61088a7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610bea565b6108fc5760405162461bcd60e51b815260206004820152603a60248201527f4552433732314d696e7465724275726e65725061757365723a206d757374206860448201527f6176652070617573657220726f6c6520746f20756e706175736500000000000060648201526084016105eb565b61090461118a565b565b61072183838360405180602001604052806000815250610c1c565b61092a3361072b565b61098f5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b60648201526084016105eb565b6109988161121d565b50565b6000818152600360205260408120546001600160a01b0316806104eb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105eb565b60098054610a1f90612100565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4b90612100565b8015610a985780601f10610a6d57610100808354040283529160200191610a98565b820191906000526020600020905b815481529060010190602001808311610a7b57829003601f168201915b505050505081565b60006001600160a01b038216610b0b5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105eb565b506001600160a01b031660009081526004602052604090205490565b610b517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610bea565b610bc35760405162461bcd60e51b815260206004820152603860248201527f4552433732314d696e7465724275726e65725061757365723a206d757374206860448201527f6176652070617573657220726f6c6520746f207061757365000000000000000060648201526084016105eb565b610904611226565b6000828152602081905260408120610be390836112a1565b9392505050565b6000828152602081905260408120610be390836112ad565b60606002805461050090612100565b6107e23383836112cf565b610c263383610e47565b610c425760405162461bcd60e51b81526004016105eb9061213b565b610c4e8484848461139e565b50505050565b60606104eb826113d1565b60008181526020819052604081206104eb90611533565b610ca07f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610bea565b610d125760405162461bcd60e51b815260206004820152603760248201527f4552433732314d696e7465724275726e65725061757365723a206d757374206860448201527f617665206d696e74657220726f6c6520746f206d696e7400000000000000000060648201526084016105eb565b610d1c838361153d565b610721828261167c565b600082815260208190526040902060020154610d429033610bea565b6108565760405162461bcd60e51b815260206004820152603060248201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60448201526f2061646d696e20746f207265766f6b6560801b60648201526084016105eb565b6000610be3836001600160a01b038416611707565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e0e8261099b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610e5282610dbc565b610eb35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105eb565b6000610ebe8361099b565b9050806001600160a01b0316846001600160a01b03161480610ef95750836001600160a01b0316610eee84610583565b6001600160a01b0316145b80610f2957506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610f448261099b565b6001600160a01b031614610fa85760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105eb565b6001600160a01b03821661100a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105eb565b611015838383611756565b611020600082610dd9565b6001600160a01b03831660009081526004602052604081208054600192906110499084906121a2565b90915550506001600160a01b03821660009081526004602052604081208054600192906110779084906121b9565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008281526020819052604090206110f09082610da7565b156107e25760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d90600090a45050565b60008281526020819052604090206111499082611761565b156107e25760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b90600090a45050565b60075460ff166111d35760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016105eb565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61099881611776565b60075460ff161561126c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016105eb565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586112003390565b6000610be383836117b6565b6001600160a01b03811660009081526001830160205260408120541515610be3565b816001600160a01b0316836001600160a01b031614156113315760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105eb565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6113a9848484610f31565b6113b5848484846117e0565b610c4e5760405162461bcd60e51b81526004016105eb906121d1565b60606113dc82610dbc565b6114425760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b60648201526084016105eb565b6000828152600860205260408120805461145b90612100565b80601f016020809104026020016040519081016040528092919081815260200182805461148790612100565b80156114d45780601f106114a9576101008083540402835291602001916114d4565b820191906000526020600020905b8154815290600101906020018083116114b757829003601f168201915b5050505050905060006114e56118de565b90508051600014156114f8575092915050565b81511561152a578082604051602001611512929190612223565b60405160208183030381529060405292505050919050565b610f29846118ed565b60006104eb825490565b6001600160a01b0382166115935760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105eb565b61159c81610dbc565b156115e95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105eb565b6115f560008383611756565b6001600160a01b038216600090815260046020526040812080546001929061161e9084906121b9565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61168582610dbc565b6116e85760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016105eb565b6000828152600860209081526040909120825161072192840190611cb6565b600081815260018301602052604081205461174e575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104eb565b5060006104eb565b6107218383836119b7565b6000610be3836001600160a01b038416611a1e565b61177f81611b11565b6000818152600860205260409020805461179890612100565b15905061099857600081815260086020526040812061099891611d3a565b60008260000182815481106117cd576117cd612252565b9060005260206000200154905092915050565b60006001600160a01b0384163b156118d357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611824903390899088908890600401612268565b6020604051808303816000875af192505050801561185f575060408051601f3d908101601f1916820190925261185c918101906122a5565b60015b6118b9573d80801561188d576040519150601f19603f3d011682016040523d82523d6000602084013e611892565b606091505b5080516118b15760405162461bcd60e51b81526004016105eb906121d1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f29565b506001949350505050565b60606009805461050090612100565b60606118f882610dbc565b61195c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105eb565b60006119666118de565b905060008151116119865760405180602001604052806000815250610be3565b8061199084611bb8565b6040516020016119a1929190612223565b6040516020818303038152906040529392505050565b60075460ff16156107215760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201526a1a1a5b19481c185d5cd95960aa1b60648201526084016105eb565b60008181526001830160205260408120548015611b07576000611a426001836121a2565b8554909150600090611a56906001906121a2565b9050818114611abb576000866000018281548110611a7657611a76612252565b9060005260206000200154905080876000018481548110611a9957611a99612252565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611acc57611acc6122c2565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104eb565b60009150506104eb565b6000611b1c8261099b565b9050611b2a81600084611756565b611b35600083610dd9565b6001600160a01b0381166000908152600460205260408120805460019290611b5e9084906121a2565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b606081611bdc5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611c065780611bf0816122d8565b9150611bff9050600a83612309565b9150611be0565b60008167ffffffffffffffff811115611c2157611c21611f63565b6040519080825280601f01601f191660200182016040528015611c4b576020820181803683370190505b5090505b8415610f2957611c606001836121a2565b9150611c6d600a8661231d565b611c789060306121b9565b60f81b818381518110611c8d57611c8d612252565b60200101906001600160f81b031916908160001a905350611caf600a86612309565b9450611c4f565b828054611cc290612100565b90600052602060002090601f016020900481019282611ce45760008555611d2a565b82601f10611cfd57805160ff1916838001178555611d2a565b82800160010185558215611d2a579182015b82811115611d2a578251825591602001919060010190611d0f565b50611d36929150611d70565b5090565b508054611d4690612100565b6000825580601f10611d56575050565b601f01602090049060005260206000209081019061099891905b5b80821115611d365760008155600101611d71565b6001600160e01b03198116811461099857600080fd5b600060208284031215611dad57600080fd5b8135610be381611d85565b60005b83811015611dd3578181015183820152602001611dbb565b83811115610c4e5750506000910152565b60008151808452611dfc816020860160208601611db8565b601f01601f19169290920160200192915050565b602081526000610be36020830184611de4565b600060208284031215611e3557600080fd5b5035919050565b80356001600160a01b0381168114611e5357600080fd5b919050565b60008060408385031215611e6b57600080fd5b611e7483611e3c565b946020939093013593505050565b600080600060608486031215611e9757600080fd5b611ea084611e3c565b9250611eae60208501611e3c565b9150604084013590509250925092565b60008060408385031215611ed157600080fd5b82359150611ee160208401611e3c565b90509250929050565b600060208284031215611efc57600080fd5b610be382611e3c565b60008060408385031215611f1857600080fd5b50508035926020909101359150565b60008060408385031215611f3a57600080fd5b611f4383611e3c565b915060208301358015158114611f5857600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611f9457611f94611f63565b604051601f8501601f19908116603f01168101908282118183101715611fbc57611fbc611f63565b81604052809350858152868686011115611fd557600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561200557600080fd5b61200e85611e3c565b935061201c60208601611e3c565b925060408501359150606085013567ffffffffffffffff81111561203f57600080fd5b8501601f8101871361205057600080fd5b61205f87823560208401611f79565b91505092959194509250565b60008060006060848603121561208057600080fd5b61208984611e3c565b925060208401359150604084013567ffffffffffffffff8111156120ac57600080fd5b8401601f810186136120bd57600080fd5b6120cc86823560208401611f79565b9150509250925092565b600080604083850312156120e957600080fd5b6120f283611e3c565b9150611ee160208401611e3c565b600181811c9082168061211457607f821691505b6020821081141561213557634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156121b4576121b461218c565b500390565b600082198211156121cc576121cc61218c565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351612235818460208801611db8565b835190830190612249818360208801611db8565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061229b90830184611de4565b9695505050505050565b6000602082840312156122b757600080fd5b8151610be381611d85565b634e487b7160e01b600052603160045260246000fd5b60006000198214156122ec576122ec61218c565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082612318576123186122f3565b500490565b60008261232c5761232c6122f3565b50069056fea2646970667358221220a36fedb900001fa1a46298500bc02afd92b53337672be28be2d478e1dfa1d29e64736f6c634300080b0033" diff --git a/e2e/evm/contracts/erc721/erc721.go b/e2e/evm/contracts/erc721/erc721.go deleted file mode 100644 index 7fcd0982..00000000 --- a/e2e/evm/contracts/erc721/erc721.go +++ /dev/null @@ -1,76 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package erc721 - -import ( - "math/big" - "strings" - - "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/contracts" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/rs/zerolog/log" -) - -type ERC721Contract struct { - contracts.Contract -} - -func NewErc721Contract( - client client.Client, - erc721ContractAddress common.Address, - t transactor.Transactor, -) *ERC721Contract { - a, _ := abi.JSON(strings.NewReader(ERC721PresetMinterPauserABI)) - b := common.FromHex(ERC721PresetMinterPauserBin) - return &ERC721Contract{contracts.NewContract(erc721ContractAddress, a, b, client, t)} -} - -func (c *ERC721Contract) AddMinter( - minter common.Address, opts transactor.TransactOptions, -) (*common.Hash, error) { - log.Debug().Msgf("Adding new minter %s", minter.String()) - role, err := c.MinterRole() - if err != nil { - return nil, err - } - return c.ExecuteTransaction("grantRole", opts, role, minter) -} - -func (c *ERC721Contract) Approve( - tokenId *big.Int, recipient common.Address, opts transactor.TransactOptions, -) (*common.Hash, error) { - log.Debug().Msgf("Approving %s token for %s", tokenId.String(), recipient.String()) - return c.ExecuteTransaction("approve", opts, recipient, tokenId) -} - -func (c *ERC721Contract) Mint( - tokenId *big.Int, metadata string, destination common.Address, opts transactor.TransactOptions, -) (*common.Hash, error) { - log.Debug().Msgf("Minting tokens %s to %s", tokenId.String(), destination.String()) - return c.ExecuteTransaction("mint", opts, destination, tokenId, metadata) -} - -func (c *ERC721Contract) Owner(tokenId *big.Int) (*common.Address, error) { - log.Debug().Msgf("Getting owner of %s", tokenId.String()) - res, err := c.CallContract("ownerOf", tokenId) - if err != nil { - return nil, err - } - - ownerAddr := abi.ConvertType(res[0], new(common.Address)).(*common.Address) - return ownerAddr, nil -} - -func (c *ERC721Contract) MinterRole() ([32]byte, error) { - res, err := c.CallContract("MINTER_ROLE") - if err != nil { - return [32]byte{}, err - } - out := *abi.ConvertType(res[0], new([32]byte)).(*[32]byte) - return out, nil -} diff --git a/e2e/evm/contracts/retry/retry.go b/e2e/evm/contracts/retry/retry.go deleted file mode 100644 index 2e03b069..00000000 --- a/e2e/evm/contracts/retry/retry.go +++ /dev/null @@ -1,39 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package retry - -import ( - "math/big" - "strings" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/consts" - "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/contracts" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" -) - -type RetryContract struct { - contracts.Contract -} - -func NewRetryContract( - client client.Client, - address common.Address, - transactor transactor.Transactor, -) *RetryContract { - a, _ := abi.JSON(strings.NewReader(consts.RetryABI)) - return &RetryContract{contracts.NewContract(address, a, nil, client, transactor)} -} - -func (c *RetryContract) Retry( - source uint8, - destination uint8, - block *big.Int, - resourceID [32]byte, - opts transactor.TransactOptions) (*common.Hash, error) { - return c.ExecuteTransaction("retry", opts, source, destination, block, resourceID) -} diff --git a/e2e/evm/evm_test.go b/e2e/evm/evm_test.go deleted file mode 100644 index a473a71e..00000000 --- a/e2e/evm/evm_test.go +++ /dev/null @@ -1,400 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package evm_test - -import ( - "context" - "math/big" - "math/rand" - "sync" - "testing" - "time" - - substrateTypes "github.com/centrifuge/go-substrate-rpc-client/v4/types" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/rs/zerolog/log" - "github.com/stretchr/testify/suite" - - "github.com/ChainSafe/sygma-relayer/e2e/evm/contracts/erc1155" - "github.com/ChainSafe/sygma-relayer/e2e/evm/contracts/erc20" - "github.com/ChainSafe/sygma-relayer/e2e/evm/contracts/erc721" - "github.com/ChainSafe/sygma-relayer/e2e/evm/contracts/retry" - "github.com/ChainSafe/sygma-relayer/e2e/evm/keystore" - - "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/gas" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/signAndSend" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/transaction" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/contracts/bridge" - "github.com/ChainSafe/sygma-relayer/e2e/evm" -) - -type TestClient interface { - evm.EVMClient - LatestBlock() (*big.Int, error) - CodeAt(ctx context.Context, contractAddress common.Address, block *big.Int) ([]byte, error) - FetchEventLogs(ctx context.Context, contractAddress common.Address, event string, startBlock *big.Int, endBlock *big.Int) ([]types.Log, error) - SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) - TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) - BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) -} - -// Alice key is used by the relayer, Charlie key is used as admin and depositer -func Test_EVM2EVM(t *testing.T) { - rand.Seed(time.Now().Unix()) - ethClient1, err := client.NewEVMClient(evm.ETHEndpoint1, evm.AdminAccount) - if err != nil { - panic(err) - } - gasPricer1 := gas.NewStaticGasPriceDeterminant(ethClient1, nil) - - ethClient2, err := client.NewEVMClient(evm.ETHEndpoint2, evm.AdminAccount) - if err != nil { - panic(err) - } - gasPricer2 := gas.NewStaticGasPriceDeterminant(ethClient2, nil) - - suite.Run( - t, - NewEVM2EVMTestSuite( - transaction.NewTransaction, - transaction.NewTransaction, - ethClient1, - ethClient2, - gasPricer1, - gasPricer2, - evm.DEFAULT_CONFIG, - evm.DEFAULT_CONFIG, - ), - ) -} - -func NewEVM2EVMTestSuite( - fabric1, fabric2 transaction.TxFabric, - client1, client2 TestClient, - gasPricer1, gasPricer2 signAndSend.GasPricer, - config1, config2 evm.BridgeConfig, -) *IntegrationTestSuite { - return &IntegrationTestSuite{ - fabric1: fabric1, - fabric2: fabric2, - client1: client1, - client2: client2, - gasPricer1: gasPricer1, - gasPricer2: gasPricer2, - config1: config1, - config2: config2, - } -} - -type IntegrationTestSuite struct { - suite.Suite - client1 TestClient - client2 TestClient - gasPricer1 signAndSend.GasPricer - gasPricer2 signAndSend.GasPricer - fabric1 transaction.TxFabric - fabric2 transaction.TxFabric - config1 evm.BridgeConfig - config2 evm.BridgeConfig -} - -func (s *IntegrationTestSuite) SetupSuite() { - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric1, s.gasPricer1, s.client1) - transactor2 := signAndSend.NewSignAndSendTransactor(s.fabric2, s.gasPricer2, s.client2) - erc20Contract := erc20.NewERC20Contract(s.client1, s.config1.Erc20Addr, transactor1) - mintTo := s.client1.From() - amountToMint := big.NewInt(0).Mul(big.NewInt(5000000000000000), big.NewInt(0).Exp(big.NewInt(10), big.NewInt(18), nil)) - - amountToApprove := big.NewInt(0).Mul(big.NewInt(100000), big.NewInt(0).Exp(big.NewInt(10), big.NewInt(18), nil)) - _, err := erc20Contract.MintTokens(mintTo, amountToMint, transactor.TransactOptions{}) - - if err != nil { - panic(err) - } - - _, err = erc20Contract.MintTokens(s.config1.Erc20HandlerAddr, amountToMint, transactor.TransactOptions{}) - if err != nil { - panic(err) - } - // Approving tokens - _, err = erc20Contract.ApproveTokens(s.config1.Erc20HandlerAddr, amountToApprove, transactor.TransactOptions{}) - if err != nil { - panic(err) - } - - erc20LRContract := erc20.NewERC20Contract(s.client1, s.config1.Erc20LockReleaseAddr, transactor1) - _, err = erc20LRContract.MintTokens(mintTo, amountToMint, transactor.TransactOptions{}) - if err != nil { - panic(err) - } - - erc20LRContract2 := erc20.NewERC20Contract(s.client2, s.config2.Erc20LockReleaseAddr, transactor2) - _, err = erc20LRContract2.MintTokens(s.config2.Erc20LockReleaseHandlerAddr, amountToMint, transactor.TransactOptions{}) - if err != nil { - panic(err) - } - - // Approving tokens - _, err = erc20LRContract.ApproveTokens(s.config1.Erc20HandlerAddr, amountToApprove, transactor.TransactOptions{}) - if err != nil { - panic(err) - } -} - -var amountToDeposit = big.NewInt(100) - -func (s *IntegrationTestSuite) Test_Erc20Deposit() { - pk, _ := crypto.HexToECDSA("cc2c32b154490f09f70c1c8d4b997238448d649e0777495863db231c4ced3616") - dstAddr := crypto.PubkeyToAddress(pk.PublicKey) - - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric1, s.gasPricer1, s.client1) - erc20Contract1 := erc20.NewERC20Contract(s.client1, s.config1.Erc20Addr, transactor1) - bridgeContract1 := bridge.NewBridgeContract(s.client1, s.config1.BridgeAddr, transactor1) - - transactor2 := signAndSend.NewSignAndSendTransactor(s.fabric2, s.gasPricer2, s.client2) - erc20Contract2 := erc20.NewERC20Contract(s.client2, s.config2.Erc20Addr, transactor2) - - senderBalBefore, err := erc20Contract1.GetBalance(crypto.PubkeyToAddress(pk.PublicKey)) - s.Nil(err) - destBalanceBefore, err := erc20Contract2.GetBalance(dstAddr) - s.Nil(err) - - erc20DepositData := evm.ConstructErc20DepositData(dstAddr.Bytes(), amountToDeposit) - depositTxHash, err := bridgeContract1.ExecuteTransaction("deposit", transactor.TransactOptions{Value: s.config1.BasicFee}, uint8(2), s.config1.Erc20ResourceID, erc20DepositData, []byte{}) - - s.Nil(err) - - log.Debug().Msgf("deposit hash %s", depositTxHash.Hex()) - - _, _, err = s.client1.TransactionByHash(context.Background(), *depositTxHash) - s.Nil(err) - - err = evm.WaitForProposalExecuted(s.client2, s.config2.BridgeAddr) - s.Nil(err) - - senderBalAfter, err := erc20Contract1.GetBalance(s.client1.From()) - s.Nil(err) - s.Equal(-1, senderBalAfter.Cmp(senderBalBefore)) - - destBalanceAfter, err := erc20Contract2.GetBalance(dstAddr) - s.Nil(err) - //Balance has increased - s.Equal(1, destBalanceAfter.Cmp(destBalanceBefore)) -} - -func (s *IntegrationTestSuite) Test_Erc721Deposit() { - tokenId := big.NewInt(int64(rand.Int())) - metadata := "metadata.url" - - dstAddr := keystore.TestKeyRing.EthereumKeys[keystore.BobKey].CommonAddress() - - // erc721 contract for evm1 - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric1, s.gasPricer1, s.client1) - erc721Contract1 := erc721.NewErc721Contract(s.client1, s.config1.Erc721Addr, transactor1) - bridgeContract1 := bridge.NewBridgeContract(s.client1, s.config1.BridgeAddr, transactor1) - - // erc721 contract for evm2 - transactor2 := signAndSend.NewSignAndSendTransactor(s.fabric2, s.gasPricer2, s.client2) - erc721Contract2 := erc721.NewErc721Contract(s.client2, s.config2.Erc721Addr, transactor2) - - // Mint token and give approval - // This is done here so token only exists on evm1 - _, err := erc721Contract1.Mint(tokenId, metadata, s.client1.From(), transactor.TransactOptions{}) - s.Nil(err, "Mint failed") - _, err = erc721Contract1.Approve(tokenId, s.config1.Erc721HandlerAddr, transactor.TransactOptions{}) - s.Nil(err, "Approve failed") - - // Check on evm1 if initial owner is admin - initialOwner, err := erc721Contract1.Owner(tokenId) - s.Nil(err) - s.Equal(initialOwner.String(), s.client1.From().String()) - - // Check on evm2 token doesn't exist - _, err = erc721Contract2.Owner(tokenId) - s.Error(err) - - erc721DepositData := evm.ConstructErc721DepositData(dstAddr.Bytes(), tokenId, []byte(metadata)) - depositTxHash, err := bridgeContract1.ExecuteTransaction("deposit", transactor.TransactOptions{Value: s.config1.BasicFee}, uint8(2), s.config1.Erc721ResourceID, erc721DepositData, []byte{}) - - s.Nil(err) - - _, _, err = s.client1.TransactionByHash(context.Background(), *depositTxHash) - s.Nil(err) - - err = evm.WaitForProposalExecuted(s.client2, s.config2.BridgeAddr) - s.Nil(err) - - // Check on evm1 that token is burned - _, err = erc721Contract1.Owner(tokenId) - s.Error(err) - - // Check on evm2 that token is minted to destination address - owner, err := erc721Contract2.Owner(tokenId) - s.Nil(err) - s.Equal(dstAddr.String(), owner.String()) -} - -func (s *IntegrationTestSuite) Test_PermissionlessGenericDeposit() { - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric1, s.gasPricer1, s.client1) - bridgeContract1 := bridge.NewBridgeContract(s.client1, s.config1.BridgeAddr, transactor1) - - byteArrayToHash, _ := substrateTypes.NewI64(int64(rand.Int())).MarshalJSON() - hash := substrateTypes.NewHash(byteArrayToHash) - functionSig := string(crypto.Keccak256([]byte("storeWithDepositor(address,bytes32,address)"))[:4]) - contractAddress := s.client2.From() - maxFee := big.NewInt(600000) - depositor := s.client1.From() - var metadata []byte - metadata = append(metadata, common.LeftPadBytes(hash[:], 32)...) - metadata = append(metadata, common.LeftPadBytes(depositor.Bytes(), 32)...) - - permissionlessGenericDepositData := evm.ConstructPermissionlessGenericDepositData(metadata, []byte(functionSig), contractAddress.Bytes(), depositor.Bytes(), maxFee) - _, err := bridgeContract1.ExecuteTransaction("deposit", transactor.TransactOptions{Value: s.config1.BasicFee}, uint8(2), s.config1.PermissionlessGenericResourceID, permissionlessGenericDepositData, []byte{}) - s.Nil(err) - - err = evm.WaitForProposalExecuted(s.client2, s.config2.BridgeAddr) - s.Nil(err) -} - -func (s *IntegrationTestSuite) Test_RetryDeposit() { - dstAddr := keystore.TestKeyRing.EthereumKeys[keystore.BobKey].CommonAddress() - amountToMint := big.NewInt(0).Mul(big.NewInt(350), big.NewInt(0).Exp(big.NewInt(10), big.NewInt(18), nil)) - - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric1, s.gasPricer1, s.client1) - bridgeContract1 := bridge.NewBridgeContract(s.client1, s.config1.BridgeAddr, transactor1) - - transactor2 := signAndSend.NewSignAndSendTransactor(s.fabric2, s.gasPricer2, s.client2) - erc20Contract2 := erc20.NewERC20Contract(s.client2, s.config2.Erc20LockReleaseAddr, transactor2) - - retryContract := retry.NewRetryContract(s.client2, s.config2.RetryAddr, transactor2) - - destBalanceBefore, err := erc20Contract2.GetBalance(dstAddr) - s.Nil(err) - - erc20DepositData := evm.ConstructErc20DepositData(dstAddr.Bytes(), amountToDeposit) - depositTxHash, err := bridgeContract1.ExecuteTransaction("deposit", transactor.TransactOptions{Value: s.config1.BasicFee}, uint8(2), s.config1.Erc20LockReleaseResourceID, erc20DepositData, []byte{}) - - s.Nil(err) - - log.Debug().Msgf("deposit hash %s", depositTxHash.Hex()) - - receipt, err := s.client1.TransactionReceipt(context.Background(), *depositTxHash) - s.Nil(err) - time.Sleep(time.Second * 15) - - _, err = erc20Contract2.MintTokens(s.config2.Erc20LockReleaseHandlerAddr, amountToMint, transactor.TransactOptions{}) - if err != nil { - return - } - - retryTxHash, err := retryContract.Retry(1, 2, receipt.BlockNumber, s.config1.Erc20LockReleaseResourceID, transactor.TransactOptions{}) - if err != nil { - return - } - s.Nil(err) - s.NotNil(retryTxHash) - - time.Sleep(time.Second * 15) - - destBalanceAfter, err := erc20Contract2.GetBalance(dstAddr) - s.Nil(err) - //Balance has increased - s.Equal(1, destBalanceAfter.Cmp(destBalanceBefore)) -} - -func (s *IntegrationTestSuite) Test_MultipleDeposits() { - dstAddr := keystore.TestKeyRing.EthereumKeys[keystore.BobKey].CommonAddress() - - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric1, s.gasPricer1, s.client1) - bridgeContract1 := bridge.NewBridgeContract(s.client1, s.config1.BridgeAddr, transactor1) - - transactor2 := signAndSend.NewSignAndSendTransactor(s.fabric2, s.gasPricer2, s.client2) - erc20Contract2 := erc20.NewERC20Contract(s.client2, s.config2.Erc20Addr, transactor2) - - destBalanceBefore, err := erc20Contract2.GetBalance(dstAddr) - s.Nil(err) - - numOfDeposits := 25 - - var wg sync.WaitGroup - for i := 0; i < numOfDeposits; i++ { - go func() { - - erc20DepositData := evm.ConstructErc20DepositData(dstAddr.Bytes(), amountToDeposit) - _, err := bridgeContract1.ExecuteTransaction("deposit", transactor.TransactOptions{Value: s.config1.BasicFee}, uint8(2), s.config1.Erc20ResourceID, erc20DepositData, []byte{}) - - wg.Add(1) - defer wg.Done() - s.Nil(err) - }() - } - wg.Wait() - time.Sleep(10 * time.Second) - - err = evm.WaitForProposalExecuted(s.client2, s.config2.BridgeAddr) - s.Nil(err) - - destBalanceAfter, err := erc20Contract2.GetBalance(dstAddr) - s.Nil(err) - //Balance has increased - s.Equal(1, destBalanceAfter.Cmp(destBalanceBefore)) -} - -func (s *IntegrationTestSuite) Test_Erc1155Deposit() { - tokenId := big.NewInt(int64(rand.Int())) - amount := big.NewInt(int64(rand.Int())) - - metadata := "metadata.url" - - txOptions := transactor.TransactOptions{} - - dstAddr := keystore.TestKeyRing.EthereumKeys[keystore.BobKey].CommonAddress() - - // 1155 contract for evm1 - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric1, s.gasPricer1, s.client1) - erc1155Contract1 := erc1155.NewErc1155Contract(s.client1, s.config1.Erc1155Addr, transactor1) - bridgeContract1 := bridge.NewBridgeContract(s.client1, s.config1.BridgeAddr, transactor1) - - // 1155 contract for evm2 - transactor2 := signAndSend.NewSignAndSendTransactor(s.fabric2, s.gasPricer2, s.client2) - erc1155Contract2 := erc1155.NewErc1155Contract(s.client2, s.config2.Erc1155Addr, transactor2) - - // Mint token and give approval - // This is done here so token only exists on evm1 - _, err := erc1155Contract1.Mint(tokenId, amount, []byte{0}, s.client1.From(), txOptions) - s.Nil(err, "Mint failed") - _, err = erc1155Contract1.Approve(tokenId, s.config1.Erc1155HandlerAddr, txOptions) - s.Nil(err, "Approve failed") - - initialAmount, err := erc1155Contract1.BalanceOf(s.client1.From(), tokenId) - s.Nil(err) - s.Equal(0, initialAmount.Cmp(amount)) - - erc1155DepositData, err := evm.ConstructErc1155DepositData(dstAddr.Bytes(), tokenId, amount, []byte(metadata)) - s.Nil(err) - depositTxHash, err := bridgeContract1.ExecuteTransaction("deposit", transactor.TransactOptions{Value: s.config1.BasicFee}, uint8(2), s.config1.Erc1155ResourceID, erc1155DepositData, []byte{}) - s.Nil(err) - - _, _, err = s.client1.TransactionByHash(context.Background(), *depositTxHash) - s.Nil(err) - - err = evm.WaitForProposalExecuted(s.client2, s.config2.BridgeAddr) - s.Nil(err) - - // Check on evm1 that token is burned - sourceAmount, err := erc1155Contract1.BalanceOf(s.client1.From(), tokenId) - s.Nil(err) - s.Equal(0, sourceAmount.Cmp(big.NewInt(0))) - - // Check on evm2 that token is minted to destination address - dstAmount, err := erc1155Contract2.BalanceOf(dstAddr, tokenId) - s.Nil(err) - s.Equal(0, dstAmount.Cmp(initialAmount)) -} diff --git a/e2e/evm/keystore/keyring.go b/e2e/evm/keystore/keyring.go deleted file mode 100644 index 8b79265e..00000000 --- a/e2e/evm/keystore/keyring.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2020 ChainSafe Systems -// SPDX-License-Identifier: LGPL-3.0-only - -package keystore - -import ( - "github.com/centrifuge/go-substrate-rpc-client/v4/signature" - "github.com/sygmaprotocol/sygma-core/crypto/secp256k1" - "github.com/sygmaprotocol/sygma-core/crypto/sr25519" -) - -// The Constant "keys". These are the name that the keys are based on. This can be expanded, but -// any additions must be added to Keys and to insecureKeyFromAddress - -const AliceKey = "alice" -const BobKey = "bob" -const CharlieKey = "charlie" -const DaveKey = "dave" -const EveKey = "eve" - -var Keys = []string{AliceKey, BobKey, CharlieKey, DaveKey, EveKey} - -// The Chain type Constants -const EthChain = "ethereum" -const SubChain = "substrate" - -var TestKeyRing *TestKeyRingHolder - -var AliceSr25519 = sr25519.NewKeypairFromKRP(signature.KeyringPair{ - URI: "//Alice", - Address: "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", - PublicKey: []byte{0xd4, 0x35, 0x93, 0xc7, 0x15, 0xfd, 0xd3, 0x1c, 0x61, 0x14, 0x1a, 0xbd, 0x4, 0xa9, 0x9f, 0xd6, 0x82, 0x2c, 0x85, 0x58, 0x85, 0x4c, 0xcd, 0xe3, 0x9a, 0x56, 0x84, 0xe7, 0xa5, 0x6d, 0xa2, 0x7d}, -}) - -var BobSr25519 = sr25519.NewKeypairFromKRP(signature.KeyringPair{ - URI: "//Bob", - Address: "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", - PublicKey: []byte{0x8e, 0xaf, 0x4, 0x15, 0x16, 0x87, 0x73, 0x63, 0x26, 0xc9, 0xfe, 0xa1, 0x7e, 0x25, 0xfc, 0x52, 0x87, 0x61, 0x36, 0x93, 0xc9, 0x12, 0x90, 0x9c, 0xb2, 0x26, 0xaa, 0x47, 0x94, 0xf2, 0x6a, 0x48}, -}) - -var CharlieSr25519 = sr25519.NewKeypairFromKRP(signature.KeyringPair{ - URI: "//Charlie", - Address: "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y", - PublicKey: []byte{0x90, 0xb5, 0xab, 0x20, 0x5c, 0x69, 0x74, 0xc9, 0xea, 0x84, 0x1b, 0xe6, 0x88, 0x86, 0x46, 0x33, 0xdc, 0x9c, 0xa8, 0xa3, 0x57, 0x84, 0x3e, 0xea, 0xcf, 0x23, 0x14, 0x64, 0x99, 0x65, 0xfe, 0x22}, -}) - -var DaveSr25519 = sr25519.NewKeypairFromKRP(signature.KeyringPair{ - URI: "//Dave", - Address: "5DAAnrj7VHTznn2AWBemMuyBwZWs6FNFjdyVXUeYum3PTXFy", - PublicKey: []byte{0x30, 0x67, 0x21, 0x21, 0x1d, 0x54, 0x4, 0xbd, 0x9d, 0xa8, 0x8e, 0x2, 0x4, 0x36, 0xa, 0x1a, 0x9a, 0xb8, 0xb8, 0x7c, 0x66, 0xc1, 0xbc, 0x2f, 0xcd, 0xd3, 0x7f, 0x3c, 0x22, 0x22, 0xcc, 0x20}, -}) - -var EveSr25519 = sr25519.NewKeypairFromKRP(signature.KeyringPair{ - URI: "//Eve", - Address: "5HGjWAeFDfFCWPsjFQdVV2Msvz2XtMktvgocEZcCj68kUMaw", - PublicKey: []byte{0xe6, 0x59, 0xa7, 0xa1, 0x62, 0x8c, 0xdd, 0x93, 0xfe, 0xbc, 0x4, 0xa4, 0xe0, 0x64, 0x6e, 0xa2, 0xe, 0x9f, 0x5f, 0xc, 0xe0, 0x97, 0xd9, 0xa0, 0x52, 0x90, 0xd4, 0xa9, 0xe0, 0x54, 0xdf, 0x4e}, -}) - -// TestKeyStore is a struct that holds a Keystore of all the test keys -type TestKeyRingHolder struct { - EthereumKeys map[string]*secp256k1.Keypair - SubstrateKeys map[string]*sr25519.Keypair -} - -// Init function to create a keyRing that can be accessed anywhere without having to recreate the data -func init() { - TestKeyRing = &TestKeyRingHolder{ - EthereumKeys: makeEthRing(), - SubstrateKeys: map[string]*sr25519.Keypair{ - AliceKey: AliceSr25519, - BobKey: BobSr25519, - CharlieKey: CharlieSr25519, - DaveKey: DaveSr25519, - EveKey: EveSr25519, - }, - } - -} - -func makeEthRing() map[string]*secp256k1.Keypair { - ring := map[string]*secp256k1.Keypair{} - for _, key := range Keys { - bz := padWithZeros([]byte(key), secp256k1.PrivateKeyLength) - kp, err := secp256k1.NewKeypairFromPrivateKey(bz) - if err != nil { - panic(err) - } - ring[key] = kp - } - - return ring -} - -// padWithZeros adds on extra 0 bytes to make a byte array of a specified length -func padWithZeros(key []byte, targetLength int) []byte { - res := make([]byte, targetLength-len(key)) - return append(res, key...) -} diff --git a/e2e/evm/util.go b/e2e/evm/util.go deleted file mode 100644 index 9a9765b0..00000000 --- a/e2e/evm/util.go +++ /dev/null @@ -1,207 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package evm - -import ( - "context" - "errors" - "math/big" - "time" - - "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/gas" - "github.com/sygmaprotocol/sygma-core/crypto/secp256k1" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/depositHandlers" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" - ethereumTypes "github.com/ethereum/go-ethereum/core/types" -) - -var TestTimeout = time.Minute * 4 - -var ( - BasicFee = big.NewInt(100000000000000) - AdminAccount, _ = secp256k1.NewKeypairFromString("cc2c32b154490f09f70c1c8d4b997238448d649e0777495863db231c4ced3616") -) - -const ( - ETHEndpoint1 = "ws://localhost:8545" - ETHEndpoint2 = "ws://localhost:8547" - OracleFee = uint16(500) // 5% - multiplied by 100 to not lose precision on contract side - GasUsed = uint32(2000000000) -) - -type Client interface { - LatestBlock() (*big.Int, error) - SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- ethereumTypes.Log) (ethereum.Subscription, error) - FetchEventLogs(ctx context.Context, contractAddress common.Address, event string, startBlock *big.Int, endBlock *big.Int) ([]ethereumTypes.Log, error) -} - -type EVMClient interface { - client.Client - gas.GasPriceClient - ChainID(ctx context.Context) (*big.Int, error) -} - -type BridgeConfig struct { - BridgeAddr common.Address - RetryAddr common.Address - - Erc20Addr common.Address - Erc20HandlerAddr common.Address - Erc20ResourceID [32]byte - - Erc20LockReleaseAddr common.Address - Erc20LockReleaseHandlerAddr common.Address - Erc20LockReleaseResourceID [32]byte - - PermissionlessGenericResourceID [32]byte - - Erc721Addr common.Address - Erc721HandlerAddr common.Address - Erc721ResourceID [32]byte - - Erc1155Addr common.Address - Erc1155HandlerAddr common.Address - Erc1155ResourceID [32]byte - - BasicFeeHandlerAddr common.Address - FeeRouterAddress common.Address - BasicFee *big.Int - - MaxGasPrice *big.Int - GasMultiplier *big.Float -} - -var DEFAULT_CONFIG = BridgeConfig{ - BridgeAddr: common.HexToAddress("0x6CdE2Cd82a4F8B74693Ff5e194c19CA08c2d1c68"), - RetryAddr: common.HexToAddress("0xAD825082B91980E7C8908652269c96a47D687cC5"), - - Erc20Addr: common.HexToAddress("0xA45E01c8D945D47ADa916828828B201d0815b83F"), - Erc20HandlerAddr: common.HexToAddress("0xC2D334e2f27A9dB2Ed8C4561De86C1A00EBf6760"), - Erc20ResourceID: SliceTo32Bytes(common.LeftPadBytes([]byte{0}, 31)), - - Erc20LockReleaseAddr: common.HexToAddress("0x783BB8123b8532CC85C8D2deF2f47C55D1e46b46"), - Erc20LockReleaseHandlerAddr: common.HexToAddress("0xC2D334e2f27A9dB2Ed8C4561De86C1A00EBf6760"), - Erc20LockReleaseResourceID: SliceTo32Bytes(common.LeftPadBytes([]byte{3}, 31)), - - Erc721Addr: common.HexToAddress("0x67272Fa6DB7ADa1639736753eD99f9D0C9e1450D"), - Erc721HandlerAddr: common.HexToAddress("0xF28c11CB14C6d2B806f99EA8b138F65e74a1Ed66"), - Erc721ResourceID: SliceTo32Bytes(common.LeftPadBytes([]byte{2}, 31)), - - PermissionlessGenericResourceID: SliceTo32Bytes(common.LeftPadBytes([]byte{5}, 31)), - - Erc1155ResourceID: SliceTo32Bytes(common.LeftPadBytes([]byte{4}, 31)), - Erc1155HandlerAddr: common.HexToAddress("0xE54Dc792c226AEF99D6086527b98b36a4ADDe56a"), - Erc1155Addr: common.HexToAddress("0x9Fd58882b82EFaD2867f7eaB43539907bc07C360"), - - BasicFeeHandlerAddr: common.HexToAddress("0x8dA96a8C2b2d3e5ae7e668d0C94393aa8D5D3B94"), - FeeRouterAddress: common.HexToAddress("0x1CcB4231f2ff299E1E049De76F0a1D2B415C563A"), - BasicFee: BasicFee, -} - -func WaitForProposalExecuted(client Client, bridge common.Address) error { - startBlock, _ := client.LatestBlock() - - query := ethereum.FilterQuery{ - FromBlock: startBlock, - Addresses: []common.Address{bridge}, - Topics: [][]common.Hash{ - {events.ProposalExecutionSig.GetTopic()}, - }, - } - timeout := time.After(TestTimeout) - ch := make(chan ethereumTypes.Log) - sub, err := client.SubscribeFilterLogs(context.Background(), query, ch) - if err != nil { - return err - } - - defer sub.Unsubscribe() - for { - select { - case <-ch: - return nil - case err := <-sub.Err(): - if err != nil { - return err - } - case <-timeout: - return errors.New("test timed out waiting for proposal execution event") - } - } -} - -func SliceTo32Bytes(in []byte) [32]byte { - var res [32]byte - copy(res[:], in) - return res -} - -func ConstructPermissionlessGenericDepositData(metadata []byte, executionFunctionSig []byte, executeContractAddress []byte, metadataDepositor []byte, maxFee *big.Int) []byte { - var data []byte - data = append(data, common.LeftPadBytes(maxFee.Bytes(), 32)...) - data = append(data, common.LeftPadBytes(big.NewInt(int64(len(executionFunctionSig))).Bytes(), 2)...) - data = append(data, executionFunctionSig...) - data = append(data, byte(len(executeContractAddress))) - data = append(data, executeContractAddress...) - data = append(data, byte(len(metadataDepositor))) - data = append(data, metadataDepositor...) - data = append(data, metadata...) - return data -} - -func constructMainDepositData(tokenStats *big.Int, destRecipient []byte) []byte { - var data []byte - data = append(data, math.PaddedBigBytes(tokenStats, 32)...) // Amount (ERC20) or Token Id (ERC721) - data = append(data, math.PaddedBigBytes(big.NewInt(int64(len(destRecipient))), 32)...) // length of recipient - data = append(data, destRecipient...) // Recipient - return data -} - -func ConstructErc20DepositData(destRecipient []byte, amount *big.Int) []byte { - data := constructMainDepositData(amount, destRecipient) - return data -} - -func ConstructErc721DepositData(destRecipient []byte, tokenId *big.Int, metadata []byte) []byte { - data := constructMainDepositData(tokenId, destRecipient) - data = append(data, math.PaddedBigBytes(big.NewInt(int64(len(metadata))), 32)...) // Length of metadata - data = append(data, metadata...) // Metadata - return data -} - -func ConstructGenericDepositData(metadata []byte) []byte { - var data []byte - data = append(data, math.PaddedBigBytes(big.NewInt(int64(len(metadata))), 32)...) // Length of metadata - data = append(data, metadata...) // Metadata - return data -} - -func ConstructErc1155DepositData(destRecipient []byte, tokenIds *big.Int, amounts *big.Int, metadata []byte) ([]byte, error) { - erc1155Type, err := depositHandlers.GetErc1155Type() - if err != nil { - return nil, err - } - - payload := []interface{}{ - []*big.Int{ - tokenIds, - }, - []*big.Int{ - amounts, - }, - destRecipient, - []byte{}, - } - data, err := erc1155Type.Pack(payload...) - - if err != nil { - return nil, err - } - return data, nil -} diff --git a/e2e/substrate/substrate_test.go b/e2e/substrate/substrate_test.go deleted file mode 100644 index e728ff2f..00000000 --- a/e2e/substrate/substrate_test.go +++ /dev/null @@ -1,203 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package substrate_test - -import ( - "context" - "encoding/binary" - - substrateTypes "github.com/centrifuge/go-substrate-rpc-client/v4/types" - "github.com/ethereum/go-ethereum/core/types" - evmClient "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/gas" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/signAndSend" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/transaction" - "github.com/sygmaprotocol/sygma-core/chains/substrate/client" - "github.com/sygmaprotocol/sygma-core/chains/substrate/connection" - - "math/big" - "testing" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/contracts/bridge" - - "github.com/ChainSafe/sygma-relayer/e2e/evm" - "github.com/ChainSafe/sygma-relayer/e2e/evm/contracts/erc20" - "github.com/ChainSafe/sygma-relayer/e2e/substrate" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/suite" -) - -type TestClient interface { - evm.EVMClient - LatestBlock() (*big.Int, error) - CodeAt(ctx context.Context, contractAddress common.Address, block *big.Int) ([]byte, error) - FetchEventLogs(ctx context.Context, contractAddress common.Address, event string, startBlock *big.Int, endBlock *big.Int) ([]types.Log, error) - SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) - TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) - BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) -} - -func Test_EVMSubstrate(t *testing.T) { - ethClient, err := evmClient.NewEVMClient(evm.ETHEndpoint1, evm.AdminAccount) - if err != nil { - panic(err) - } - gasPricer := gas.NewStaticGasPriceDeterminant(ethClient, nil) - - substrateConnection, err := connection.NewSubstrateConnection(substrate.SubstrateEndpoint) - if err != nil { - panic(err) - } - substrateClient := client.NewSubstrateClient(substrateConnection, &substrate.SubstratePK, big.NewInt(5), 0) - - var assetId uint32 = 2000 - assetIdSerialized := make([]byte, 4) - binary.LittleEndian.PutUint32(assetIdSerialized, assetId) - - suite.Run( - t, - NewEVMSubstrateTestSuite( - transaction.NewTransaction, - ethClient, - substrateClient, - substrateConnection, - gasPricer, - evm.DEFAULT_CONFIG, - assetIdSerialized, - ), - ) -} - -func NewEVMSubstrateTestSuite( - fabric transaction.TxFabric, - evmClient TestClient, - substrateClient *client.SubstrateClient, - substrateConnection *connection.Connection, - gasPricer signAndSend.GasPricer, - evmConfig evm.BridgeConfig, - substrateAssetID []byte, -) *IntegrationTestSuite { - return &IntegrationTestSuite{ - fabric: fabric, - evmClient: evmClient, - substrateClient: substrateClient, - substrateConnection: substrateConnection, - gasPricer: gasPricer, - evmConfig: evmConfig, - substrateAssetID: substrateAssetID, - } -} - -type IntegrationTestSuite struct { - suite.Suite - fabric transaction.TxFabric - evmClient TestClient - substrateClient *client.SubstrateClient - substrateConnection *connection.Connection - gasPricer signAndSend.GasPricer - evmConfig evm.BridgeConfig - substrateAssetID []byte -} - -func (s *IntegrationTestSuite) SetupSuite() { - // EVM side preparation - evmTransactor := signAndSend.NewSignAndSendTransactor(s.fabric, s.gasPricer, s.evmClient) - mintTo := s.evmClient.From() - amountToMint := big.NewInt(0).Mul(big.NewInt(5000000000000000), big.NewInt(0).Exp(big.NewInt(10), big.NewInt(18), nil)) - amountToApprove := big.NewInt(0).Mul(big.NewInt(100000), big.NewInt(0).Exp(big.NewInt(10), big.NewInt(18), nil)) - - erc20LRContract := erc20.NewERC20Contract(s.evmClient, s.evmConfig.Erc20LockReleaseAddr, evmTransactor) - _, err := erc20LRContract.MintTokens(mintTo, amountToMint, transactor.TransactOptions{}) - if err != nil { - panic(err) - } - _, err = erc20LRContract.MintTokens(s.evmConfig.Erc20LockReleaseHandlerAddr, amountToMint, transactor.TransactOptions{}) - if err != nil { - panic(err) - } - _, err = erc20LRContract.ApproveTokens(s.evmConfig.Erc20HandlerAddr, amountToApprove, transactor.TransactOptions{}) - if err != nil { - panic(err) - } -} - -func (s *IntegrationTestSuite) Test_Erc20Deposit_Substrate_to_EVM() { - var accountInfoBefore substrate.Account - meta := s.substrateConnection.GetMetadata() - key, _ := substrateTypes.CreateStorageKey(&meta, "Assets", "Account", s.substrateAssetID, substrate.SubstratePK.PublicKey) - _, err := s.substrateConnection.RPC.State.GetStorageLatest(key, &accountInfoBefore) - s.Nil(err) - - transactor := signAndSend.NewSignAndSendTransactor(s.fabric, s.gasPricer, s.evmClient) - - erc20Contract := erc20.NewERC20Contract(s.evmClient, s.evmConfig.Erc20LockReleaseAddr, transactor) - - destBalanceBefore, err := erc20Contract.GetBalance(s.evmClient.From()) - s.Nil(err) - - extHash, sub, err := s.substrateClient.Transact("SygmaBridge.deposit", substrate.USDCAsset{}, substrate.Destination{}) - s.Nil(err) - - err = s.substrateClient.TrackExtrinsic(extHash, sub) - s.Nil(err) - - err = evm.WaitForProposalExecuted(s.evmClient, s.evmConfig.BridgeAddr) - s.Nil(err) - - meta = s.substrateConnection.GetMetadata() - var senderBalanceAfter substrate.Account - key, _ = substrateTypes.CreateStorageKey(&meta, "Assets", "Account", s.substrateAssetID, substrate.SubstratePK.PublicKey) - _, err = s.substrateConnection.RPC.State.GetStorageLatest(key, &senderBalanceAfter) - s.Nil(err) - - // balance of sender has decreased - s.Equal(1, accountInfoBefore.Balance.Int.Cmp(senderBalanceAfter.Balance.Int)) - destBalanceAfter, err := erc20Contract.GetBalance(s.evmClient.From()) - - s.Nil(err) - //Balance has increased - s.Equal(1, destBalanceAfter.Cmp(destBalanceBefore)) -} - -var amountToDeposit = big.NewInt(100000000000000) - -func (s *IntegrationTestSuite) Test_Erc20Deposit_EVM_to_Substrate() { - transactor1 := signAndSend.NewSignAndSendTransactor(s.fabric, s.gasPricer, s.evmClient) - erc20Contract1 := erc20.NewERC20Contract(s.evmClient, s.evmConfig.Erc20LockReleaseAddr, transactor1) - bridgeContract1 := bridge.NewBridgeContract(s.evmClient, s.evmConfig.BridgeAddr, transactor1) - - senderBalBefore, err := erc20Contract1.GetBalance(s.evmClient.From()) - s.Nil(err) - - meta := s.substrateConnection.GetMetadata() - var destBalanceBefore substrate.Account - key, _ := substrateTypes.CreateStorageKey(&meta, "Assets", "Account", s.substrateAssetID, substrate.SubstratePK.PublicKey) - _, err = s.substrateConnection.RPC.State.GetStorageLatest(key, &destBalanceBefore) - s.Nil(err) - pk := []substrateTypes.U8{0xd4, 0x35, 0x93, 0xc7, 0x15, 0xfd, 0xd3, 0x1c, 0x61, 0x14, 0x1a, 0xbd, 0x4, 0xa9, 0x9f, 0xd6, 0x82, 0x2c, 0x85, 0x58, 0x85, 0x4c, 0xcd, 0xe3, 0x9a, 0x56, 0x84, 0xe7, 0xa5, 0x6d, 0xa2, 0x7d} - - recipientMultilocation := substrate.ConstructRecipientData(pk) - - erc20DepositData := evm.ConstructErc20DepositData(recipientMultilocation, amountToDeposit) - _, err = bridgeContract1.ExecuteTransaction("deposit", transactor.TransactOptions{Value: s.evmConfig.BasicFee}, uint8(3), s.evmConfig.Erc20LockReleaseResourceID, erc20DepositData, []byte{}) - - s.Nil(err) - - err = substrate.WaitForProposalExecuted(s.substrateConnection, destBalanceBefore.Balance, substrate.SubstratePK.PublicKey) - s.Nil(err) - senderBalAfter, err := erc20Contract1.GetBalance(s.evmClient.From()) - s.Nil(err) - s.Equal(-1, senderBalAfter.Cmp(senderBalBefore)) - - var destBalanceAfter substrate.Account - key, _ = substrateTypes.CreateStorageKey(&meta, "Assets", "Account", s.substrateAssetID, substrate.SubstratePK.PublicKey) - _, err = s.substrateConnection.RPC.State.GetStorageLatest(key, &destBalanceAfter) - s.Nil(err) - - //Balance has increased - s.Equal(1, destBalanceAfter.Balance.Int.Cmp(destBalanceBefore.Balance.Int)) -} diff --git a/e2e/substrate/util.go b/e2e/substrate/util.go deleted file mode 100644 index a12d0b94..00000000 --- a/e2e/substrate/util.go +++ /dev/null @@ -1,151 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package substrate - -import ( - "bytes" - "context" - "encoding/binary" - "errors" - "math/big" - "time" - - "github.com/centrifuge/go-substrate-rpc-client/v4/scale" - "github.com/centrifuge/go-substrate-rpc-client/v4/signature" - substrateTypes "github.com/centrifuge/go-substrate-rpc-client/v4/types" - "github.com/sygmaprotocol/sygma-core/chains/evm/client" - "github.com/sygmaprotocol/sygma-core/chains/substrate/connection" - - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/gas" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - ethereumTypes "github.com/ethereum/go-ethereum/core/types" -) - -var TestTimeout = time.Minute * 4 -var BasicFee = big.NewInt(100000000000000) -var GasUsed = uint32(2000000000) -var SubstratePK = signature.KeyringPair{ - URI: "//Alice", - PublicKey: []byte{0xd4, 0x35, 0x93, 0xc7, 0x15, 0xfd, 0xd3, 0x1c, 0x61, 0x14, 0x1a, 0xbd, 0x4, 0xa9, 0x9f, 0xd6, 0x82, 0x2c, 0x85, 0x58, 0x85, 0x4c, 0xcd, 0xe3, 0x9a, 0x56, 0x84, 0xe7, 0xa5, 0x6d, 0xa2, 0x7d}, - Address: "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", -} - -const ( - SubstrateEndpoint = "ws://localhost:9944" -) - -type USDCAsset struct{} - -func (a USDCAsset) Encode(encoder scale.Encoder) error { - _ = encoder.Write([]byte{0, 1, 3, 0, 85, 31, 6, 5, 115, 121, 103, 109, 97, 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, 6, 4, 117, 115, 100, 99, 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, 4}) - return nil -} - -func (a USDCAsset) Decode(decoder scale.Decoder) error { - return nil -} - -type Destination struct { -} - -func (a Destination) Encode(encoder scale.Encoder) error { - _ = encoder.Write([]byte{0, 2, 6, 20, 92, 31, 89, 97, 105, 107, 173, 46, 115, 247, 52, 23, 240, 126, 245, 92, 98, 162, 220, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 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, 0, 0, 0}) - return nil -} - -func (a Destination) Decode(decoder scale.Decoder) error { - return nil -} - -type Client interface { - LatestBlock() (*big.Int, error) - SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- ethereumTypes.Log) (ethereum.Subscription, error) - FetchEventLogs(ctx context.Context, contractAddress common.Address, event string, startBlock *big.Int, endBlock *big.Int) ([]ethereumTypes.Log, error) -} - -type EVMClient interface { - client.Client - gas.GasPriceClient - ChainID(ctx context.Context) (*big.Int, error) -} - -func WaitForProposalExecuted(connection *connection.Connection, beforeBalance substrateTypes.U128, key []byte) error { - timeout := time.After(TestTimeout) - ticker := time.NewTicker(5 * time.Second) - - for { - select { - case <-ticker.C: - done, err := checkBalance(beforeBalance, connection, key) - if err != nil { - ticker.Stop() - return err - } - if done { - ticker.Stop() - return nil - } - case <-timeout: - ticker.Stop() - return errors.New("test timed out waiting for proposal execution event") - } - } -} - -func checkBalance(beforeBalance substrateTypes.U128, connection *connection.Connection, key []byte) (bool, error) { - meta := connection.GetMetadata() - var acc Account - var assetId uint32 = 2000 - assetIdSerialized := make([]byte, 4) - binary.LittleEndian.PutUint32(assetIdSerialized, assetId) - - key, _ = substrateTypes.CreateStorageKey(&meta, "Assets", "Account", assetIdSerialized, key) - _, err := connection.RPC.State.GetStorageLatest(key, &acc) - if err != nil { - return false, err - } - destBalanceAfter := acc.Balance - if destBalanceAfter.Int.Cmp(beforeBalance.Int) == 1 { - return true, nil - } else { - return false, nil - } -} - -type Account struct { - Balance substrateTypes.U128 -} - -func ConstructRecipientData(recipient []substrateTypes.U8) []byte { - rec := substrateTypes.MultiLocationV1{ - Parents: 0, - Interior: substrateTypes.JunctionsV1{ - IsX1: true, - X1: substrateTypes.JunctionV1{ - IsAccountID32: true, - AccountID32NetworkID: substrateTypes.NetworkID{ - IsAny: true, - }, - AccountID: recipient, - }, - }, - } - - encodedRecipient := bytes.NewBuffer([]byte{}) - encoder := scale.NewEncoder(encodedRecipient) - _ = rec.Encode(*encoder) - - recipientBytes := encodedRecipient.Bytes() - var finalRecipient []byte - - // remove accountID size data - // this is a fix because the substrate decoder is not able to parse the data with extra data - // that represents size of the recipient byte array - finalRecipient = append(finalRecipient, recipientBytes[:4]...) - finalRecipient = append(finalRecipient, recipientBytes[5:]...) - - return finalRecipient -} diff --git a/example/Dockerfile b/example/Dockerfile deleted file mode 100644 index ab8975f9..00000000 --- a/example/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2020 ChainSafe Systems -# SPDX-License-Identifier: LGPL-3.0-only - -FROM alpine:3.6 as alpine -RUN apk add -U --no-cache ca-certificates - -FROM golang:1.19 AS builder -ADD . /src -WORKDIR /src -RUN cd /src && echo $(ls -1 /src) -RUN go mod download -RUN go build -ldflags "-X google.golang.org/protobuf/reflect/protoregistry.conflictPolicy=ignore" -o /bridge ./example/ - -# final stage -FROM debian:stable-slim -COPY --from=builder /bridge ./ -RUN chmod +x ./bridge -COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ - -CMD ["./bridge"] diff --git a/example/app/app.go b/example/app/app.go deleted file mode 100644 index d245bbeb..00000000 --- a/example/app/app.go +++ /dev/null @@ -1,356 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package app - -import ( - "context" - "fmt" - "os" - "os/signal" - "sync" - "syscall" - "time" - - "github.com/ChainSafe/sygma-relayer/chains" - "github.com/ChainSafe/sygma-relayer/chains/btc" - "github.com/ChainSafe/sygma-relayer/chains/btc/mempool" - "github.com/ChainSafe/sygma-relayer/chains/btc/uploader" - substrateListener "github.com/ChainSafe/sygma-relayer/chains/substrate/listener" - substratePallet "github.com/ChainSafe/sygma-relayer/chains/substrate/pallet" - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - propStore "github.com/ChainSafe/sygma-relayer/store" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/sygmaprotocol/sygma-core/chains/evm/listener" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/gas" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/transaction" - coreSubstrate "github.com/sygmaprotocol/sygma-core/chains/substrate" - substrateClient "github.com/sygmaprotocol/sygma-core/chains/substrate/client" - "github.com/sygmaprotocol/sygma-core/chains/substrate/connection" - coreSubstrateListener "github.com/sygmaprotocol/sygma-core/chains/substrate/listener" - "github.com/sygmaprotocol/sygma-core/crypto/secp256k1" - "github.com/sygmaprotocol/sygma-core/observability" - "github.com/sygmaprotocol/sygma-core/relayer" - "github.com/sygmaprotocol/sygma-core/store" - "github.com/sygmaprotocol/sygma-core/store/lvldb" - - "github.com/ethereum/go-ethereum/common" - "github.com/libp2p/go-libp2p/core/crypto" - "github.com/rs/zerolog/log" - "github.com/spf13/viper" - - "github.com/centrifuge/go-substrate-rpc-client/v4/signature" - "github.com/sygmaprotocol/sygma-core/chains/evm/transactor/monitored" - "github.com/sygmaprotocol/sygma-core/relayer/message" - - btcConfig "github.com/ChainSafe/sygma-relayer/chains/btc/config" - btcConnection "github.com/ChainSafe/sygma-relayer/chains/btc/connection" - btcExecutor "github.com/ChainSafe/sygma-relayer/chains/btc/executor" - btcListener "github.com/ChainSafe/sygma-relayer/chains/btc/listener" - "github.com/ChainSafe/sygma-relayer/chains/evm" - "github.com/ChainSafe/sygma-relayer/chains/substrate" - substrateExecutor "github.com/ChainSafe/sygma-relayer/chains/substrate/executor" - "github.com/ChainSafe/sygma-relayer/jobs" - "github.com/ChainSafe/sygma-relayer/metrics" - coreEvm "github.com/sygmaprotocol/sygma-core/chains/evm" - - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/contracts/bridge" - "github.com/ChainSafe/sygma-relayer/chains/evm/calls/events" - "github.com/ChainSafe/sygma-relayer/chains/evm/executor" - "github.com/ChainSafe/sygma-relayer/chains/evm/listener/depositHandlers" - hubEventHandlers "github.com/ChainSafe/sygma-relayer/chains/evm/listener/eventHandlers" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/comm/p2p" - "github.com/ChainSafe/sygma-relayer/config" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/topology" - evmClient "github.com/sygmaprotocol/sygma-core/chains/evm/client" -) - -func Run() error { - configuration, err := config.GetConfigFromFile(viper.GetString(config.ConfigFlagName), nil) - if err != nil { - panic(err) - } - - networkTopology, _ := topology.ProcessRawTopology(&topology.RawTopology{ - Peers: []topology.RawPeer{ - {PeerAddress: "/dns4/relayer2/tcp/9001/p2p/QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT"}, - {PeerAddress: "/dns4/relayer3/tcp/9002/p2p/QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK"}, - {PeerAddress: "/dns4/relayer1/tcp/9000/p2p/QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX"}, - }, - Threshold: "2", - }) - - db, err := lvldb.NewLvlDB(viper.GetString(config.BlockstoreFlagName)) - if err != nil { - panic(err) - } - blockstore := store.NewBlockStore(db) - - privBytes, err := crypto.ConfigDecodeKey(configuration.RelayerConfig.MpcConfig.Key) - if err != nil { - panic(err) - } - priv, err := crypto.UnmarshalPrivateKey(privBytes) - if err != nil { - panic(err) - } - - connectionGate := p2p.NewConnectionGate(networkTopology) - host, err := p2p.NewHost(priv, networkTopology, connectionGate, configuration.RelayerConfig.MpcConfig.Port) - if err != nil { - panic(err) - } - - communication := p2p.NewCommunication(host, "p2p/sygma") - electorFactory := elector.NewCoordinatorElectorFactory(host, configuration.RelayerConfig.BullyConfig) - coordinator := tss.NewCoordinator(host, communication, electorFactory) - keyshareStore := keyshare.NewECDSAKeyshareStore(configuration.RelayerConfig.MpcConfig.KeysharePath) - frostKeyshareStore := keyshare.NewFrostKeyshareStore(configuration.RelayerConfig.MpcConfig.FrostKeysharePath) - propStore := propStore.NewPropStore(db) - - // wait until executions are done and then stop further executions before exiting - exitLock := &sync.RWMutex{} - defer exitLock.Lock() - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - mp, err := observability.InitMetricProvider(ctx, configuration.RelayerConfig.OpenTelemetryCollectorURL) - if err != nil { - panic(err) - } - defer func() { - if err := mp.Shutdown(context.Background()); err != nil { - log.Error().Msgf("Error shutting down meter provider: %v", err) - } - }() - - sygmaMetrics, err := metrics.NewSygmaMetrics(ctx, mp.Meter("relayer-metric-provider"), configuration.RelayerConfig.Env, configuration.RelayerConfig.Id, "latest") - if err != nil { - panic(err) - } - - msgChan := make(chan []*message.Message) - domains := make(map[uint8]relayer.RelayedChain) - for _, chainConfig := range configuration.ChainConfigs { - switch chainConfig["type"] { - case "evm": - { - config, err := evm.NewEVMConfig(chainConfig) - panicOnError(err) - kp, err := secp256k1.NewKeypairFromString(config.GeneralChainConfig.Key) - panicOnError(err) - - client, err := evmClient.NewEVMClient(config.GeneralChainConfig.Endpoint, kp) - panicOnError(err) - - log.Info().Str("domain", config.String()).Msgf("Registering EVM domain") - - bridgeAddress := common.HexToAddress(config.Bridge) - frostAddress := common.HexToAddress(config.FrostKeygen) - gasPricer := gas.NewLondonGasPriceClient(client, &gas.GasPricerOpts{ - UpperLimitFeePerGas: config.MaxGasPrice, - GasPriceFactor: config.GasMultiplier, - }) - t := monitored.NewMonitoredTransactor(*config.GeneralChainConfig.Id, transaction.NewTransaction, gasPricer, sygmaMetrics, client, config.MaxGasPrice, config.GasIncreasePercentage) - go t.Monitor(ctx, time.Minute*3, time.Minute*10, time.Minute) - bridgeContract := bridge.NewBridgeContract(client, bridgeAddress, t) - - depositHandler := depositHandlers.NewETHDepositHandler(bridgeContract) - for _, handler := range config.Handlers { - switch handler.Type { - case "erc20", "native": - { - depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.Erc20DepositHandler{}) - } - case "permissionlessGeneric": - { - depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.PermissionlessGenericDepositHandler{}) - } - case "erc721": - { - depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.Erc721DepositHandler{}) - } - case "erc1155": - { - depositHandler.RegisterDepositHandler(handler.Address, &depositHandlers.Erc1155DepositHandler{}) - } - } - } - depositListener := events.NewListener(client) - tssListener := events.NewListener(client) - eventHandlers := make([]listener.EventHandler, 0) - l := log.With().Str("chain", fmt.Sprintf("%v", config.GeneralChainConfig.Name)).Uint8("domainID", *config.GeneralChainConfig.Id) - - depositEventHandler := hubEventHandlers.NewDepositEventHandler(depositListener, depositHandler, bridgeAddress, *config.GeneralChainConfig.Id, msgChan) - eventHandlers = append(eventHandlers, depositEventHandler) - eventHandlers = append(eventHandlers, hubEventHandlers.NewKeygenEventHandler(l, tssListener, coordinator, host, communication, keyshareStore, bridgeAddress, networkTopology.Threshold)) - eventHandlers = append(eventHandlers, hubEventHandlers.NewFrostKeygenEventHandler(l, tssListener, coordinator, host, communication, frostKeyshareStore, frostAddress, networkTopology.Threshold)) - eventHandlers = append(eventHandlers, hubEventHandlers.NewRefreshEventHandler(l, nil, nil, tssListener, coordinator, host, communication, connectionGate, keyshareStore, frostKeyshareStore, bridgeAddress)) - eventHandlers = append(eventHandlers, hubEventHandlers.NewRetryV1EventHandler(l, tssListener, depositHandler, propStore, bridgeAddress, *config.GeneralChainConfig.Id, config.BlockConfirmations, msgChan)) - if config.Retry != "" { - eventHandlers = append(eventHandlers, hubEventHandlers.NewRetryV2EventHandler(l, tssListener, common.HexToAddress(config.Retry), *config.GeneralChainConfig.Id, msgChan)) - } - evmListener := listener.NewEVMListener(client, eventHandlers, blockstore, sygmaMetrics, *config.GeneralChainConfig.Id, config.BlockRetryInterval, config.BlockConfirmations, config.BlockInterval) - - mh := message.NewMessageHandler() - mh.RegisterMessageHandler(retry.RetryMessageType, executor.NewRetryMessageHandler(depositEventHandler, client, propStore, config.BlockConfirmations, msgChan)) - mh.RegisterMessageHandler(transfer.TransferMessageType, &executor.TransferMessageHandler{}) - executor := executor.NewExecutor(host, communication, coordinator, bridgeContract, keyshareStore, exitLock, config.GasLimit.Uint64(), config.TransferGas) - - startBlock, err := blockstore.GetStartBlock(*config.GeneralChainConfig.Id, config.StartBlock, config.GeneralChainConfig.LatestBlock, config.GeneralChainConfig.FreshStart) - if err != nil { - panic(err) - } - if startBlock == nil { - head, err := client.LatestBlock() - if err != nil { - panic(err) - } - startBlock = head - } - startBlock, err = chains.CalculateStartingBlock(startBlock, config.BlockInterval) - if err != nil { - panic(err) - } - chain := coreEvm.NewEVMChain(evmListener, mh, executor, *config.GeneralChainConfig.Id, startBlock) - - domains[*config.GeneralChainConfig.Id] = chain - } - case "substrate": - { - config, err := substrate.NewSubstrateConfig(chainConfig) - if err != nil { - panic(err) - } - - conn, err := connection.NewSubstrateConnection(config.GeneralChainConfig.Endpoint) - if err != nil { - panic(err) - } - keyPair, err := signature.KeyringPairFromSecret(config.GeneralChainConfig.Key, config.SubstrateNetwork) - if err != nil { - panic(err) - } - - substrateClient := substrateClient.NewSubstrateClient(conn, &keyPair, config.ChainID, config.Tip) - bridgePallet := substratePallet.NewPallet(substrateClient) - - log.Info().Str("domain", config.String()).Msgf("Registering substrate domain") - - l := log.With().Str("chain", fmt.Sprintf("%v", config.GeneralChainConfig.Name)).Uint8("domainID", *config.GeneralChainConfig.Id) - depositHandler := substrateListener.NewSubstrateDepositHandler() - depositHandler.RegisterDepositHandler(transfer.FungibleTransfer, substrateListener.FungibleTransferHandler) - eventHandlers := make([]coreSubstrateListener.EventHandler, 0) - depositEventHandler := substrateListener.NewFungibleTransferEventHandler(l, *config.GeneralChainConfig.Id, depositHandler, msgChan, conn) - eventHandlers = append(eventHandlers, substrateListener.NewRetryEventHandler(l, conn, depositHandler, *config.GeneralChainConfig.Id, msgChan)) - eventHandlers = append(eventHandlers, depositEventHandler) - substrateListener := coreSubstrateListener.NewSubstrateListener(conn, eventHandlers, blockstore, sygmaMetrics, *config.GeneralChainConfig.Id, config.BlockRetryInterval, config.BlockInterval) - - mh := message.NewMessageHandler() - mh.RegisterMessageHandler(transfer.TransferMessageType, &substrateExecutor.SubstrateMessageHandler{}) - mh.RegisterMessageHandler(retry.RetryMessageType, substrateExecutor.NewRetryMessageHandler(depositEventHandler, conn, propStore, msgChan)) - - sExecutor := substrateExecutor.NewExecutor(host, communication, coordinator, bridgePallet, keyshareStore, conn, exitLock) - - startBlock, err := blockstore.GetStartBlock(*config.GeneralChainConfig.Id, config.StartBlock, config.GeneralChainConfig.LatestBlock, config.GeneralChainConfig.FreshStart) - if err != nil { - panic(err) - } - if startBlock == nil { - head, err := substrateClient.LatestBlock() - if err != nil { - panic(err) - } - startBlock = head - } - startBlock, err = chains.CalculateStartingBlock(startBlock, config.BlockInterval) - if err != nil { - panic(err) - } - substrateChain := coreSubstrate.NewSubstrateChain(substrateListener, mh, sExecutor, *config.GeneralChainConfig.Id, startBlock) - - domains[*config.GeneralChainConfig.Id] = substrateChain - } - case "btc": - { - log.Info().Msgf("Registering btc domain") - config, err := btcConfig.NewBtcConfig(chainConfig) - if err != nil { - panic(err) - } - - conn, err := btcConnection.NewBtcConnection( - config.GeneralChainConfig.Endpoint, - config.Username, - config.Password, - true) - if err != nil { - panic(err) - } - - l := log.With().Str("chain", fmt.Sprintf("%v", config.GeneralChainConfig.Name)).Uint8("domainID", *config.GeneralChainConfig.Id) - resources := make(map[[32]byte]btcConfig.Resource) - for _, resource := range config.Resources { - resources[resource.ResourceID] = resource - } - depositHandler := &btcListener.BtcDepositHandler{} - depositEventHandler := btcListener.NewFungibleTransferEventHandler(l, *config.GeneralChainConfig.Id, depositHandler, msgChan, conn, resources, config.FeeAddress) - eventHandlers := make([]btcListener.EventHandler, 0) - eventHandlers = append(eventHandlers, depositEventHandler) - listener := btcListener.NewBtcListener(conn, eventHandlers, config, blockstore) - - mempool := mempool.NewMempoolAPI(config.MempoolUrl) - - mh := message.NewMessageHandler() - mh.RegisterMessageHandler(transfer.TransferMessageType, &btcExecutor.FungibleMessageHandler{}) - mh.RegisterMessageHandler(retry.RetryMessageType, btcExecutor.NewRetryMessageHandler(depositEventHandler, conn, config.BlockConfirmations, propStore, msgChan)) - uploader := uploader.NewIPFSUploader(configuration.RelayerConfig.UploaderConfig) - executor := btcExecutor.NewExecutor( - propStore, - host, - communication, - coordinator, - frostKeyshareStore, - conn, - mempool, - resources, - config.Network, - exitLock, - uploader) - - btcChain := btc.NewBtcChain(listener, executor, mh, *config.GeneralChainConfig.Id) - domains[*config.GeneralChainConfig.Id] = btcChain - - } - default: - panic(fmt.Errorf("type '%s' not recognized", chainConfig["type"])) - } - } - - go jobs.StartCommunicationHealthCheckJob(host, configuration.RelayerConfig.MpcConfig.CommHealthCheckInterval, sygmaMetrics) - r := relayer.NewRelayer(domains, sygmaMetrics) - - go r.Start(ctx, msgChan) - - sysErr := make(chan os.Signal, 1) - signal.Notify(sysErr, - syscall.SIGTERM, - syscall.SIGINT, - syscall.SIGHUP, - syscall.SIGQUIT) - - sig := <-sysErr - log.Info().Msgf("terminating got ` [%v] signal", sig) - return nil - -} - -func panicOnError(err error) { - if err != nil { - panic(err) - } -} diff --git a/example/cfg/config_evm-evm_1.json b/example/cfg/config_evm-evm_1.json deleted file mode 100644 index dfe1b3c6..00000000 --- a/example/cfg/config_evm-evm_1.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "relayer": { - "mpcConfig": { - "port": "9000", - "keysharePath": "/cfg/keyshares/0.keyshare", - "frostKeysharePath": "/cfg/keyshares/0-frost.keyshare", - "key": "CAASpwkwggSjAgEAAoIBAQDVGgUufcOR+u/KjuifMbWbEy4F18250ua3/+PO2eSn/mNRhPp2KCWZJcbVvcvfmsrUG9rJC9DMeUZqttTGSF4/ZaNzzvW0b3Ij2NsI9F+R9HKfsbak8NT8z4nLlWF6V2JuZAD8papG+S60k97278kTPIDZZ+S1ZzH/ViFG/5eu26bNylU27AjL4tTRivXSW6hqlem/RnuPdHNtHqBmw2pAAsV/CZJjmibsk6wQJAMH5/o453rW5v2Ntc0rkGH0leszk9DUJoALr/623MP4re4ZsNPIoZE+ieU4sbM0d8vkbxs4BRcnAa075X8dX8KTl88MiA+AxW9nkW+X2Sn0XI1/AgMBAAECggEBAMNghduoJoRSo0L9Xz2FX9F79jgZMV7rg+iyzXQ6xa9YRkrZNqDaEg6lWfVhe+fYjZmGqEKneJnfnrX8Rnw8oVxSnVdyKkdx3h4LllZRZsX0bpsHXkM/IqdeyCFFJgf60h4Pxe/dG47SqwWYhVW1Zo8ia6fn3wKKSIanuv7TG4iN4Zd1T+joPF9ACq5zYqVBN0nwHTTrMdBjwWOo8jguLXwRgNw1j2qTcTfDvhfkHKXNVm2QMul8DOWZOpHPnFdp1pPu6lAuHyDUvfbA3RLIh2T//iuSWNiHw1bYXhQMcOeB0rqhISEE/qFNHC/9lzCqVoDTP4YfU0SV0ezx4Vgu9zECgYEA8K++vpfezsBEEvtl5iG2NfvqypC6rQrrt4WWEgvskRrNRY4NUeXC3CJpH6ItOwruIv0NTQz10RoH+d6m7isOoUHCSHKFVcePdDcFJXlQf8WN99vFATB39ItfL+fepLqKSZ8+dh59pq+76ewdvStZXhV3Idjcx3L/D2RIVj0nzUUCgYEA4qj6cCOUfEyeE2YIOJ0+iP3GUPu90pNWTpS5R8UE7GBgHCSqBlNpIcoaOzDVJWN30OYVoyBBxfYaTGx5L5adMCtQCUaSuYlCb0Sd8L6v5cnKNXm9Mdd7L19y9RamGdzGS4pkkatG8Gzod3DESXbcEYg5djn/8meeirFoDV6IsfMCgYAH7sLqpTbCubOErKR/IT1QKi1i38JHUcTTF6QKlDoHzkpVsIjf2iLB/qBYWpADEiknHhACKhsv+RuqMJxv3RtuVSyCFsQuP5WKzwVsZsMwcuJq+ONVVrOda7qHaaz84OkN5CG64uZhSAl5fD6+rV8UqsBybSNZr4CYkUWREhLtwQKBgHEGIhvZIin5arnxnxfcEVrucP3hCn7+yYLV1q5bKGFWjZZ7Ee2lmj8nMH1jlGXYe97HXPLDGwlD90k0rhl02V0zu+1kK7YpI9+oL7nk3IGRZivUUOuRr/OnfQOKD7nFxXvVvuCEsBMju6gTq02W35Y+f6jcsyyFTyGJ5YEFKtTRAoGAG/7OBEetoNyWTvMQ6w5HjQkz66n05DoUKFJ44T6ia1vlZCacZ5F7T1S0eMo3zlUp8F/Kz1VxmG3UlsiX3RMf9qiOh+HFIGI6lAtNojHn4jdXpCxTRHecu9GDmds8/7MLemJvoJ4oo3I1n/PyEA9fUMJn07MTGMAABw2IkcOS0dw=", - "topologyConfiguration": { - "path": ".", - "url": "test.url", - "encryptionKey": "test-enc-key" - }, - "commHealthCheckInterval": "24h" - }, - "opentelemetryCollectorURL": "http://otel-collector:4318", - "UploaderConfig":{ - "URL":"http://ipfs0:5001/api/v0/add" - } - }, - "domains": [ - { - "id": 1, - "name": "evm1", - "type": "evm", - "endpoint": "ws://evm1-1:8545", - "bridge": "0x6CdE2Cd82a4F8B74693Ff5e194c19CA08c2d1c68", - "retry": "0xAD825082B91980E7C8908652269c96a47D687cC5", - "handlers": [ - { - "type": "erc20", - "address": "0xC2D334e2f27A9dB2Ed8C4561De86C1A00EBf6760" - }, - { - "type": "erc721", - "address": "0xF28c11CB14C6d2B806f99EA8b138F65e74a1Ed66" - }, - { - "type": "erc1155", - "address": "0xE54Dc792c226AEF99D6086527b98b36a4ADDe56a" - }, - { - "type": "permissionlessGeneric", - "address": "0x94e9070f0354b69E7FB583134A820949A390D341" - } - ], - "gasLimit": 9000000, - "maxGasPrice": 20000000000, - "blockConfirmations": 2, - "key": "a5fca6b6b7ac1be2e8f8f39e7c38722216c655a1c4504c29e43ebb7e21f14937" - }, - { - "id": 2, - "name": "evm2", - "type": "evm", - "endpoint": "ws://evm2-1:8545", - "bridge": "0x6CdE2Cd82a4F8B74693Ff5e194c19CA08c2d1c68", - "retry": "0xAD825082B91980E7C8908652269c96a47D687cC5", - "handlers": [ - { - "type": "erc20", - "address": "0xC2D334e2f27A9dB2Ed8C4561De86C1A00EBf6760" - }, - { - "type": "erc721", - "address": "0xF28c11CB14C6d2B806f99EA8b138F65e74a1Ed66" - }, - { - "type": "erc1155", - "address": "0xE54Dc792c226AEF99D6086527b98b36a4ADDe56a" - }, - { - "type": "permissionlessGeneric", - "address": "0x94e9070f0354b69E7FB583134A820949A390D341" - } - ], - "gasLimit": 9000000, - "maxGasPrice": 20000000000, - "blockConfirmations": 2, - "key": "a5fca6b6b7ac1be2e8f8f39e7c38722216c655a1c4504c29e43ebb7e21f14937" - }, - { - "id": 3, - "chainID": 5, - "name": "substrate1", - "type": "substrate", - "startBlock": 5, - "endpoint": "ws://substrate-pallet:9944", - "tip": 0, - "blockConfirmations": 2, - "key": "//Alice", - "substrateNetwork": 0 - }, - { - "id": 4, - "name": "bitcoin", - "type": "btc", - "startBlock": 100, - "feeAddress": "mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt", - "endpoint": "bitcoin:18443", - "mempoolUrl": "http://mempool-stub:8882", - "blockConfirmations": 1, - "network": "regtest", - "username": "user", - "password": "password", - "resources": [ - { - "address": "bcrt1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2sjyr5ek", - "resourceId": "0x0000000000000000000000000000000000000000000000000000000000001000", - "script": "51206a698882348433b57d549d6344f74500fcd13ad8d2200cdf89f8e39e5cafa7d5", - "tweak": "c82aa6ae534bb28aaafeb3660c31d6a52e187d8f05d48bb6bdb9b733a9b42212", - "feeAmount": "10000000" - } - ] - } - ] -} diff --git a/example/cfg/config_evm-evm_2.json b/example/cfg/config_evm-evm_2.json deleted file mode 100644 index 5e492bae..00000000 --- a/example/cfg/config_evm-evm_2.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "relayer": { - "mpcConfig": { - "port": "9001", - "keysharePath": "/cfg/keyshares/1.keyshare", - "frostKeysharePath": "/cfg/keyshares/1-frost.keyshare", - "key": "CAASpwkwggSjAgEAAoIBAQC89zG/nTK/iWXllnMv65fyrhndM/hhe4IAUnC1kgdzazgUDRCsDHvmPOJ2TccgBjiuG5alxo+tw9y20PYJJoZB7ctDPxBKRJ/6l+0UrWUZE4LxxbKPW4RIRvosVr78OFTrRE63eTsJwUEDNj8EanN+biftSlSzN3DAh/ZSEZtqXUEul2ZxZcuSzgo7gjglGSqTlMLEMHhTu09ceXUECNeky2v6pAKQ/7khaMS96nYTBcyT5ZrEss0fQV13txHoMie+LbnjFM82ezZwcN4GGiHyxyU88/1WP/SKQhW6Ug5Zvd5kkDUuZzKMDRaj3gwDf47uYUGEGDMoL8m2r3OUIAVJAgMBAAECggEAIW3xxR5APhZGiolFM3MQXIRkWve4tzYsV3Y+LkD5RHfxYcq16loDCUY4Igm8cnPnTxXeXtFz1Z/SyhzJifDgy4UP8oOTlC/zxVdfP8s1GWyUO8Vnw2jDTC4SUAnAm8oza7OX4Wl3AlDH+ZN9LoDOkc1XDumZdmMWdVkYQIiQ4A30+AVcuKpfWZa+e034vtHV6/0Ys+zX/jbiRgw5bnZAsFiiy577V0RGzMqcILtrZfg9FHmyRhrfQH+Kh1HlYrHIUqaWaZHl8vROBHJs0ePqPoXmVSCu9dzJLtIzZlAtIUi7CX1SkIXFR4ZF+RORGQK3v0qNLQK55hPe/DndhpewoQKBgQDC4Y6vgbTLurYEgT4kDlrY0rZ1Yjkxi4LwpEfiEN/NHeO5IwePc4SwZ7y4JVNcN0KJFPlitdELXjKJJ9rjmvgUHJ2IQu1drEk5JJXdKq7s6lEROhggj1U+tRBc5znmOPd/PsFjETJ0ux4/vSBM6fQgWK+yGfL2QZdJbwZ7N8QtDQKBgQD4OrMz9G/GCdxnXbHnu+RTTYrHa6WrUBViRqUyy/PYnLD1TGvaARf64R7kHXrhIBZlLLjuiOq8VhVBD5jGpK798Egk52DoRPIRPYmhmGkg7iNj62MUrCk4BwVsgOBZjkvzb0iSIOh67ZpqR7p5iKhAkasaOLtR/ertAGjxSPICLQKBgQC2PMD2ZF+SKB5v5gAbLYVMvva6nEiJiUHAEI/b2hW+tRWvmg9G2Sqa39c9iEIEuPQyRnfTE9zROZweYDOzpcYY4I17z8IyV5r9obW25WRAzflTF7VaNU7s3drYVa3yGRFwX1nubzV0rUpjJlOfOSP+X5ClBtkJ6Vo05Gr2LLb5vQKBgE0wG6dtPBCN4m52ESspHw/UTfJDBAooZe3gX+BS0WmrF8+/Ss5Ihsdpl2yBykMU8kHVzU/HXY7hCczoZ65laVDnldd754NyZP99bj3EofQueOzKNk4oVszoSgR6cskGWZHCKgPencwT9G9WDKNcHk2tvlHyEDWnypSWCwv0jeSlAoGACso4W3vBXaXCUbNqOQ+T0GZGvbvGUDE5XC2Xe7rbZAsoAgrjInqZhwqqjnRV4QnjtdXrA+PjtubS9OKeU6aguFp0f/8VQzZ4lGKFHj+6Sa84+5pEvc+V9lRg1FKTLyDY8d8IXxjqc/IKfc+yosyXFdwkYwddSVmH5fjwHaH/bBg=", - "topologyConfiguration": { - "path": ".", - "url": "test.url", - "encryptionKey": "test-enc-key" - }, - "commHealthCheckInterval": "24h" - }, - "opentelemetryCollectorURL": "http://otel-collector:4318", - "UploaderConfig":{ - "URL":"http://ipfs0:5001/api/v0/add" - } - }, - "domains": [ - { - "id": 1, - "name": "evm1", - "type": "evm", - "endpoint": "ws://evm1-1:8545", - "bridge": "0x6CdE2Cd82a4F8B74693Ff5e194c19CA08c2d1c68", - "retry": "0xAD825082B91980E7C8908652269c96a47D687cC5", - "handlers": [ - { - "type": "erc20", - "address": "0xC2D334e2f27A9dB2Ed8C4561De86C1A00EBf6760" - }, - { - "type": "erc721", - "address": "0xF28c11CB14C6d2B806f99EA8b138F65e74a1Ed66" - }, - { - "type": "erc1155", - "address": "0xE54Dc792c226AEF99D6086527b98b36a4ADDe56a" - }, - { - "type": "permissionlessGeneric", - "address": "0x94e9070f0354b69E7FB583134A820949A390D341" - } - ], - "gasLimit": 9000000, - "maxGasPrice": 20000000000, - "blockConfirmations": 2, - "key": "266aafa561c7a5329d8075521c5cf6a94253d4280b33b0a9c5135aaccdc2f3d3" - }, - { - "id": 2, - "name": "evm2", - "type": "evm", - "endpoint": "ws://evm2-1:8545", - "bridge": "0x6CdE2Cd82a4F8B74693Ff5e194c19CA08c2d1c68", - "retry": "0xAD825082B91980E7C8908652269c96a47D687cC5", - "handlers": [ - { - "type": "erc20", - "address": "0xC2D334e2f27A9dB2Ed8C4561De86C1A00EBf6760" - }, - { - "type": "erc721", - "address": "0xF28c11CB14C6d2B806f99EA8b138F65e74a1Ed66" - }, - { - "type": "erc1155", - "address": "0xE54Dc792c226AEF99D6086527b98b36a4ADDe56a" - }, - { - "type": "permissionlessGeneric", - "address": "0x94e9070f0354b69E7FB583134A820949A390D341" - } - ], - "gasLimit": 9000000, - "startBlock": 50, - "maxGasPrice": 20000000000, - "blockConfirmations": 2, - "key": "266aafa561c7a5329d8075521c5cf6a94253d4280b33b0a9c5135aaccdc2f3d3" - }, - { - "id": 3, - "chainID": 5, - "name": "substrate1", - "type": "substrate", - "endpoint": "ws://substrate-pallet:9944", - "tip": 0, - "startBlock": 5, - "blockConfirmations": 2, - "key": "//Bob", - "substrateNetwork": 0 - }, - { - "id": 4, - "chainID": 5, - "name": "bitcoin", - "type": "btc", - "startBlock": 100, - "feeAddress": "mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt", - "endpoint": "bitcoin:18443", - "mempoolUrl": "http://mempool-stub:8882", - "blockConfirmations": 1, - "address": "bcrt1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2sjyr5ek", - "network": "regtest", - "username": "user", - "password": "password", - "resources": [ - { - "address": "bcrt1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2sjyr5ek", - "resourceId": "0x0000000000000000000000000000000000000000000000000000000000001000", - "script": "51206a698882348433b57d549d6344f74500fcd13ad8d2200cdf89f8e39e5cafa7d5", - "tweak": "c82aa6ae534bb28aaafeb3660c31d6a52e187d8f05d48bb6bdb9b733a9b42212", - "feeAmount": "10000000" - } - ] - } - ] -} diff --git a/example/cfg/config_evm-evm_3.json b/example/cfg/config_evm-evm_3.json deleted file mode 100644 index 97a0659a..00000000 --- a/example/cfg/config_evm-evm_3.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "relayer": { - "mpcConfig": { - "port": "9002", - "keysharePath": "/cfg/keyshares/2.keyshare", - "frostKeysharePath": "/cfg/keyshares/2-frost.keyshare", - "key": "CAASpwkwggSjAgEAAoIBAQDZfFDUCVF9APeLcJ7FRNWvqdwiDPgq2YDIKD/wGuHWz0CbsUH4zmp9qPGeU/X9EzFwrk46Bb5Vt2GOfQcizyWYYJQq0J/vSTlPB9+b2lOJEejQ746g+3zdTHXmh7MYSiNXWuaeWfHHX9QllxwRZ22vos44+3ZdFt7W5smhhznghjA9wDauaUWmLNBRnodIji1ni197fI0T5k9pd8nXO0itIXlj5wEY7bca0i6uvIrZ450lmcyGZQQs2dPhUnhODvWkvWhsPHgooPiiceKkBXYLJMRutoDBvCnXj/WEvK9R2As+Zbrql+KxxnfsVaSsp7OD6v2PFEhcJHc2UtBrzLQzAgMBAAECggEADcdKd6R/fSPqivL/nA/YWeCxCZc4wb414nhqVJPfavSGa1a3j0PEi2GArT80fmwQ3cqtOg/TFysfCx/wq8vj3duAh5XgDBDfiJo/GGikkjKIRXRn3NsR9hM6BPjj584KnyYrJi0cnDz9+8OvC4s5776owgNsZElmpMbKT2l5yTeZNThW9C0GTbVGg6uC0llTkakf9ra7PYyZDnRpSWiirkO6HshyHVWudICcXFwT3YrTec3eVl+Kbs/K3/5EmKep/lhJS5Gw95bbFjpzYYLYd9lN84dSdxVTM7m6+rwSW76MTrGwO8fz7xihfniANKbb4Mn1TW4zdfz4mfJvxfAiQQKBgQDfROMgr34tVOAhwUikMBGG5mG3UiniVFMAVscnov6S0IjtVPFR3xU4YmP672gIEdApZENjeLC4Hrguwlpxv4mnEK4VXf14fjjIjbCLKFjJl6TpVXlA0zvVjQOr89hlQhygAeJRGxxh3x/+aqH2uX5FqdVRX9xKofqgx7Le0oOjVQKBgQD5XmEFcJ2AOeVUu53+2ZZtmIyzhCmbMYcQPcJoIlyFGN8PHB6RxHaYunYKgCqR+P0xX5cEqTX5SivmPnd++kf62Pmkss8+OvEl5wjDwVU+yDrvhHGomayU18708aDkdkYFTWhZsGVTAjb2WxraBnTdWXpqIDR7vhU1NDu057gJZwKBgQDKbFBoX/PL8bnLoMvVYGdjoRhS9sFWnBEsq4CgpRydy0d5tZudGN7KYho3djshpdTO0kJuuwutwtxGOJt7qaaJu4u5f5/BUN72pc+8OvZUv5Iaow3uAhWrhdAgZFJ7a7c8MrkXw7a13W/KYK87W+3qBxKKVpkJaVYr0yKO9tm2iQKBgH9QxFA2svMonAGq2HupM7g4zn1I2MU3gDG2lm78PChoDlp0jNb3a2WGrYWm8hUc/ogaucvTaI8iY09mTTQzLFTSOoLwGAc5qK0lS8BGEPPA3vYytKTT8Nz9YdiFFRQPnqhOYRyJhvHei5kz4n22Fix85pcQYjtbTRCg3mr6c2e5AoGATXLjoKmawM2llIcOx8bzWCXGefZHCcwGEhFzTbrr31Fbjo9ZEyCLOedk7VgU0vV8cAYxHCqG+iZseJ4pwmhPq0beNKUkb12ZZWN5l+YafwKogWJpwMIQqYJyAFSXP68Z1rvP2XHYwwR+MKxD/WwzJPNvVMRUk3VKCBvz11jnNeI=", - "topologyConfiguration": { - "path": ".", - "url": "test.url", - "encryptionKey": "test-enc-key" - }, - "commHealthCheckInterval": "24h" - }, - "opentelemetryCollectorURL": "http://otel-collector:4318", - "UploaderConfig":{ - "URL":"http://ipfs0:5001/api/v0/add" - } - }, - "domains": [ - { - "id": 1, - "name": "evm1", - "type": "evm", - "endpoint": "ws://evm1-1:8545", - "bridge": "0x6CdE2Cd82a4F8B74693Ff5e194c19CA08c2d1c68", - "retry": "0xAD825082B91980E7C8908652269c96a47D687cC5", - "handlers": [ - { - "type": "erc20", - "address": "0xC2D334e2f27A9dB2Ed8C4561De86C1A00EBf6760" - }, - { - "type": "erc721", - "address": "0xF28c11CB14C6d2B806f99EA8b138F65e74a1Ed66" - }, - { - "type": "erc1155", - "address": "0xE54Dc792c226AEF99D6086527b98b36a4ADDe56a" - }, - { - "type": "permissionlessGeneric", - "address": "0x94e9070f0354b69E7FB583134A820949A390D341" - } - ], - "gasLimit": 9000000, - "maxGasPrice": 20000000000, - "blockConfirmations": 2, - "key": "e3c47ceedff6e7dbe384aeeac37dba751b019ed0bb686e91a005f89172cc8184" - }, - { - "id": 2, - "name": "evm2", - "type": "evm", - "endpoint": "ws://evm2-1:8545", - "bridge": "0x6CdE2Cd82a4F8B74693Ff5e194c19CA08c2d1c68", - "retry": "0xAD825082B91980E7C8908652269c96a47D687cC5", - "handlers": [ - { - "type": "erc20", - "address": "0xC2D334e2f27A9dB2Ed8C4561De86C1A00EBf6760" - }, - { - "type": "erc721", - "address": "0xF28c11CB14C6d2B806f99EA8b138F65e74a1Ed66" - }, - { - "type": "erc1155", - "address": "0xE54Dc792c226AEF99D6086527b98b36a4ADDe56a" - }, - { - "type": "permissionlessGeneric", - "address": "0x94e9070f0354b69E7FB583134A820949A390D341" - } - ], - "gasLimit": 9000000, - "startBlock": 425, - "maxGasPrice": 20000000000, - "blockConfirmations": 2, - "key": "e3c47ceedff6e7dbe384aeeac37dba751b019ed0bb686e91a005f89172cc8184" - }, - { - "id": 3, - "chainID": 5, - "name": "substrate1", - "type": "substrate", - "endpoint": "ws://substrate-pallet:9944", - "tip": 0, - "startBlock": 5, - "blockConfirmations": 2, - "key": "//Charlie", - "substrateNetwork": 0 - }, - { - "id": 4, - "name": "bitcoin", - "type": "btc", - "startBlock": 100, - "feeAddress": "mkHS9ne12qx9pS9VojpwU5xtRd4T7X7ZUt", - "endpoint": "bitcoin:18443", - "mempoolUrl": "http://mempool-stub:8882", - "blockConfirmations": 1, - "address": "bcrt1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2sjyr5ek", - "network": "regtest", - "username": "user", - "password": "password", - "resources": [ - { - "address": "bcrt1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2sjyr5ek", - "resourceId": "0x0000000000000000000000000000000000000000000000000000000000001000", - "script": "51206a698882348433b57d549d6344f74500fcd13ad8d2200cdf89f8e39e5cafa7d5", - "tweak": "c82aa6ae534bb28aaafeb3660c31d6a52e187d8f05d48bb6bdb9b733a9b42212", - "feeAmount": "10000000" - } - ] - } - ] -} diff --git a/example/cfg/entrypoint/entrypoint.sh b/example/cfg/entrypoint/entrypoint.sh deleted file mode 100755 index 680189ae..00000000 --- a/example/cfg/entrypoint/entrypoint.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# Start bitcoind in the background -bitcoind -regtest -daemon -rpcuser=user -rpcpassword=password -rpcport=18443 -rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0 - -# Wait for bitcoind to start -sleep 5 - -bitcoin-cli -regtest -rpcuser=user -rpcpassword=password loadwallet "test" true - -bitcoin-cli -regtest -rpcuser=user -rpcpassword=password importdescriptors '[{ "desc": "addr(bcrt1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2sjyr5ek)#qyrrxhja", "timestamp":"now", "label": "ray"}]' -bitcoin-cli -regtest -rpcuser=user -rpcpassword=password importdescriptors '[{ "desc": "addr(bcrt1pja8aknn7te4empmghnyqnrtjqn0lyg5zy3p5jsdp4le930wnpnxsrtd3ht)#n807x7zd", "timestamp":"now", "label": "ray"}]' -bitcoin-cli -regtest -rpcuser=user -rpcpassword=password importdescriptors '[{ "desc": "addr(mrheH3ouZNyUbpp9LtWP28xqv1yhNQAsfC)#wmef0tpn", "timestamp":"now", "label": "ray"}]' - -# Mine some blocks to fund the wallet (101 blocks to ensure the funds are spendable) -bitcoin-cli -regtest -rpcuser=user -rpcpassword=password generatetoaddress 101 "bcrt1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2sjyr5ek" -bitcoin-cli -regtest -rpcuser=user -rpcpassword=password generatetoaddress 150 "mrheH3ouZNyUbpp9LtWP28xqv1yhNQAsfC" - -bitcoin-cli -regtest -rpcuser=user -rpcpassword=password listunspent - -# Check balance -BALANCE=$(bitcoin-cli -regtest -rpcuser=user -rpcpassword=password getbalance) -# Check if BALANCE is assigned properly -if [ -z "$BALANCE" ]; then - echo "Failed to retrieve balance" - exit 1 -fi -echo "Wallet Balance: $BALANCE BTC" - -# Keep the container running -tail -f /dev/null \ No newline at end of file diff --git a/example/cfg/keyshares/0-frost.keyshare b/example/cfg/keyshares/0-frost.keyshare deleted file mode 100755 index 03c11615..00000000 --- a/example/cfg/keyshares/0-frost.keyshare +++ /dev/null @@ -1 +0,0 @@ -{"Key":{"ID":"QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX","Threshold":1,"PrivateShare":"guc3ZBZNfeoJZQlbeoZKXO4rkFVVhc8mRHhma1+Y+pA=","PublicKey":"3NNmUE/J5K0M2xVvb01g2NuRkaOlJ7s8C0BwuGr8yWA=","ChainKey":null,"VerificationShares":{"QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK":"A18VgtOV5WfDW5QR0lIdvodvcDEbElz0G0vHoxyoNkk1","QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX":"AkarNXxFKHYXojxQ6o45zuFzX93JdQMsL/NzA0/Ic/Lm","QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT":"A2NE2efE1QiuE4598+tUrU4mDKEHlSzFHEnFBFH1DWRX"}},"Threshold":1,"Peers":["QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT","QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK","QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX"]} \ No newline at end of file diff --git a/example/cfg/keyshares/0.keyshare b/example/cfg/keyshares/0.keyshare deleted file mode 100755 index b39b08a1..00000000 --- a/example/cfg/keyshares/0.keyshare +++ /dev/null @@ -1 +0,0 @@ -{"Key":{"PaillierSK":{"N":26663121945352269329061783698291420312376027514563512448532143609485626666561474533308003713265747647452440120480137722572420857050003796087818115528505807385749996360048686095945201999902456158165464480224741378418848928624439428739656123317828138932849103366252366549638784673861919501286581742468263921220347795278642378996943997581347618597636349243505429056697558058529039228750382965002257483211723269777100521954633345364685319549081906428280637049631854165145395260687585075735064805277804615729750590162057265702333347580063727908558601594375966034867889631703560927334322490761016590134615426393346143117473,"LambdaN":13331560972676134664530891849145710156188013757281756224266071804742813333280737266654001856632873823726220060240068861286210428525001898043909057764252903692874998180024343047972600999951228079082732240112370689209424464312219714369828061658914069466424551683126183274819392336930959750643290871234131960610010184075332434747235705733759475502223540716326530541311476162595858325772426683543666563646391586454804797055757662825525090816759147897160757450132961280704796849907967321553678932037587861363788947522535605224102554124933043760260206111420108975980458101585847612123070214188981265593624651853028397141314,"PhiN":26663121945352269329061783698291420312376027514563512448532143609485626666561474533308003713265747647452440120480137722572420857050003796087818115528505807385749996360048686095945201999902456158165464480224741378418848928624439428739656123317828138932849103366252366549638784673861919501286581742468263921220020368150664869494471411467518951004447081432653061082622952325191716651544853367087333127292783172909609594111515325651050181633518295794321514900265922561409593699815934643107357864075175722727577895045071210448205108249866087520520412222840217951960916203171695224246140428377962531187249303706056794282628},"NTildei":23932907304613354156403375229080422483289486706305851109021142179997360349650452985673120164176716097661439796993757221839525547633003658152214183514746958483368434572512075626840153902936111941045079537926565056074653394251623710315136699815053710728688601274124065387938779836556588988087385520344071253932157388506844952043730365911403164343843785340780418246493546386485819951714207417178375839439245168708324258538684640574135680452752872904086029086916169783321684969301155590715221659933350035412160278019046434453819954195233812496700171685504278258964331914561402323517330542829516385766846051411891290128781,"H1i":11719112689683384929138225161024875989066672051332256311044856434621173806756182820017041753222965737475488310532195079878542604266957097568927565667543259212682875708639625866599983364363288861132576771687715138716095260911449394432328547466457041377741922863955127018750395812681978628371944537710859153619067834515250875228531160696899153846002902297590885259705540309822060012474127264910403222582718146827853247242120361276614166700635769999510144901434481441606097538954321587443661922814673771982655627072290513143552447333033706776535330220813901933440355950320239156019375910983522794684265512181827071171498,"H2i":16215129787621652528343544148534999012205092772666011233610987768303355816332361707373000612293282714164880178407045859714642891394205539888294949671344177584350738746878480358609355958532067118295777642408442266349935042709866035479985543666346013323619083573008813955404503742342730744185151838827065178849959396404629444342822423367900070501208263984266627896703597615254357233424727951198614772559610581047378288681909363597071695061884669560650591191075556717814221609540244648064956839749968635241762274810406914286677928046357647449444017190972620550533629707363468696375771455607538122027031022223220496386966,"Alpha":14984429854828201679219608154134572432346816827273814513849386862324885389389340793156436783810495398280385432017808622520790295364269731611974899743642135567035592637631462411264766684922786628421042597891439830420444829908982542639157978168846713489262326472112035282812919811749665592537038640421038658144126848518226903190294997102701532070354426602754199994057974898216361065918894081543328248106412478236431857871632542208222401168401506191062974258039793869483007613951849578487486854124698483664629102316582922979088238397408087756507787300041149518032545529929253224649283053702501626901130176789969163272348,"Beta":2268103417159999363712431459063374176988723425152924088968488294064501200006605578698035754479271985770719075778781122668433337751235166469222948967544882615523848726036060837061851393448870827427524338222597900540049341360799188550650195752681053275945087209544112760595338173803174996986606825958244665095699821803605903351260967718234263719241172741210655278996803854051780117617470780193351486881256480504389932541458513165944088604103098956228682249866172573060633314547664244825089142299844771538133924893866030572786021700924760020140466960346168124563094413756521366998360667461284633065447680330910106584723,"P":73447886197963256413153449578574198266037380273619656469249450255713022680143081723715275580038596883513634408760031443533263281119701279792317589642737242523506589757387956430429443792824880603811732719211050095086131787734804464029829087866570592158903529538385486385513664207930836016437514044664656098781,"Q":81462205869707604525674480025981661029872192168582517636815173160730171408460537499202476325019672108989547306114519918463287091133032570271178253323759404375336986510452144400034694483281908021424901588444814222792889132433159419268020422023865254860710162337176657057214640814714666834091650928879145340843,"Xi":68401715983739223731434994557007546959085393378847400726876050690748666471538,"ShareID":191235478912991789875868655522968218870153307835367242180600409179984084128359442723933011694190574264372394584,"Ks":[191235113145644914940004867018859568681198814037622570081810928830315859943671289037965755943398626147651647563,191235478912991789875868655522968218870153307835367242180600409179984084128359442723933011694190574264372394584,191235545851557944247538001495780786927451297380356904097044262907057841267555776336221635243959928604391530836],"NTildej":[27685786760534043866064203233345707954956325285993912134308117383074887617823088139238936467884884402501595290153570564846346081720780918841107286261651986000395270485206984776621209921092953612807144006333854707721341390214794183780684499113085695981243871272439969009359172305339248085136919988662865178691500059306709917774437683539695203815269194097608425827149296390476686318326328656958475799373589659685497244177150181546506633503712059389254854135235698676974151684509149200556461554805791444333936870964419462208831466926606024436843987010907084043641935867045156724595959537569358337217825494548979814345517,23932907304613354156403375229080422483289486706305851109021142179997360349650452985673120164176716097661439796993757221839525547633003658152214183514746958483368434572512075626840153902936111941045079537926565056074653394251623710315136699815053710728688601274124065387938779836556588988087385520344071253932157388506844952043730365911403164343843785340780418246493546386485819951714207417178375839439245168708324258538684640574135680452752872904086029086916169783321684969301155590715221659933350035412160278019046434453819954195233812496700171685504278258964331914561402323517330542829516385766846051411891290128781,25238588516050359082142820501950682483487961677274776735009922224922947892919991718704186906556036627573220567315119001186055767479308907694297139258041842049966340397167713138142146089512137569680133675314505256561687491117434225054311537515608197508362128454235561258245079594767578799632648773225021694062353238368681612515853115987206133827923671984489078329709110808889447728584318101519791984515462837995511592745586889104201939731738665989522184200533268643666167541585395470359954536861656934198924748541726094430799240737269671201829417257209020313717242601611388638357015269077576054556426261235235970592157],"H1j":[4028501385135955376265066844060464845421073884942966376385553856035469265797328251275809668395189585588703997163412005993077990498973854683916456756938680145996747072495677763912440220147759297857510926804974968470959310363578583703959148687290765852242842129631595688567352328371346143898574465326481734891809435500192963299847978152856195336672849328784264193710542791352289104791387081035183483223590673702503824042911190798453433643769984803106759726278358838610839964377102907173282179490508072357586146291728765859102098750769292727031943649191773230027543682559428518776055044159484106838611174426371376178507,11719112689683384929138225161024875989066672051332256311044856434621173806756182820017041753222965737475488310532195079878542604266957097568927565667543259212682875708639625866599983364363288861132576771687715138716095260911449394432328547466457041377741922863955127018750395812681978628371944537710859153619067834515250875228531160696899153846002902297590885259705540309822060012474127264910403222582718146827853247242120361276614166700635769999510144901434481441606097538954321587443661922814673771982655627072290513143552447333033706776535330220813901933440355950320239156019375910983522794684265512181827071171498,6206142996154588363116888675203567703615714915722381430547976736011062583650887430992357583686169341327731743108145341346114617896070430873520113342511072549632951237625638349417349833973415821415699132560921413402765989721378694024456941652485473141368520532597368647364779311732130943653903313398481125897660913753096143655825213537072741825939437109245383749461005590188794269655275232114427058816872213643541029828034508029093721964260954448430451440649785606776941933615196151220417331093952260747134913668152978051954128077374339614879069640578348817848275159570677425878349230787534386487915227414741882464595],"H2j":[2410233223642337802569378964507592894914339776933172810325098863433784823255808993766605405559200445839956816444345603593007364304349869563918306198933826589701248355531677915870758747131754303779467571422108600564257662750556431732258552395090415772894925132143098613760508506620776025571962600127459499040966040277047510550142146789798494903190193417940643536893021067258529669539647455518153836627759969229812094529172800933071734006190035355804409741077472744220064215714268989243057199340504539161192917720892054066359047725380429409503383212588784807260989365798106583927486402026528140433405272272108420138009,16215129787621652528343544148534999012205092772666011233610987768303355816332361707373000612293282714164880178407045859714642891394205539888294949671344177584350738746878480358609355958532067118295777642408442266349935042709866035479985543666346013323619083573008813955404503742342730744185151838827065178849959396404629444342822423367900070501208263984266627896703597615254357233424727951198614772559610581047378288681909363597071695061884669560650591191075556717814221609540244648064956839749968635241762274810406914286677928046357647449444017190972620550533629707363468696375771455607538122027031022223220496386966,4839536552764303645514529256978411747459535386543477277639377350685720033291520242887167912138532127461064093185137511898451898243809931162431738907345948014523840718116575217892001120976746269862495157194983064370825660791381383515530551503148906426941790540678237745393855927123104717060941158460564288005123492937616782329126763971717613743741776555996229626792893972689049365137211311977559297899867064261493296770455445427431763056235655626542858569265419725153801447489335997095829398500761921236086845379524680962700608351563926601818614983542047847363769967133194968129674937324611810987731653613725873280845],"BigXj":[{"Coords":[78424329443476539887600962041171065146953669368940660999783139385727189705840,95617363099952497067333140035623860549105456856321179221887547289269131762600]},{"Coords":[22248141792220224192977509881603816433656516437961432584832878998835694145218,107811817428264244765919021308585366692566188473656667526872045917368898834373]},{"Coords":[75474971056024193777818808287220521673022529971909857018481302603668259461874,3763480694054615837748426506527021035803705590443910704440686306837906260121]}],"PaillierPKs":[{"N":20278291210411982396258228093108125574698812984636191652409611688138976833768255333828498735580374756224059664960970166577669161739453318955219205073513023765550833748712791258993388185190858264136946123321802162613233769848313648320036826095131532713129311179449815635115296066618230005718640694628071864383485431829005765858924843726539788834407506078566439242679069979684556254291764814547929775402517729439809090093371105072686989012915298993075256047474328334936621346745387365833236403606798598374074176481445071755659327065590086756663290187401628594761552495456792531854956386931149717159845703573566662954477},{"N":26663121945352269329061783698291420312376027514563512448532143609485626666561474533308003713265747647452440120480137722572420857050003796087818115528505807385749996360048686095945201999902456158165464480224741378418848928624439428739656123317828138932849103366252366549638784673861919501286581742468263921220347795278642378996943997581347618597636349243505429056697558058529039228750382965002257483211723269777100521954633345364685319549081906428280637049631854165145395260687585075735064805277804615729750590162057265702333347580063727908558601594375966034867889631703560927334322490761016590134615426393346143117473},{"N":24753247847521696263032820412974156379394134251104054680440413186315534091979580594877075648234615056559061740266851126638825170704814295247761443790962910437391149230187447631796535177964442931864511599798473041176360487312207722319126885978458276890024488466277346311170111089606650097246505295443314269020069527420986062785518565355843893434539653178745278310823614206596293487856083258388149595150085309597168341701900432377002622711965544827346324654086317932170271920977558301198637227726333638645372981390292918901405597591203707105263891037847552766566986280591791672352110028008794233240453100218752651146713}],"ECDSAPub":{"Coords":[99792991025598809824687621495951149430789012528919850670927919917336503132188,111402397362043885035343727026243494770561917870531571670274436593258059296525]}},"Threshold":1,"Peers":["QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX","QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT","QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK"]} \ No newline at end of file diff --git a/example/cfg/keyshares/1-frost.keyshare b/example/cfg/keyshares/1-frost.keyshare deleted file mode 100755 index 039c93f0..00000000 --- a/example/cfg/keyshares/1-frost.keyshare +++ /dev/null @@ -1 +0,0 @@ -{"Key":{"ID":"QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT","Threshold":1,"PrivateShare":"dUXvec0uRlWvQ90Wi8B+Hz+VkcbQr9+h0zs4IahNSTc=","PublicKey":"3NNmUE/J5K0M2xVvb01g2NuRkaOlJ7s8C0BwuGr8yWA=","ChainKey":null,"VerificationShares":{"QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK":"A18VgtOV5WfDW5QR0lIdvodvcDEbElz0G0vHoxyoNkk1","QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX":"AkarNXxFKHYXojxQ6o45zuFzX93JdQMsL/NzA0/Ic/Lm","QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT":"A2NE2efE1QiuE4598+tUrU4mDKEHlSzFHEnFBFH1DWRX"}},"Threshold":1,"Peers":["QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT","QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX","QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK"]} \ No newline at end of file diff --git a/example/cfg/keyshares/1.keyshare b/example/cfg/keyshares/1.keyshare deleted file mode 100755 index d3158e74..00000000 --- a/example/cfg/keyshares/1.keyshare +++ /dev/null @@ -1 +0,0 @@ -{"Key":{"PaillierSK":{"N":24753247847521696263032820412974156379394134251104054680440413186315534091979580594877075648234615056559061740266851126638825170704814295247761443790962910437391149230187447631796535177964442931864511599798473041176360487312207722319126885978458276890024488466277346311170111089606650097246505295443314269020069527420986062785518565355843893434539653178745278310823614206596293487856083258388149595150085309597168341701900432377002622711965544827346324654086317932170271920977558301198637227726333638645372981390292918901405597591203707105263891037847552766566986280591791672352110028008794233240453100218752651146713,"LambdaN":12376623923760848131516410206487078189697067125552027340220206593157767045989790297438537824117307528279530870133425563319412585352407147623880721895481455218695574615093723815898267588982221465932255799899236520588180243656103861159563442989229138445012244233138673155585055544803325048623252647721657134509876753798896475701824235666237340854537214498805398029312212401413859540285824111110955399569829887868264194950891180574072770036379060245984540401640261868481408774322212549642980849849978482255894821451286075539955141441450435564218159406274686687206219555629662067375597033041123700650355775843311262961114,"PhiN":24753247847521696263032820412974156379394134251104054680440413186315534091979580594877075648234615056559061740266851126638825170704814295247761443790962910437391149230187447631796535177964442931864511599798473041176360487312207722319126885978458276890024488466277346311170111089606650097246505295443314269019753507597792951403648471332474681709074428997610796058624424802827719080571648222221910799139659775736528389901782361148145540072758120491969080803280523736962817548644425099285961699699956964511789642902572151079910282882900871128436318812549373374412439111259324134751194066082247401300711551686622525922228},"NTildei":25238588516050359082142820501950682483487961677274776735009922224922947892919991718704186906556036627573220567315119001186055767479308907694297139258041842049966340397167713138142146089512137569680133675314505256561687491117434225054311537515608197508362128454235561258245079594767578799632648773225021694062353238368681612515853115987206133827923671984489078329709110808889447728584318101519791984515462837995511592745586889104201939731738665989522184200533268643666167541585395470359954536861656934198924748541726094430799240737269671201829417257209020313717242601611388638357015269077576054556426261235235970592157,"H1i":6206142996154588363116888675203567703615714915722381430547976736011062583650887430992357583686169341327731743108145341346114617896070430873520113342511072549632951237625638349417349833973415821415699132560921413402765989721378694024456941652485473141368520532597368647364779311732130943653903313398481125897660913753096143655825213537072741825939437109245383749461005590188794269655275232114427058816872213643541029828034508029093721964260954448430451440649785606776941933615196151220417331093952260747134913668152978051954128077374339614879069640578348817848275159570677425878349230787534386487915227414741882464595,"H2i":4839536552764303645514529256978411747459535386543477277639377350685720033291520242887167912138532127461064093185137511898451898243809931162431738907345948014523840718116575217892001120976746269862495157194983064370825660791381383515530551503148906426941790540678237745393855927123104717060941158460564288005123492937616782329126763971717613743741776555996229626792893972689049365137211311977559297899867064261493296770455445427431763056235655626542858569265419725153801447489335997095829398500761921236086845379524680962700608351563926601818614983542047847363769967133194968129674937324611810987731653613725873280845,"Alpha":15892398738515146428072232902203268780357920491482721878128402761993483512633325981027472058633720512522724318769192285126784808146051258777066550329771965709584850746553644804937447079161538000638627471584154996987462627562038814998804115626645377512758105554614421839969006170074944224007504726944399357663208936980481623911798204528615796596733260472921530728139436439999847680986511734999218980998648218011802601948381267861826297347791075520745069836080971472908187705854911381170987154867854320278473904752571536827111528391125510187357674484654666073602313259983911787411557719248741759144148211919734543940553,"Beta":6054099129804118674844850341051560397146516628292621684494443257594785084840844441792684970124532776147539569706978432460070353625800211279157832006140488827213411524363781148993735590456893044949782120612671823408038565823979326434942790162211136257249329239520751453966456665256855935443697554746128799418369085677917705894188925608208185986421526844697606586294247077178872596001986518161938889382120156181273523421545512313559101175517708325782975880387747862340569267983223135579979103553689270370953130807388722088923077699106904414132947662703655220024332842610135678550359086896045942801548158012383895358028,"P":70841997365852109215716200740664253383714235605629550726770489022092149515409523698002725313828753662793589345336932213818524436172193147649520961961240532878562412868098192933524721427470729380801717147749968760847784988799486201910140057354885957546317178579699420031576052060450197739539990004514122014331,"Q":89066476999899244789915953383070722658076444370197733379535602881354998288135655627455812345793484662461554289205961542180966621704000380601562131860289211104720793885790981209593610765633192652786503870412325716104688604375292875964019933483815426959754260802378192008220416305814258566211810491536692008069,"Xi":78713807088279226006322053994225003347494810349706101754412617483353238687704,"ShareID":191235545851557944247538001495780786927451297380356904097044262907057841267555776336221635243959928604391530836,"Ks":[191235113145644914940004867018859568681198814037622570081810928830315859943671289037965755943398626147651647563,191235478912991789875868655522968218870153307835367242180600409179984084128359442723933011694190574264372394584,191235545851557944247538001495780786927451297380356904097044262907057841267555776336221635243959928604391530836],"NTildej":[27685786760534043866064203233345707954956325285993912134308117383074887617823088139238936467884884402501595290153570564846346081720780918841107286261651986000395270485206984776621209921092953612807144006333854707721341390214794183780684499113085695981243871272439969009359172305339248085136919988662865178691500059306709917774437683539695203815269194097608425827149296390476686318326328656958475799373589659685497244177150181546506633503712059389254854135235698676974151684509149200556461554805791444333936870964419462208831466926606024436843987010907084043641935867045156724595959537569358337217825494548979814345517,23932907304613354156403375229080422483289486706305851109021142179997360349650452985673120164176716097661439796993757221839525547633003658152214183514746958483368434572512075626840153902936111941045079537926565056074653394251623710315136699815053710728688601274124065387938779836556588988087385520344071253932157388506844952043730365911403164343843785340780418246493546386485819951714207417178375839439245168708324258538684640574135680452752872904086029086916169783321684969301155590715221659933350035412160278019046434453819954195233812496700171685504278258964331914561402323517330542829516385766846051411891290128781,25238588516050359082142820501950682483487961677274776735009922224922947892919991718704186906556036627573220567315119001186055767479308907694297139258041842049966340397167713138142146089512137569680133675314505256561687491117434225054311537515608197508362128454235561258245079594767578799632648773225021694062353238368681612515853115987206133827923671984489078329709110808889447728584318101519791984515462837995511592745586889104201939731738665989522184200533268643666167541585395470359954536861656934198924748541726094430799240737269671201829417257209020313717242601611388638357015269077576054556426261235235970592157],"H1j":[4028501385135955376265066844060464845421073884942966376385553856035469265797328251275809668395189585588703997163412005993077990498973854683916456756938680145996747072495677763912440220147759297857510926804974968470959310363578583703959148687290765852242842129631595688567352328371346143898574465326481734891809435500192963299847978152856195336672849328784264193710542791352289104791387081035183483223590673702503824042911190798453433643769984803106759726278358838610839964377102907173282179490508072357586146291728765859102098750769292727031943649191773230027543682559428518776055044159484106838611174426371376178507,11719112689683384929138225161024875989066672051332256311044856434621173806756182820017041753222965737475488310532195079878542604266957097568927565667543259212682875708639625866599983364363288861132576771687715138716095260911449394432328547466457041377741922863955127018750395812681978628371944537710859153619067834515250875228531160696899153846002902297590885259705540309822060012474127264910403222582718146827853247242120361276614166700635769999510144901434481441606097538954321587443661922814673771982655627072290513143552447333033706776535330220813901933440355950320239156019375910983522794684265512181827071171498,6206142996154588363116888675203567703615714915722381430547976736011062583650887430992357583686169341327731743108145341346114617896070430873520113342511072549632951237625638349417349833973415821415699132560921413402765989721378694024456941652485473141368520532597368647364779311732130943653903313398481125897660913753096143655825213537072741825939437109245383749461005590188794269655275232114427058816872213643541029828034508029093721964260954448430451440649785606776941933615196151220417331093952260747134913668152978051954128077374339614879069640578348817848275159570677425878349230787534386487915227414741882464595],"H2j":[2410233223642337802569378964507592894914339776933172810325098863433784823255808993766605405559200445839956816444345603593007364304349869563918306198933826589701248355531677915870758747131754303779467571422108600564257662750556431732258552395090415772894925132143098613760508506620776025571962600127459499040966040277047510550142146789798494903190193417940643536893021067258529669539647455518153836627759969229812094529172800933071734006190035355804409741077472744220064215714268989243057199340504539161192917720892054066359047725380429409503383212588784807260989365798106583927486402026528140433405272272108420138009,16215129787621652528343544148534999012205092772666011233610987768303355816332361707373000612293282714164880178407045859714642891394205539888294949671344177584350738746878480358609355958532067118295777642408442266349935042709866035479985543666346013323619083573008813955404503742342730744185151838827065178849959396404629444342822423367900070501208263984266627896703597615254357233424727951198614772559610581047378288681909363597071695061884669560650591191075556717814221609540244648064956839749968635241762274810406914286677928046357647449444017190972620550533629707363468696375771455607538122027031022223220496386966,4839536552764303645514529256978411747459535386543477277639377350685720033291520242887167912138532127461064093185137511898451898243809931162431738907345948014523840718116575217892001120976746269862495157194983064370825660791381383515530551503148906426941790540678237745393855927123104717060941158460564288005123492937616782329126763971717613743741776555996229626792893972689049365137211311977559297899867064261493296770455445427431763056235655626542858569265419725153801447489335997095829398500761921236086845379524680962700608351563926601818614983542047847363769967133194968129674937324611810987731653613725873280845],"BigXj":[{"Coords":[78424329443476539887600962041171065146953669368940660999783139385727189705840,95617363099952497067333140035623860549105456856321179221887547289269131762600]},{"Coords":[22248141792220224192977509881603816433656516437961432584832878998835694145218,107811817428264244765919021308585366692566188473656667526872045917368898834373]},{"Coords":[75474971056024193777818808287220521673022529971909857018481302603668259461874,3763480694054615837748426506527021035803705590443910704440686306837906260121]}],"PaillierPKs":[{"N":20278291210411982396258228093108125574698812984636191652409611688138976833768255333828498735580374756224059664960970166577669161739453318955219205073513023765550833748712791258993388185190858264136946123321802162613233769848313648320036826095131532713129311179449815635115296066618230005718640694628071864383485431829005765858924843726539788834407506078566439242679069979684556254291764814547929775402517729439809090093371105072686989012915298993075256047474328334936621346745387365833236403606798598374074176481445071755659327065590086756663290187401628594761552495456792531854956386931149717159845703573566662954477},{"N":26663121945352269329061783698291420312376027514563512448532143609485626666561474533308003713265747647452440120480137722572420857050003796087818115528505807385749996360048686095945201999902456158165464480224741378418848928624439428739656123317828138932849103366252366549638784673861919501286581742468263921220347795278642378996943997581347618597636349243505429056697558058529039228750382965002257483211723269777100521954633345364685319549081906428280637049631854165145395260687585075735064805277804615729750590162057265702333347580063727908558601594375966034867889631703560927334322490761016590134615426393346143117473},{"N":24753247847521696263032820412974156379394134251104054680440413186315534091979580594877075648234615056559061740266851126638825170704814295247761443790962910437391149230187447631796535177964442931864511599798473041176360487312207722319126885978458276890024488466277346311170111089606650097246505295443314269020069527420986062785518565355843893434539653178745278310823614206596293487856083258388149595150085309597168341701900432377002622711965544827346324654086317932170271920977558301198637227726333638645372981390292918901405597591203707105263891037847552766566986280591791672352110028008794233240453100218752651146713}],"ECDSAPub":{"Coords":[99792991025598809824687621495951149430789012528919850670927919917336503132188,111402397362043885035343727026243494770561917870531571670274436593258059296525]}},"Threshold":1,"Peers":["QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT","QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK","QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX"]} \ No newline at end of file diff --git a/example/cfg/keyshares/2-frost.keyshare b/example/cfg/keyshares/2-frost.keyshare deleted file mode 100755 index 30fdc3ae..00000000 --- a/example/cfg/keyshares/2-frost.keyshare +++ /dev/null @@ -1 +0,0 @@ -{"Key":{"ID":"QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK","Threshold":1,"PrivateShare":"koKwlrcSJO4RWtpYea1VGrq0P1mMF9GZgTREhqXk9aw=","PublicKey":"3NNmUE/J5K0M2xVvb01g2NuRkaOlJ7s8C0BwuGr8yWA=","ChainKey":null,"VerificationShares":{"QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK":"A18VgtOV5WfDW5QR0lIdvodvcDEbElz0G0vHoxyoNkk1","QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX":"AkarNXxFKHYXojxQ6o45zuFzX93JdQMsL/NzA0/Ic/Lm","QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT":"A2NE2efE1QiuE4598+tUrU4mDKEHlSzFHEnFBFH1DWRX"}},"Threshold":1,"Peers":["QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX","QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK","QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT"]} \ No newline at end of file diff --git a/example/cfg/keyshares/2.keyshare b/example/cfg/keyshares/2.keyshare deleted file mode 100755 index ec1c3744..00000000 --- a/example/cfg/keyshares/2.keyshare +++ /dev/null @@ -1 +0,0 @@ -{"Key":{"PaillierSK":{"N":20278291210411982396258228093108125574698812984636191652409611688138976833768255333828498735580374756224059664960970166577669161739453318955219205073513023765550833748712791258993388185190858264136946123321802162613233769848313648320036826095131532713129311179449815635115296066618230005718640694628071864383485431829005765858924843726539788834407506078566439242679069979684556254291764814547929775402517729439809090093371105072686989012915298993075256047474328334936621346745387365833236403606798598374074176481445071755659327065590086756663290187401628594761552495456792531854956386931149717159845703573566662954477,"LambdaN":10139145605205991198129114046554062787349406492318095826204805844069488416884127666914249367790187378112029832480485083288834580869726659477609602536756511882775416874356395629496694092595429132068473061660901081306616884924156824160018413047565766356564655589724907817557648033309115002859320347314035932191600105495339460253983061149042100888413208511871814287262285388350697165104065098948616514566404145039762729587673117189235378421733768158679780257335148910640097433285507250147593178275168689632759887165072309944046274690822403050494328053270365530126567565025944691776668254315215582108475937411259865986398,"PhiN":20278291210411982396258228093108125574698812984636191652409611688138976833768255333828498735580374756224059664960970166577669161739453318955219205073513023765550833748712791258993388185190858264136946123321802162613233769848313648320036826095131532713129311179449815635115296066618230005718640694628071864383200210990678920507966122298084201776826417023743628574524570776701394330208130197897233029132808290079525459175346234378470756843467536317359560514670297821280194866571014500295186356550337379265519774330144619888092549381644806100988656106540731060253135130051889383553336508630431164216951874822519731972796},"NTildei":27685786760534043866064203233345707954956325285993912134308117383074887617823088139238936467884884402501595290153570564846346081720780918841107286261651986000395270485206984776621209921092953612807144006333854707721341390214794183780684499113085695981243871272439969009359172305339248085136919988662865178691500059306709917774437683539695203815269194097608425827149296390476686318326328656958475799373589659685497244177150181546506633503712059389254854135235698676974151684509149200556461554805791444333936870964419462208831466926606024436843987010907084043641935867045156724595959537569358337217825494548979814345517,"H1i":4028501385135955376265066844060464845421073884942966376385553856035469265797328251275809668395189585588703997163412005993077990498973854683916456756938680145996747072495677763912440220147759297857510926804974968470959310363578583703959148687290765852242842129631595688567352328371346143898574465326481734891809435500192963299847978152856195336672849328784264193710542791352289104791387081035183483223590673702503824042911190798453433643769984803106759726278358838610839964377102907173282179490508072357586146291728765859102098750769292727031943649191773230027543682559428518776055044159484106838611174426371376178507,"H2i":2410233223642337802569378964507592894914339776933172810325098863433784823255808993766605405559200445839956816444345603593007364304349869563918306198933826589701248355531677915870758747131754303779467571422108600564257662750556431732258552395090415772894925132143098613760508506620776025571962600127459499040966040277047510550142146789798494903190193417940643536893021067258529669539647455518153836627759969229812094529172800933071734006190035355804409741077472744220064215714268989243057199340504539161192917720892054066359047725380429409503383212588784807260989365798106583927486402026528140433405272272108420138009,"Alpha":2786788825049122487040696557010371610399937015708123169745859260109728881643528072290117798475713465354949450411533386017936694634465768671135232790444149812066506702760199078985653469214841173031112993291895119180275808209374919245933891204320212257163796588536997841744611413981915491965403674679755679539444431450060528954839979270070311707113949612612318782103163383239292486463314092034003731351447059515979940769673100844602979542975094094135251722179471778619222763597459491737861504818686798264031209038853554023414724486196213690020798212981945900910713432822043254523928962470395248377447063609165304036887,"Beta":2802746867324215747468539692745039497877421304125416688350791866032863997007449194249762560505868092948644346517826813390686880716036428749659184358853932226503255949090967370080158427030074693960884950046999634689379128174141489157130315328361097266679049127278686401155434131034106828376506982611815915339433499937735178704527945899642774642876566591243244629938448710632044353530093680253330064901417925184176670419473000383601696208983092895520506265973295570532812896226203511486194902310928545728848974145239635349505556883584365993340869485151058898278936807620519276006222985475303223536602166253798770648482,"P":80078684662683048121483206421256240910542582756286706194006219630408753224949392058530372035494314931718305615782449985333924438951980089893378269260973574738987683270923008874103119477758347676101167932696078079337530341222567634836835300702763519884398003306428147145127025781997246257666688406532778533891,"Q":86433071663063039077101221719787025329035137894203418916933152379052431225377642092019774915344305732445891644688059524723931707716470799399609750359601443065532828054430702643965937076597105670275015245091138275104102764991745156924093351652003234679658352658798427804788677838202931830328825059829218422549,"Xi":72172626741369240611690205820627094170217475940173219229840179032063153996109,"ShareID":191235113145644914940004867018859568681198814037622570081810928830315859943671289037965755943398626147651647563,"Ks":[191235113145644914940004867018859568681198814037622570081810928830315859943671289037965755943398626147651647563,191235478912991789875868655522968218870153307835367242180600409179984084128359442723933011694190574264372394584,191235545851557944247538001495780786927451297380356904097044262907057841267555776336221635243959928604391530836],"NTildej":[27685786760534043866064203233345707954956325285993912134308117383074887617823088139238936467884884402501595290153570564846346081720780918841107286261651986000395270485206984776621209921092953612807144006333854707721341390214794183780684499113085695981243871272439969009359172305339248085136919988662865178691500059306709917774437683539695203815269194097608425827149296390476686318326328656958475799373589659685497244177150181546506633503712059389254854135235698676974151684509149200556461554805791444333936870964419462208831466926606024436843987010907084043641935867045156724595959537569358337217825494548979814345517,23932907304613354156403375229080422483289486706305851109021142179997360349650452985673120164176716097661439796993757221839525547633003658152214183514746958483368434572512075626840153902936111941045079537926565056074653394251623710315136699815053710728688601274124065387938779836556588988087385520344071253932157388506844952043730365911403164343843785340780418246493546386485819951714207417178375839439245168708324258538684640574135680452752872904086029086916169783321684969301155590715221659933350035412160278019046434453819954195233812496700171685504278258964331914561402323517330542829516385766846051411891290128781,25238588516050359082142820501950682483487961677274776735009922224922947892919991718704186906556036627573220567315119001186055767479308907694297139258041842049966340397167713138142146089512137569680133675314505256561687491117434225054311537515608197508362128454235561258245079594767578799632648773225021694062353238368681612515853115987206133827923671984489078329709110808889447728584318101519791984515462837995511592745586889104201939731738665989522184200533268643666167541585395470359954536861656934198924748541726094430799240737269671201829417257209020313717242601611388638357015269077576054556426261235235970592157],"H1j":[4028501385135955376265066844060464845421073884942966376385553856035469265797328251275809668395189585588703997163412005993077990498973854683916456756938680145996747072495677763912440220147759297857510926804974968470959310363578583703959148687290765852242842129631595688567352328371346143898574465326481734891809435500192963299847978152856195336672849328784264193710542791352289104791387081035183483223590673702503824042911190798453433643769984803106759726278358838610839964377102907173282179490508072357586146291728765859102098750769292727031943649191773230027543682559428518776055044159484106838611174426371376178507,11719112689683384929138225161024875989066672051332256311044856434621173806756182820017041753222965737475488310532195079878542604266957097568927565667543259212682875708639625866599983364363288861132576771687715138716095260911449394432328547466457041377741922863955127018750395812681978628371944537710859153619067834515250875228531160696899153846002902297590885259705540309822060012474127264910403222582718146827853247242120361276614166700635769999510144901434481441606097538954321587443661922814673771982655627072290513143552447333033706776535330220813901933440355950320239156019375910983522794684265512181827071171498,6206142996154588363116888675203567703615714915722381430547976736011062583650887430992357583686169341327731743108145341346114617896070430873520113342511072549632951237625638349417349833973415821415699132560921413402765989721378694024456941652485473141368520532597368647364779311732130943653903313398481125897660913753096143655825213537072741825939437109245383749461005590188794269655275232114427058816872213643541029828034508029093721964260954448430451440649785606776941933615196151220417331093952260747134913668152978051954128077374339614879069640578348817848275159570677425878349230787534386487915227414741882464595],"H2j":[2410233223642337802569378964507592894914339776933172810325098863433784823255808993766605405559200445839956816444345603593007364304349869563918306198933826589701248355531677915870758747131754303779467571422108600564257662750556431732258552395090415772894925132143098613760508506620776025571962600127459499040966040277047510550142146789798494903190193417940643536893021067258529669539647455518153836627759969229812094529172800933071734006190035355804409741077472744220064215714268989243057199340504539161192917720892054066359047725380429409503383212588784807260989365798106583927486402026528140433405272272108420138009,16215129787621652528343544148534999012205092772666011233610987768303355816332361707373000612293282714164880178407045859714642891394205539888294949671344177584350738746878480358609355958532067118295777642408442266349935042709866035479985543666346013323619083573008813955404503742342730744185151838827065178849959396404629444342822423367900070501208263984266627896703597615254357233424727951198614772559610581047378288681909363597071695061884669560650591191075556717814221609540244648064956839749968635241762274810406914286677928046357647449444017190972620550533629707363468696375771455607538122027031022223220496386966,4839536552764303645514529256978411747459535386543477277639377350685720033291520242887167912138532127461064093185137511898451898243809931162431738907345948014523840718116575217892001120976746269862495157194983064370825660791381383515530551503148906426941790540678237745393855927123104717060941158460564288005123492937616782329126763971717613743741776555996229626792893972689049365137211311977559297899867064261493296770455445427431763056235655626542858569265419725153801447489335997095829398500761921236086845379524680962700608351563926601818614983542047847363769967133194968129674937324611810987731653613725873280845],"BigXj":[{"Coords":[78424329443476539887600962041171065146953669368940660999783139385727189705840,95617363099952497067333140035623860549105456856321179221887547289269131762600]},{"Coords":[22248141792220224192977509881603816433656516437961432584832878998835694145218,107811817428264244765919021308585366692566188473656667526872045917368898834373]},{"Coords":[75474971056024193777818808287220521673022529971909857018481302603668259461874,3763480694054615837748426506527021035803705590443910704440686306837906260121]}],"PaillierPKs":[{"N":20278291210411982396258228093108125574698812984636191652409611688138976833768255333828498735580374756224059664960970166577669161739453318955219205073513023765550833748712791258993388185190858264136946123321802162613233769848313648320036826095131532713129311179449815635115296066618230005718640694628071864383485431829005765858924843726539788834407506078566439242679069979684556254291764814547929775402517729439809090093371105072686989012915298993075256047474328334936621346745387365833236403606798598374074176481445071755659327065590086756663290187401628594761552495456792531854956386931149717159845703573566662954477},{"N":26663121945352269329061783698291420312376027514563512448532143609485626666561474533308003713265747647452440120480137722572420857050003796087818115528505807385749996360048686095945201999902456158165464480224741378418848928624439428739656123317828138932849103366252366549638784673861919501286581742468263921220347795278642378996943997581347618597636349243505429056697558058529039228750382965002257483211723269777100521954633345364685319549081906428280637049631854165145395260687585075735064805277804615729750590162057265702333347580063727908558601594375966034867889631703560927334322490761016590134615426393346143117473},{"N":24753247847521696263032820412974156379394134251104054680440413186315534091979580594877075648234615056559061740266851126638825170704814295247761443790962910437391149230187447631796535177964442931864511599798473041176360487312207722319126885978458276890024488466277346311170111089606650097246505295443314269020069527420986062785518565355843893434539653178745278310823614206596293487856083258388149595150085309597168341701900432377002622711965544827346324654086317932170271920977558301198637227726333638645372981390292918901405597591203707105263891037847552766566986280591791672352110028008794233240453100218752651146713}],"ECDSAPub":{"Coords":[99792991025598809824687621495951149430789012528919850670927919917336503132188,111402397362043885035343727026243494770561917870531571670274436593258059296525]}},"Threshold":1,"Peers":["QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT","QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX","QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK"]} \ No newline at end of file diff --git a/example/cfg/otel-collector-config.yml b/example/cfg/otel-collector-config.yml deleted file mode 100644 index 470887e0..00000000 --- a/example/cfg/otel-collector-config.yml +++ /dev/null @@ -1,23 +0,0 @@ -# The Licensed Work is (c) 2022 Sygma -# SPDX-License-Identifier: LGPL-3.0-only - -receivers: - otlp: - protocols: - grpc: - http: - -exporters: - prometheus: - endpoint: 0.0.0.0:8889 - namespace: default - -extensions: - health_check: - -service: - extensions: [health_check] - pipelines: - metrics: - exporters: [prometheus] - receivers: [otlp] diff --git a/example/cfg/pks/0.pk b/example/cfg/pks/0.pk deleted file mode 100644 index 64e486ee..00000000 Binary files a/example/cfg/pks/0.pk and /dev/null differ diff --git a/example/cfg/pks/1.pk b/example/cfg/pks/1.pk deleted file mode 100644 index 0d547693..00000000 Binary files a/example/cfg/pks/1.pk and /dev/null differ diff --git a/example/cfg/pks/2.pk b/example/cfg/pks/2.pk deleted file mode 100644 index 8c9af95b..00000000 Binary files a/example/cfg/pks/2.pk and /dev/null differ diff --git a/example/cfg/stubs/mempool.yml b/example/cfg/stubs/mempool.yml deleted file mode 100644 index 5004c87e..00000000 --- a/example/cfg/stubs/mempool.yml +++ /dev/null @@ -1,17 +0,0 @@ -- request: - url: /api/address/bcrt1pdf5c3q35ssem2l25n435fa69qr7dzwkc6gsqehuflr3euh905l2sjyr5ek/utxo - method: GET - response: - headers: - content-type: application/json - body: > - [{"txid":"16e57c77dcb150039a237721ee8d7e2d8d5515fc2a40d2cd3e959e88b436d903","vout":0,"value":5000000000}] - -- request: - url: /api/v1/fees/recommended - method: GET - response: - headers: - content-type: application/json - body: > - {"fastestFee":15,"halfHourFee":10,"hourFee":1,"economyFee":10,"minimumFee":5} \ No newline at end of file diff --git a/example/cmd/cmd.go b/example/cmd/cmd.go deleted file mode 100644 index 3089e30f..00000000 --- a/example/cmd/cmd.go +++ /dev/null @@ -1,40 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package cmd - -import ( - "github.com/rs/zerolog/log" - "github.com/spf13/cobra" - - "github.com/ChainSafe/sygma-relayer/config" - "github.com/ChainSafe/sygma-relayer/example/app" -) - -var ( - rootCMD = &cobra.Command{ - Use: "", - } - runCMD = &cobra.Command{ - Use: "run", - Short: "Run example app", - Long: "Run example app", - RunE: func(cmd *cobra.Command, args []string) error { - if err := app.Run(); err != nil { - return err - } - return nil - }, - } -) - -func init() { - config.BindFlags(runCMD) -} - -func Execute() { - rootCMD.AddCommand(runCMD) - if err := rootCMD.Execute(); err != nil { - log.Fatal().Err(err).Msg("failed to execute root cmd") - } -} diff --git a/example/docker-compose.yml b/example/docker-compose.yml deleted file mode 100644 index c62a585a..00000000 --- a/example/docker-compose.yml +++ /dev/null @@ -1,193 +0,0 @@ -# Copyright 2020 ChainSafe Systems -# SPDX-License-Identifier: LGPL-3.0-only - -x-logging: - &default-logging - driver: "json-file" - options: - max-size: "1m" - max-file: "1" - tag: "{{.Name}}" - -services: - mempool-stub: - image: ghcr.io/sprintertech/beacon-api-stub - container_name: mempool-stub - labels: - logging: "promtail" - logging_jobname: "containerlogs" - volumes: - - "./cfg/stubs:/stubs" - ports: - - 8882:8882 - environment: - - STUB_DATA=/stubs/mempool.yml - logging: *default-logging - - bitcoin: -# image: ruimarinho/bitcoin-core:latest - image: ghcr.io/sprintertech/bitcoin - container_name: bitcoin - labels: - logging: "promtail" - logging_jobname: "containerlogs" - ports: - - "18443:18443" - - "18332:18332" - environment: - BITCOIN_RPC_USER: user - BITCOIN_RPC_PASSWORD: password - BITCOIN_RPC_PORT: 18443 - BITCOIN_NETWORK: regtest - BITCOIN_EXTRA_ARGS: "-rpcallowip=0.0.0.0/0 -rpcbind=0.0.0.0" - volumes: - - ./cfg/entrypoint/entrypoint.sh:/cfg/entrypoint/entrypoint.sh - entrypoint: /cfg/entrypoint/entrypoint.sh - logging: *default-logging - - evm1-1: - image: ghcr.io/sprintertech/sygma-solidity:evm1-v2.10.1 - container_name: evm1-1 - command: --chain.chainId 1337 --db data/ --blockTime 2 --m 'black toward wish jar twin produce remember fluid always confirm bacon slush' > /dev/null - labels: - logging: "promtail" - logging_jobname: "containerlogs" - logging: *default-logging - ports: - - "8545:8545" - - evm2-1: - image: ghcr.io/sprintertech/sygma-solidity:evm2-v2.10.1 - command: --chain.chainId 1338 --db data/ --blockTime 2 --m 'black toward wish jar twin produce remember fluid always confirm bacon slush' > /dev/null - container_name: evm2-1 - labels: - logging: "promtail" - logging_jobname: "containerlogs" - logging: *default-logging - ports: - - "8547:8545" - - substrate-pallet: - image: "ghcr.io/sprintertech/sygma-substrate-pallets:e2e-v0.3.1" - container_name: substrate-pallet - labels: - logging: "promtail" - logging_jobname: "containerlogs" - ports: - - "9944:9944" - - "9933:9933" - logging: *default-logging - - ipfs0: - image: ipfs/kubo:release - container_name: ipfs0 - labels: - logging: "promtail" - logging_jobname: "containerlogs" - ports: - - "4001:4001" - - "5002:5001" - - "8080:8080" - logging: *default-logging - - relayer1: - container_name: example_relayer1 - build: - context: ../. - dockerfile: ./example/Dockerfile - command: sh -c "sleep 5 && ./bridge run --config /cfg/config_evm-evm_1.json --fresh" - depends_on: - - evm1-1 - - substrate-pallet - labels: - logging: "promtail" - logging_jobname: "containerlogs" - volumes: - - ./cfg:/cfg - restart: always - logging: *default-logging - - relayer2: - container_name: example_relayer2 - build: - context: ../. - dockerfile: ./example/Dockerfile - command: sh -c "sleep 5 && ./bridge run --config /cfg/config_evm-evm_2.json --fresh" - depends_on: - - evm1-1 - - substrate-pallet - labels: - logging: "promtail" - logging_jobname: "containerlogs" - volumes: - - ./cfg:/cfg - restart: always - logging: *default-logging - - relayer3: - container_name: example_relayer3 - build: - context: ../. - dockerfile: ./example/Dockerfile - command: sh -c "sleep 5 && ./bridge run --config /cfg/config_evm-evm_3.json --fresh" - depends_on: - - evm1-1 - - substrate-pallet - labels: - logging: "promtail" - logging_jobname: "containerlogs" - volumes: - - ./cfg:/cfg - restart: always - logging: *default-logging - - otel-collector: - container_name: otel-collector - image: otel/opentelemetry-collector - command: ["--config=/etc/otel-collector-config.yml"] - labels: - logging: "promtail" - logging_jobname: "containerlogs" - volumes: - - ./cfg/otel-collector-config.yml:/etc/otel-collector-config.yml - ports: - - "8889:8889" # Prometheus exporter metrics - logging: *default-logging - - grafana: - image: grafana/grafana:11.3.0 - container_name: grafana - ports: - - 3000:3000 - volumes: - - ./grafana/datasources/grafana.yaml:/etc/grafana/provisioning/datasources/datasources.yaml - - ./grafana/plugins/app.yaml:/etc/grafana/provisioning/plugins/app.yaml - environment: - - GF_AUTH_ANONYMOUS_ENABLED=true - - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - - GF_AUTH_DISABLE_LOGIN_FORM=true - - GF_FEATURE_TOGGLES_ENABLE=accessControlOnCall lokiLogsDataplane - - GF_INSTALL_PLUGINS=grafana-lokiexplore-app - logging: *default-logging - - loki: - image: grafana/loki:3.0.0 - container_name: loki - ports: - - 3100:3100 - command: -config.file=/etc/loki/loki.yaml - volumes: - - ./loki/loki.yaml:/etc/loki/loki.yaml - logging: *default-logging - - promtail: - image: grafana/promtail:3.0.0 - container_name: promtail - volumes: - - ./promtail/promtail.yaml:/etc/promtail/docker-config.yaml - - /var/lib/docker/containers:/var/lib/docker/containers:ro - - /var/run/docker.sock:/var/run/docker.sock - command: -config.file=/etc/promtail/docker-config.yaml - depends_on: - - loki - logging: *default-logging \ No newline at end of file diff --git a/example/fee-oracle-config/config.yaml b/example/fee-oracle-config/config.yaml deleted file mode 100644 index 1aba0e4b..00000000 --- a/example/fee-oracle-config/config.yaml +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright 2021 ChainSafe Systems -# SPDX-License-Identifier: LGPL-3.0-only - -# app mode: debug, release -app_mode: release - -# env -env: dev # dev, production - -# Log level -log_level: 5 # 5 is debug level, use 4(info) in prod - -# Gin http server config -http_server: - mode: debug # or release, debug - port: :8091 - -# time in second before server shutdown -# this will allow server to finish running jobs before shutdown -finish_up_time: 10 - -# internal scheduled cronjob -cron_job: - update_conversion_rate_job: - name: conversion rate - enable: true - check_frequency: "* * * * *" - process_number: 1 - update_gas_price_job: - name: gas price - enable: true - check_frequency: "* * * * *" - process_number: 1 - -# store path -store: - path: ./lvldbdata - -oracle: - etherscan: - enable: true - api_key: 473P55YZMBNSRR63YF78D2PMMIUYUQJMGY - apis: - gas_price: https://api.etherscan.io/api?module=gastracker&action=gasoracle&apikey= - polygonscan: - enable: true - api_key: BZM7P395BQS1YFKQMA2AK2ACQKWGEW4JB3 - apis: - gas_price: https://api.polygonscan.com/api?module=gastracker&action=gasoracle&apikey= - coinmarketcap: - enable: true - api_key: 1408daf0-0777-4916-9fe4-20da5ee77560 - apis: - query_rate: https://pro-api.coinmarketcap.com/v2/cryptocurrency/quotes/latest? - -gas_price_domains: - [ ethereum, polygon ] - -# conversion_rate_pairs contains price pair for conversion rate -# must be paired and follow the format of [ base, foreign, base, foreign, ... ] -conversion_rate_pairs: - [ eth, usdt, eth, matic, matic, usdt ] - -# strategy defines the strategy on verify and aggregate data from store when fetched -strategy: - local: average - -# data_valid_interval defines how long the endpoint response data remains valid before sending it to fee handler contract -data_valid_interval: 3600 # second diff --git a/example/fee-oracle-config/domain.json b/example/fee-oracle-config/domain.json deleted file mode 100644 index af441eb4..00000000 --- a/example/fee-oracle-config/domain.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "domains": [ - { - "id": 1, - "name": "ethereum", - "baseCurrencyFullName": "ether", - "baseCurrencySymbol": "eth", - "addressPrefix": "0x" - }, - { - "id": 2, - "name": "polygon", - "baseCurrencyFullName": "matic", - "baseCurrencySymbol": "matic", - "addressPrefix": "0x" - } - ] -} \ No newline at end of file diff --git a/example/fee-oracle-config/resource.json b/example/fee-oracle-config/resource.json deleted file mode 100644 index 6bf49c15..00000000 --- a/example/fee-oracle-config/resource.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "resources": [ - { - "id": "0x00000000000000000000000000000000000000001", - "symbol": "eth", - "domains": [ - { - "domainId": 1, - "decimal": 18 - } - ] - }, - { - "id": "0x00000000000000000000000000000000000000002", - "symbol": "matic", - "domains": [ - { - "domainId": 2, - "decimal": 18 - } - ] - }, - { - "id": "0x0000000000000000000000000000000000000000000000000000000000000000", - "symbol": "TST-20", - "domains": [ - { - "domainId": 1, - "decimal": 18 - }, - { - "domainId": 2, - "decimal": 18 - } - ] - } - ] -} diff --git a/example/geth-build/Dockerfile b/example/geth-build/Dockerfile deleted file mode 100644 index 431c8c52..00000000 --- a/example/geth-build/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2020 ChainSafe Systems -# SPDX-License-Identifier: LGPL-3.0-only -FROM ethereum/client-go:v1.10.8 - -WORKDIR /root - -COPY ./genesis_1.json . -COPY ./genesis_2.json . -COPY ./keystore /root/keystore -COPY entrypoint.sh . -COPY ./password.txt . - -RUN chmod +x entrypoint.sh - -ENTRYPOINT ["/root/entrypoint.sh"] diff --git a/example/geth-build/entrypoint.sh b/example/geth-build/entrypoint.sh deleted file mode 100644 index 5655911e..00000000 --- a/example/geth-build/entrypoint.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env sh -# Copyright 2020 ChainSafe Systems -# SPDX-License-Identifier: LGPL-3.0-only - -# Exit on failure -set -ex - -# Initialize different genesis file depending on set GENESIS_PATH -geth init ${GENESIS_PATH} -rm -f /root/.ethereum/keystore/* - -# If accounts are not set, set all accounts. -if [ -z $ACCOUNTS ] -then - ACCOUNTS="0xf4314cb9046bece6aa54bb9533155434d0c76909,0xff93B45308FD417dF303D6515aB04D9e89a750Ca,0x8e0a907331554AF72563Bd8D43051C2E64Be5d35,0x24962717f8fA5BA3b931bACaF9ac03924EB475a0,0x148FfB2074A9e59eD58142822b3eB3fcBffb0cd7,0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485" -fi - -# Copy requested accounts to celo keystore. -ACCOUNTS_TRIMMED=${ACCOUNTS//0x/} -ACCOUNTS_PATTERN=${ACCOUNTS_TRIMMED//,/|} -find /root/keystore | grep -iE ${ACCOUNTS_PATTERN} | xargs -i cp {} /root/.ethereum/keystore/ - -# Identify the docker container external IP. -IP=$(ip -4 -o address | \ - grep -Eo -m 1 'eth0\s+inet\s+[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' | \ - grep -Eo '[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}') - -if [ ! -z $BOOTNODE ] -then - BOOTNODE="--bootnodes ${BOOTNODE}" -else - BOOTNODE=" " -fi -if [ ! -z $NODEKEY ]; then NODEKEY="--nodekeyhex ${NODEKEY}"; fi -if [ -z $NETWORKID ]; then NETWORKID="5"; fi - -if [ ! -z $MINE ]; -then -# MINE="--mine --miner.etherbase=0x0000000000000000000000000000000000000000 --miner.threads=1" - MINE="--mine" -else - MINE=" " -fi - -exec geth \ - --unlock ${ACCOUNTS} \ - --password /root/password.txt \ - --ws \ - --ws.port 8546 \ - --ws.origins="*" \ - --ws.addr 0.0.0.0 \ - --http \ - --http.addr 0.0.0.0\ - --http.port 8545 \ - --http.corsdomain="*" \ - --http.vhosts="*" \ - --nat=extip:${IP} \ - --networkid ${NETWORKID} \ - --allow-insecure-unlock ${MINE} ${BOOTNODE} ${NODEKEY} - -# HTTP based JSON-RPC API options: -# -#--http Enable the HTTP-RPC server -#--http.addr HTTP-RPC server listening interface (default: localhost) -#--http.port HTTP-RPC server listening port (default: 8545) -#--http.api API's offered over the HTTP-RPC interface (default: eth,net,web3) -#--http.corsdomain Comma separated list of domains from which to accept cross origin requests (browser enforced) -#--ws Enable the WS-RPC server -#--ws.addr WS-RPC server listening interface (default: localhost) -#--ws.port WS-RPC server listening port (default: 8546) -#--ws.api API's offered over the WS-RPC interface (default: eth,net,web3) -#--ws.origins Origins from which to accept websockets requests -#--ipcdisable Disable the IPC-RPC server -#--ipcapi API's offered over the IPC-RPC interface (default: admin,debug,eth,miner,net,personal,shh,txpool,web3) -#--ipcpath Filename for IPC socket/pipe within the datadir (explicit paths escape it) diff --git a/example/geth-build/genesis_1.json b/example/geth-build/genesis_1.json deleted file mode 100644 index 20c4e1e5..00000000 --- a/example/geth-build/genesis_1.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "config": { - "chainId": 422, - "homesteadBlock": 0, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "berlinBlock": 0, - "londonBlock": 0, - "clique": { - "period": 7, - "epoch": 30000 - } - }, - "alloc": { - "0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485": { - "balance": "100000000000000000000" - }, - "0xff93B45308FD417dF303D6515aB04D9e89a750Ca": { - "balance": "100000000000000000000" - }, - "0x8e0a907331554AF72563Bd8D43051C2E64Be5d35": { - "balance": "100000000000000000000" - }, - "0x24962717f8fA5BA3b931bACaF9ac03924EB475a0": { - "balance": "100000000000000000000" - }, - "0x148FfB2074A9e59eD58142822b3eB3fcBffb0cd7": { - "balance": "100000000000000000000" - }, - "0xf4314cb9046bece6aa54bb9533155434d0c76909": { - "balance": "100000000000000000000" - }, - "0x1c5541A79AcC662ab2D2647F3B141a3B7Cdb2Ae4": { - "balance": "100000000000000000000" - }, - "0x5A7421c47e67932b7Ad7a7C4fEBBEBA1188bE667": { - "balance": "100000000000000000000" - }, - "0xe6D381eE94D759Abcf77f3C42700f6F989763273": { - "balance": "100000000000000000000" - }, - "0x082d5Fc70Adca2AdFBb598727008cA3530eF14Ad": { - "balance": "100000000000000000000" - }, - "0xfF1aFa1f2F6215a6bF23679AF37E466284eeBF69": { - "balance": "100000000000000000000" - }, - "0xC04B5f3566420707b2C9f1511F65c5FFF05e680d": { - "balance": "100000000000000000000" - }, - "0x5D651d1f523B2bc4b9ce4aB24f4E0b42137C1552": { - "balance": "100000000000000000000" - } - }, - "coinbase": "0x0000000000000000000000000000000000000000", - "difficulty": "0x1", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f4314cb9046bece6aa54bb9533155434d0c769090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0x5DB698", - "nonce": "0x0000000700001142", - "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": "0x00" -} \ No newline at end of file diff --git a/example/geth-build/genesis_2.json b/example/geth-build/genesis_2.json deleted file mode 100644 index 3d77e7ac..00000000 --- a/example/geth-build/genesis_2.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "config": { - "chainId": 1214, - "homesteadBlock": 0, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "berlinBlock": 0, - "londonBlock": 0, - "clique": { - "period": 7, - "epoch": 30000 - } - }, - "alloc": { - "0x4CEEf6139f00F9F4535Ad19640Ff7A0137708485": { - "balance": "100000000000000000000" - }, - "0xff93B45308FD417dF303D6515aB04D9e89a750Ca": { - "balance": "100000000000000000000" - }, - "0x8e0a907331554AF72563Bd8D43051C2E64Be5d35": { - "balance": "100000000000000000000" - }, - "0x24962717f8fA5BA3b931bACaF9ac03924EB475a0": { - "balance": "100000000000000000000" - }, - "0x148FfB2074A9e59eD58142822b3eB3fcBffb0cd7": { - "balance": "100000000000000000000" - }, - "0xf4314cb9046bece6aa54bb9533155434d0c76909": { - "balance": "100000000000000000000" - }, - "0x1c5541A79AcC662ab2D2647F3B141a3B7Cdb2Ae4": { - "balance": "100000000000000000000" - }, - "0x5A7421c47e67932b7Ad7a7C4fEBBEBA1188bE667": { - "balance": "100000000000000000000" - }, - "0xe6D381eE94D759Abcf77f3C42700f6F989763273": { - "balance": "100000000000000000000" - }, - "0x082d5Fc70Adca2AdFBb598727008cA3530eF14Ad": { - "balance": "100000000000000000000" - }, - "0xfF1aFa1f2F6215a6bF23679AF37E466284eeBF69": { - "balance": "100000000000000000000" - }, - "0xC04B5f3566420707b2C9f1511F65c5FFF05e680d": { - "balance": "100000000000000000000" - }, - "0x5D651d1f523B2bc4b9ce4aB24f4E0b42137C1552": { - "balance": "100000000000000000000" - } - }, - "coinbase": "0x0000000000000000000000000000000000000000", - "difficulty": "0x1", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f4314cb9046bece6aa54bb9533155434d0c769090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0x5DB698", - "nonce": "0x0000000700001142", - "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": "0x00" -} diff --git a/example/geth-build/keystore/UTC--2020-03-20T21-14-07.508717834Z--f4314cb9046bece6aa54bb9533155434d0c76909 b/example/geth-build/keystore/UTC--2020-03-20T21-14-07.508717834Z--f4314cb9046bece6aa54bb9533155434d0c76909 deleted file mode 100644 index d28ef126..00000000 --- a/example/geth-build/keystore/UTC--2020-03-20T21-14-07.508717834Z--f4314cb9046bece6aa54bb9533155434d0c76909 +++ /dev/null @@ -1 +0,0 @@ -{"address":"f4314cb9046bece6aa54bb9533155434d0c76909","blspublickey":"ec0d01b5adf993cdfee480b43be638b346ca58bc7d63d2d0e8b288de24bb320c02fa254a79fecc14511dc176f4e15c012e7d1b8ea9717c82c07b76ee5d6a5ec4ba710418ae299d3bdce703351f7c465fbaeb7ba814b43d7206546051d90f1b80","crypto":{"cipher":"aes-128-ctr","ciphertext":"8d7fa638ee1a6be535ba935bc74692731d4af74a061e1731e7cdde15ef03ccec","cipherparams":{"iv":"d237dc253c39020be3f17eda348c7dc0"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"ece36023315eb6e12601968470727936b0f098ea4703e5823275a0842088e05e"},"mac":"a3b3234d36cc3d697f1926b9360a59f4b7824c40b7a64cd21c8ed54de8dfb130"},"id":"d3d08dff-f9a7-49a7-9f17-5871d0b345c5","version":3} \ No newline at end of file diff --git a/example/geth-build/keystore/UTC--2020-04-07T13-50-35.447Z--ff93b45308fd417df303d6515ab04d9e89a750ca b/example/geth-build/keystore/UTC--2020-04-07T13-50-35.447Z--ff93b45308fd417df303d6515ab04d9e89a750ca deleted file mode 100644 index 8f413f91..00000000 --- a/example/geth-build/keystore/UTC--2020-04-07T13-50-35.447Z--ff93b45308fd417df303d6515ab04d9e89a750ca +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"id":"369ea1d8-73ac-440b-932c-0722491eb9a2","address":"ff93b45308fd417df303d6515ab04d9e89a750ca","crypto":{"ciphertext":"095e1ad5c02249880243cfba01c79297b3a58315d5819d79c5349db7e65fcb13","cipherparams":{"iv":"589cfe4b3f5c935ea4847dd233980f0a"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"f01da06f89421cdc88d7b896844ca3b0295f01208cff36f89fa2a6706d248107","n":8192,"r":8,"p":1},"mac":"60267143aa71c8124156ac2dafb5e771cb1d0a9862634c78606549418573b907"}} \ No newline at end of file diff --git a/example/geth-build/keystore/UTC--2020-04-07T13-52-12.564Z--8e0a907331554af72563bd8d43051c2e64be5d35 b/example/geth-build/keystore/UTC--2020-04-07T13-52-12.564Z--8e0a907331554af72563bd8d43051c2e64be5d35 deleted file mode 100644 index 8f729108..00000000 --- a/example/geth-build/keystore/UTC--2020-04-07T13-52-12.564Z--8e0a907331554af72563bd8d43051c2e64be5d35 +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"id":"1bdffff9-241c-4cda-b9b1-a2afffa73a3a","address":"8e0a907331554af72563bd8d43051c2e64be5d35","crypto":{"ciphertext":"d1af2dc6976cabe7b390799c908940150315285515622c3e5332412564c57d6d","cipherparams":{"iv":"87c6ffc252c435c3b612fcca5e9a10a0"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"e85eebb3570913942908be7201003435f9541beb26668ed275a1f2a6d4bcd932","n":8192,"r":8,"p":1},"mac":"dc8e177a84ac62c8395ecda5b7680f7ad7b0278499beddaa2e8c71965477b07b"}} \ No newline at end of file diff --git a/example/geth-build/keystore/UTC--2020-04-07T13-53-49.003Z--24962717f8fa5ba3b931bacaf9ac03924eb475a0 b/example/geth-build/keystore/UTC--2020-04-07T13-53-49.003Z--24962717f8fa5ba3b931bacaf9ac03924eb475a0 deleted file mode 100644 index afa43592..00000000 --- a/example/geth-build/keystore/UTC--2020-04-07T13-53-49.003Z--24962717f8fa5ba3b931bacaf9ac03924eb475a0 +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"id":"fca758b1-8782-4e54-9ede-96ca22931b72","address":"24962717f8fa5ba3b931bacaf9ac03924eb475a0","crypto":{"ciphertext":"5120712ba214043947befd835e3d86a38fce60c8d830f878ca1a053120d37056","cipherparams":{"iv":"71168d1cbf61b9e65ea02b5db38de7e7"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"2010ca09bebf3988fb95997279ad7d761ab0d4b8323c647470dd680bdfc2f202","n":8192,"r":8,"p":1},"mac":"920f27b77fcdaaa3c322a33e91e088a7c30f82b0e3a9bfd1072058198b367f07"}} \ No newline at end of file diff --git a/example/geth-build/keystore/UTC--2020-04-07T13-55-20.258Z--148ffb2074a9e59ed58142822b3eb3fcbffb0cd7 b/example/geth-build/keystore/UTC--2020-04-07T13-55-20.258Z--148ffb2074a9e59ed58142822b3eb3fcbffb0cd7 deleted file mode 100644 index 810d54c7..00000000 --- a/example/geth-build/keystore/UTC--2020-04-07T13-55-20.258Z--148ffb2074a9e59ed58142822b3eb3fcbffb0cd7 +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"id":"2995e9ab-3ac6-4814-bc40-03165cf23f1b","address":"148ffb2074a9e59ed58142822b3eb3fcbffb0cd7","crypto":{"ciphertext":"c986b6930bd7814092d613c607e7f4df0758d895f6216294fc0452bb18348d91","cipherparams":{"iv":"527bb46169ca968a6821d75c845bfd3f"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"71f9c2041a9a6b5476393331ef6924335f5485cf4c175cbc33c83c685c3f4394","n":8192,"r":8,"p":1},"mac":"c10a5aaf7a34a9d08377a02a517339b3afaa4ed7e6ec9a6a70dd1bcf3b4e1fba"}} \ No newline at end of file diff --git a/example/geth-build/keystore/UTC--2020-04-07T13-56-44.768Z--4ceef6139f00f9f4535ad19640ff7a0137708485 b/example/geth-build/keystore/UTC--2020-04-07T13-56-44.768Z--4ceef6139f00f9f4535ad19640ff7a0137708485 deleted file mode 100644 index 3daa9f09..00000000 --- a/example/geth-build/keystore/UTC--2020-04-07T13-56-44.768Z--4ceef6139f00f9f4535ad19640ff7a0137708485 +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"id":"a163ef8f-b883-4474-a79f-9ecddf079683","address":"4ceef6139f00f9f4535ad19640ff7a0137708485","crypto":{"ciphertext":"fa612d9881ab9863b830daea365acaac6643469d0f02189b82fb84948f59d643","cipherparams":{"iv":"b91f79de31d0a9bdc8a0670a129efea8"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"ddb540564be1bf1546245fafafd1b952431213b4d742a9af3d4fbedc54846ae3","n":8192,"r":8,"p":1},"mac":"ffbc5fab063f361c8dfa52f91be661d08a1e9119c9a81aac83fa81af4a2f5909"}} \ No newline at end of file diff --git a/example/geth-build/password.txt b/example/geth-build/password.txt deleted file mode 100644 index d6505c6b..00000000 --- a/example/geth-build/password.txt +++ /dev/null @@ -1,6 +0,0 @@ -passwordpassword -passwordpassword -passwordpassword -passwordpassword -passwordpassword -passwordpassword \ No newline at end of file diff --git a/example/grafana/datasources/grafana.yaml b/example/grafana/datasources/grafana.yaml deleted file mode 100644 index 868c26f1..00000000 --- a/example/grafana/datasources/grafana.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: 1 - -datasources: - - name: Loki - type: loki - access: proxy - url: http://loki:3100 - version: 1 - editable: false - isDefault: true \ No newline at end of file diff --git a/example/grafana/plugins/app.yaml b/example/grafana/plugins/app.yaml deleted file mode 100644 index 64f8efd1..00000000 --- a/example/grafana/plugins/app.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: 1 - -apps: - - type: "grafana-lokiexplore-app" - org_id: 1 - org_name: "Grafana" - disabled: false - jsonData: - apiUrl: http://localhost - isApiKeySet: true - secureJsonData: - apiKey: example-key diff --git a/example/loki/loki.yaml b/example/loki/loki.yaml deleted file mode 100644 index 1cd1f51c..00000000 --- a/example/loki/loki.yaml +++ /dev/null @@ -1,49 +0,0 @@ -auth_enabled: false - -server: - http_listen_port: 3100 - grpc_listen_port: 9096 - -common: - instance_addr: 127.0.0.1 - path_prefix: /tmp/loki - storage: - filesystem: - chunks_directory: /tmp/loki/chunks - rules_directory: /tmp/loki/rules - replication_factor: 1 - ring: - kvstore: - store: inmemory - -frontend: - max_outstanding_per_tenant: 2048 - -pattern_ingester: - enabled: true - -limits_config: - max_global_streams_per_user: 0 - ingestion_rate_mb: 50000 - ingestion_burst_size_mb: 50000 - volume_enabled: true - -query_range: - results_cache: - cache: - embedded_cache: - enabled: true - max_size_mb: 100 - -schema_config: - configs: - - from: 2020-10-24 - store: tsdb - object_store: filesystem - schema: v13 - index: - prefix: index_ - period: 24h - -analytics: - reporting_enabled: false diff --git a/example/main.go b/example/main.go deleted file mode 100644 index fb86f6c2..00000000 --- a/example/main.go +++ /dev/null @@ -1,12 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package main - -import ( - "github.com/ChainSafe/sygma-relayer/example/cmd" -) - -func main() { - cmd.Execute() -} diff --git a/example/promtail/promtail.yaml b/example/promtail/promtail.yaml deleted file mode 100644 index b1f97593..00000000 --- a/example/promtail/promtail.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# https://grafana.com/docs/loki/latest/clients/promtail/configuration/ -# https://docs.docker.com/engine/api/v1.41/#operation/ContainerList -server: - http_listen_port: 9080 - grpc_listen_port: 0 - -positions: - filename: /tmp/positions.yaml - -clients: - - url: http://loki:3100/loki/api/v1/push - -scrape_configs: - - job_name: flog_scrape - docker_sd_configs: - - host: unix:///var/run/docker.sock - refresh_interval: 5s - filters: - - name: label - values: ["logging=promtail"] - relabel_configs: - - source_labels: ['__meta_docker_container_name'] - regex: '/(.*)' - target_label: 'container' - - source_labels: ['__meta_docker_container_log_stream'] - target_label: 'logstream' - - source_labels: ['__meta_docker_container_label_logging_jobname'] - target_label: 'job' - pipeline_stages: - - cri: {} - - multiline: - firstline: ^\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2},\d{3} - max_wait_time: 3s - # https://grafana.com/docs/loki/latest/clients/promtail/stages/json/ - - json: - expressions: - #message: message - level: level - #output: 'message' diff --git a/go.mod b/go.mod index 91ec8a07..45473396 100644 --- a/go.mod +++ b/go.mod @@ -1,57 +1,80 @@ -module github.com/ChainSafe/sygma-relayer +module github.com/sprintertech/sprinter-signing -go 1.19 +go 1.23 require ( github.com/binance-chain/tss-lib v0.0.0-00010101000000-000000000000 - github.com/btcsuite/btcd/btcutil v1.1.5 - github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 - github.com/cenkalti/backoff/v4 v4.3.0 github.com/centrifuge/go-substrate-rpc-client/v4 v4.2.1 github.com/creasty/defaults v1.6.0 - github.com/deckarep/golang-set/v2 v2.1.0 github.com/ethereum/go-ethereum v1.13.4 github.com/golang/mock v1.6.0 github.com/imdario/mergo v0.3.12 - github.com/libp2p/go-libp2p v0.23.4 + github.com/libp2p/go-libp2p v0.38.2 github.com/mitchellh/mapstructure v1.4.2 - github.com/multiformats/go-multiaddr v0.12.1 - github.com/multiformats/go-multiaddr-dns v0.3.1 + github.com/multiformats/go-multiaddr v0.14.0 + github.com/multiformats/go-multiaddr-dns v0.4.1 github.com/rs/zerolog v1.25.0 github.com/spf13/cobra v1.5.0 github.com/spf13/viper v1.9.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.10.0 github.com/sygmaprotocol/sygma-core v0.0.0-20241028121638-2c5597ae589f github.com/taurusgroup/multi-party-sig v0.6.0-alpha-2021-09-21.0.20230619131919-9c7c6ffd7217 go.opentelemetry.io/otel v1.16.0 go.opentelemetry.io/otel/metric v1.16.0 - go.uber.org/mock v0.3.0 - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 + go.uber.org/mock v0.5.0 + golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 ) require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/bits-and-blooms/bitset v1.7.0 // indirect - github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect - github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect - github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect + github.com/cenkalti/backoff/v4 v4.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.3.0 // indirect github.com/cronokirby/saferith v0.33.0 // indirect + github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/ethereum/c-kzg-4844 v0.3.1 // indirect github.com/fxamacker/cbor/v2 v2.4.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo/v2 v2.22.0 // indirect + github.com/pion/datachannel v1.5.10 // indirect + github.com/pion/dtls/v2 v2.2.12 // indirect + github.com/pion/ice/v2 v2.3.37 // indirect + github.com/pion/interceptor v0.1.37 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns v0.0.12 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.15 // indirect + github.com/pion/rtp v1.8.10 // indirect + github.com/pion/sctp v1.8.35 // indirect + github.com/pion/sdp/v3 v3.0.9 // indirect + github.com/pion/srtp/v2 v2.0.20 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.10 // indirect + github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/turn/v2 v2.1.6 // indirect + github.com/pion/webrtc/v3 v3.3.5 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.48.2 // indirect + github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect github.com/supranational/blst v0.3.11 // indirect - github.com/vedhavyas/go-subkey v1.0.4 // indirect github.com/vedhavyas/go-subkey/v2 v2.0.0 // indirect + github.com/wlynxg/anet v0.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/zeebo/blake3 v0.2.3 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect + go.uber.org/dig v1.18.0 // indirect + go.uber.org/fx v1.23.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) @@ -60,85 +83,73 @@ require ( github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/agl/ed25519 v0.0.0-20200305024217-f36fc4b53d43 // indirect - github.com/benbjohnson/clock v1.3.0 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/btcsuite/btcd v0.24.0 - github.com/btcsuite/btcd/btcec/v2 v2.2.0 + github.com/btcsuite/btcd v0.24.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/btcsuite/btcutil v1.0.3-0.20211129182920-9c4bbabe7acd // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/containerd/cgroups v1.0.4 // indirect - github.com/coreos/go-systemd/v22 v22.4.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/containerd/cgroups v1.1.0 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/base58 v1.0.4 // indirect github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect github.com/decred/dcrd/dcrec/edwards/v2 v2.0.2 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/docker/go-units v0.5.0 // indirect - github.com/elastic/gosigar v0.14.2 // indirect - github.com/flynn/noise v1.0.0 // indirect + github.com/elastic/gosigar v0.14.3 // indirect + github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-ole/go-ole v1.2.5 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/ipfs/go-cid v0.3.2 // indirect + github.com/ipfs/go-cid v0.4.1 // indirect github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect - github.com/klauspost/compress v1.15.15 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/koron/go-ssdp v0.0.3 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/koron/go-ssdp v0.0.4 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p-asn-util v0.2.0 // indirect - github.com/libp2p/go-msgio v0.2.0 // indirect - github.com/libp2p/go-nat v0.1.0 // indirect - github.com/libp2p/go-netroute v0.2.0 // indirect - github.com/libp2p/go-openssl v0.1.0 // indirect - github.com/libp2p/go-reuseport v0.2.0 // indirect - github.com/libp2p/go-yamux/v4 v4.0.0 // indirect - github.com/lucas-clemente/quic-go v0.29.1 // indirect + github.com/libp2p/go-flow-metrics v0.2.0 // indirect + github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect + github.com/libp2p/go-msgio v0.3.0 // indirect + github.com/libp2p/go-nat v0.2.0 // indirect + github.com/libp2p/go-netroute v0.2.2 // indirect + github.com/libp2p/go-reuseport v0.4.0 // indirect + github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/magiconair/properties v1.8.5 // indirect - github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect - github.com/marten-seemann/qtls-go1-19 v0.1.0 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect - github.com/mattn/go-isatty v0.0.17 // indirect - github.com/mattn/go-pointer v0.0.1 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect - github.com/miekg/dns v1.1.50 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/miekg/dns v1.1.62 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.1.0 // indirect + github.com/multiformats/go-base36 v0.2.0 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect - github.com/multiformats/go-multibase v0.1.1 // indirect - github.com/multiformats/go-multicodec v0.6.0 // indirect - github.com/multiformats/go-multihash v0.2.1 // indirect - github.com/multiformats/go-multistream v0.3.3 // indirect - github.com/multiformats/go-varint v0.0.6 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/onsi/ginkgo v1.16.5 // indirect - github.com/opencontainers/runtime-spec v1.0.2 // indirect + github.com/multiformats/go-multibase v0.2.0 // indirect + github.com/multiformats/go-multicodec v0.9.0 // indirect + github.com/multiformats/go-multihash v0.2.3 // indirect + github.com/multiformats/go-multistream v0.6.0 // indirect + github.com/multiformats/go-varint v0.0.7 // indirect + github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/otiai10/primes v0.0.0-20210501021515-f1b2be525a11 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect @@ -146,21 +157,18 @@ require ( github.com/pierrec/xxHash v0.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.13.0 // indirect - github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect - github.com/rs/cors v1.8.2 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/sourcegraph/conc v0.3.0 - github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.6.0 // indirect github.com/spf13/cast v1.4.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -171,29 +179,25 @@ require ( go.opentelemetry.io/otel/sdk/metric v0.39.0 // indirect go.opentelemetry.io/otel/trace v1.16.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.9.0 // indirect - go.uber.org/zap v1.23.0 - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.18.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.13.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/tools v0.28.0 // indirect google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect google.golang.org/grpc v1.55.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.36.0 // indirect gopkg.in/ini.v1 v1.63.2 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - lukechampine.com/blake3 v1.1.7 // indirect + lukechampine.com/blake3 v1.3.0 // indirect ) replace ( github.com/agl/ed25519 => github.com/binance-chain/edwards25519 v0.0.0-20200305024217-f36fc4b53d43 github.com/binance-chain/tss-lib => github.com/ChainSafe/threshlib v0.0.0-20230420112309-603112eb4684 - github.com/taurusgroup/multi-party-sig => github.com/sygmaprotocol/multi-party-sig v0.0.0-20240523153754-9377ba09c35e ) diff --git a/go.sum b/go.sum index 6cfed548..a15696ef 100644 --- a/go.sum +++ b/go.sum @@ -58,18 +58,15 @@ github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z github.com/ChainSafe/threshlib v0.0.0-20230420112309-603112eb4684 h1:l5IpX6FFHNFgbjOIZ9LLS9y2sm1Zxp6CMbMpUmFWuxw= github.com/ChainSafe/threshlib v0.0.0-20230420112309-603112eb4684/go.mod h1:QWOI8ORRuVh3uoHDqcDVOjUmg+CIVvNmzJOs4vWlfcY= github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= 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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 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.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= +github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -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/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -77,10 +74,10 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV 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/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/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= @@ -90,34 +87,19 @@ github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHl github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= -github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= -github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= -github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= -github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= 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.20211129182920-9c4bbabe7acd h1:vAwk2PCYxzUUGAXXtw66PyY2IMCwWBnm8GR5aLIxS3Q= github.com/btcsuite/btcutil v1.0.3-0.20211129182920-9c4bbabe7acd/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= 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 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= 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-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= @@ -126,12 +108,10 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/centrifuge/go-substrate-rpc-client/v4 v4.2.1 h1:io49TJ8IOIlzipioJc9pJlrjgdJvqktpUWYxVY5AUjE= github.com/centrifuge/go-substrate-rpc-client/v4 v4.2.1/go.mod h1:k61SBXqYmnZO4frAJyH3iuqjolYrYsq79r8EstmklDY= -github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.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= @@ -146,24 +126,30 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= 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.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= 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/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 v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -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/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 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/go-systemd/v22 v22.4.0 h1:y9YHcjnjynCd/DVbg5j9L/33jQM3MxJlbj/zWskzfGU= -github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +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/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= @@ -183,8 +169,6 @@ 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/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -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/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/base58 v1.0.4 h1:QJC6B0E0rXOPA8U/kw2rP+qiRJsUaE2Er+pYb3siUeA= @@ -194,17 +178,15 @@ github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5il github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/edwards/v2 v2.0.2 h1:bX7rtGTMBDJxujZ29GNqtn7YCAdINjHKnA6J6tBBv6s= github.com/decred/dcrd/dcrec/edwards/v2 v2.0.2/go.mod h1:d0H8xGMWbiIQP7gN3v2rByWUcuZPm9YsgmnfoxgbINc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -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/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo= +github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= 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= @@ -221,9 +203,10 @@ github.com/ethereum/go-ethereum v1.13.4/go.mod h1:I0U5VewuuTzvBtVzKo7b3hJzDhXOUt 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/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 v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= -github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= +github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= +github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -235,45 +218,41 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 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-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 v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/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-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -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 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 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.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= 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/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= 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= @@ -325,12 +304,13 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +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 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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= +github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= 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= @@ -352,19 +332,22 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe 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-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= 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.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= 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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -379,6 +362,7 @@ github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/ github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-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.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -399,24 +383,22 @@ github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= 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.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= 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.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/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= -github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= +github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= +github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= @@ -428,107 +410,84 @@ github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABo github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= 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/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.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.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.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -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/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.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.3 h1:JivLMY45N76b4p/vsWGOKewBQu6uf39y8l+AQ7sDKx8= -github.com/koron/go-ssdp v0.0.3/go.mod h1:b2MxI6yh02pKrsyNoQUsk4+YNikaGhe4894J+Q5lDvA= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= +github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.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/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/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= 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/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= -github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= -github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= -github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.23.4 h1:hWi9XHSOVFR1oDWRk7rigfyA4XNMuYL20INNybP9LP8= -github.com/libp2p/go-libp2p v0.23.4/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI= -github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= -github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= +github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= +github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= +github.com/libp2p/go-libp2p v0.38.2 h1:9SZQDOCi82A25An4kx30lEtr6kGTxrtoaDkbs5xrK5k= +github.com/libp2p/go-libp2p v0.38.2/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo= +github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= +github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= -github.com/libp2p/go-msgio v0.2.0 h1:W6shmB+FeynDrUVl2dgFQvzfBZcXiyqY4VmpQLu9FqU= -github.com/libp2p/go-msgio v0.2.0/go.mod h1:dBVM1gW3Jk9XqHkU4eKdGvVHdLa51hoGfll6jMJMSlY= -github.com/libp2p/go-nat v0.1.0 h1:MfVsH6DLcpa04Xr+p8hmVRG4juse0s3J8HyNWYHffXg= -github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC3uRBM= -github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= -github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE= -github.com/libp2p/go-netroute v0.2.0/go.mod h1:Vio7LTzZ+6hoT4CMZi5/6CpY3Snzh2vgZhWgxMNwlQI= -github.com/libp2p/go-openssl v0.1.0 h1:LBkKEcUv6vtZIQLVTegAil8jbNpJErQ9AnT+bWV+Ooo= -github.com/libp2p/go-openssl v0.1.0/go.mod h1:OiOxwPpL3n4xlenjx2h7AwSGaFSC/KZvf6gNdOBQMtc= -github.com/libp2p/go-reuseport v0.2.0 h1:18PRvIMlpY6ZK85nIAicSBuXXvrYoSw3dsBAR7zc560= -github.com/libp2p/go-reuseport v0.2.0/go.mod h1:bvVho6eLMm6Bz5hmU0LYN3ixd3nPPvtIlaURZZgOY4k= -github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= -github.com/libp2p/go-yamux/v4 v4.0.0/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= -github.com/lucas-clemente/quic-go v0.29.1 h1:Z+WMJ++qMLhvpFkRZA+jl3BTxUjm415YBmWanXB8zP0= -github.com/lucas-clemente/quic-go v0.29.1/go.mod h1:CTcNfLYJS2UuRNB+zcNlgvkjBhxX6Hm3WUxxAQx2mgE= +github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= +github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= +github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= +github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= +github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= +github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= +github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= +github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= +github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= +github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= +github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= 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-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marten-seemann/qpack v0.2.1 h1:jvTsT/HpCn2UZJdP+UUB53FfUUgeOyG5K1ns0OJOGVs= -github.com/marten-seemann/qtls-go1-18 v0.1.2 h1:JH6jmzbduz0ITVQ7ShevK10Av5+jBEKAHMntXmIV7kM= -github.com/marten-seemann/qtls-go1-18 v0.1.2/go.mod h1:mJttiymBAByA49mhlNZZGrH5u1uXYZJ+RW28Py7f4m4= -github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK5df3GufyYYU= -github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= -github.com/marten-seemann/webtransport-go v0.1.1 h1:TnyKp3pEXcDooTaNn4s9dYpMJ7kMnTp7k5h+SgYP/mc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 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.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.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-pointer v0.0.1 h1:n+XhsuGeVO6MEAp7xyEukFINEa+Quek5psIR/ylA6o0= -github.com/mattn/go-pointer v0.0.1/go.mod h1:2zXcozF6qYGgmsG+SeTZz3oAbFLdD3OWqnUbNvJZAlc= +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.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 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/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= 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/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= -github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -550,6 +509,7 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= 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= @@ -557,59 +517,60 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 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/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.1.0 h1:JR6TyF7JjGd3m6FbLU2cOxhC0Li8z8dLNGQ89tUg4F4= -github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= +github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= +github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= 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.12.1 h1:vm+BA/WZA8QZDp1pF1FWhi5CT3g1tbi5GJmqpb6wnlk= -github.com/multiformats/go-multiaddr v0.12.1/go.mod h1:7mPkiBMmLeFipt+nNSq9pHZUeJSt8lHBgH6yhj0YQzE= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU= +github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4= +github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= +github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= -github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= -github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= -github.com/multiformats/go-multicodec v0.6.0 h1:KhH2kSuCARyuJraYMFxrNO3DqIaYhOdS039kbhgVwpE= -github.com/multiformats/go-multicodec v0.6.0/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw= +github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= +github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= +github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= +github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= -github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= -github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= -github.com/multiformats/go-multistream v0.3.3 h1:d5PZpjwRgVlbwfdTDjife7XszfZd8KYWfROYFlGcR8o= -github.com/multiformats/go-multistream v0.3.3/go.mod h1:ODRoqamLUsETKS9BNcII4gcRsJBU5VAwRIv7O39cEXg= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= -github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -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/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= +github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= +github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA= +github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg= +github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= +github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +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/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/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/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= 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.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 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/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= 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 v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= +github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= 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 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= +github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8= +github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= 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/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= @@ -628,7 +589,48 @@ github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhEC github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo= github.com/pierrec/xxHash v0.1.5/go.mod h1:w2waW5Zoa/Wc4Yqe0wgrIYAGKqRMf7czn2HNKXmuL+I= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= +github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= +github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= +github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= +github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= +github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= +github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= +github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU= +github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4= +github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA= +github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= +github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= +github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= +github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= +github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= +github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.3.5 h1:ZsSzaMz/i9nblPdiAkZoP+E6Kmjw+jnyq3bEmU3EtRg= +github.com/pion/webrtc/v3 v3.3.5/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE= 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= @@ -638,40 +640,32 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.8.0/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 v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -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/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.13.0 h1:b71QUfeo5M8gq2+evJdTPfZhYMAU0uKPkyPJ7TPsloU= -github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y= -github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -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.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/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.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -711,16 +705,11 @@ github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go. 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.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= -github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= 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= @@ -737,11 +726,11 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.9.0 h1:yR6EXjTp0y0cLN8OZg1CRZmOBdI88UcGkhgyJhu6nZk= github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= 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.1.1/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/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= @@ -751,43 +740,50 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/sygmaprotocol/multi-party-sig v0.0.0-20240523153754-9377ba09c35e h1:IzidTxe1CT6O5qy2gK9NQO/hrC+2wjDGzCxCF+kjCKU= -github.com/sygmaprotocol/multi-party-sig v0.0.0-20240523153754-9377ba09c35e/go.mod h1:roZI3gaKCo15PUSB4LdJpTLTjq8TFsJiOH5kpcN1HpQ= github.com/sygmaprotocol/sygma-core v0.0.0-20241028121638-2c5597ae589f h1:tZb5+2slQMAb+OTYZGDvri7JJn8osd9lPJWbNv9Z8XU= github.com/sygmaprotocol/sygma-core v0.0.0-20241028121638-2c5597ae589f/go.mod h1:Shna6DuIf/SE2yGmhO+76Ou0oszfWKabX4n8gMnIH8U= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/taurusgroup/multi-party-sig v0.6.0-alpha-2021-09-21.0.20230619131919-9c7c6ffd7217 h1:scPlKINcpfsVU4lWvK3jvoTY9NhGZXyGOAyqEuDlpaE= +github.com/taurusgroup/multi-party-sig v0.6.0-alpha-2021-09-21.0.20230619131919-9c7c6ffd7217/go.mod h1:roZI3gaKCo15PUSB4LdJpTLTjq8TFsJiOH5kpcN1HpQ= 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/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU= github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/vedhavyas/go-subkey v1.0.4 h1:QwjBZx4w7qXC2lmqol2jJfhaNXPI9BsgLZiMiCwqGDU= -github.com/vedhavyas/go-subkey v1.0.4/go.mod h1:aOIil/KS9hJlnr9ZSQKSoXdu/MbnkCxG4x9IOlLsMtI= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/vedhavyas/go-subkey/v2 v2.0.0 h1:LemDIsrVtRSOkp0FA8HxP6ynfKjeOj3BY2U9UNfeDMA= github.com/vedhavyas/go-subkey/v2 v2.0.0/go.mod h1:95aZ+XDCWAUUynjlmi7BtPExjXgXxByE0WfBwbmIRH4= 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/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= +github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= 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/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/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/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= @@ -826,26 +822,28 @@ go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJP go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= +go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg= +go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo= -go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= +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/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= 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.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= 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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -863,8 +861,12 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 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.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= 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= @@ -875,8 +877,8 @@ 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-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo= +golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= 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= @@ -903,17 +905,16 @@ 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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -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.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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-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= @@ -922,7 +923,6 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn 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-20190613194153-d28f0bde5980/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= @@ -941,7 +941,6 @@ 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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -951,16 +950,18 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v 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-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-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-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= 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= @@ -979,7 +980,6 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= 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= @@ -992,24 +992,21 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +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.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/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-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-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-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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1026,7 +1023,6 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1040,13 +1036,9 @@ 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-20200625212154-ddb9806d33ae/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-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1054,19 +1046,15 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w 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-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-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426080607-c94f62235c83/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= @@ -1074,18 +1062,26 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/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-20220811171246-fbc7d0a398ab/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-20220908164124-27713097b956/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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= 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= @@ -1095,13 +1091,18 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +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.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +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-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1162,9 +1163,10 @@ 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.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= -golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +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.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= 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= @@ -1313,9 +1315,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba 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.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/protobuf v1.36.0 h1:mjIs9gYtt56AzC4ZaffQuh88TZurBGhIJMBZGSxNerQ= +google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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= @@ -1327,15 +1328,13 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.63.2 h1:tGK/CyBg7SMzb60vP1M03vNZ3VDu3wGQJwn7Sxi9r3c= gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/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/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= 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.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= @@ -1353,8 +1352,8 @@ 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= -lukechampine.com/blake3 v1.1.7 h1:GgRMhmdsuK8+ii6UZFDL8Nb+VyMwadAgcJyfYHxG6n0= -lukechampine.com/blake3 v1.1.7/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= +lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= +lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/jobs/jobs.go b/jobs/jobs.go index e76798bd..5eea3a7f 100644 --- a/jobs/jobs.go +++ b/jobs/jobs.go @@ -6,11 +6,11 @@ package jobs import ( "time" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/p2p" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/rs/zerolog/log" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/comm/p2p" ) type RelayerStatusMeter interface { diff --git a/keyshare/ecdsa_test.go b/keyshare/ecdsa_test.go index ae531910..ab7469b0 100644 --- a/keyshare/ecdsa_test.go +++ b/keyshare/ecdsa_test.go @@ -7,9 +7,9 @@ import ( "os" "testing" - "github.com/ChainSafe/sygma-relayer/keyshare" "github.com/binance-chain/tss-lib/ecdsa/keygen" "github.com/libp2p/go-libp2p/core/peer" + "github.com/sprintertech/sprinter-signing/keyshare" "github.com/stretchr/testify/suite" ) diff --git a/keyshare/frost_test.go b/keyshare/frost_test.go index da944bef..6fc72be6 100644 --- a/keyshare/frost_test.go +++ b/keyshare/frost_test.go @@ -8,8 +8,8 @@ import ( "os" "testing" - "github.com/ChainSafe/sygma-relayer/keyshare" "github.com/libp2p/go-libp2p/core/peer" + "github.com/sprintertech/sprinter-signing/keyshare" "github.com/stretchr/testify/suite" "github.com/taurusgroup/multi-party-sig/pkg/math/curve" "github.com/taurusgroup/multi-party-sig/pkg/party" @@ -57,7 +57,7 @@ func (s *FrostKeyshareStoreTestSuite) Test_StoreAndRetrieveShare() { peers := []peer.ID{peer1, peer2} keyshare := keyshare.NewFrostKeyshare(&frost.TaprootConfig{ - ID: party.ID(peer1.Pretty()), + ID: party.ID(peer1.String()), Threshold: 1, PrivateShare: privateShare, VerificationShares: verificationShares, diff --git a/main.go b/main.go index f7c6c828..2faf3573 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,7 @@ package main -import "github.com/ChainSafe/sygma-relayer/cli" +import "github.com/sprintertech/sprinter-signing/cli" func main() { cli.Execute() diff --git a/relayer/retry/retry.go b/relayer/retry/retry.go deleted file mode 100644 index 3634e7b9..00000000 --- a/relayer/retry/retry.go +++ /dev/null @@ -1,89 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package retry - -import ( - "math/big" - - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ChainSafe/sygma-relayer/store" - "github.com/rs/zerolog/log" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -const ( - RetryMessageType message.MessageType = "RetryMessage" -) - -type RetryMessageData struct { - SourceDomainID uint8 - DestinationDomainID uint8 - BlockHeight *big.Int - ResourceID [32]byte -} - -type PropStorer interface { - StorePropStatus(source, destination uint8, depositNonce uint64, status store.PropStatus) error - PropStatus(source, destination uint8, depositNonce uint64) (store.PropStatus, error) -} - -// FilterDeposits filters deposits per domain and resource -// that are to be retried. -func FilterDeposits( - propStorer PropStorer, - domainDeposits map[uint8][]*message.Message, - resourceID [32]byte, - destination uint8) ([]*message.Message, error) { - filteredDeposits := make([]*message.Message, 0) - for domain, deposits := range domainDeposits { - if domain != destination { - continue - } - - for _, deposit := range deposits { - data := deposit.Data.(transfer.TransferMessageData) - if data.ResourceId != resourceID { - continue - } - - isExecuted, err := isExecuted(deposit, propStorer) - if err != nil { - log.Err(err).Str("messageID", deposit.ID).Msgf("Failed checking if deposit executed %+v", deposit) - continue - } - if isExecuted { - log.Debug().Str("messageID", deposit.ID).Msgf("Deposit marked as executed %+v", deposit) - continue - } - - filteredDeposits = append(filteredDeposits, deposit) - } - } - return filteredDeposits, nil -} - -func isExecuted(msg *message.Message, propStorer PropStorer) (bool, error) { - var err error - propStatus, err := propStorer.PropStatus( - msg.Source, - msg.Destination, - msg.Data.(transfer.TransferMessageData).DepositNonce) - if err != nil { - return true, err - } - - if propStatus == store.ExecutedProp { - return true, nil - } - - // change the status to failed if proposal is stuck to be able to retry it - if propStatus == store.PendingProp { - err = propStorer.StorePropStatus( - msg.Source, - msg.Destination, - msg.Data.(transfer.TransferMessageData).DepositNonce, - store.FailedProp) - } - return false, err -} diff --git a/relayer/retry/retry_test.go b/relayer/retry/retry_test.go deleted file mode 100644 index eda2a0fa..00000000 --- a/relayer/retry/retry_test.go +++ /dev/null @@ -1,149 +0,0 @@ -package retry_test - -import ( - "fmt" - "testing" - - mock_executor "github.com/ChainSafe/sygma-relayer/chains/btc/executor/mock" - "github.com/ChainSafe/sygma-relayer/e2e/evm" - "github.com/ChainSafe/sygma-relayer/relayer/retry" - "github.com/ChainSafe/sygma-relayer/relayer/transfer" - "github.com/ChainSafe/sygma-relayer/store" - "github.com/ethereum/go-ethereum/common" - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/suite" - "github.com/sygmaprotocol/sygma-core/relayer/message" -) - -type FilterDepositsTestSuite struct { - suite.Suite - - mockPropStorer *mock_executor.MockPropStorer -} - -func TestRunRetryMessageHandlerTestSuite(t *testing.T) { - suite.Run(t, new(FilterDepositsTestSuite)) -} - -func (s *FilterDepositsTestSuite) SetupTest() { - ctrl := gomock.NewController(s.T()) - s.mockPropStorer = mock_executor.NewMockPropStorer(ctrl) -} - -func (s *FilterDepositsTestSuite) Test_NoValidDeposits() { - validResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{3}, 31)) - invalidResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{4}, 31)) - invalidDomain := uint8(3) - validDomain := uint8(4) - - deposits := make(map[uint8][]*message.Message) - deposits[validDomain] = []*message.Message{ - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: 2, - ResourceId: invalidResource, - }, - }, - } - - d, err := retry.FilterDeposits(s.mockPropStorer, deposits, validResource, validDomain) - - expectedDeposits := make([]*message.Message, 0) - s.Nil(err) - s.Equal(d, expectedDeposits) -} - -func (s *FilterDepositsTestSuite) Test_FilterDeposits() { - validResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{3}, 31)) - invalidResource := evm.SliceTo32Bytes(common.LeftPadBytes([]byte{4}, 31)) - invalidDomain := uint8(3) - validDomain := uint8(4) - - executedNonce := uint64(1) - failedNonce := uint64(3) - pendingNonce := uint64(4) - failedExecutionCheckNonce := uint64(5) - - deposits := make(map[uint8][]*message.Message) - deposits[invalidDomain] = []*message.Message{ - { - Destination: invalidDomain, - Data: transfer.TransferMessageData{ - DepositNonce: 1, - ResourceId: validResource, - }, - }, - } - deposits[validDomain] = []*message.Message{ - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: executedNonce, - ResourceId: validResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: 2, - ResourceId: invalidResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: failedNonce, - ResourceId: validResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: failedExecutionCheckNonce, - ResourceId: validResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: pendingNonce, - ResourceId: validResource, - }, - }, - } - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, executedNonce).Return(store.ExecutedProp, nil) - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, failedNonce).Return(store.FailedProp, nil) - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, pendingNonce).Return(store.PendingProp, nil) - s.mockPropStorer.EXPECT().PropStatus(invalidDomain, validDomain, failedExecutionCheckNonce).Return(store.PendingProp, fmt.Errorf("error")) - s.mockPropStorer.EXPECT().StorePropStatus(invalidDomain, validDomain, pendingNonce, store.FailedProp).Return(nil) - - d, err := retry.FilterDeposits(s.mockPropStorer, deposits, validResource, validDomain) - - expectedDeposits := []*message.Message{ - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: failedNonce, - ResourceId: validResource, - }, - }, - { - Source: invalidDomain, - Destination: validDomain, - Data: transfer.TransferMessageData{ - DepositNonce: pendingNonce, - ResourceId: validResource, - }, - }, - } - s.Nil(err) - s.Equal(d, expectedDeposits) -} diff --git a/relayer/transfer/transfer.go b/relayer/transfer/transfer.go deleted file mode 100644 index 434071f1..00000000 --- a/relayer/transfer/transfer.go +++ /dev/null @@ -1,55 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package transfer - -import ( - "github.com/sygmaprotocol/sygma-core/relayer/message" - "github.com/sygmaprotocol/sygma-core/relayer/proposal" -) - -type TransferType string - -const ( - FungibleTransfer TransferType = "fungible" - SemiFungibleTransfer TransferType = "semiFungible" - NonFungibleTransfer TransferType = "nonFungible" - PermissionedGenericTransfer TransferType = "permissionedGeneric" - PermissionlessGenericTransfer TransferType = "permissionlessGeneric" -) - -type TransferMessageData struct { - DepositNonce uint64 - ResourceId [32]byte - Metadata map[string]interface{} - Payload []interface{} - Type TransferType -} - -const ( - TransferMessageType message.MessageType = "TransferMessage" - TransferProposalType proposal.ProposalType = "TransferProposal" -) - -type TransferMessage struct { - Source uint8 - Destination uint8 - Data TransferMessageData - Type message.MessageType - ID string -} - -type TransferProposalData struct { - DepositNonce uint64 - ResourceId [32]byte - Metadata map[string]interface{} - Data []byte -} - -type TransferProposal struct { - Source uint8 - Destination uint8 - Data TransferProposalData - Type proposal.ProposalType - MessageID string -} diff --git a/store/propstore_test.go b/store/propstore_test.go index 67f2190d..dacc7dd7 100644 --- a/store/propstore_test.go +++ b/store/propstore_test.go @@ -4,7 +4,7 @@ import ( "errors" "testing" - "github.com/ChainSafe/sygma-relayer/store" + "github.com/sprintertech/sprinter-signing/store" "github.com/stretchr/testify/suite" mock_store "github.com/sygmaprotocol/sygma-core/mock" "github.com/syndtr/goleveldb/leveldb" diff --git a/topology/encryption_test.go b/topology/encryption_test.go index 971b3fc4..85d5ed47 100644 --- a/topology/encryption_test.go +++ b/topology/encryption_test.go @@ -7,7 +7,7 @@ import ( "encoding/json" "testing" - "github.com/ChainSafe/sygma-relayer/topology" + "github.com/sprintertech/sprinter-signing/topology" "github.com/stretchr/testify/suite" ) diff --git a/topology/mock/topology.go b/topology/mock/topology.go index ea686d6e..6ceb2b02 100644 --- a/topology/mock/topology.go +++ b/topology/mock/topology.go @@ -8,8 +8,8 @@ import ( http "net/http" reflect "reflect" - topology "github.com/ChainSafe/sygma-relayer/topology" gomock "github.com/golang/mock/gomock" + topology "github.com/sprintertech/sprinter-signing/topology" ) // MockFetcher is a mock of Fetcher interface. diff --git a/topology/store_test.go b/topology/store_test.go index c16e2d94..600a1a2d 100644 --- a/topology/store_test.go +++ b/topology/store_test.go @@ -8,7 +8,7 @@ import ( "reflect" "testing" - "github.com/ChainSafe/sygma-relayer/topology" + "github.com/sprintertech/sprinter-signing/topology" "github.com/stretchr/testify/suite" ) diff --git a/topology/topology.go b/topology/topology.go index 747f10c5..08d62f88 100644 --- a/topology/topology.go +++ b/topology/topology.go @@ -13,9 +13,9 @@ import ( "strconv" "strings" - "github.com/ChainSafe/sygma-relayer/config/relayer" "github.com/libp2p/go-libp2p/core/peer" "github.com/rs/zerolog/log" + "github.com/sprintertech/sprinter-signing/config/relayer" ) type NetworkTopology struct { diff --git a/topology/topology_test.go b/topology/topology_test.go index b776e609..30d4c991 100644 --- a/topology/topology_test.go +++ b/topology/topology_test.go @@ -11,13 +11,13 @@ import ( "strings" "testing" - "github.com/ChainSafe/sygma-relayer/config/relayer" - "github.com/ChainSafe/sygma-relayer/topology" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/peer" + "github.com/sprintertech/sprinter-signing/config/relayer" + "github.com/sprintertech/sprinter-signing/topology" "github.com/stretchr/testify/suite" - mock_topology "github.com/ChainSafe/sygma-relayer/topology/mock" + mock_topology "github.com/sprintertech/sprinter-signing/topology/mock" ) type TopologyTestSuite struct { @@ -43,9 +43,9 @@ func (s *TopologyTestSuite) Test_ProcessRawTopology_ValidTopology() { }) s.Nil(err) s.Equal(2, topology.Threshold) - s.Equal("QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT", topology.Peers[0].ID.Pretty()) - s.Equal("QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK", topology.Peers[1].ID.Pretty()) - s.Equal("QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX", topology.Peers[2].ID.Pretty()) + s.Equal("QmeTuMtdpPB7zKDgmobEwSvxodrf5aFVSmBXX3SQJVjJaT", topology.Peers[0].ID.String()) + s.Equal("QmYAYuLUPNwYEBYJaKHcE7NKjUhiUV8txx2xDXHvcYa1xK", topology.Peers[1].ID.String()) + s.Equal("QmcvEg7jGvuxdsUFRUiE4VdrL2P1Yeju5L83BsJvvXz7zX", topology.Peers[2].ID.String()) } func (s *TopologyTestSuite) Test_ProcessRawTopology_InvalidPeerAddress() { diff --git a/tss/coordinator.go b/tss/coordinator.go index 60559004..987454e9 100644 --- a/tss/coordinator.go +++ b/tss/coordinator.go @@ -5,19 +5,20 @@ package tss import ( "context" + "errors" "fmt" "sync" "time" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/common" - "github.com/ChainSafe/sygma-relayer/tss/message" "github.com/binance-chain/tss-lib/tss" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/rs/zerolog/log" "github.com/sourcegraph/conc/pool" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/comm/elector" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/common" + "github.com/sprintertech/sprinter-signing/tss/message" "golang.org/x/exp/slices" ) @@ -99,7 +100,7 @@ func (c *Coordinator) Execute(ctx context.Context, tssProcesses []TssProcess, re coordinatorElector := c.electorFactory.CoordinatorElector(sessionID, elector.Static) coordinator, _ := coordinatorElector.Coordinator(ctx, tssProcesses[0].ValidCoordinators()) - log.Info().Str("SessionID", sessionID).Msgf("Starting process with coordinator %s", coordinator.Pretty()) + log.Info().Str("SessionID", sessionID).Msgf("Starting process with coordinator %s", coordinator.String()) p.Go(func(ctx context.Context) error { err := c.start(ctx, tssProcesses, coordinator, resultChn, []peer.ID{}) @@ -132,40 +133,37 @@ func (c *Coordinator) handleError(ctx context.Context, err error, tssProcesses [ return c.watchExecution(ctx, tssProcesses[0], peer.ID("")) }) sessionID := tssProcesses[0].SessionID() - switch err := err.(type) { - case *CoordinatorError: - { - log.Warn().Str("SessionID", sessionID).Msgf("Tss process failed with error %+v", err) - excludedPeers := []peer.ID{err.Peer} - rp.Go(func(ctx context.Context) error { return c.retry(ctx, tssProcesses, resultChn, excludedPeers) }) - } - case *comm.CommunicationError: - { - log.Err(err).Str("SessionID", sessionID).Msgf("Tss process failed with error %+v", err) - rp.Go(func(ctx context.Context) error { return c.retry(ctx, tssProcesses, resultChn, []peer.ID{}) }) - } - case *tss.Error: - { - log.Err(err).Str("SessionID", sessionID).Msgf("Tss process failed with error %+v", err) - excludedPeers, err := common.PeersFromParties(err.Culprits()) - if err != nil { - return err - } - rp.Go(func(ctx context.Context) error { return c.retry(ctx, tssProcesses, resultChn, excludedPeers) }) - } - case *SubsetError: - { - // wait for start message if existing singing process fails - rp.Go(func(ctx context.Context) error { - return c.waitForStart(ctx, tssProcesses, resultChn, peer.ID(""), c.TssTimeout) - }) - } - default: - { + var coordinatorError *CoordinatorError + var commError *comm.CommunicationError + var subsetError *SubsetError + var tssError *tss.Error + if errors.As(err, &coordinatorError) { + coordinatorError = err.(*CoordinatorError) + log.Warn().Str("SessionID", sessionID).Msgf("Tss process failed with error %+v", err) + + excludedPeers := []peer.ID{coordinatorError.Peer} + rp.Go(func(ctx context.Context) error { return c.retry(ctx, tssProcesses, resultChn, excludedPeers) }) + } else if errors.Is(err, commError) { + log.Err(err).Str("SessionID", sessionID).Msgf("Tss process failed with error %+v", err) + rp.Go(func(ctx context.Context) error { return c.retry(ctx, tssProcesses, resultChn, []peer.ID{}) }) + } else if errors.Is(err, &tss.Error{}) { + tssError = err.(*tss.Error) + log.Err(err).Str("SessionID", sessionID).Msgf("Tss process failed with error %+v", err) + excludedPeers, err := common.PeersFromParties(tssError.Culprits()) + if err != nil { return err } + rp.Go(func(ctx context.Context) error { return c.retry(ctx, tssProcesses, resultChn, excludedPeers) }) + } else if errors.As(err, &subsetError) { + // wait for start message if existing singing process fails + rp.Go(func(ctx context.Context) error { + return c.waitForStart(ctx, tssProcesses, resultChn, peer.ID(""), c.TssTimeout) + }) + } else { + return err } + return rp.Wait() } @@ -191,7 +189,7 @@ func (c *Coordinator) watchExecution(ctx context.Context, tssProcess TssProcess, case msg := <-failChn: { // ignore messages that are not from coordinator - if msg.From.Pretty() != coordinator.Pretty() { + if msg.From.String() != coordinator.String() { continue } @@ -203,7 +201,7 @@ func (c *Coordinator) watchExecution(ctx context.Context, tssProcess TssProcess, // start initiates listeners for coordinator and participants with static calculated coordinator func (c *Coordinator) start(ctx context.Context, tssProcesses []TssProcess, coordinator peer.ID, resultChn chan interface{}, excludedPeers []peer.ID) error { - if coordinator.Pretty() == c.host.ID().Pretty() { + if coordinator.String() == c.host.ID().String() { return c.initiate(ctx, tssProcesses, resultChn, excludedPeers) } else { return c.waitForStart(ctx, tssProcesses, resultChn, coordinator, c.CoordinatorTimeout) @@ -314,7 +312,7 @@ func (c *Coordinator) waitForStart( case wMsg := <-msgChan: { if coordinator != "" && wMsg.From != coordinator { - log.Warn().Msgf("Received initate message from a peer %s that is not the coordinator %s", wMsg.From.Pretty(), coordinator.Pretty()) + log.Warn().Msgf("Received initate message from a peer %s that is not the coordinator %s", wMsg.From.String(), coordinator.String()) continue } @@ -332,7 +330,7 @@ func (c *Coordinator) waitForStart( // having startMsg.From as "" is special case when peer is not selected in subset // but should wait for start message if existing singing process fails if coordinator != "" && startMsg.From != coordinator { - log.Warn().Msgf("Received start message from a peer %s that is not the coordinator %s", startMsg.From.Pretty(), coordinator.Pretty()) + log.Warn().Msgf("Received start message from a peer %s that is not the coordinator %s", startMsg.From.String(), coordinator.String()) continue } diff --git a/tss/ecdsa/common/base.go b/tss/ecdsa/common/base.go index aec2ec7a..67e08050 100644 --- a/tss/ecdsa/common/base.go +++ b/tss/ecdsa/common/base.go @@ -9,12 +9,12 @@ import ( "math/big" "runtime/debug" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/tss/message" "github.com/binance-chain/tss-lib/tss" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/rs/zerolog" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/tss/message" ) type Party interface { @@ -66,7 +66,7 @@ func (b *BaseTss) ProcessInboundMessages(ctx context.Context, msgChan chan *comm ok, err := b.Party.UpdateFromBytes( msg.MsgBytes, - b.PartyStore[wMsg.From.Pretty()], + b.PartyStore[wMsg.From.String()], msg.IsBroadcast, new(big.Int).SetBytes([]byte(b.SID))) if !ok { diff --git a/tss/ecdsa/common/base_test.go b/tss/ecdsa/common/base_test.go index b2dd4176..c4ccc9d3 100644 --- a/tss/ecdsa/common/base_test.go +++ b/tss/ecdsa/common/base_test.go @@ -11,15 +11,15 @@ import ( "testing" "time" - "github.com/ChainSafe/sygma-relayer/comm" - mock_communication "github.com/ChainSafe/sygma-relayer/comm/mock" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/common" - mock_tss "github.com/ChainSafe/sygma-relayer/tss/ecdsa/common/mock" - "github.com/ChainSafe/sygma-relayer/tss/message" "github.com/binance-chain/tss-lib/tss" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/peer" "github.com/sourcegraph/conc/pool" + "github.com/sprintertech/sprinter-signing/comm" + mock_communication "github.com/sprintertech/sprinter-signing/comm/mock" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/common" + mock_tss "github.com/sprintertech/sprinter-signing/tss/ecdsa/common/mock" + "github.com/sprintertech/sprinter-signing/tss/message" "github.com/stretchr/testify/suite" ) diff --git a/tss/ecdsa/common/utils_test.go b/tss/ecdsa/common/utils_test.go index 8a7d2395..4d38064f 100644 --- a/tss/ecdsa/common/utils_test.go +++ b/tss/ecdsa/common/utils_test.go @@ -6,9 +6,9 @@ package common_test import ( "testing" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/common" "github.com/binance-chain/tss-lib/tss" "github.com/libp2p/go-libp2p/core/peer" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/common" "github.com/stretchr/testify/suite" ) diff --git a/tss/ecdsa/keygen/keygen.go b/tss/ecdsa/keygen/keygen.go index 245111c5..dac91201 100644 --- a/tss/ecdsa/keygen/keygen.go +++ b/tss/ecdsa/keygen/keygen.go @@ -8,9 +8,6 @@ import ( "errors" "math/big" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/common" "github.com/binance-chain/tss-lib/ecdsa/keygen" "github.com/binance-chain/tss-lib/tss" "github.com/ethereum/go-ethereum/crypto" @@ -18,6 +15,9 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/rs/zerolog/log" "github.com/sourcegraph/conc/pool" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/keyshare" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/common" ) type ECDSAKeyshareStorer interface { @@ -73,7 +73,7 @@ func (k *Keygen) Run( k.PopulatePartyStore(parties) pCtx := tss.NewPeerContext(parties) - tssParams, err := tss.NewParameters(tss.S256(), pCtx, k.PartyStore[k.Host.ID().Pretty()], len(parties), k.threshold) + tssParams, err := tss.NewParameters(tss.S256(), pCtx, k.PartyStore[k.Host.ID().String()], len(parties), k.threshold) if err != nil { return err } diff --git a/tss/ecdsa/keygen/keygen_test.go b/tss/ecdsa/keygen/keygen_test.go index 2e88e5b5..1398fdcf 100644 --- a/tss/ecdsa/keygen/keygen_test.go +++ b/tss/ecdsa/keygen/keygen_test.go @@ -8,14 +8,14 @@ import ( "testing" "time" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/keygen" - tsstest "github.com/ChainSafe/sygma-relayer/tss/test" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/peer" "github.com/sourcegraph/conc/pool" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/comm/elector" + "github.com/sprintertech/sprinter-signing/tss" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/keygen" + tsstest "github.com/sprintertech/sprinter-signing/tss/test" "github.com/stretchr/testify/suite" ) diff --git a/tss/ecdsa/resharing/resharing.go b/tss/ecdsa/resharing/resharing.go index f84b7dd2..18793618 100644 --- a/tss/ecdsa/resharing/resharing.go +++ b/tss/ecdsa/resharing/resharing.go @@ -9,10 +9,6 @@ import ( "errors" "math/big" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/common" - "github.com/ChainSafe/sygma-relayer/tss/util" "github.com/binance-chain/tss-lib/ecdsa/keygen" "github.com/binance-chain/tss-lib/ecdsa/resharing" "github.com/binance-chain/tss-lib/tss" @@ -20,6 +16,10 @@ import ( "github.com/libp2p/go-libp2p/core/peer" "github.com/rs/zerolog/log" "github.com/sourcegraph/conc/pool" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/keyshare" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/common" + "github.com/sprintertech/sprinter-signing/tss/util" "golang.org/x/exp/slices" ) @@ -99,7 +99,7 @@ func (r *Resharing) Run( tss.S256(), oldCtx, newCtx, - r.PartyStore[r.Host.ID().Pretty()], + r.PartyStore[r.Host.ID().String()], len(oldParties), startParams.OldThreshold, len(newParties), @@ -154,7 +154,7 @@ func (r *Resharing) ValidCoordinators() []peer.ID { validCoordinators := make(peer.IDSlice, 0) for _, peer := range peers { for _, subsetPeer := range r.key.Peers { - if subsetPeer.Pretty() == peer.Pretty() { + if subsetPeer.String() == peer.String() { validCoordinators = append(validCoordinators, peer) break } diff --git a/tss/ecdsa/resharing/resharing_test.go b/tss/ecdsa/resharing/resharing_test.go index 737f813f..f71436cb 100644 --- a/tss/ecdsa/resharing/resharing_test.go +++ b/tss/ecdsa/resharing/resharing_test.go @@ -8,17 +8,17 @@ import ( "fmt" "testing" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/resharing" - tsstest "github.com/ChainSafe/sygma-relayer/tss/test" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peerstore" "github.com/sourcegraph/conc/pool" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/comm/elector" + "github.com/sprintertech/sprinter-signing/keyshare" + "github.com/sprintertech/sprinter-signing/tss" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/resharing" + tsstest "github.com/sprintertech/sprinter-signing/tss/test" "github.com/stretchr/testify/suite" ) diff --git a/tss/ecdsa/signing/signing.go b/tss/ecdsa/signing/signing.go index 1241d334..4a550696 100644 --- a/tss/ecdsa/signing/signing.go +++ b/tss/ecdsa/signing/signing.go @@ -20,11 +20,11 @@ import ( "github.com/sourcegraph/conc/pool" "golang.org/x/exp/slices" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/keyshare" - errors "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/common" - "github.com/ChainSafe/sygma-relayer/tss/util" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/keyshare" + errors "github.com/sprintertech/sprinter-signing/tss" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/common" + "github.com/sprintertech/sprinter-signing/tss/util" ) type SaveDataFetcher interface { @@ -98,7 +98,7 @@ func (s *Signing) Run( parties := common.PartiesFromPeers(s.Peers) s.PopulatePartyStore(parties) pCtx := tss.NewPeerContext(parties) - tssParams, err := tss.NewParameters(tss.S256(), pCtx, s.PartyStore[s.Host.ID().Pretty()], len(parties), s.key.Threshold) + tssParams, err := tss.NewParameters(tss.S256(), pCtx, s.PartyStore[s.Host.ID().String()], len(parties), s.key.Threshold) if err != nil { return err } diff --git a/tss/ecdsa/signing/signing_test.go b/tss/ecdsa/signing/signing_test.go index 68e327ac..70e7e63b 100644 --- a/tss/ecdsa/signing/signing_test.go +++ b/tss/ecdsa/signing/signing_test.go @@ -10,15 +10,15 @@ import ( "testing" "time" - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/keygen" - "github.com/ChainSafe/sygma-relayer/tss/ecdsa/signing" - tsstest "github.com/ChainSafe/sygma-relayer/tss/test" "github.com/libp2p/go-libp2p/core/peer" "github.com/sourcegraph/conc/pool" + "github.com/sprintertech/sprinter-signing/comm" + "github.com/sprintertech/sprinter-signing/comm/elector" + "github.com/sprintertech/sprinter-signing/keyshare" + "github.com/sprintertech/sprinter-signing/tss" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/keygen" + "github.com/sprintertech/sprinter-signing/tss/ecdsa/signing" + tsstest "github.com/sprintertech/sprinter-signing/tss/test" "github.com/stretchr/testify/suite" ) diff --git a/tss/errors.go b/tss/errors.go index 490ed743..68c19337 100644 --- a/tss/errors.go +++ b/tss/errors.go @@ -14,7 +14,7 @@ type CoordinatorError struct { } func (ce *CoordinatorError) Error() string { - return fmt.Sprintf("coordinator %s non-responsive", ce.Peer.Pretty()) + return fmt.Sprintf("coordinator %s non-responsive", ce.Peer.String()) } type SubsetError struct { diff --git a/tss/frost/common/base.go b/tss/frost/common/base.go deleted file mode 100644 index 7fdd37f6..00000000 --- a/tss/frost/common/base.go +++ /dev/null @@ -1,124 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package common - -import ( - "context" - "fmt" - "runtime/debug" - "time" - - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/binance-chain/tss-lib/tss" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/rs/zerolog" - "github.com/taurusgroup/multi-party-sig/pkg/protocol" -) - -const STARTUP_PAUSE = time.Second * 10 - -// BaseTss contains common variables and methods to -// all tss processes. -type BaseFrostTss struct { - Host host.Host - SID string - Communication comm.Communication - Log zerolog.Logger - Peers []peer.ID - Handler *protocol.MultiHandler - Done chan bool - - Cancel context.CancelFunc -} - -// ProcessInboundMessages processes messages from tss parties and updates local party accordingly. -func (k *BaseFrostTss) ProcessInboundMessages(ctx context.Context, msgChan chan *comm.WrappedMessage) (err error) { - defer func() { - if r := recover(); r != nil { - err = fmt.Errorf("%s", string(debug.Stack())) - } - }() - - for { - select { - case wMsg := <-msgChan: - { - k.Log.Debug().Msgf("processed inbound message from %s", wMsg.From) - - msg := &protocol.Message{} - err := msg.UnmarshalBinary(wMsg.Payload) - if err != nil { - return err - } - if !k.Handler.CanAccept(msg) { - continue - } - go k.Handler.Accept(msg) - } - case <-ctx.Done(): - return nil - } - } -} - -// ProcessOutboundMessages sends messages received from tss out channel to target peers. -// On context cancel stops listening to channel and exits. -func (k *BaseFrostTss) ProcessOutboundMessages(ctx context.Context, outChn chan tss.Message, messageType comm.MessageType) error { - // delay sending messages until everyone is ready to accept them - time.Sleep(STARTUP_PAUSE) - - for { - select { - case msg, ok := <-k.Handler.Listen(): - { - if !ok { - k.Done <- true - return nil - } - - msgBytes, err := msg.MarshalBinary() - if err != nil { - return err - } - - peers, err := k.BroadcastPeers(msg) - if err != nil { - return err - } - - k.Log.Debug().Msgf("sending message %s to %s", msg, peers) - - err = k.Communication.Broadcast(peers, msgBytes, messageType, k.SessionID()) - if err != nil { - return err - } - } - case <-ctx.Done(): - { - return nil - } - } - } -} - -func (k *BaseFrostTss) BroadcastPeers(msg *protocol.Message) ([]peer.ID, error) { - if msg.Broadcast { - return k.Peers, nil - } else { - if string(msg.To) == "" { - return k.Peers, nil - } - - p, err := peer.Decode(string(msg.To)) - if err != nil { - return nil, err - } - return []peer.ID{p}, nil - } -} - -func (b *BaseFrostTss) SessionID() string { - return b.SID -} diff --git a/tss/frost/common/util.go b/tss/frost/common/util.go deleted file mode 100644 index 22de1fdb..00000000 --- a/tss/frost/common/util.go +++ /dev/null @@ -1,19 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package common - -import ( - mapset "github.com/deckarep/golang-set/v2" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/taurusgroup/multi-party-sig/pkg/party" -) - -func PartyIDSFromPeers(peers peer.IDSlice) []party.ID { - peerSet := mapset.NewSet[peer.ID](peers...) - idSlice := make([]party.ID, len(peerSet.ToSlice())) - for i, peer := range peerSet.ToSlice() { - idSlice[i] = party.ID(peer.String()) - } - return idSlice -} diff --git a/tss/frost/keygen/keygen.go b/tss/frost/keygen/keygen.go deleted file mode 100644 index fbd9801d..00000000 --- a/tss/frost/keygen/keygen.go +++ /dev/null @@ -1,151 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package keygen - -import ( - "context" - "encoding/hex" - "errors" - - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/tss/frost/common" - "github.com/binance-chain/tss-lib/tss" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/rs/zerolog/log" - "github.com/sourcegraph/conc/pool" - "github.com/taurusgroup/multi-party-sig/pkg/party" - "github.com/taurusgroup/multi-party-sig/pkg/protocol" - "github.com/taurusgroup/multi-party-sig/protocols/frost" -) - -type FrostKeyshareStorer interface { - StoreKeyshare(keyshare keyshare.FrostKeyshare) error - LockKeyshare() - UnlockKeyshare() - GetKeyshare() (keyshare.FrostKeyshare, error) -} - -type Keygen struct { - common.BaseFrostTss - storer FrostKeyshareStorer - threshold int - subscriptionID comm.SubscriptionID -} - -func NewKeygen( - sessionID string, - threshold int, - host host.Host, - comm comm.Communication, - storer FrostKeyshareStorer, -) *Keygen { - storer.LockKeyshare() - return &Keygen{ - BaseFrostTss: common.BaseFrostTss{ - Host: host, - Communication: comm, - Peers: host.Peerstore().Peers(), - SID: sessionID, - Log: log.With().Str("SessionID", sessionID).Str("Process", "keygen").Logger(), - Cancel: func() {}, - Done: make(chan bool), - }, - storer: storer, - threshold: threshold, - } -} - -// Run initializes the keygen party and runs the keygen tss process. -// -// Should be run only after all the participating parties are ready. -func (k *Keygen) Run( - ctx context.Context, - coordinator bool, - resultChn chan interface{}, - params []byte, -) error { - ctx, k.Cancel = context.WithCancel(ctx) - - outChn := make(chan tss.Message) - msgChn := make(chan *comm.WrappedMessage) - k.subscriptionID = k.Communication.Subscribe(k.SessionID(), comm.TssKeyGenMsg, msgChn) - - var err error - k.Handler, err = protocol.NewMultiHandler( - frost.KeygenTaproot( - party.ID(k.Host.ID().String()), - common.PartyIDSFromPeers(append(k.Host.Peerstore().Peers(), k.Host.ID())), - k.threshold), - []byte(k.SessionID())) - if err != nil { - return err - } - p := pool.New().WithContext(ctx).WithCancelOnError() - p.Go(func(ctx context.Context) error { return k.ProcessInboundMessages(ctx, msgChn) }) - p.Go(func(ctx context.Context) error { return k.processEndMessage(ctx) }) - p.Go(func(ctx context.Context) error { return k.ProcessOutboundMessages(ctx, outChn, comm.TssKeyGenMsg) }) - - return p.Wait() -} - -// Stop ends all subscriptions created when starting the tss process and unlocks keyshare. -func (k *Keygen) Stop() { - k.Communication.UnSubscribe(k.subscriptionID) - k.storer.UnlockKeyshare() - k.Cancel() -} - -// Ready returns true if all parties from the peerstore are ready. -// Error is returned if excluded peers exist as we need all peers to participate -// in keygen process. -func (k *Keygen) Ready(readyPeers []peer.ID, excludedPeers []peer.ID) (bool, error) { - if len(excludedPeers) > 0 { - return false, errors.New("error") - } - - return len(readyPeers) == len(k.Host.Peerstore().Peers()), nil -} - -// ValidCoordinators returns all peers in peerstore -func (k *Keygen) ValidCoordinators() []peer.ID { - return k.Peers -} - -func (k *Keygen) StartParams(readyPeers []peer.ID) []byte { - return []byte{} -} - -func (k *Keygen) Retryable() bool { - return false -} - -// processEndMessage waits for the final message with generated key share and stores it locally. -func (k *Keygen) processEndMessage(ctx context.Context) error { - - for { - select { - case <-k.Done: - { - result, err := k.Handler.Result() - if err != nil { - return err - } - taprootConfig := result.(*frost.TaprootConfig) - - err = k.storer.StoreKeyshare(keyshare.NewFrostKeyshare(taprootConfig, k.threshold, k.Peers)) - if err != nil { - return err - } - - k.Log.Info().Msgf("Generated public key %s", hex.EncodeToString(taprootConfig.PublicKey)) - k.Cancel() - return nil - } - case <-ctx.Done(): - return nil - } - } -} diff --git a/tss/frost/keygen/keygen_test.go b/tss/frost/keygen/keygen_test.go deleted file mode 100644 index 3b80fe44..00000000 --- a/tss/frost/keygen/keygen_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package keygen_test - -import ( - "context" - "testing" - - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/frost/keygen" - tsstest "github.com/ChainSafe/sygma-relayer/tss/test" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/sourcegraph/conc/pool" - "github.com/stretchr/testify/suite" - "go.uber.org/mock/gomock" -) - -type KeygenTestSuite struct { - tsstest.CoordinatorTestSuite -} - -func TestRunKeygenTestSuite(t *testing.T) { - suite.Run(t, new(KeygenTestSuite)) -} - -func (s *KeygenTestSuite) Test_ValidKeygenProcess() { - communicationMap := make(map[peer.ID]*tsstest.TestCommunication) - coordinators := []*tss.Coordinator{} - processes := []tss.TssProcess{} - - for _, host := range s.CoordinatorTestSuite.Hosts { - communication := tsstest.TestCommunication{ - Host: host, - Subscriptions: make(map[comm.SubscriptionID]chan *comm.WrappedMessage), - } - communicationMap[host.ID()] = &communication - s.MockFrostStorer.EXPECT().LockKeyshare() - keygen := keygen.NewKeygen("keygen", s.Threshold, host, &communication, s.MockFrostStorer) - electorFactory := elector.NewCoordinatorElectorFactory(host, s.BullyConfig) - coordinators = append(coordinators, tss.NewCoordinator(host, &communication, electorFactory)) - processes = append(processes, keygen) - } - tsstest.SetupCommunication(communicationMap) - s.MockFrostStorer.EXPECT().StoreKeyshare(gomock.Any()).Times(3) - s.MockFrostStorer.EXPECT().UnlockKeyshare().Times(3) - - pool := pool.New().WithContext(context.Background()).WithCancelOnError() - for i, coordinator := range coordinators { - pool.Go(func(ctx context.Context) error { return coordinator.Execute(ctx, []tss.TssProcess{processes[i]}, nil) }) - } - - err := pool.Wait() - s.Nil(err) -} diff --git a/tss/frost/resharing/resharing.go b/tss/frost/resharing/resharing.go deleted file mode 100644 index 2eae4e20..00000000 --- a/tss/frost/resharing/resharing.go +++ /dev/null @@ -1,201 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package resharing - -import ( - "context" - "encoding/json" - - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/tss/frost/common" - "github.com/binance-chain/tss-lib/tss" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/rs/zerolog/log" - "github.com/sourcegraph/conc/pool" - "github.com/taurusgroup/multi-party-sig/pkg/math/curve" - "github.com/taurusgroup/multi-party-sig/pkg/party" - "github.com/taurusgroup/multi-party-sig/pkg/protocol" - "github.com/taurusgroup/multi-party-sig/pkg/taproot" - "github.com/taurusgroup/multi-party-sig/protocols/frost" -) - -type startParams struct { - PublicKey taproot.PublicKey - VerificationShares map[party.ID]*curve.Secp256k1Point -} -type FrostKeyshareStorer interface { - GetKeyshare() (keyshare.FrostKeyshare, error) - StoreKeyshare(keyshare keyshare.FrostKeyshare) error - LockKeyshare() - UnlockKeyshare() -} - -type Resharing struct { - common.BaseFrostTss - key keyshare.FrostKeyshare - subscriptionID comm.SubscriptionID - storer FrostKeyshareStorer - newThreshold int -} - -func NewResharing( - sessionID string, - threshold int, - host host.Host, - comm comm.Communication, - storer FrostKeyshareStorer, -) *Resharing { - storer.LockKeyshare() - var key keyshare.FrostKeyshare - key, err := storer.GetKeyshare() - if err != nil { - // empty key for parties that don't have one - key = keyshare.FrostKeyshare{ - Key: &frost.TaprootConfig{ - Threshold: threshold, - PublicKey: nil, - PrivateShare: &curve.Secp256k1Scalar{}, - VerificationShares: make(map[party.ID]*curve.Secp256k1Point), - ID: party.ID(host.ID().Pretty()), - }, - } - } - key.Key.Threshold = threshold - - return &Resharing{ - BaseFrostTss: common.BaseFrostTss{ - Host: host, - Communication: comm, - Peers: host.Peerstore().Peers(), - SID: sessionID, - Log: log.With().Str("SessionID", sessionID).Str("Process", "resharing").Logger(), - Cancel: func() {}, - Done: make(chan bool), - }, - key: key, - storer: storer, - newThreshold: threshold, - } -} - -// Run initializes the signing party and runs the resharing tss process. -// Params contains peer subset that leaders sends with start message. -func (r *Resharing) Run( - ctx context.Context, - coordinator bool, - resultChn chan interface{}, - params []byte, -) error { - ctx, r.Cancel = context.WithCancel(ctx) - var err error - - outChn := make(chan tss.Message) - msgChn := make(chan *comm.WrappedMessage) - r.subscriptionID = r.Communication.Subscribe(r.SessionID(), comm.TssReshareMsg, msgChn) - startParams, err := r.unmarshallStartParams(params) - if err != nil { - return err - } - // initialize verification shares for the new relayer - if len(r.key.Key.VerificationShares) == 0 { - r.key.Key.VerificationShares = startParams.VerificationShares - r.key.Key.PublicKey = startParams.PublicKey - } - - // Add a new verification share for each party that does not already have one - partyIds := common.PartyIDSFromPeers(append(r.Host.Peerstore().Peers(), r.Host.ID())) - group := curve.Secp256k1{} - for _, k := range partyIds { - if r.key.Key.VerificationShares[k] == nil { - r.key.Key.VerificationShares[k] = group.NewPoint().(*curve.Secp256k1Point) - } - } - - r.Handler, err = protocol.NewMultiHandler( - frost.RefreshTaproot( - r.key.Key, - common.PartyIDSFromPeers(append(r.Host.Peerstore().Peers(), r.Host.ID()))), - []byte(r.SessionID())) - if err != nil { - return err - } - - p := pool.New().WithContext(ctx).WithCancelOnError() - p.Go(func(ctx context.Context) error { return r.ProcessInboundMessages(ctx, msgChn) }) - p.Go(func(ctx context.Context) error { return r.processEndMessage(ctx) }) - p.Go(func(ctx context.Context) error { return r.ProcessOutboundMessages(ctx, outChn, comm.TssReshareMsg) }) - - r.Log.Info().Msgf("Started resharing process") - return p.Wait() -} - -// Stop ends all subscriptions created when starting the tss process and unlocks keyshare. -func (r *Resharing) Stop() { - r.Log.Info().Msgf("Stopping tss process.") - r.Communication.UnSubscribe(r.subscriptionID) - r.storer.UnlockKeyshare() - r.Cancel() -} - -// Ready returns true if all parties from peerstore are ready -func (r *Resharing) Ready(readyPeers []peer.ID, excludedPeers []peer.ID) (bool, error) { - return len(readyPeers) == len(r.Host.Peerstore().Peers()), nil -} - -func (r *Resharing) ValidCoordinators() []peer.ID { - return r.key.Peers -} - -func (r *Resharing) StartParams(readyPeers []peer.ID) []byte { - startParams := &startParams{ - PublicKey: r.key.Key.PublicKey, - VerificationShares: r.key.Key.VerificationShares, - } - paramBytes, _ := json.Marshal(startParams) - return paramBytes -} - -func (r *Resharing) unmarshallStartParams(paramBytes []byte) (startParams, error) { - var startParams startParams - err := json.Unmarshal(paramBytes, &startParams) - if err != nil { - return startParams, err - } - - return startParams, nil -} - -func (r *Resharing) Retryable() bool { - return false -} - -// processEndMessage waits for the final message with generated key share and stores it locally. -func (r *Resharing) processEndMessage(ctx context.Context) error { - - for { - select { - case <-r.Done: - { - result, err := r.Handler.Result() - if err != nil { - return err - } - taprootConfig := result.(*frost.TaprootConfig) - - err = r.storer.StoreKeyshare(keyshare.NewFrostKeyshare(taprootConfig, r.newThreshold, r.Peers)) - if err != nil { - return err - } - - r.Log.Info().Msgf("Refreshed key") - r.Cancel() - return nil - } - case <-ctx.Done(): - return nil - } - } -} diff --git a/tss/frost/resharing/resharing_test.go b/tss/frost/resharing/resharing_test.go deleted file mode 100644 index 177b3896..00000000 --- a/tss/frost/resharing/resharing_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package resharing_test - -import ( - "context" - "fmt" - "testing" - - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/frost/resharing" - tsstest "github.com/ChainSafe/sygma-relayer/tss/test" - "github.com/golang/mock/gomock" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/peerstore" - "github.com/sourcegraph/conc/pool" - "github.com/stretchr/testify/suite" -) - -type ResharingTestSuite struct { - tsstest.CoordinatorTestSuite -} - -func TestRunResharingTestSuite(t *testing.T) { - suite.Run(t, new(ResharingTestSuite)) -} - -func (s *ResharingTestSuite) Test_ValidResharingProcess_OldAndNewSubset() { - communicationMap := make(map[peer.ID]*tsstest.TestCommunication) - coordinators := []*tss.Coordinator{} - processes := []tss.TssProcess{} - - hosts := []host.Host{} - for i := 0; i < s.PartyNumber+1; i++ { - host, _ := tsstest.NewHost(i) - hosts = append(hosts, host) - } - for _, host := range hosts { - for _, peer := range hosts { - host.Peerstore().AddAddr(peer.ID(), peer.Addrs()[0], peerstore.PermanentAddrTTL) - } - } - - for i, host := range hosts { - communication := tsstest.TestCommunication{ - Host: host, - Subscriptions: make(map[comm.SubscriptionID]chan *comm.WrappedMessage), - } - communicationMap[host.ID()] = &communication - storer := keyshare.NewFrostKeyshareStore(fmt.Sprintf("../../test/keyshares/%d-frost.keyshare", i)) - share, err := storer.GetKeyshare() - s.MockFrostStorer.EXPECT().LockKeyshare() - s.MockFrostStorer.EXPECT().UnlockKeyshare() - s.MockFrostStorer.EXPECT().GetKeyshare().Return(share, err) - s.MockFrostStorer.EXPECT().StoreKeyshare(gomock.Any()).Return(nil) - resharing := resharing.NewResharing("resharing2", 1, host, &communication, s.MockFrostStorer) - electorFactory := elector.NewCoordinatorElectorFactory(host, s.BullyConfig) - coordinators = append(coordinators, tss.NewCoordinator(host, &communication, electorFactory)) - processes = append(processes, resharing) - } - tsstest.SetupCommunication(communicationMap) - - resultChn := make(chan interface{}) - pool := pool.New().WithContext(context.Background()).WithCancelOnError() - for i, coordinator := range coordinators { - pool.Go(func(ctx context.Context) error { - return coordinator.Execute(ctx, []tss.TssProcess{processes[i]}, resultChn) - }) - } - - err := pool.Wait() - s.Nil(err) -} - -func (s *ResharingTestSuite) Test_ValidResharingProcess_RemovePeer() { - communicationMap := make(map[peer.ID]*tsstest.TestCommunication) - coordinators := []*tss.Coordinator{} - processes := []tss.TssProcess{} - - hosts := []host.Host{} - for i := 0; i < s.PartyNumber-1; i++ { - host, _ := tsstest.NewHost(i) - hosts = append(hosts, host) - } - for _, host := range hosts { - for _, peer := range hosts { - host.Peerstore().AddAddr(peer.ID(), peer.Addrs()[0], peerstore.PermanentAddrTTL) - } - } - - for i, host := range hosts { - communication := tsstest.TestCommunication{ - Host: host, - Subscriptions: make(map[comm.SubscriptionID]chan *comm.WrappedMessage), - } - communicationMap[host.ID()] = &communication - storer := keyshare.NewFrostKeyshareStore(fmt.Sprintf("../../test/keyshares/%d-frost.keyshare", i)) - share, err := storer.GetKeyshare() - s.MockFrostStorer.EXPECT().LockKeyshare() - s.MockFrostStorer.EXPECT().UnlockKeyshare() - s.MockFrostStorer.EXPECT().GetKeyshare().Return(share, err) - s.MockFrostStorer.EXPECT().StoreKeyshare(gomock.Any()).Return(nil) - resharing := resharing.NewResharing("resharing2", 1, host, &communication, s.MockFrostStorer) - electorFactory := elector.NewCoordinatorElectorFactory(host, s.BullyConfig) - coordinators = append(coordinators, tss.NewCoordinator(host, &communication, electorFactory)) - processes = append(processes, resharing) - } - tsstest.SetupCommunication(communicationMap) - - resultChn := make(chan interface{}) - pool := pool.New().WithContext(context.Background()).WithCancelOnError() - for i, coordinator := range coordinators { - pool.Go(func(ctx context.Context) error { - return coordinator.Execute(ctx, []tss.TssProcess{processes[i]}, resultChn) - }) - } - - err := pool.Wait() - s.Nil(err) -} diff --git a/tss/frost/signing/signing.go b/tss/frost/signing/signing.go deleted file mode 100644 index 1395efa4..00000000 --- a/tss/frost/signing/signing.go +++ /dev/null @@ -1,237 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package signing - -import ( - "context" - "encoding/hex" - "encoding/json" - - errors "github.com/ChainSafe/sygma-relayer/tss" - "github.com/binance-chain/tss-lib/tss" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/rs/zerolog/log" - "github.com/sourcegraph/conc/pool" - "github.com/taurusgroup/multi-party-sig/pkg/math/curve" - "github.com/taurusgroup/multi-party-sig/pkg/protocol" - "github.com/taurusgroup/multi-party-sig/pkg/taproot" - "github.com/taurusgroup/multi-party-sig/protocols/frost" - "golang.org/x/exp/slices" - - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/tss/frost/common" - "github.com/ChainSafe/sygma-relayer/tss/util" -) - -type Signature struct { - Id int - Signature taproot.Signature -} - -type SaveDataFetcher interface { - GetKeyshare() (keyshare.FrostKeyshare, error) - LockKeyshare() - UnlockKeyshare() -} - -type Signing struct { - common.BaseFrostTss - id int - coordinator bool - key keyshare.FrostKeyshare - msg []byte - resultChn chan interface{} - subscriptionID comm.SubscriptionID -} - -func NewSigning( - id int, - msg []byte, - tweak string, - messageID string, - sessionID string, - host host.Host, - comm comm.Communication, - fetcher SaveDataFetcher, -) (*Signing, error) { - fetcher.LockKeyshare() - defer fetcher.UnlockKeyshare() - key, err := fetcher.GetKeyshare() - if err != nil { - return nil, err - } - - tweakBytes, err := hex.DecodeString(tweak) - if err != nil { - return nil, err - } - - h := &curve.Secp256k1Scalar{} - err = h.UnmarshalBinary(tweakBytes) - if err != nil { - return nil, err - } - key.Key, err = key.Key.Derive(h, nil) - if err != nil { - return nil, err - } - - return &Signing{ - BaseFrostTss: common.BaseFrostTss{ - Host: host, - Communication: comm, - Peers: key.Peers, - SID: sessionID, - Log: log.With().Str("SessionID", sessionID).Str("messageID", messageID).Str("Process", "signing").Logger(), - Cancel: func() {}, - Done: make(chan bool), - }, - key: key, - id: id, - msg: msg, - }, nil -} - -// Run initializes the signing party and runs the signing tss process. -// Params contains peer subset that leaders sends with start message. -func (s *Signing) Run( - ctx context.Context, - coordinator bool, - resultChn chan interface{}, - params []byte, -) error { - s.coordinator = coordinator - s.resultChn = resultChn - ctx, s.Cancel = context.WithCancel(ctx) - - peerSubset, err := s.unmarshallStartParams(params) - if err != nil { - return err - } - s.Peers = peerSubset - if !util.IsParticipant(s.Host.ID(), peerSubset) { - return &errors.SubsetError{Peer: s.Host.ID()} - } - - msgChn := make(chan *comm.WrappedMessage) - s.subscriptionID = s.Communication.Subscribe(s.SessionID(), comm.TssKeySignMsg, msgChn) - s.Handler, err = protocol.NewMultiHandler( - frost.SignTaproot( - s.key.Key, - common.PartyIDSFromPeers(peerSubset), - s.msg, - ), - []byte(s.SessionID())) - if err != nil { - return err - } - - outChn := make(chan tss.Message) - p := pool.New().WithContext(ctx).WithCancelOnError() - p.Go(func(ctx context.Context) error { return s.ProcessInboundMessages(ctx, msgChn) }) - p.Go(func(ctx context.Context) error { return s.processEndMessage(ctx) }) - p.Go(func(ctx context.Context) error { return s.ProcessOutboundMessages(ctx, outChn, comm.TssKeySignMsg) }) - - s.Log.Info().Msgf("Started signing process for message %s", hex.EncodeToString(s.msg)) - return p.Wait() -} - -// Stop ends all subscriptions created when starting the tss process. -func (s *Signing) Stop() { - s.Log.Info().Msgf("Stopping tss process.") - s.Communication.UnSubscribe(s.subscriptionID) - s.Cancel() -} - -// Ready returns true if threshold+1 parties are ready to start the signing process. -func (s *Signing) Ready(readyPeers []peer.ID, excludedPeers []peer.ID) (bool, error) { - readyPeers = s.readyParticipants(readyPeers) - return len(readyPeers) == s.key.Threshold+1, nil -} - -// ValidCoordinators returns only peers that have a valid keyshare -func (s *Signing) ValidCoordinators() []peer.ID { - return s.key.Peers -} - -// StartParams returns peer subset for this tss process. It is calculated -// by sorting hashes of peer IDs and session ID and chosing ready peers alphabetically -// until threshold is satisfied. -func (s *Signing) StartParams(readyPeers []peer.ID) []byte { - readyPeers = s.readyParticipants(readyPeers) - peers := []peer.ID{} - peers = append(peers, readyPeers...) - - sortedPeers := util.SortPeersForSession(peers, s.SessionID()) - peerSubset := []peer.ID{} - for _, peer := range sortedPeers { - peerSubset = append(peerSubset, peer.ID) - if len(peerSubset) == s.key.Threshold+1 { - break - } - } - - paramBytes, _ := json.Marshal(peerSubset) - return paramBytes -} - -func (s *Signing) unmarshallStartParams(paramBytes []byte) ([]peer.ID, error) { - var peerSubset []peer.ID - err := json.Unmarshal(paramBytes, &peerSubset) - if err != nil { - return []peer.ID{}, err - } - - return peerSubset, nil -} - -// processEndMessage routes signature to result channel. -func (s *Signing) processEndMessage(ctx context.Context) error { - defer s.Cancel() - for { - select { - case <-s.Done: - { - result, err := s.Handler.Result() - if err != nil { - return err - } - s.Log.Info().Msg("Successfully generated signature") - signature, _ := result.(taproot.Signature) - - s.resultChn <- Signature{ - Signature: signature, - Id: s.id, - } - s.Cancel() - return nil - } - case <-ctx.Done(): - { - return nil - } - } - } -} - -// readyParticipants returns all ready peers that contain a valid key share -func (s *Signing) readyParticipants(readyPeers []peer.ID) []peer.ID { - readyParticipants := make([]peer.ID, 0) - for _, peer := range readyPeers { - - if !slices.Contains(s.key.Peers, peer) { - continue - } - - readyParticipants = append(readyParticipants, peer) - } - - return readyParticipants -} - -func (s *Signing) Retryable() bool { - return true -} diff --git a/tss/frost/signing/signing_test.go b/tss/frost/signing/signing_test.go deleted file mode 100644 index d90178fc..00000000 --- a/tss/frost/signing/signing_test.go +++ /dev/null @@ -1,205 +0,0 @@ -// The Licensed Work is (c) 2022 Sygma -// SPDX-License-Identifier: LGPL-3.0-only - -package signing_test - -import ( - "context" - "encoding/hex" - "fmt" - "testing" - "time" - - "github.com/ChainSafe/sygma-relayer/comm" - "github.com/ChainSafe/sygma-relayer/comm/elector" - "github.com/ChainSafe/sygma-relayer/keyshare" - "github.com/ChainSafe/sygma-relayer/tss" - "github.com/ChainSafe/sygma-relayer/tss/frost/signing" - tsstest "github.com/ChainSafe/sygma-relayer/tss/test" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/sourcegraph/conc/pool" - "github.com/stretchr/testify/suite" - "github.com/taurusgroup/multi-party-sig/pkg/math/curve" -) - -type SigningTestSuite struct { - tsstest.CoordinatorTestSuite -} - -func TestRunSigningTestSuite(t *testing.T) { - suite.Run(t, new(SigningTestSuite)) -} - -func (s *SigningTestSuite) Test_ValidSigningProcess() { - communicationMap := make(map[peer.ID]*tsstest.TestCommunication) - coordinators := []*tss.Coordinator{} - processes := []tss.TssProcess{} - - tweak := "c82aa6ae534bb28aaafeb3660c31d6a52e187d8f05d48bb6bdb9b733a9b42212" - tweakBytes, err := hex.DecodeString(tweak) - s.Nil(err) - h := &curve.Secp256k1Scalar{} - err = h.UnmarshalBinary(tweakBytes) - s.Nil(err) - - fetcher := keyshare.NewFrostKeyshareStore(fmt.Sprintf("../../test/keyshares/%d-frost.keyshare", 0)) - testKeyshare, err := fetcher.GetKeyshare() - s.Nil(err) - tweakedKeyshare, err := testKeyshare.Key.Derive(h, nil) - s.Nil(err) - - msgBytes := []byte("Message") - for i, host := range s.Hosts { - communication := tsstest.TestCommunication{ - Host: host, - Subscriptions: make(map[comm.SubscriptionID]chan *comm.WrappedMessage), - } - communicationMap[host.ID()] = &communication - fetcher := keyshare.NewFrostKeyshareStore(fmt.Sprintf("../../test/keyshares/%d-frost.keyshare", i)) - - signing, err := signing.NewSigning(1, msgBytes, tweak, "signing1", "signing1", host, &communication, fetcher) - if err != nil { - panic(err) - } - electorFactory := elector.NewCoordinatorElectorFactory(host, s.BullyConfig) - coordinators = append(coordinators, tss.NewCoordinator(host, &communication, electorFactory)) - processes = append(processes, signing) - } - tsstest.SetupCommunication(communicationMap) - - resultChn := make(chan interface{}, 2) - - ctx, cancel := context.WithCancel(context.Background()) - pool := pool.New().WithContext(ctx) - for i, coordinator := range coordinators { - coordinator := coordinator - pool.Go(func(ctx context.Context) error { - return coordinator.Execute(ctx, []tss.TssProcess{processes[i]}, resultChn) - }) - } - - sig1 := <-resultChn - sig2 := <-resultChn - tSig1 := sig1.(signing.Signature) - tSig2 := sig2.(signing.Signature) - s.Equal(tweakedKeyshare.PublicKey.Verify(tSig1.Signature, msgBytes), true) - s.Equal(tweakedKeyshare.PublicKey.Verify(tSig2.Signature, msgBytes), true) - cancel() - err = pool.Wait() - s.Nil(err) -} - -func (s *SigningTestSuite) Test_MultipleProcesses() { - communicationMap := make(map[peer.ID]*tsstest.TestCommunication) - coordinators := []*tss.Coordinator{} - processes := [][]tss.TssProcess{} - - tweak := "c82aa6ae534bb28aaafeb3660c31d6a52e187d8f05d48bb6bdb9b733a9b42212" - tweakBytes, err := hex.DecodeString(tweak) - s.Nil(err) - h := &curve.Secp256k1Scalar{} - err = h.UnmarshalBinary(tweakBytes) - s.Nil(err) - - msgBytes := []byte("Message") - for i, host := range s.Hosts { - communication := tsstest.TestCommunication{ - Host: host, - Subscriptions: make(map[comm.SubscriptionID]chan *comm.WrappedMessage), - } - communicationMap[host.ID()] = &communication - fetcher := keyshare.NewFrostKeyshareStore(fmt.Sprintf("../../test/keyshares/%d-frost.keyshare", i)) - - signing1, err := signing.NewSigning(1, msgBytes, tweak, "signing1", "signing1", host, &communication, fetcher) - if err != nil { - panic(err) - } - signing2, err := signing.NewSigning(1, msgBytes, tweak, "signing1", "signing2", host, &communication, fetcher) - if err != nil { - panic(err) - } - signing3, err := signing.NewSigning(1, msgBytes, tweak, "signing1", "signing3", host, &communication, fetcher) - if err != nil { - panic(err) - } - electorFactory := elector.NewCoordinatorElectorFactory(host, s.BullyConfig) - coordinator := tss.NewCoordinator(host, &communication, electorFactory) - coordinators = append(coordinators, coordinator) - processes = append(processes, []tss.TssProcess{signing1, signing2, signing3}) - } - tsstest.SetupCommunication(communicationMap) - - resultChn := make(chan interface{}, 6) - ctx, cancel := context.WithCancel(context.Background()) - pool := pool.New().WithContext(ctx) - for i, coordinator := range coordinators { - coordinator := coordinator - - pool.Go(func(ctx context.Context) error { - return coordinator.Execute(ctx, processes[i], resultChn) - }) - } - - results := make([]signing.Signature, 6) - i := 0 - for result := range resultChn { - sig := result.(signing.Signature) - results[i] = sig - i++ - if i == 5 { - break - } - } - err = pool.Wait() - s.NotNil(err) - cancel() -} - -func (s *SigningTestSuite) Test_ProcessTimeout() { - communicationMap := make(map[peer.ID]*tsstest.TestCommunication) - coordinators := []*tss.Coordinator{} - processes := []tss.TssProcess{} - - tweak := "c82aa6ae534bb28aaafeb3660c31d6a52e187d8f05d48bb6bdb9b733a9b42212" - tweakBytes, err := hex.DecodeString(tweak) - s.Nil(err) - h := &curve.Secp256k1Scalar{} - err = h.UnmarshalBinary(tweakBytes) - s.Nil(err) - - msgBytes := []byte("Message") - for i, host := range s.Hosts { - communication := tsstest.TestCommunication{ - Host: host, - Subscriptions: make(map[comm.SubscriptionID]chan *comm.WrappedMessage), - } - communicationMap[host.ID()] = &communication - fetcher := keyshare.NewFrostKeyshareStore(fmt.Sprintf("../../test/keyshares/%d-frost.keyshare", i)) - - signing, err := signing.NewSigning(1, msgBytes, tweak, "signing1", "signing1", host, &communication, fetcher) - if err != nil { - panic(err) - } - electorFactory := elector.NewCoordinatorElectorFactory(host, s.BullyConfig) - coordinator := tss.NewCoordinator(host, &communication, electorFactory) - coordinator.TssTimeout = time.Nanosecond - coordinators = append(coordinators, coordinator) - processes = append(processes, signing) - } - tsstest.SetupCommunication(communicationMap) - - resultChn := make(chan interface{}) - - ctx, cancel := context.WithCancel(context.Background()) - pool := pool.New().WithContext(ctx) - for i, coordinator := range coordinators { - coordinator := coordinator - pool.Go(func(ctx context.Context) error { - return coordinator.Execute(ctx, []tss.TssProcess{processes[i]}, resultChn) - }) - } - - err = pool.Wait() - s.NotNil(err) - cancel() -} diff --git a/tss/message/message_test.go b/tss/message/message_test.go index e164444a..6a8d1919 100644 --- a/tss/message/message_test.go +++ b/tss/message/message_test.go @@ -6,7 +6,7 @@ package message_test import ( "testing" - "github.com/ChainSafe/sygma-relayer/tss/message" + "github.com/sprintertech/sprinter-signing/tss/message" "github.com/stretchr/testify/suite" ) diff --git a/tss/mock/ecdsa.go b/tss/mock/ecdsa.go index 7e33d1ca..c69f986c 100644 --- a/tss/mock/ecdsa.go +++ b/tss/mock/ecdsa.go @@ -7,8 +7,8 @@ package mock_tss import ( reflect "reflect" - keyshare "github.com/ChainSafe/sygma-relayer/keyshare" gomock "github.com/golang/mock/gomock" + keyshare "github.com/sprintertech/sprinter-signing/keyshare" ) // MockECDSAKeyshareStorer is a mock of ECDSAKeyshareStorer interface. diff --git a/tss/mock/frost.go b/tss/mock/frost.go index db796900..67b3093f 100644 --- a/tss/mock/frost.go +++ b/tss/mock/frost.go @@ -7,7 +7,7 @@ package mock_tss import ( reflect "reflect" - keyshare "github.com/ChainSafe/sygma-relayer/keyshare" + keyshare "github.com/sprintertech/sprinter-signing/keyshare" gomock "github.com/golang/mock/gomock" ) diff --git a/tss/mock/storer.go b/tss/mock/storer.go index 5a6a5667..c900eea0 100644 --- a/tss/mock/storer.go +++ b/tss/mock/storer.go @@ -7,7 +7,7 @@ package mock_tss import ( reflect "reflect" - keyshare "github.com/ChainSafe/sygma-relayer/keyshare" + keyshare "github.com/sprintertech/sprinter-signing/keyshare" gomock "github.com/golang/mock/gomock" ) diff --git a/tss/test/communication.go b/tss/test/communication.go index 0f694408..6d6a19e2 100644 --- a/tss/test/communication.go +++ b/tss/test/communication.go @@ -8,9 +8,9 @@ import ( "sync" "time" - "github.com/ChainSafe/sygma-relayer/comm" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" + "github.com/sprintertech/sprinter-signing/comm" ) type Receiver interface { @@ -39,11 +39,11 @@ func (tc *TestCommunication) Broadcast( time.Sleep(100 * time.Millisecond) for _, peer := range peers { - if tc.PeerCommunications[peer.Pretty()] == nil { + if tc.PeerCommunications[peer.String()] == nil { continue } - go tc.PeerCommunications[peer.Pretty()].ReceiveMessage(&wMsg, msgType, sessionID) + go tc.PeerCommunications[peer.String()].ReceiveMessage(&wMsg, msgType, sessionID) } return nil diff --git a/tss/test/utils.go b/tss/test/utils.go index 2d464537..98314e39 100644 --- a/tss/test/utils.go +++ b/tss/test/utils.go @@ -8,17 +8,17 @@ import ( "os" "time" - "github.com/ChainSafe/sygma-relayer/config/relayer" "github.com/golang/mock/gomock" "github.com/libp2p/go-libp2p" "github.com/libp2p/go-libp2p/core/crypto" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/peer" "github.com/libp2p/go-libp2p/core/peerstore" + "github.com/sprintertech/sprinter-signing/config/relayer" "github.com/stretchr/testify/suite" - mock_comm "github.com/ChainSafe/sygma-relayer/comm/mock" - mock_tss "github.com/ChainSafe/sygma-relayer/tss/mock" + mock_comm "github.com/sprintertech/sprinter-signing/comm/mock" + mock_tss "github.com/sprintertech/sprinter-signing/tss/mock" ) type CoordinatorTestSuite struct { @@ -91,10 +91,10 @@ func SetupCommunication(commMap map[peer.ID]*TestCommunication) { for self, comm := range commMap { peerComms := make(map[string]Receiver) for p, otherComm := range commMap { - if self.Pretty() == p.Pretty() { + if self.String() == p.String() { continue } - peerComms[p.Pretty()] = otherComm + peerComms[p.String()] = otherComm } comm.PeerCommunications = peerComms } diff --git a/tss/util/sort.go b/tss/util/sort.go index 093151ed..c31ef396 100644 --- a/tss/util/sort.go +++ b/tss/util/sort.go @@ -27,9 +27,9 @@ func (sps SortablePeerSlice) Swap(i, j int) { } func (sps SortablePeerSlice) Less(i, j int) bool { - crypto.Keccak256(append([]byte(sps[i].ID.Pretty()), []byte(sps[i].SessionID)...)) - iHash := crypto.Keccak256(append([]byte(sps[i].ID.Pretty()), []byte(sps[i].SessionID)...)) - jHash := crypto.Keccak256(append([]byte(sps[j].ID.Pretty()), []byte(sps[j].SessionID)...)) + crypto.Keccak256(append([]byte(sps[i].ID.String()), []byte(sps[i].SessionID)...)) + iHash := crypto.Keccak256(append([]byte(sps[i].ID.String()), []byte(sps[i].SessionID)...)) + jHash := crypto.Keccak256(append([]byte(sps[j].ID.String()), []byte(sps[j].SessionID)...)) return binary.BigEndian.Uint64(iHash) > binary.BigEndian.Uint64(jHash) } diff --git a/tss/util/util.go b/tss/util/util.go index 3da08c61..f56f39c8 100644 --- a/tss/util/util.go +++ b/tss/util/util.go @@ -24,7 +24,7 @@ func SortPeersForSession(peers []peer.ID, sessionID string) SortablePeerSlice { func IsParticipant(peer peer.ID, peers peer.IDSlice) bool { for _, p := range peers { - if p.Pretty() == peer.Pretty() { + if p.String() == peer.String() { return true } } diff --git a/tss/util/util_test.go b/tss/util/util_test.go index 2a029e44..f73a5735 100644 --- a/tss/util/util_test.go +++ b/tss/util/util_test.go @@ -6,8 +6,8 @@ package util_test import ( "testing" - "github.com/ChainSafe/sygma-relayer/tss/util" "github.com/libp2p/go-libp2p/core/peer" + "github.com/sprintertech/sprinter-signing/tss/util" "github.com/stretchr/testify/suite" )